코볼

배경

1950년대 말 컴퓨터 사용자와 제조업체는 프로그래밍의 비용이 치솟는 것을 걱정하기 시작했다. 1959년 조사에 따르면 데이터 처리 설치에서 프로그래밍의 평균 비용은 $800,000 (미국 달러)이고 새로운 하드웨어에서 실행할 수 있도록 프로그램을 변환하는데 드는 비용은 $600,000였다. 새로운 프로그래밍 언어들이 빠르게 확산되는 가운데, 동일 조사에서 하나로 통일된 사무 지향 언어가 사용된다면 변환은 훨씬 저렴해지고 빨라질 것이라는 결과가 나왔다.
1959년 4월 학계, 컴퓨터 사용자들, 제조업체들의 대표들이 펜실베니아 대학교에서 통일된 사무 언어에 대한 정식 회의를 조성하기에 이르렀다.
영어와 같은 데이터 처리 언어 FLOW-MATIC을 개발한 그레이스 호퍼를 포함하여 Jean Sammet, Saul Gorn가 대표로 참석했다.
이 단체는 미국 국방부에 통일된 사무 언어를 만들기 위해 지원해줄 것을 요청하였다. 대표단은 미국 국방부의 데이터 시스템 연구 스태프 총괄을 맡던 찰스 A. 필립스에게 감명을 주었는데, 그는 이들이 미국 국방부의 문제들을 꼼꼼하게 이해하였다고 생각하였다. 미국 국방부는 225대의 컴퓨터를 운영했고 추가로 175대를 주문하였으며 이 컴퓨터들 상에 프로그램을 구현하는데 $200,000,000를 지출하였다. 이식 가능한 프로그램들은 시간을 절약하고, 비용을 줄이며 현대화를 쉽게 할 수 있었다.
필립스는 이 회의를 지원하는데 동의하였고 대표단에게 의제의 초안을 작성하는 일을 부여하였다.

코볼-61 ~ 코볼-65

수많은 논리적 결함들이 코볼 60에 발견되었는데, GE의 찰스 캐츠는 이에 대해 모호하게 해석되지 않는다고 경고하였다. 마지못한 단기 위원회는 완전한 정리를 단행하였고 1963년 3월 코볼의 문법이 알골의 것처럼 정의가 가능해졌으나 의미적인 모호성(semantic ambiguities)은 여전히 남아있다고 보고되었다.
초기 코볼 컴파일러들은 원시적이었고 속도가 느렸다. 1962년 미국 해군 평가는 분당 3-11개 문의 컴파일 속도를 지적했다. 1964년 중순에는 분당 11-1000개의 문으로까지 증가하였다.
메모리가 늘어나면서 속도가 급격하게 빨라졌고 컴파일 비용이 다양해졌다. 문 당 비용은 $0.23에서 $18.91 사이였다.
1962년 말에 IBM은 코볼이 그들의 주 개발 언어가 되고 COMTRAN의 개발은 중단할 것이라 선언하였다.
코볼 사양은 출판 이후로 5년 안에 3번 개정되었다. 코볼-60은 1961년에 코볼-61으로 대체되었다. 그 뒤 코볼-61 확장 사양으로 1963년에 대체되어 정렬 및 보고서 작성 기능이 도입되었다. 추가된 기능들은 하니웰이 1959년 말 단기 위원회에 편지를 보내 확인된 결함들을 수정하였다. 코볼 에디션 1965는 사양에 대해 더 명확히 하고 대용량 기억 장치의 파일들과 표를 다룰 수 있는 기능을 소개하였다.

코볼-68

버전 간 비호환성을 극복하기 위해 코볼을 표준화하는 작업이 시작되었다. 1962년 말 ISO와 미국 스탠더드(현재의 ANSI)는 표준을 만드는 그룹들을 설립하였다.
ANSI는 1968년 8월 《USA Standard COBOL X3.23》을 만듦으로써 차기 버전들의 주춧돌이 되었다. 이 버전은 ANS(American National Standard) 코볼로 알려져 있으며 1972년에 ISO에 채택되었다.

코볼-74

1970년에 코볼은 전 세계에서 가장 널리 쓰이는 프로그래밍 언어가 되었다.
ANSI 위원회와 독립적으로 CODASYL 프로그래밍 언어 위원회는 언어 개선에 착수했다. 이들은 1968년, 1969년, 1970년, 1973년에 새로운 버전들을 기술하였고, 여기에 새로운 프로그램 간 통신, 디버깅, 파일 병합 기능, 개선된 문자열 관리, 라이브러리 포함 기능과 같은 변경 사항을 포함하였다. CODASYL이 ANSI 위원회와 독립적이었으나, ANSI는 《CODASYL Journal of Development》를 사용하여 구현을 보증하는데 충분히 대중적인 기능들을 식별하게 하였다. 프로그래밍 언어 위원회는 또한 ECMA와 일본 코볼 표준 위원회와도 연계하였다.
그러나 프로그래밍 언어 위원회는 잘 알려지지 않았다. 부사장이었던 William Rinehuls는 코볼 커뮤니티의 2/3이 위원회의 존재조차 모르고 있다고 불평하였다. 또, 무료로 이용이 가능한 변경 사항 제안, 회의록과 같은 공용 문서를 만들 자금이 부족할 정도로 빈약했다.
1974년 ANSI는 (ANS) 코볼의 개정판을 출판하였으며, 여기에는 파일 조직, DELETE 문, 세그먼트 모듈과 같은 새로운 기능들이 포함되었다. NOTE 문, EXAMINE 문(INSPECT 문으로 대체), 구현자 정의 랜덤 액세스 모듈(새로운 순차 및 상대 입출력 모듈로 대체)과 같은 기능들이 제거되었다. 44개의 변경 사항으로 이루어져 있고 새로운 표준과 호환되지 않은 기존의 문들을 나열하였다. 보고서 작성 기능은 혹평을 받아 코볼에서 물러났지만 표준이 출판되기 전에 복귀되었다. 나중에 ISO는 1978년에 갱신된 표준을 채택하였다.

레거시

코볼 프로그램들은 정부와 기업체에 고루 사용되며 z/OS, VME, 유닉스, 윈도우와 같은 다양한 운영 체제에서 구동된다. 1997년 가트너 그룹은 전 세계 비즈니스의 80%가 200,000,000,000줄 이상의 코드의 코볼을 실행하였고 한 해에 5,000,000,000줄 이상이 작성되고 있다고 보고했다.
20세기 말 무렵, 2000년 문제(Y2K) 해결을 위해 코볼 프로그래밍 노력이 상당 부분 집중되었으며 가끔은 10년 전에 시스템을 개발했던 동일 프로그래머들에 의해 수행되었다. 코볼 코드를 고치는데 필요한 일정 수준의 노력이 상당량의 비즈니스 지향 코볼에 전가되었는데, 사무 응용 프로그램들이 날짜를 사용하는 정도가 심했기 때문이다. 그 외에 고정 길이 데이터 필드에도 영향을 주었다.
2006년과 2012년에 컴퓨터월드 조사에 따르면 조직 중 60%가 코볼을 (C++, 비주얼 베이직 닷넷보다 더) 사용하였으며 코볼은 자사 내부 소프트웨어 다수에 사용되었다. 관리자 중 36%가 코볼로부터 이관할 예정이라고 언급했으며, 25%는 값이 더 저렴해진다면 그러할 의향이 있다고 밝혔다. 일부 기업체는 그들의 코볼 프로그램들을 유지보수하면서도 그들의 시스템을 값비싼 메인프레임에서 더 값싼 더 현대적인 시스템으로 이관해오고 있다.

문법

코볼은 영어와 같은 문법을 가지고 있으며, 프로그램 안의 거의 모든 것을 기술하는데 사용된다. 예를 들어, 조건은 x IS GREATER THAN y로 표현할 수 있고, 더 간결하게는 x GREATER y나 x > y로 표현할 수 있다. 더 복잡한 조건들은 반복되는 조건과 변수들을 제거하여 축약할 수 있다. 이를테면 a > b AND a > c OR a = d는 a > b AND c OR = d로 줄일 수 있다. 영어와 같은 문법을 지닌 코볼은 300개의 예약어가 있다. 일부 예약어는 대체가 가능하고 단복수를 표현하는 낱말도 마치 영어의 구문처럼 바꾸어 사용할 수 있다. 이를테면 IN과 OF 키워드는 번갈아 사용할 수 있는데, 이는 IS와 ARE, VALUE와 VALUES도 그러하다.
각 코볼 프로그램은 4개의 어휘 항목을 이룬다; 워드, 리터럴, 픽처(PICTURE) 문자, 구분자(separator). 워드에는 예약어와 사용자 정의 식별자를 포함한다. 이들은 최대 31개 문자 길이로 되어 있으며 문자, 숫자, 하이픈(-), 언더바(_)를 포함할 수 있다. 리터럴은 숫자(예: 12)와 문자(예: 'Hello!')를 포함한다. 구분자는 공백 문자와 콤마, 세미콜론을 포함하고 그 뒤에 공백이 온다.
코볼 프로그램은 4개의 구역으로 나뉜다: IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION, PROCEDURE DIVISION. IDENTIFICATION DIVISION은 소스 요소의 이름과 종류를 정의하며 여기서 클래스와 인터페이스가 지정된다. ENVIRONMENT DIVISION은 이를 실행하는 시스템에 의존하는 프로그램 기능을 정의하는데, 이를테면 파일과 문자 집합을 들 수 있다. DATA DIVISION은 변수와 매개변수를 선언하는데 쓰인다. PROCEDURE DIVISION은 프로그램의 문을 포함한다. 각 구역은 섹션으로 다시 구분되며 섹션은 여러 문단으로 이루어진다.

IDENTIFICATION DIVISION

IDENTIFICATION DIVISION은 다음의 코드 개체를 식별하고 클래스나 인터페이스의 정의를 포함한다.

객체 지향 프로그래밍

클래스와 인터페이스라는 개념은 2002년 이후로 코볼에 포함되고 있다. 클래스에는 클래스 메소드와 변수, 인스턴스 오브젝트를 포함하는 팩토리 오브젝트(factory object)와 인스턴스 메소드와 변수를 포함하는 인스턴스 오브젝트(instance object)들을 갖고 있다. 상속과 인터페이스들은 다형성을 제공한다.
제네릭 프로그래밍 지원은 매개변수 방식의 클래스들을 통해 제공되며, 클래스나 인터페이스를 사용하여 예를 들 수 있다. 오브젝트들은 특정한 종류에 제한을 두기 위해 참조용으로 저장된다. 이른바 두 종류의 메소드가 있다.: INVOKE 문 (CALL과 매우 비슷하게 동작), 인라인 메소드 호출(함수를 사용하는 것과 비슷).
*> 아래의 것들은 동등하다.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> 인라인 메소드 호출
코볼은 메소드를 숨기는 방식은 제공하지 않는다. 클래스 데이터는 숨길 수 있지만, 사용자가 그것에 접근하지 못하도록 PROPERTY 절 없이 선언한 경우에야 가능. 메소드 오버로드는 코볼 2014에 추가되었다.

ENVIRONMENT DIVISION

ENVIRONMENT DIVISION에는 CONFIGURATION SECTION과 INPUT-OUTPUT SECTION을 포함한다. CONFIGURATION SECTION은 통화 기호, 로케일, 문자 집합과 같은 변수 기능들을 지정하는데 사용한다. INPUT-OUTPUT SECTION은 파일 관련 정보를 포함한다.

파일

코볼은 세 개의 파일 포맷, 즉 오거나이제이션(organization)을 지원한다: 순차(sequential), 색인(indexed), 상대(relative). 순차 파일에서 레코드들은 연속적이며 순차적으로 가로질러야 하는데, 이는 마치 연결 리스트와 비슷하다. 색인 파일들은 하나 이상의 색인을 갖고 있어서 레코드들이 임의 접근을 가능하게 하고 이들에 저장을 가능케 한다. 각 레코드는 고유 키를 가지고 있어야 하지만 다른 대안이 되는 레코드 키들은 꼭 고유하지 않아도 된다. 색인 파일들의 구현체들은 업체에 따라 다르지만, C‑ISAM와 VSAM과 같은 공통 구현체들은 IBM의 ISAM에 기반을 두고 있다. 색인 파일들과 비슷한 상대 파일들은 고유 레코드 키를 가지고 있으나 대안 키들이 존재하지는 않는다. 상대 레코드의 키는 서열적인 위치를 지니는데, 이를테면 10번째 레코드는 10의 키를 가진다. 다시 말해, 5의 키를 지닌 레코드를 만들 때에는 (비어있는) 선행 레코드들이 만들어져야 한다. 또, 상대 파일들은 순차 및 임의 접근이 가능하다.
공통 비표준 확장으로 줄 단위의 순차 방식(line sequential organization)이 있으며 텍스트 파일을 처리하는데 쓰인다. 파일 안의 레코드들은 새 줄 단위로 끝을 맺으며 그 길이는 다양하다.

DATA DIVISION

DATA DIVISION은 여섯 개의 섹션으로 나뉘며 각기 다른 항목들을 선언한다. 파일 레코드의 경우 FILE SECTION, 정적 변수의 경우 WORKING-STORAGE SECTION, 매개변수와 반환값의 경우 LINKAGE SECTION, 텍스트 기반 사용자 인터페이스의 경우 REPORT SECTION과 SCREEN SECTION이 있다.

데이터 집합

코볼의 데이터 항목들은 데이터 항목이 다른 것의 일부인지를 지시하는 줄 번호를 사용하여 계층적으로 선언한다. 더 높은 수준의 번호에 위치한 항목은 더 낮은 번호의 항목에 종속된다. 번호 1을 가진 최상위 데이터 항목들은 레코드(record)라고 한다. 종속된 데이터 집합을 지닌 항목들은 그룹 항목(group item)이라고 하며, 이들을 기초 항목(elementary item)이라 부르지는 않는다. 표준 데이터 항목들을 기술하는데 쓰이는 계층적 번호들은 1부터 49 사이에 위치한다.
       01  some-record.                   *> 집합 그룹 레코드 항목           05  num            PIC 9(10).  *> 기초 항목           05  the-date.                  *> 집합 하위 그룹 레코드 항목               10  the-year   PIC 9(4).   *> 기초 항목               10  the-month  PIC 99.     *> 기초 항목               10  the-day    PIC 99.     *> 기초 항목
위의 예에서 기초 항목 num과 그룹 항목 the-date는 레코드 some-record에 종속되어 있지만 기초 항목 the-year, the-month, the-day은 그룹 항목 the-date의 일부분이다.
종속 항목들은 IN (또는 OF)이라는 키워드를 함께 사용하면 동일 이름의 항목을 구분할 수 있다. 이를테면 위의 예제 코드가 다음의 예제 코드와 나란히 있다고 하자:
       01  sale-date.           05  the-year       PIC 9(4).           05  the-month      PIC 99.           05  the-day        PIC 99.
the-year, the-month, the-day라는 이름들은 그 자체로 혼동이 있는데, 그 이유는 the-date에 위치한 항목들과 the-date에 위치한 항목들이 동일한 이름으로 정의되어 있기 때문이다. 특정 데이터 항목(예를 들어 sale-date 그룹에 속하는 항목의 하나)을 지정하려면 프로그래머는 the-year IN sale-date 또는 the-year OF sale-date를 사용하면 된다. (이러한 문법은 마치 최근의 언어에서 지원되는 닷 노테이션/dot notation과 비슷함)

그 밖의 데이터 수준

66이라는 수준의 번호는 항목의 구조화와는 관계 없이 이전에 정의된 항목들을 다시 묶는 것을 선언하기 위해 쓰인다. RENAMES 절과 함께 쓰이는 이 데이터 수준은 거의 쓰이지 않으며 1988년 경의 오래된 프로그램들에서나 흔히 볼 수 있다. 계층적, 논리적 구조의 데이터를 무시하는 이 기능은 이용이 권장되지 않았으며 수많은 설치본들에서 이의 사용을 금하였다.
       01  customer-record.           05  cust-key            PIC X(10).           05  cust-name.               10  cust-first-name PIC X(30).               10  cust-last-name  PIC X(30).           05  cust-dob            PIC 9(8).           05  cust-balance        PIC 9(7)V99.       66  cust-personal-details   RENAMES cust-name THRU cust-dob.       66  cust-all-details        RENAMES cust-name THRU cust-balance.
77 수준의 번호는 그 항목이 단독적임을 나타내며 이러한 상황에서 1이라는 수준 번호와 동등하다. 이를테면 다음의 코드는 두 개의 77 수준 데이터 항목 property-name, sales-region을 선언하며, 이들은 다른 어떠한 데이터 항목들과도 종속되지 않고 독립적인, 그룹에 속하지 않은 데이터 항목들이다:
       77  property-name      PIC X(80).       77  sales-region       PIC 9(5).
88 수준의 번호는 조건명을 선언하며, 부모 데이터 항목이 그 VALUE 절안에 지정된 값들의 하나를 포함할 때 참이다. 이를테면 다음의 코드는 두 개의 88 수준의 조건명 항목들을 정의하며, wage-type 데이터 항목의 현재 문자 데이터 값에 따라 참이냐 거짓이냐가 결정된다. 해당 데이터 항목에 'H'라는 값이 포함되는 경우 조건명 wage-is-hourly은 참이지만, 'S'나 'Y'라는 값이 포함되면 조건명 wage-is-yearly가 참이다. 데이터 항목에 그 밖의 다른 값이 포함되어 있으면 조건명은 거짓이다.
       01  wage-type          PIC X.           88  wage-is-hourly VALUE "H".           88  wage-is-yearly VALUE "S", "Y".

보고서 작성기

보고서 작성기(report writer)는 보고서를 작성하기 위한 선언형 기능이다. 프로그래머는 보고서 레이아웃 및 보고서를 만들어내는데 필요한 데이터만 지정하면 되며, 페이지 나누기, 데이터 형식 지정, 머릿말과 꼬릿말과 같은 것들을 다루기 위해 코드를 작성할 필요는 없다.
보고서는 보고서 파일들에 연결되며, 이 파일들은 보고서 작성기 문들을 통해서만 기록이 가능하다.
       FD  report-out REPORT sales-report.
각 보고서는 DATA DIVISION의 REPORT SECTION에 정의된다. 보고서는 보고서의 머릿말, 꼬릿말, 상세 사항을 정의하는 보고서 그룹들로 나뉜다. 보고서들은 계층적 제어 차단(control break)을 두고 동작한다. 제어 차단은 키 변수가 값을 변경할 때 발생한다. 이를테면 고객 주문이 상세히 적힌 보고서를 만들 때 프로그램이 다른 고객의 주문에 도달하게 되면 제어 차단이 일어난다. 아래는 판매원의 판매 정보를 제공하고 유효하지 않은 레코드를 경고하는 보고서를 설명한 예이다:
       RD  sales-report           PAGE LIMITS 60 LINES           FIRST DETAIL 3           CONTROLS seller-name.       01  TYPE PAGE HEADING.           03  COL 1                    VALUE "Sales Report".           03  COL 74                   VALUE "Page".           03  COL 79                   PIC Z9 SOURCE PAGE-COUNTER.       01  sales-on-day TYPE DETAIL, LINE + 1.           03  COL 3                    VALUE "Sales on".           03  COL 12                   PIC 99/99/9999 SOURCE sales-date.           03  COL 21                   VALUE "were".           03  COL 26                   PIC $$$$9.99 SOURCE sales-amount.       01  invalid-sales TYPE DETAIL, LINE + 1.           03  COL 3                    VALUE "INVALID RECORD:".           03  COL 19                   PIC X(34) SOURCE sales-record.       01  TYPE CONTROL HEADING seller-name, LINE + 2.           03  COL 1                    VALUE "Seller:".           03  COL 9                    PIC X(30) SOURCE seller-name.
위의 보고서 설명은 아래의 레이아웃을 기술한다:
Sales Report                                                             Page  1

Seller: Howard Bromberg
  Sales on 10/12/2008 were $1000.00
  Sales on 12/12/2008 were    $0.00
  Sales on 13/12/2008 were   $31.47
  INVALID RECORD: Howard Bromberg             XXXXYY

Seller: Howard Discount
...
Sales Report                                                            Page 12

  Sales on 08/05/2014 were  $543.98
  INVALID RECORD: William Selden      12O52014FOOFOO
  Sales on 30/05/2014 were    $0.00
4개의 문들이 보고서 작성기를 제어한다: INITIATE는 인쇄를 위해 보고서 작성기를 준비한다. GENERATE는 보고서 그룹을 인쇄한다. SUPPRESS는 보고서 그룹의 인쇄를 숨긴다. TERMINATE는 보고 처리를 끝낸다. 위의 판매 보고서의 예를 기준으로 PROCEDURE DIVISION은 다음의 모습과 같이 되어 있다:
           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           .

문

코볼 2014를 기준으로 47개의 문들이 있으며(verb/동사라고 함) 다음의 넓은 분류로 묶을 수 있다: 제어 흐름, 입출력, 데이터 조작, 보고서 작성기. 보고서 작성기 문들은 보고서 작성기 섹션에서 다룬다.

제어 흐름

코볼의 조건문으로는 IF와 EVALUATE가 있다. EVALUATE는 마치 여러 개의 값들과 조건들을 평가하는 기능이 추가된 switch와 비슷한 문이다. 의사결정표를 구현하는데 사용할 수 있다. 이를테면 다음은 CNC 선반을 제어하는데 쓰일 수 있다.
EVALUATE TRUE ALSO desired-speed ALSO current-speed
    WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed
        PERFORM slow-down-machine
    WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed
        PERFORM speed-up-machine
    WHEN lid-open ALSO ANY ALSO NOT ZERO        PERFORM emergency-stop
    WHEN OTHER        CONTINUEEND-EVALUATE
PERFORM 문은 조건이 참이 될 때까지 실행하는 반복문을 정의한다. (다른 언어들의 wihle과는 다름) 프로시저들이나 일정한 범위의 프로시저들을 호출하기 위해서도 쓰인다. (프로시저 단락 참고) CALL와 INVOKE는 각각 하위 프로그램들과 메소드를 호출한다. 하위 프로그램/메소드의 이름은 리터럴이나 데이터 항목이 되는 문자열 안에 포함된다. 매개변수들은 참조에 의해서나 내용을 통해서나(사본이 참조에 의해 전달될 때) 값에 의해(프로토타입을 이용할 수 있는 경우에만) 전달할 수 있다. CANCEL은 하위 프로그램들을 메모리로부터 해제한다. GO TO 절들은 프로그램이 지정된 프로시저로 건너뛰게 한다.
GOBACK 문은 반환문이며 STOP 문은 프로그램을 정지시킨다. EXIT 문에는 각기 다른 형식이 있다: 반환문, break 문, continue 문, 끝 표시기(end marker) 또는 프로시저를 빠져나는 기능으로 사용할 수 있다.
예외는 RAISE 문을 통해 발생시킬 수 있으며 PROCEDURE DIVISION의 DECLARATIVES 부분에 정의되는 핸들러(declarative로 부름)에 의해 포착된다. DECLARATIVES는 USE 문으로 시작하는 섹션들이며, 다루어져야 할 오류를 지정한다. 예외는 이름이나 오브젝트가 될 수 있다. RESUME은 DECLARATIVE 안에서 사용할 수 있으며, DECLARATIVES 밖의 프로시저나 예외를 일으킨 지점 이후의 문으로 건너뛸 수 있다. 다른 언어들과는 달리 포착되지 못한 예외들은 프로그램을 끝내지 못하며 프로그램은 영향을 받지 않은 채로 계속 실행된다.

입출력

파일 입출력은 자체 기술되는 OPEN, CLOSE, READ, WRITE 문들에 의해 처리되며, 이들은 다음의 세 가지와 나란히 쓰인다: REWRITE는 레코드를 업데이트한다. START는 특정 키로 레코드를 찾음으로써, 접근할 차기의 레코드를 선택한다. UNLOCK은 마지막으로 접근한 레코드의 락을 해제한다.
사용자 상호 작용은 ACCEPT와 DISPLAY를 이용하여 수행된다.

자체 수정 코드

원래의 코볼 사양은 악명이 높은  ALTER X TO PROCEED TO Y  문을 지원하였고, 이를 위해 수많은 컴파일러들이 자체 수정 코드를 생성하였다. X와 Y는 프로시저의 레이블이고, ALTER 문 뒤에 실행되는 프로시저 X 안의 하나의  GO TO  문은  GO TO Y 를 의미한다.
수많은 컴파일러들이 이를 지원하지만 코볼 1985 표준에서는 이용하지 않을 것을 권고하였고 2002년에 삭제되었다.

Hello world

코볼의 Hello world 프로그램은 다음과 같다.
       IDENTIFICATION DIVISION.       PROGRAM-ID. hello-world.       PROCEDURE DIVISION.           DISPLAY "Hello, world!"           .

HELLO, WORLD

지금은 유명한 《C 프로그래밍 언어》(The C Programming Language)라는 책의 Hello world 프로그램 예제가 1978년 첫 출판되었을 때, 비슷한 메인프레임 코볼 프로그램 예제가 80컬럼의 천공 카드와 천공 카드 리더를 사용할 가능성이 매우 높은 JCL을 통해 제출되었다.
아래는 DATA DIVISION이 비어있으며 MVS 3.8J이 구동되는 시스템/370 허큘리스 에뮬레이터와 GNU/리눅스를 통해 테스트되었다. 2015년 7월에 작성된 이 JCL은 제이 무슬리(Jay Moseley)의 허큘리스 강좌와 샘플에서 가져온 것이다. 동시대의 코볼 프로그래밍을 유지한 채 HELLO, WORLD은 모두 대문자로 표시된다.
//COBUCLG JOB (001),'COBOL BASE TEST', 00010000// CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1) 00020000//BASETEST EXEC COBUCLG 00030000//COB.SYSIN DD * 00040000 00000* VALIDATION OF BASE COBOL INSTALL                                00050000 01000 IDENTIFICATION DIVISION.                                         00060000 01100 PROGRAM-ID. 'HELLO'.                                             00070000 02000 ENVIRONMENT DIVISION.                                            00080000 02100 CONFIGURATION SECTION.                                           00090000 02110 SOURCE-COMPUTER.  GNULINUX.                                      00100000 02120 OBJECT-COMPUTER.  HERCULES.                                      00110000 02200 SPECIAL-NAMES.                                                   00120000 02210     CONSOLE IS CONSL.                                            00130000 03000 DATA DIVISION.                                                   00140000 04000 PROCEDURE DIVISION.                                              00150000 04100 00-MAIN.                                                         00160000 04110     DISPLAY 'HELLO, WORLD' UPON CONSL.                           00170000 04900     STOP RUN.                                                    00180000//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR 00190000// DD DSNAME=SYS1.LINKLIB,DISP=SHR 00200000//GO.SYSPRINT DD SYSOUT=A 00210000// 00220000
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번째 줄에 결과를 위해 색으로 강조 표시되었으며, 이 강조 표시 색은 실제 콘솔 출력의 일부분은 아니다.

구조의 결여

1970년대에 프로그래머들은 구조적이지 않은 스파게티 코드를 구조적 프로그래밍 패러다임으로 옮기기 시작하였다. 컴퓨터 과학자이자 튜링상을 받은 에츠허르 데이크스트라는 "코볼을 이용하는 일은 마음을 무력하게 만든다. 이에 대한 교리는 범죄 공격으로 여겨진다."고 강조하면서 편집장에게 보내는 "어떻게 우리가 상처를 줄 수 있는 진실을 이야기하는가?"라는 제목의 1975년 편지에서 동시대 코볼의 일부를 비평하였다.
스파게티 코드의 한 가지 이유는 GO TO 문이다. GO TO 문을 코볼 코드에서 제거하려는 시도는 그러나 난해한 프로그램들을 만들고 코드 품질을 떨어트렸다. GO TO 문은 대체적으로 PERFORM 문과 프로시저로 대체되었는데 이로 말미암아 모듈식 프로그래밍을 촉진시켰고, 강력한 반복 기능으로 손쉬운 접근을 가능케 했다. 그러나 PERFORM 문은 오직 프로시저와 함께 쓰일 수 있으므로 반복문은 이들이 사용하는 곳에 위치되지 않아 프로그램을 이해하기 더 어렵게 만들게 된다.
코볼 프로그램들은 이음매가 없고 모듈성이 결여된 점으로 악명이 높았다. 코볼 코드는 프로시저를 통해서만 모듈성을 이룰 수 있어 대형 시스템에서는 부적절한 것으로 알려져 있었다. 데이터로의 접근을 제한하는 것이 불가능하였는데, 다시 말해 프로시저 하나가 어떠한 데이터 항목이라도 접근하여 수정할 수 있었다. 게다가 매개변수를 프로시저에 보내는 방법이 없었는데, 이를 빠트린 것을 두고 Jean Sammet는 위원회의 최대 실수로 간주하였다. 또다른 복합적 문제는 PERFORM THRU 기능에서 비롯한다. 제어권이 어떠한 프로시저로 점프할 수 있고 어떠한 프로시저로부터 반환을 받을 수 있다는 것을 말하며, 이는 난해한 제어 흐름을 만들고 프로그래머가 하나의 입구, 하나의 출구(single entry, single exit) 규칙을 무너뜨릴 가능성이 있다.
이러한 상황은 코볼이 더 많은 기능을 채용하면서 개선되었다. 코볼-74는 하부 프로그램들을 추가하여 프로그래머들에게 각 프로그램 부분이 접근할 수 있는 데이터를 제어하는 기능을 제공하였다. 그 뒤로 코볼-85는 내재형 하위 프로그램(nested subprogram)을 추가하여 프로그래머들이 하위 프로그램들을 숨길 수 있게 하였다. 데이터와 코드의 추가적인 제어는 2002년에 도입되어 객체 지향 프로그래밍, 사용자 지정 함수, 사용자 지정 자료형이 포함되었다.

호환성 문제

코볼은 이식성이 높은, 공통으로 쓰이는 언어를 목표로 개발된 언어였다. 그러나 2001년까지 대략 300개의 방언이 만들어졌다.
코볼-85는 그 이전의 버전들과 완전히 호환되지 못했고 이에 대한 개발은 논란이 있었다. 트래블러스 인슈런스(Travelers Insurance)의 CIO 조지프 T. 브로피는 막중한 프로그래밍 비용을 들이는 코볼 사용자들에게 새로운 표준의 구현을 알리는 일을 진두지휘하였다. 그 결과 ANSI 코볼 위원회는 2,200장 이상의 편지를 받았는데 대부분 부정적이었고 위원회가 변경을 취할 수 밖에 없게 만들었다. 한편, 코볼-85로의 전환은 그 뒤의 수년 동안 생산성 증가를 가져올 것으로 여겨졌고 변환 비용을 정당화시킬 수 있었다.

장황한 문법

코볼 문법은 장황하다는 이유로 자주 비판을 받아왔다. 지지자들은 이것이 코드를 자체 문서화하여 프로그램 유지보수를 쉽게 하기 위한 것이라고 말한다. 또, 코볼은 프로그래머들이 배우고 쓰기 쉽게 하기 위해 만들어졌지만 관리자들과 같은 비기술 종사자들에게도 읽힌다. 가독성에 대한 열망으로 인해 명사, 동사, 절, 문장, 섹션, 디비전과 같은 영어와 비슷한 문법과 구조 요소들을 이용하게 되었다. 코볼 프로그램을 유지보수하는 사람들은 1984년까지는 이해하기 어려운 코드를 다루는데 고심해야 했으며 코볼-85의 주요 변경 사항들은 유지보수를 쉽게 할 수 있게 도와준다.
단기 위원회 구성원인 Jean Sammet은 "전문 프로그래머에게 제공하려는 시도는 거의 없었다. 주된 관심거리가 프로그래밍인 사람들은 코볼을 매우 언짢게 생각하는 경향이 있다."고 언급하며 그녀는 이를 코볼의 장황한 문법 때문인 것으로 보았다.

컴퓨터 과학 공동체와의 분리

코볼 공동체는 늘 컴퓨터 과학 공동체와는 분리되어 왔다. 어떠한 학술 컴퓨터 과학자들도 코볼의 설계에 참여하지 않았다. 위원회에 속한 전원이 상업 분야나 정부 쪽 출신이었다. 당시 컴퓨터 과학자들은 코볼 개발이 씨름하던 상용 파일 처리 문제 보다 수치 분석, 물리학, 시스템 프로그래밍과 같은 분야에 더 관심이 많았다. Jean Sammet은 우아하지 못함, 설계 과정에 참여할 영향력 있는 컴퓨터 과학자들의 부족, 사무용 데이터 처리를 업신여기는 것 때문에 코볼의 인기가 없던 것을 초기의 잘난체 반응 때문인 것으로 보았다.
코볼 사양은 새로운 배커스-나우르 표기법이 아닌, 고유한 표기법이나 메타 언어를 사용했는데 그 이유는 이를 들었던 위원회 구성원들이 얼마 없었기 때문이었다. 이로 인해 가혹한 비평을 받았다.
나중에 코볼은 코볼을 아우르는 자료의 부족으로 고통을 받았다. 소개 서적들이 등장하는데 1963년까지 그러하였다. 미국 의회도서관에는 포트란의 경우 코볼의 2배 분량의 서적이, 베이직의 경우 코볼의 4배 분량의 서적이 있었다. 대학 교수들은 직업 학교용으로 간주된 코볼 대신 더 현대적인, 최신식의 언어들과 테크닉을 가르쳤다. CODASYL 코볼 위원회의 의장인 도널드 넬슨은 1984년에 "학계가 ... 코볼을 싫어한다"고 말했고 컴퓨터 과학 동문들은 "'코볼이 싫다'라는 것을 그들에게 주입시켰다"고 말했다. 마이크로 포커스의 2013년 조사에 따르면 대학 학계의 20%는 코볼은 구식이거나 죽었다고 생각했으며 55%는 그들의 학생들이 코볼이 구식이거나 죽었다고 생각하였다고 믿었다. 동일 조사에서 60%가 코볼을 가르쳐야 한다고 생각함에도 불구하고 학계의 25%만이 그들의 교육과정에 코볼 프로그래밍이 있었다. 반면, 2003년 코볼은 미국에서 정보 시스템 교육과정의 80%에 특별히 포함되었는데 이는 C++와 자바의 비율과 동일하다.

설계 과정에 대한 걱정

설계 과정이 효과적인지에 대한 의구심이 있었다. (가끔은 코볼에 참여한 사람들까지도) 단기 위원회 구성원 호워드 브롬버그는 개발 과정에서 통제가 거의 없었으며 "소속 인원의 지속성이 없고 ... 재능의 부족으로 홍역을 치렀다"고 말했다.
코볼 표준들은 수차례 지연으로 인해 고통을 받아왔다: 코볼-85는 희망했던 날보다 5년은 더 늦었고
COBOL 2002도 5년이 늦었으며, COBOL 2014는 6년이 늦었다. 지연을 방지하기 위해 표준 위원회는 다음 표준 리비전을 기다리지 않고 더 빨리 추가 기능을 더 빠르게 추가하는 선택적인 부록을 만드는 것을 허용하였다. 그러나 일부 위원회 구성원들은 구현체와 표준의 잦은 수정 간에 따르는 비호환성에 대해 걱정을 드러냈다.

다른 언어들에 미친 영향

코볼의 자료 구조는 뒤에 나온 프로그래밍 언어들에 영향을 주었다. 레코드와 파일 구조는 PL/I과 파스칼에 영향을 주었고, REDEFINES 절은 파스칼의 변종 레코드의 이전 것이었다. 분명한 파일 구조 정의들은 데이터베이스 관리 시스템의 개발보다 앞섰고 수집된 데이터는 포트란의 배열보다 훨씬 더 앞선 것이었다.
원시적인 수준으로 간주되긴 하지만 코볼의 COPY 기능은 include 지시자의 개발에 영향을 미쳤다.
이식성과 표준화에 초점을 둠에 따라 코볼로 작성된 프로그램들은 이식이 가능하였고 언어가 다양한 하드웨어 플랫폼과 운영 체제에 안착할 수 있었다. 게다가 잘 정의된 디비전 구조는 ENVIRONMENT DIVISION의 외부 참조 정의를 제한함으로써 특히 플랫폼 변경을 단순화하는 일에 기여하였다.