SyntaxEdit
COBOL에는 프로그램의 거의 모든 것을 설명하는 데 사용되는 영어와 유사한 구문이 있습니다. 예를 들어 조건은 x IS GREATER THAN y
또는 더 간결하게 x GREATER y 또는
x > y
. 더 복잡한 조건은 반복되는 조건과 변수를 제거하여 "축약"할 수 있습니다. 예 : a > b AND a > c OR a = d
는 a > b AND c OR = d
로 줄일 수 있습니다. 이 영어와 유사한 구문을 지원하기 위해 COBOL에는 300 개 이상의 키워드가 있습니다. 일부 키워드는 동일한 단어의 단순한 대안 또는 복수형 철자이며, 이는보다 영어와 유사한 문장 및 절을 제공합니다. 예를 들어 IN
및 OF
키워드는 IS
및 ARE
및 VALUE
및 VALUES
.
각 COBOL 프로그램은 단어, 리터럴, 그림 문자 문자열의 네 가지 기본 어휘 항목으로 구성됩니다 (§ PICTURE 참조). 절) 및 구분 기호. 단어에는 예약어와 사용자 정의 식별자가 포함됩니다. 최대 31 자이며 문자, 숫자, 하이픈 및 밑줄을 포함 할 수 있습니다. 리터럴에는 숫자 (예 : 12
) 및 문자열 (예 : "Hello!"
)이 포함됩니다. 구분 기호에는 공백 문자와 쉼표 및 세미콜론 뒤에 공백이 있습니다.
COBOL 프로그램은 식별 구분, 환경 구분, 데이터 구분 및 프로 시저 구분의 네 구분으로 나뉩니다. 식별 구분은 소스 요소의 이름과 유형을 지정하고 클래스와 인터페이스가 지정되는 곳입니다. 환경 부서는 파일 및 문자 세트와 같이 실행중인 시스템에 의존하는 모든 프로그램 기능을 지정합니다. 데이터 분할은 변수와 매개 변수를 선언하는 데 사용됩니다. 프로 시저 구분은 프로그램의 명령문을 포함합니다. 각 구분은 단락으로 구성된 섹션으로 세분화됩니다.
MetalanguageEdit
COBOL “의 구문은 일반적으로 중괄호, 대괄호, 막대 및 밑줄을 사용하는 고유 한 메타 언어. 메타 언어는 원래 COBOL 사양을 위해 개발되었습니다. 당시에는 Backus–Naur 형식이 있었지만위원회에서는 들어 본 적이 없었습니다.
요소 | 모양 | 기능 |
---|---|---|
모두 대문자 | EXAMPLE | 예약어 |
밑줄 | EXAMPLE | 예약어는 필수 |
중괄호 | {} | 하나의 옵션 만 선택할 수 있습니다. |
브래킷 | 0 개 또는 하나의 옵션을 선택할 수 있습니다. | |
줄임표 | … | 이전 요소는 반복 될 수 있습니다. |
막대 | {| |} | 하나 이상의 옵션을 선택할 수 있습니다. 모든 옵션은 한 번만 선택할 수 있습니다. |
0 개 이상의 옵션을 선택할 수 있습니다. 모든 옵션은 한 번만 선택되었습니다. |
예를 들어, consi ADD
문에 대한 다음 설명에서 :
이 설명은 다음 변형을 허용합니다.
ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"
Code formatEdit
COBOL은 고정 (기본값) 또는 무료의 두 가지 형식으로 작성할 수 있습니다. 고정 형식에서 코드는 특정 영역에 맞게 정렬되어야합니다 (천공 카드 사용으로 인한 보류).COBOL 2002까지는 다음과 같습니다.
이름 | 열 (s) | 사용 |
---|---|---|
시퀀스 번호 영역 | 1–6 | 원래 카드 / 줄 번호 (수동 편집 / 처리 후 의도 한 프로그램 코드 순서를 보장하기 위해 기계식 천공 카드 정렬을 용이하게 함),이 영역은 컴파일러에서 무시됩니다. |
표시기 영역 | 7 | 다음 문자가 여기에 허용됩니다.
|
영역 A | 8–11 | 여기에는 DIVISION , SECTION 및 프로 시저 헤더; 01 및 77 레벨 번호 및 파일 / 보고서 설명자 |
영역 B | 12–72 | 영역에서 허용되지 않는 기타 코드 A |
프로그램 이름 영역 | 73 – | 천공 카드의 경우 역사적으로 최대 80 열까지 프로그램을 식별하는 데 사용됩니다. 또는 카드가 속한 시퀀스 |
COBOL 2002에서 A 및 B 영역은 병합되어 프로그램 텍스트 영역을 형성하며 이제 구현자가 정의한 열에서 끝납니다.
COBOL 2002는 자유 형식 코드도 도입했습니다. 자유 형식 코드는 최신 프로그래밍 언어에서와 같이 파일의 모든 열에 배치 할 수 있습니다. 주석은 *>
를 사용하여 지정되며, 어디에나 배치 할 수 있으며 고정 형식 소스 코드에서도 사용할 수 있습니다. 연속 줄이 없으며 >>PAGE
지시문이 /
표시기를 대체합니다.
식별 분할 편집
식별 부서는 다음 코드 엔티티를 식별하고 클래스 또는 인터페이스의 정의를 포함합니다.
객체 지향 프로그래밍 편집
클래스 및 인터페이스는 2002 년부터 COBOL에 있습니다. 클래스 클래스 메서드 및 변수를 포함하는 팩토리 개체와 인스턴스 메서드 및 변수를 포함하는 인스턴스 개체가 있습니다. 상속과 인터페이스는 다형성을 제공합니다. 일반 프로그래밍에 대한 지원은 모든 클래스 또는 인터페이스를 사용하도록 인스턴스화 할 수있는 매개 변수화 된 클래스를 통해 제공됩니다. 객체는 특정 유형으로 제한 될 수있는 참조로 저장됩니다. 메서드를 호출하는 방법에는 두 가지가 있습니다. INVOKE
문은 CALL
과 유사하게 작동합니다. , 또는 함수를 사용하는 것과 유사한 인라인 메소드 호출을 통해.
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOL은 메소드를 숨기는 방법을 제공하지 않습니다. 그러나 클래스 데이터는 PROPERTY
절없이 선언하여 숨길 수 있습니다. 그러면 사용자가 액세스 할 수 없습니다. COBOL 2014에서 메소드 오버로딩이 추가되었습니다.
Environment divisionEdit
환경 부문에는 구성 섹션과 입력-출력 섹션이 포함됩니다. 구성 섹션은 통화 기호, 로케일 및 문자 세트와 같은 가변 기능을 지정하는 데 사용됩니다. 입력-출력 섹션에는 파일 관련 정보가 포함되어 있습니다.
FilesEdit
COBOL은 순차, 색인 및 상대의 세 가지 파일 형식 또는 조직을 지원합니다. 순차 파일에서 레코드는 연속적이며 연결 목록과 유사하게 순차적으로 순회되어야합니다. 색인화 된 파일에는 레코드에 무작위로 액세스하고 정렬 할 수있는 하나 이상의 색인이 있습니다. 각 레코드에는 고유 한 키가 있어야하지만 다른 대체 레코드 키는 고유 할 필요가 없습니다. C‑ISAM 및 VSAM과 같은 일반적인 구현은 IBM의 ISAM을 기반으로하지만 색인화 된 파일의 구현은 공급 업체마다 다릅니다. 색인화 된 파일과 같은 상대 파일에는 고유 한 레코드 키가 있지만 대체 키는 없습니다. A 상대 레코드의 키는 서수 위치입니다. 예를 들어, 10 번째 레코드에는 10 개의 키가 있습니다. 즉, 5 개의 키로 레코드를 만들려면 선행 레코드 (비어 있음)를 만들어야 할 수 있습니다. 상대 파일은 또한 순차 액세스와 임의 액세스를 모두 허용합니다.
일반적인 비표준 확장자는 텍스트 파일을 처리하는 데 사용되는 행 순차 구성입니다. 파일의 레코드는 줄 바꿈으로 끝나며 길이가 다를 수 있습니다.
데이터 분할 편집
데이터 분할은 서로 다른 항목을 선언하는 6 개의 섹션으로 분할됩니다. 파일 기록; 정적 변수를위한 작업 저장 섹션; 자동 변수를위한 로컬 저장 섹션; 매개 변수 및 반환 값에 대한 연결 섹션; 텍스트 기반 사용자 인터페이스를위한 보고서 섹션 및 화면 섹션.
Aggregated dataEdit
COBOL의 데이터 항목은 데이터 항목이 다른 항목의 일부인지를 나타내는 수준 번호를 사용하여 계층 적으로 선언됩니다. 높은 레벨 번호를 가진 항목은 낮은 항목에 종속됩니다. 레벨 번호가 1 인 최상위 데이터 항목을 레코드라고합니다. 하위 집계 데이터가있는 항목을 그룹 항목이라고합니다. 그렇지 않은 것을 기본 항목이라고합니다. 표준 데이터 항목을 설명하는 데 사용되는 레벨 번호는 1에서 49 사이입니다.
위의 예에서 기본 항목 num
및 그룹 항목 the-date
는 레코드 some-record
에 종속되며 기본 항목은 연도
, 월
및 -day
는 그룹 항목 the-date
의 일부입니다.
하위 항목은 IN
(또는 OF
) 키워드. 예를 들어, 다음 예제와 함께 위의 예제 코드를 고려하십시오.
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
이름 연도
, 월
및 오늘 code>는 둘 이상의 데이터 항목이 해당 이름으로 정의되어 있기 때문에 자체적으로 모호합니다. 특정 데이터 항목 (예 :
sale-date
그룹에 포함 된 항목 중 하나)을 지정하기 위해 프로그래머는 the-year IN sale-date
(또는 이에 상응하는 the-year OF sale-date
). (이 구문은 대부분의 현대 언어에서 지원하는 "점 표기법"과 유사합니다.)
기타 데이터 수준 편집
66의 수준 번호는 다시 그룹화를 선언하는 데 사용됩니다. 항목의 구조에 관계없이 이전에 정의 된 항목. 관련 RENAMES
절로도 참조되는이 데이터 수준은 거의 사용되지 않으며 1988 년경에는 일반적으로 오래된 프로그램에서 발견되었습니다. 계층 적 및 논리적 구조 데이터를 무시할 수 있다는 것은 사용이 권장되지 않았고 많은 설치에서 사용을 금지한다는 것을 의미했습니다.
77 레벨 번호는 항목이 독립형임을 나타내며 이러한 상황에서는 다음과 같습니다. 예를 들어 다음 코드는 두 개의 77 수준 데이터 항목 인 property-name
및 sales-region
: 다른 데이터 항목과 독립적 인 (하위가 아닌) 비 그룹 데이터 항목 :
77 property-name PIC X(80). 77 sales-region PIC 9(5).
88 레벨 번호는 상위 데이터 항목이 VALUE
절. 예를 들어 다음 코드는 임금 유형
데이터 항목의 현재 문자 데이터 값에 따라 참 또는 거짓 인 두 개의 88 수준 조건 이름 항목을 정의합니다. . 데이터 항목에 "H"
값이 포함 된 경우 조건 이름 시간당 임금
는 true이지만 "S"
또는 "Y"의 값을 포함하는 경우 code>, 조건 이름
연간 임금
이 참입니다. 데이터 항목에 다른 값이 포함되어 있으면 두 조건 이름이 모두 거짓입니다.
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
데이터 유형 편집
표준 COBOL은 다음 데이터 유형을 제공합니다.
데이터 유형 | 샘플 선언 | 참고 |
---|---|---|
알파벳 | PIC A (30) |
문자 또는 공백 만 포함 할 수 있습니다. |
영숫자 | PIC X (30) |
모든 문자를 포함 할 수 있음 |
부울 | PIC 1 USAGE BIT |
0과 1의 형식으로 2 진수로 저장된 데이터 |
색인 | 사용 색인 |
표 요소를 참조하는 데 사용 |
국가 | PIC N (30) |
영숫자와 유사하지만 확장 문자 사용 예 : UTF-8 |
숫자 | PIC 9 (5) V9 (5) |
숫자 만 포함 할 수 있음 |
개체 | 사용 개체 참조 |
객체 또는 NULL |
포인터 | 사용 포인터 |
유형 안전성은 COBOL에서 가변적입니다.숫자 데이터는 다른 표현과 크기 사이에서 자동으로 변환되며 영숫자 데이터는 숫자 및 그룹 데이터를 포함하여 문자열로 저장할 수있는 모든 데이터 항목에 배치 될 수 있습니다. 반대로 객체 참조와 포인터는 같은 유형의 항목에서만 할당 될 수 있으며 해당 값은 특정 유형으로 제한 될 수 있습니다.
PICTURE 절 편집
A PICTURE
(또는 PIC
) 절은 문자열로, 각 문자열은 데이터 항목의 일부를 나타내고 포함 할 수있는 것. 일부 그림 문자는 항목의 유형과 메모리에서 차지하는 문자 또는 숫자 수를 지정합니다. 예를 들어 9
는 10 진수를 나타내고 S
는 항목이 서명. 다른 그림 문자 (삽입 및 편집 문자라고 함)는 항목 형식 지정 방법을 지정합니다. 예를 들어, 일련의 +
문자는 문자 위치와 최종 문자 데이터 내에서 선행 기호 문자를 배치하는 방법을 정의합니다. 가장 오른쪽에있는 숫자가 아닌 문자에는 항목의 기호가 포함되고이 위치의 왼쪽에있는 +
에 해당하는 다른 문자 위치에는 공백이 포함됩니다. 그림 문자 뒤에 괄호 안에 숫자를 지정하여 문자를보다 간결하게 지정할 수 있습니다. 예를 들어 9 (7)
은 9999999 . 숫자 ( 9
)와 기호 () 만 포함 된 그림 사양 S
) 문자는 순수하게 숫자 데이터 항목을 정의하는 반면, 그림 사양에는 알파벳 ( A
) 또는 영숫자 ( X
) 문자는 영숫자 데이터 항목을 정의합니다. 다른 서식 지정 문자의 존재는 편집 된 숫자 또는 편집 된 영숫자 데이터 항목을 정의합니다.
USAGE clauseEdit
USAGE
절은 형식을 선언합니다. 데이터가 저장됩니다. 데이터 유형에 따라 PICTURE
절을 보완하거나 대신 사용할 수 있습니다. 포인터와 개체 참조를 선언하는 데 사용할 수 있지만 대부분 숫자 유형을 지정하는 데 사용됩니다. 이러한 숫자 형식은 다음과 같습니다.
- 바이너리, 여기서 최소 크기는
PICTURE
절 또는USAGE
절 (예 :BINARY-LONG
). -
USAGE COMPUTATIONAL
, 여기서 데이터는 구현이 제공하는 모든 형식으로 저장됩니다. 종종 기본 형식 인사용 바이너리
-
사용 표시
와 동일합니다. , 여기서 데이터는 문자열로 저장됩니다. - 부동 소수점, 구현 종속 형식 또는 IEEE 754에 따라.
-
USAGE NATIONAL
, 여기서 데이터는 확장 문자 집합을 사용하여 문자열로 저장됩니다. -
USAGE PACKED-DECIMAL
, 여기서 데이터 가능한 가장 작은 십진수 형식 (일반적으로 압축 된 이진 코드 십진수)로 저장됩니다.
보고서 작성기 편집
보고서 작성기는 보고서 작성을위한 선언적 기능입니다. 프로그래머는 보고서 레이아웃과 보고서를 생성하는 데 필요한 데이터 만 지정하면 페이지 나누기, 데이터 서식, 머리글 및 꼬리말과 같은 작업을 처리하기 위해 코드를 작성하지 않아도됩니다.
보고서는 보고서와 연결됩니다. 파일은 보고서 작성기 문을 통해서만 기록 될 수있는 파일입니다.
FD report-out REPORT sales-report.
각 보고서는 보고서 섹션에서 정의됩니다. 데이터 부문의. 보고서는 보고서의 머리글, 꼬리말 및 세부 정보를 정의하는 보고서 그룹으로 분할됩니다. 보고서는 계층 적 제어 구분을 중심으로 작동합니다. 제어 구분은 키 변수가 값을 변경할 때 발생합니다. 예를 들어 고객 주문을 자세히 설명하는 보고서를 생성 할 때 프로그램이 다른 고객의 주문에 도달하면 통제 중단이 발생할 수 있습니다. 다음은 영업 사원의 판매를 제공하고 유효하지 않은 레코드를 경고하는 보고서에 대한 예제 보고서 설명입니다.
위 보고서 설명 다음 레이아웃을 설명합니다.
4 개의 문이 보고서 작성기를 제어합니다. INITIATE
는 보고서 작성기를 인쇄용으로 준비합니다. GENERATE
, 보고서 그룹을 인쇄합니다. SUPPRESS
는 보고서 그룹의 인쇄를 억제합니다. 및 TERMINATE
는 보고서 처리를 종료합니다.위의 판매 보고서 예에서 절차 부서는 다음과 같을 수 있습니다.
OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .
보고서 작성기 기능의 사용은 다양한 경향이 있습니다. 상당히; 일부 조직에서는 광범위하게 사용했고 일부는 전혀 사용하지 않았습니다. 또한 Report Writer의 구현은 품질 범위가 다양했으며, 하단의 구현은 런타임에 과도한 양의 메모리를 사용하기도했습니다.
Procedure divisionEdit
ProceduresEdit
프로 시저 분할 (총칭하여 프로 시저라고 함)의 섹션과 단락은 레이블 및 간단한 서브 루틴으로 사용할 수 있습니다. 다른 부서와 달리 단락은 섹션에있을 필요가 없습니다. 프로그램이 종료 될 때까지 프로그램의 절차를 통해 실행이 진행됩니다. 프로 시저를 서브 루틴으로 사용하려면 PERFORM
동사가 사용됩니다.
PERFORM
문은 실행이 코드로 반환된다는 점에서 현대 언어의 프로 시저 호출과 다소 유사합니다. 호출 된 코드의 끝에서 PERFORM
문을 따릅니다. 그러나 매개 변수 전달이나 결과 값 반환을위한 메커니즘은 제공하지 않습니다. PERFORM subroutine
과 같은 간단한 문을 사용하여 서브 루틴을 호출하면 호출 된 프로 시저의 끝에서 제어가 반환됩니다. 그러나 PERFORM
은 여러 인접 프로 시저의 시퀀스에 걸쳐 범위를 호출하는 데 사용될 수 있다는 점에서 드문 경우입니다. 이것은 PERFORM sub-1 THRU sub-n
구조로 수행됩니다.
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
이 프로그램의 출력은 “AABC”입니다.
PERFORM
도 기존 프로 시저 호출과 다릅니다. 적어도 전통적으로 호출 스택에 대한 개념은 없습니다. 결과적으로 중첩 된 호출이 가능합니다 ( PERFORM
“되는 코드 시퀀스는 PERFORM
문 자체), 그러나 동일한 코드의 일부가 두 호출에 의해 실행되는 경우 각별한주의가 필요합니다. 내부 호출의 코드가 외부 호출의 종료 지점에 도달하면 문제가 발생합니다.보다 공식적으로 제어가 이전에 호출되었지만 아직 완료되지 않은 PERFORM
호출의 종료 지점 인 COBOL 2002 표준은 동작이 정의되지 않았 음을 공식적으로 규정합니다.
그 이유는 “반환 주소”가 아닌 COBOL이 연속 주소라고 할 수있는 것으로 작동하기 때문입니다. 제어 흐름이 어떤 절차의 끝에 도달하면 연속 주소를 조회하고 해당 주소로 제어를 전송합니다. 프로그램이 실행되면 모든 절차의 연속 주소가 프로의 시작 주소로 초기화됩니다. PERFORM
문이 발생하지 않으면 제어가 프로그램을 통해 위에서 아래로 흐르도록 프로그램 텍스트에서 다음으로 오는 절차입니다. 그러나 PERFORM
문이 실행되면 호출 된 프로 시저의 연속 주소 (또는 PERFORM THRU 가 사용되었으므로 제어가 마지막에 호출 사이트로 돌아갑니다. 원래 값이 저장되고 나중에 복원되지만 저장 위치는 하나만 있습니다. 두 개의 중첩 된 호출이 겹치는 코드에서 작동하는 경우 여러 방법으로 서로의 연속 주소 관리를 방해 할 수 있습니다.
다음 예제 (Veerman & Verhoeven 2006)은 문제를 보여줍니다.
이 프로그램의 출력은 “1 2 3 4 3″이 될 것으로 예상 할 수 있습니다. “2”를 표시 한 후 두 번째 PERFORM
은 “3”및 “4”를 표시 한 다음 첫 번째 호출이 “3”으로 계속됩니다. 기존 COBOL 구현에서는 그렇지 않습니다. 대신 첫 번째 PERFORM
문은 LABEL3
끝에 연속 주소를 설정하여 LABEL1
내부 호출 사이트. 두 번째 PERFORM
문은
LABEL4 이지만 LABEL3
의 끝에 도달하면 외부 PERFORM 으로 다시 점프합니다. code> 문을 열면 프로그램이 "1 2 3"만 인쇄되는 것을 중지합니다. 반면에 오픈 소스 TinyCOBOL 컴파일러와 같은 일부 COBOL 구현에서는 두 개의
PERFORM
문이 서로 간섭하지 않으며 출력은 실제로 "1 2 3 4 3 ".따라서 이러한 경우의 동작은 (아마도) 놀라 울뿐만 아니라 이식성이 없습니다.
이 제한의 특별한 결과는 PERFORM 는 재귀 코드를 작성하는 데 사용할 수 없습니다. 이를 설명하는 또 다른 간단한 예 (Veerman & Verhoeven 2006에서 약간 단순화 됨) :
MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".
출력이 "1 2 3 END END END"라고 예상 할 수 있으며 실제로 일부 COBOL 컴파일러가 생성 할 것입니다. 그러나 IBM COBOL과 같은 일부 컴파일러는 "1 2 3 END END END END ..."등을 인쇄하는 코드를 생성하여 무한 루프에서 "END"를 반복해서 인쇄합니다. 백업 연속 주소를 저장할 공간이 제한되어 있으므로 반복 호출 과정에서 백업을 덮어 쓰며 복원 할 수있는 것은 DISPLAY "END".
StatementsEdit
COBOL 2014에는 47 개의 명령문 (동사라고도 함)이 있으며, 제어 흐름, I / O, 데이터 조작 및 보고서 작성자. 보고서 작성기 설명은 보고서 작성기 섹션에서 다룹니다.
Control flowEdit
COBOL의 조건문은 IF code입니다. > 및
EVALUATE
. EVALUATE
는 다중 평가 기능이 추가 된 스위치 형 문입니다. 값 및 조건입니다. 이는 의사 결정 테이블을 구현하는 데 사용할 수 있습니다. 예를 들어 다음을 사용하여 CNC 선반을 제어 할 수 있습니다.
EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE
PERFORM
문은 조건이 참이 될 때까지 실행되는 루프를 정의하는 데 사용됩니다 (다른 언어에서 더 일반적으로 사용되는 참이 아닌 동안). 프로 시저 또는 프로 시저 범위를 호출하는데도 사용됩니다 (자세한 내용은 프로 시저 섹션 참조). CALL
및 INVOKE
는 각각 서브 프로그램과 메소드를 호출합니다. 서브 프로그램 / 메서드의 이름은 str 리터럴 또는 데이터 항목 일 수 있습니다. 매개 변수는 참조, 콘텐츠 (복사본이 참조로 전달됨) 또는 값 (하지만 프로토 타입을 사용할 수있는 경우에만)으로 전달할 수 있습니다. CANCEL
은 하위 프로그램을 언로드합니다. 기억으로부터. GO TO
는 프로그램이 지정된 프로 시저로 이동하도록합니다.
GOBACK
문은 return 문이고 STOP
문은 프로그램을 중지합니다. EXIT
문에는 6 가지 형식이 있습니다. 반환 문, 중단 문, continue 문, 종료 마커로 사용하거나 프로 시저를 종료하는 데 사용할 수 있습니다.
예외는 RAISE
문에 의해 발생하고 DECLARATIVES
부분. 선언문은 처리 할 오류를 지정하는 USE
문으로 시작하는 섹션입니다. 예외는 이름 또는 개체 일 수 있습니다. RESUME
는 선언문에서 예외를 발생시킨 문 뒤의 문으로 이동하거나 선언
. 다른 언어와 달리 포착되지 않은 예외는 프로그램을 종료하지 않을 수 있으며 프로그램은 영향을받지 않고 진행될 수 있습니다.
I / OEdit
파일 I / O는 자체 설명 열기
, 닫기
, 읽기
, 및 WRITE
문과 추가 3 개 : REWRITE
, 레코드를 업데이트합니다. START
: 특정 키가있는 레코드를 찾아 액세스 할 후속 레코드를 선택합니다. 및 UNLOCK
은 액세스 한 마지막 레코드에 대한 잠금을 해제합니다.
사용자 상호 작용은 ACCEPT
및 DISPLAY
.
데이터 조작 편집
다음 동사는 데이터를 조작합니다.
-
INITIALIZE
: 데이터 항목을 기본값으로 설정합니다. -
MOVE
, 데이터 항목에 값을 할당합니다. MOVE CORRESPONDING은 비슷한 이름의 필드를 할당합니다. -
SET
, 15 가지 형식 : 인덱스 수정, 객체 참조 할당 및 테이블 변경 가능 다른 기능 중에서 용량. -
추가
,빼기
,MULTIPLY
,DIVIDE
및COMPUTE
는 산술 (COMPUTE
가 수식의 결과를 변수에 할당) -
ALLOCATE
및FREE
는 동적 메모리를 처리합니다. -
VALIDATE
: 데이터 분할의 항목 설명에 지정된대로 데이터를 검증하고 배포합니다. -
STRING
및UNSTRING
, 각각 문자열을 연결 및 분할합니다. -
INSPECT
, 집계 또는 문자열 내에서 지정된 하위 문자열의 인스턴스를 대체합니다. -
SEARCH
는 테이블에서 첫 번째 항목을 검색합니다. 조건을 충족합니다.
파일과 테이블은 SORT
및 MERGE
동사는 파일을 병합하고 정렬합니다. RELEASE
동사는 정렬 할 레코드를 제공하고 RETURN
은 정렬 된 레코드를 순서대로 검색합니다.
범위 종료 편집
IF
및 READ , 자체적으로 문을 포함 할 수 있습니다. 이러한 명령문은 두 가지 방법으로 종료 될 수 있습니다. 포함 된 모든 종료되지 않은 명령문을 종료하는 마침표 (암시 적 종료) 또는 가장 가까운 일치하는 열린 명령문을 종료하는 범위 종료 자에 의해 종료됩니다.
기간은 버그의 일반적인 원인입니다. 예를 들어 다음 코드를 살펴보세요.
IF x DISPLAY y. DISPLAY z.
여기서 의도는 y
및 z
조건 x
가 참인 경우. 그러나 IF
문이 종료 되었기 때문에 z
는 x
의 값에 관계없이 표시됩니다. DISPLAY y
이후 잘못된 기간에 의해.
또 다른 버그는 두 개의 IF
문은 ELSE
와 연결할 수 있습니다.
IF x IF y DISPLAY aELSE DISPLAY b.
위의 부분에서 ELSE
는 iv id = "3210f17cac"대신 IF y
문과 연결됩니다. > IF x
문으로 인해 버그가 발생합니다. 명시 적 범위 종결자를 도입하기 전에는 ELSE NEXT SENTENCE
를 내부 IF
뒤에 배치해야했습니다. .
자가 수정 codeEdit
원래 (1959) COBOL 사양은 악명 높은 ALTER X를 Y로 진행
문, 많은 컴파일러가 자체 수정 코드를 생성했습니다. X
및 Y
는 프로 시저 레이블이고 단일 이동
ALTER
문 이후에 실행 된 X
프로 시저의 문은 를 의미합니다. 대신 Y
로 이동하세요. 많은 컴파일러가 여전히이를 지원하지만 COBOL 1985 표준에서 쓸모 없게 간주되어 2002 년에 삭제되었습니다.
ALTER
문은 제대로 간주되지 않았습니다. 그것은 “상황의 지역성”을 약화시키고 프로그램의 전반적인 논리를 이해하기 어렵게 만들었 기 때문입니다. 교과서 저자 인 Daniel D. McCracken이 1976 년에 썼 듯이 “이전에 프로그램을 본 적이없는 사람은 가능한 한 빨리 프로그램에 익숙해 져야합니다.” , 때로는 프로그램이 실패했기 때문에 중요한 시간 압박을 받고 있습니다 …. 프로그램 전체에 걸쳐 알 수없는 위치에 알 수없는 수의 ALTER 문이 있음을 알리는 문단 자체에 GO TO 문이 표시되면 두려움을 불러 일으 킵니다. 용감한 프로그래머의 심장입니다. “
Hello, worldEdit
COBOL의”Hello, world “프로그램 :
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
The C Programming Language의 “Hello, World!”프로그램 예제가 1978 년에 처음 출판되었을 때 유사한 마이 nframe COBOL 프로그램 샘플은 펀치 카드 판독기와 80 열 펀치 카드를 사용하여 JCL을 통해 제출되었을 것입니다. 빈 DATA DIVISION이있는 아래 목록은 GNU / Linux 및 MVS 3.8J를 실행하는 System / 370 Hercules 에뮬레이터를 사용하여 테스트되었습니다. 2015 년 7 월에 작성된 JCL은 Jay Moseley가 호스팅하는 Hercules 자습서 및 샘플에서 파생되었습니다. 그 시대의 COBOL 프로그래밍에 따라 HELLO, WORLD는 모두 대문자로 표시됩니다.
JCL을 제출 한 후 MVS 콘솔이 표시되었습니다.
19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED
위 콘솔 목록의 10 행 효과를 위해 강조 표시된 경우 강조 표시는 실제 콘솔 출력의 일부가 아닙니다.
기술 세부 사항 및 작업 실행 정보의 4 페이지에 걸쳐 생성 된 관련 컴파일러 목록은 코볼.