shopkeeper/korean_wiki_content_only_120125 huggingface dataset:
코볼 프로그램들은 정부와 기업체에 고루 사용되며 z/OS, VME, 유닉스, 윈도우와 같은 다양한 운영 체제에서 구동된다. 1997년 가트너 그룹은 전 세계 비즈니스의 80%가 200,000,000,000줄 이상의 코드의 코볼을 실행하였고 한 해에 5,000,000,000줄 이상이 작성되고 있다고 보고했다.
20세기 말 무렵, 2000년 문제(Y2K) 해결을 위해 코볼 프로그래밍 노력이 상당 부분 집중되었으며 가끔은 10년 전에 시스템을 개발했던 동일 프로그래머들에 의해 수행되었다. 코볼 코드를 고치는데 필요한 일정 수준의 노력이 상당량의 비즈니스 지향 코볼에 전가되었는데, 사무 응용 프로그램들이 날짜를 사용하는 정도가 심했기 때문이다. 그 외에 고정 길이 데이터 필드에도 영향을 주었다.
2006년과 2012년에 컴퓨터월드 조사에 따르면 조직 중 60%가 코볼을 (C++, 비주얼 베이직 닷넷보다 더) 사용하였으며 코볼은 자사 내부 소프트웨어 다수에 사용되었다. 관리자 중 36%가 코볼로부터 이관할 예정이라고 언급했으며, 25%는 값이 더 저렴해진다면 그러할 의향이 있다고 밝혔다. 일부 기업체는 그들의 코볼 프로그램들을 유지보수하면서도 그들의 시스템을 값비싼 메인프레임에서 더 값싼 더 현대적인 시스템으로 이관해오고 있다.
코볼은 영어와 같은 문법을 가지고 있으며, 프로그램 안의 거의 모든 것을 기술하는데 사용된다. 예를 들어, 조건은 로 표현할 수 있고, 더 간결하게는 나 로 표현할 수 있다. 더 복잡한 조건들은 반복되는 조건과 변수들을 제거하여 축약할 수 있다. 이를테면 는 로 줄일 수 있다. 영어와 같은 문법을 지닌 코볼은 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은 프로그램의 문을 포함한다. 각 구역은 섹션으로 다시 구분되며 섹션은 여러 문단으로 이루어진다.
코드 포맷.
코볼은 두 가지 포맷으로 작성할 수 있다: 고정 포맷 (기본값), 자유(free) 포맷. 고정 포맷의 경우 코드는 특정 이름에 맞추어 정렬하여야 한다. 코볼 2002까지는 아래와 같았다:
코볼 2002는 또한 자유 포맷 코드를 도입하였다. 자유 포맷 코드는 마치 더 새로운 프로그래밍 언어들에서처럼 파일의 어느 열에나 위치할 수 있다. 주석은 codice_2을 이용하여 지정하며 어느 곳에서 위치해도 되고 고정 포맷 소스 코드에도 사용할 수 있다. 계속행은 존재하지 않으며 codice_3라는 지시자는 codice_4 지시자를 대체한다.
IDENTIFICATION DIVISION은 다음의 코드 개체를 식별하고 클래스나 인터페이스의 정의를 포함한다.
객체 지향 프로그래밍.
클래스와 인터페이스라는 개념은 2002년 이후로 코볼에 포함되고 있다. 클래스에는 클래스 메소드와 변수, 인스턴스 오브젝트를 포함하는 팩토리 오브젝트(factory object)와 인스턴스 메소드와 변수를 포함하는 인스턴스 오브젝트(instance object)들을 갖고 있다. 상속과 인터페이스들은 다형성을 제공한다.
제네릭 프로그래밍 지원은 매개변수 방식의 클래스들을 통해 제공되며, 클래스나 인터페이스를 사용하여 예를 들 수 있다. 오브젝트들은 특정한 종류에 제한을 두기 위해 참조용으로 저장된다. 이른바 두 종류의 메소드가 있다.: 문 (과 매우 비슷하게 동작), 인라인 메소드 호출(함수를 사용하는 것과 비슷).
INVOKE my-class "foo" RETURNING var
MOVE my-class::"foo" TO var *&gt; 인라인 메소드 호출
코볼은 메소드를 숨기는 방식은 제공하지 않는다. 클래스 데이터는 숨길 수 있지만, 사용자가 그것에 접근하지 못하도록 절 없이 선언한 경우에야 가능. 메소드 오버로드는 코볼 2014에 추가되었다.
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은 여섯 개의 섹션으로 나뉘며 각기 다른 항목들을 선언한다. 파일 레코드의 경우 FILE SECTION, 정적 변수의 경우 WORKING-STORAGE SECTION, 매개변수와 반환값의 경우 LINKAGE SECTION, 텍스트 기반 사용자 인터페이스의 경우 REPORT SECTION과 SCREEN SECTION이 있다.
데이터 집합.
코볼의 데이터 항목들은 데이터 항목이 다른 것의 일부인지를 지시하는 줄 번호를 사용하여 계층적으로 선언한다. 더 높은 수준의 번호에 위치한 항목은 더 낮은 번호의 항목에 종속된다. 번호 1을 가진 최상위 데이터 항목들은 레코드(record)라고 한다. 종속된 데이터 집합을 지닌 항목들은 그룹 항목(group item)이라고 하며, 이들을 기초 항목(elementary item)이라 부르지는 않는다. 표준 데이터 항목들을 기술하는데 쓰이는 계층적 번호들은 1부터 49 사이에 위치한다.
01 some-record. *&gt; 집합 그룹 레코드 항목
05 num PIC 9(10). *&gt; 기초 항목
05 the-date. *&gt; 집합 하위 그룹 레코드 항목
10 the-year PIC 9(4). *&gt; 기초 항목
10 the-month PIC 99. *&gt; 기초 항목
10 the-day PIC 99. *&gt; 기초 항목
종속 항목들은 (또는 )이라는 키워드를 함께 사용하면 동일 이름의 항목을 구분할 수 있다. 이를테면 위의 예제 코드가 다음의 예제 코드와 나란히 있다고 하자:
01 sale-date.
05 the-year PIC 9(4).
05 the-month PIC 99.
05 the-day PIC 99.
, , 라는 이름들은 그 자체로 혼동이 있는데, 그 이유는 에 위치한 항목들과 에 위치한 항목들이 동일한 이름으로 정의되어 있기 때문이다. 특정 데이터 항목(예를 들어 그룹에 속하는 항목의 하나)을 지정하려면 프로그래머는 또는 를 사용하면 된다. (이러한 문법은 마치 최근의 언어에서 지원되는 닷 노테이션/dot notation과 비슷함)
그 밖의 데이터 수준.
66이라는 수준의 번호는 항목의 구조화와는 관계 없이 이전에 정의된 항목들을 다시 묶는 것을 선언하기 위해 쓰인다. 절과 함께 쓰이는 이 데이터 수준은 거의 쓰이지 않으며 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 수준 데이터 항목 , 을 선언하며, 이들은 다른 어떠한 데이터 항목들과도 종속되지 않고 독립적인, 그룹에 속하지 않은 데이터 항목들이다:
77 property-name PIC X(80).
77 sales-region PIC 9(5).
88 수준의 번호는 조건명을 선언하며, 부모 데이터 항목이 그 절안에 지정된 값들의 하나를 포함할 때 참이다. 이를테면 다음의 코드는 두 개의 88 수준의 조건명 항목들을 정의하며, 데이터 항목의 현재 문자 데이터 값에 따라 참이냐 거짓이냐가 결정된다. 해당 데이터 항목에 라는 값이 포함되는 경우 조건명 은 참이지만, 나 라는 값이 포함되면 조건명 가 참이다. 데이터 항목에 그 밖의 다른 값이 포함되어 있으면 조건명은 거짓이다.
01 wage-type PIC X.
88 wage-is-hourly VALUE "H".
88 wage-is-yearly VALUE "S", "Y".
자료형 안전은 코볼 안에서 변칙적이다. 수치 데이터는 각기 다른 표현들과 크기들로 조용히 변환되며 영숫자 데이터는 숫자와 그룹 데이터를 포함하여 문자열로 저장될 수 있는 어떠한 데이터 항목에라도 올 수 있다. 반면에 오브젝트 참조들과 포인터들은 동일한 종류의 항목들로부터만 할당을 받을 수 있으며 이들의 값들은 그 종류에 제한을 받는다.
PICTURE 절.
또는 절은 문자들의 문자열로, 각각이 데이터 항목의 일부분임과 동시에 무엇이 포함될 것인지를 대표한다. 일부 PICTURE 문자들은 데이터의 종류 및 얼마나 많은 문자열이나 숫자들을 메모리에 차지하게 할 것인지를 지정한다. 이를테면 은 10진수를 가리키며 는 항목이 부호가 있음을 가리킨다. 그 밖의 PICTURE 문자들(삽입 및 편집 문자)은 어떻게 항목이 형식을 가져야 하는지를 지정한다. 이를테면 일련의 문자들은 문자의 위치뿐 아니라 선두가 되는 부호가 어떻게 마지막 문자 데이터 내에 위치할 것인지를 정의한다. 즉, 맨 오른쪽에 있는 숫자가 아닌 문자는 항목의 부호를 포함하겠지만, 이 위치의 왼쪽에 있는 에 일치하는 다른 문자 위치들은 공백을 포함하는 식이다. 반복되는 문자들은 PICTURE 문자 뒤의 괄호에 숫자를 넣어서 더 간결하게 지정할 수 있다. 이를테면 는 와 같다. ()와 부호 ()만을 포함하는 PICTURE 사양들은 순수하게 숫자 데이터 항목들만 정의하고 있지만, 영문자()나 영숫자()를 포함하는 PICTURE 사양들은 영숫자 데이터 항목을 정의한다. 그 밖의 형식의 문자로는 편집된 숫자(edited numeric)나 편집된 영숫자(edited alphanumeric) 데이터 항목들로 정의된다.
USAGE 절.
절은 데이터가 저장되는 포맷을 선언한다. 자료형에 따라 절을 보완하거나 해당 절 대신 사용할 수 있다. 포인터와 오브젝트 참조를 선언하는데 사용할 수 있지만, 대개는 수치 자료형을 지정하기 위해 존재한다. 이러한 수치 자료형은 다음과 같다:
보고서 작성기.
보고서 작성기(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.
4개의 문들이 보고서 작성기를 제어한다: 는 인쇄를 위해 보고서 작성기를 준비한다. 는 보고서 그룹을 인쇄한다. 는 보고서 그룹의 인쇄를 숨긴다. 는 보고 처리를 끝낸다. 위의 판매 보고서의 예를 기준으로 PROCEDURE DIVISION은 다음의 모습과 같이 되어 있다:
OPEN INPUT sales, OUTPUT report-out
INITIATE sales-report
PERFORM UNTIL 1 &lt;&gt; 1
READ sales
AT END
EXIT PERFORM
END-READ
VALIDATE sales-record
IF valid-record
GENERATE sales-on-day
GENERATE invalid-sales
END-IF
TERMINATE sales-report
CLOSE sales, report-out
프로시저.
PROCEDURE DIVISION(통틀어 프로시저로 호칭)에 위치한 섹션과 문단은 레이블과 단순한 함수로 사용할 수 있다. 다른 디비전들과 달리 문단은 섹션 안에 꼭 올 필요는 없다. 실행은 프로그램의 프로시저를 통해 종료가 될 때까지 내려간다.
동사를 사용하면 프로시저를 함수로 쓸 수 있다. 이를 통해 제어권을 특정한 범위의 프로시저들에 넘긴 다음 마지막에 다다를 때에만 복귀한다.
특이한 제어 흐름은 지뢰를 만들어낼 수 있는데, 여기서 지뢰는 수행된 프로시저의 제어권을 예측하지 못한 시간대에 예측하지 못한 장소로 돌아오는 문제를 야기한다. 프로시저들은 세 가지 방법으로 접근할 수 있다: 1) 문으로 호출, 2) 문으로 넘어옴, 3) 윗 문단의 아랫 부분으로 빠지면서 수행되는 실행을 통해. 이들을 결합해 사용하면 미정의 동작을 일으켜 지뢰를 만들어낸다.
화면이 유효하지 않으면 제어권은 섹션으로 넘어가며, 완료 시 을 수행한다. 이러한 재귀 현상은 미정의 동작을 일으켜서, 수행 중인 프로시저들이 두 개가 존재하게 된다. 이 지뢰는 끝에 도달할 때 폭파되며, 두 위치 중 한 곳으로 돌아올 수 있음을 의미한다:
문.
제어 흐름.
코볼의 조건문으로는 와 가 있다. 는 마치 여러 개의 값들과 조건들을 평가하는 기능이 추가된 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
END-EVALUATE
문은 조건이 참이 될 때까지 실행하는 반복문을 정의한다. (다른 언어들의 wihle과는 다름) 프로시저들이나 일정한 범위의 프로시저들을 호출하기 위해서도 쓰인다. (프로시저 단락 참고) 와 는 각각 하위 프로그램들과 메소드를 호출한다. 하위 프로그램/메소드의 이름은 리터럴이나 데이터 항목이 되는 문자열 안에 포함된다. 매개변수들은 참조에 의해서나 내용을 통해서나(사본이 참조에 의해 전달될 때) 값에 의해(프로토타입을 이용할 수 있는 경우에만) 전달할 수 있다. 은 하위 프로그램들을 메모리로부터 해제한다. 절들은 프로그램이 지정된 프로시저로 건너뛰게 한다.
문은 반환문이며 문은 프로그램을 정지시킨다. 문에는 각기 다른 형식이 있다: 반환문, break 문, continue 문, 끝 표시기(end marker) 또는 프로시저를 빠져나는 기능으로 사용할 수 있다.
예외는 문을 통해 발생시킬 수 있으며 PROCEDURE DIVISION의 부분에 정의되는 핸들러(declarative로 부름)에 의해 포착된다. DECLARATIVES는 문으로 시작하는 섹션들이며, 다루어져야 할 오류를 지정한다. 예외는 이름이나 오브젝트가 될 수 있다. 은 DECLARATIVE 안에서 사용할 수 있으며, 밖의 프로시저나 예외를 일으킨 지점 이후의 문으로 건너뛸 수 있다. 다른 언어들과는 달리 포착되지 못한 예외들은 프로그램을 끝내지 못하며 프로그램은 영향을 받지 않은 채로 계속 실행된다.
파일 입출력은 자체 기술되는 , , , 문들에 의해 처리되며, 이들은 다음의 세 가지와 나란히 쓰인다: 는 레코드를 업데이트한다. 는 특정 키로 레코드를 찾음으로써, 접근할 차기의 레코드를 선택한다. 은 마지막으로 접근한 레코드의 락을 해제한다.
데이터 조작.
파일과 테이블은 를 이용하여 정렬하고 동사는 파일을 병합하고 정렬한다. 동사는 정렬할 레코드를 제공하고 은 정렬된 레코드를 순서대로 검색한다.
범위 종단.
, 와 같은 일부 문들은 스스로가 문들을 포함할 수 있다. 이러한 문들은 두 가지 방법으로 끝을 맺는다:
IF invalid-record
IF no-more-records
NEXT SENTENCE
READ record-file
AT END SET no-more-records TO TRUE.
AT END SET no-more-records TO TRUE
구두점으로 끝나는 내재(nested)된 문들은 버그의 근원이 된다. 이를테면 다음의 코드를 살펴보자:
IF x
DISPLAY y.
DISPLAY z.
여기서 조건 codice_8가 참일 때 codice_9와 codice_10를 모두 보여주는 것이 프로그래머의 의도이다. 그러나 실제로는 codice_1 문에서 실수로 뒤에 구두점을 잘못 넣었기 때문에 codice_8의 값이 무엇인지에 관계 없이 codice_10가 표시된다.
IF y
DISPLAY a
DISPLAY b.
위의 부분에서 codice_15는 문이 아니라 문에 연결되며 버그가 발생한다. 명시적 범위 종단자들이 도입되기 전까지 이러한 버그를 예방하려면 를 안쪽 codice_1 뒤에 위치시켜야 했다.
원래의 코볼 사양은 악명이 높은    문을 지원하였고, 이를 위해 수많은 컴파일러들이 자체 수정 코드를 생성하였다. codice_18와 codice_19는 프로시저의 레이블이고, 문 뒤에 실행되는 프로시저 codice_18 안의 하나의    문은   를 의미한다.
코볼의 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
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 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
비평과 옹호.
구조의 결여.
1970년대에 프로그래머들은 구조적이지 않은 스파게티 코드를 구조적 프로그래밍 패러다임으로 옮기기 시작하였다. 컴퓨터 과학자이자 튜링상을 받은 에츠허르 데이크스트라는 "코볼을 이용하는 일은 마음을 무력하게 만든다. 이에 대한 교리는 범죄 공격으로 여겨진다."고 강조하면서 편집장에게 보내는 "어떻게 우리가 상처를 줄 수 있는 진실을 이야기하는가?"라는 제목의 1975년 편지에서 동시대 코볼의 일부를 비평하였다.
스파게티 코드의 한 가지 이유는 문이다. 문을 코볼 코드에서 제거하려는 시도는 그러나 난해한 프로그램들을 만들고 코드 품질을 떨어트렸다. 문은 대체적으로 문과 프로시저로 대체되었는데 이로 말미암아 모듈식 프로그래밍을 촉진시켰고, 강력한 반복 기능으로 손쉬운 접근을 가능케 했다. 그러나 문은 오직 프로시저와 함께 쓰일 수 있으므로 반복문은 이들이 사용하는 곳에 위치되지 않아 프로그램을 이해하기 더 어렵게 만들게 된다.
코볼 프로그램들은 이음매가 없고 모듈성이 결여된 점으로 악명이 높았다. 코볼 코드는 프로시저를 통해서만 모듈성을 이룰 수 있어 대형 시스템에서는 부적절한 것으로 알려져 있었다. 데이터로의 접근을 제한하는 것이 불가능하였는데, 다시 말해 프로시저 하나가 어떠한 데이터 항목이라도 접근하여 수정할 수 있었다. 게다가 매개변수를 프로시저에 보내는 방법이 없었는데, 이를 빠트린 것을 두고 진 사멧은 위원회의 최대 실수로 간주하였다. 또다른 복합적 문제는 codice_21 기능에서 비롯한다. 제어권이 어떠한 프로시저로 점프할 수 있고 어떠한 프로시저로부터 반환을 받을 수 있다는 것을 말하며, 이는 난해한 제어 흐름을 만들고 프로그래머가 하나의 입구, 하나의 출구(single entry, single exit) 규칙을 무너뜨릴 가능성이 있다.
이러한 상황은 코볼이 더 많은 기능을 채용하면서 개선되었다. 코볼-74는 하부 프로그램들을 추가하여 프로그래머들에게 각 프로그램 부분이 접근할 수 있는 데이터를 제어하는 기능을 제공하였다. 그 뒤로 코볼-85는 내재형 하위 프로그램(nested subprogram)을 추가하여 프로그래머들이 하위 프로그램들을 숨길 수 있게 하였다. 데이터와 코드의 추가적인 제어는 2002년에 도입되어 객체 지향 프로그래밍, 사용자 지정 함수, 사용자 지정 자료형이 포함되었다.
코볼은 이식성이 높은, 공통으로 쓰이는 언어를 목표로 개발된 언어였다. 그러나 2001년까지 대략 300개의 방언이 만들어졌다.
코볼-85는 그 이전의 버전들과 완전히 호환되지 못했고 이에 대한 개발은 논란이 있었다. 트래블러스 인슈런스(Travelers Insurance)의 CIO 조지프 T. 브로피는 막중한 프로그래밍 비용을 들이는 코볼 사용자들에게 새로운 표준의 구현을 알리는 일을 진두지휘하였다. 그 결과 ANSI 코볼 위원회는 2,200장 이상의 편지를 받았는데 대부분 부정적이었고 위원회가 변경을 취할 수 밖에 없게 만들었다. 한편, 코볼-85로의 전환은 그 뒤의 수년 동안 생산성 증가를 가져올 것으로 여겨졌고 변환 비용을 정당화시킬 수 있었다.
장황한 문법.
코볼 문법은 장황하다는 이유로 자주 비판을 받아왔다. 지지자들은 이것이 코드를 자체 문서화하여 프로그램 유지보수를 쉽게 하기 위한 것이라고 말한다. 또, 코볼은 프로그래머들이 배우고 쓰기 쉽게 하기 위해 만들어졌지만 관리자들과 같은 비기술 종사자들에게도 읽힌다. 가독성에 대한 열망으로 인해 명사, 동사, 절, 문장, 섹션, 디비전과 같은 영어와 비슷한 문법과 구조 요소들을 이용하게 되었다. 코볼 프로그램을 유지보수하는 사람들은 1984년까지는 이해하기 어려운 코드를 다루는데 고심해야 했으며 코볼-85의 주요 변경 사항들은 유지보수를 쉽게 할 수 있게 도와준다.
단기 위원회 구성원인 진 사멧은 "전문 프로그래머에게 제공하려는 시도는 거의 없었다. 주된 관심거리가 프로그래밍인 사람들은 코볼을 매우 언짢게 생각하는 경향이 있다."고 언급하며 그녀는 이를 코볼의 장황한 문법 때문인 것으로 보았다.
코볼 공동체는 늘 컴퓨터 과학 공동체와는 분리되어 왔다. 어떠한 학술 컴퓨터 과학자들도 코볼의 설계에 참여하지 않았다. 위원회에 속한 전원이 상업 분야나 정부 쪽 출신이었다. 당시 컴퓨터 과학자들은 코볼 개발이 씨름하던 상용 파일 처리 문제 보다 수치 분석, 물리학, 시스템 프로그래밍과 같은 분야에 더 관심이 많았다. 진 사멧은 우아하지 못함, 설계 과정에 참여할 영향력 있는 컴퓨터 과학자들의 부족, 사무용 데이터 처리를 업신여기는 것 때문에 코볼의 인기가 없던 것을 초기의 잘난체 반응 때문인 것으로 보았다.
코볼 사양은 새로운 배커스-나우르 표기법이 아닌, 고유한 표기법이나 메타 언어를 사용했는데 그 이유는 이를 들었던 위원회 구성원들이 얼마 없었기 때문이었다. 이로 인해 가혹한 비평을 받았다.
나중에 코볼은 코볼을 아우르는 자료의 부족으로 고통을 받았다. 소개 서적들이 등장하는데 1963년까지 그러하였다. 미국 의회도서관에는 포트란의 경우 코볼의 2배 분량의 서적이, 베이직의 경우 코볼의 4배 분량의 서적이 있었다. 대학 교수들은 직업 학교용으로 간주된 코볼 대신 더 현대적인, 최신식의 언어들과 테크닉을 가르쳤다. CODASYL 코볼 위원회의 의장인 도널드 넬슨은 1984년에 "학계가 ... 코볼을 싫어한다"고 말했고 컴퓨터 과학 동문들은 "'코볼이 싫다'라는 것을 그들에게 주입시켰다"고 말했다. 마이크로 포커스의 2013년 조사에 따르면 대학 학계의 20%는 코볼은 구식이거나 죽었다고 생각했으며 55%는 그들의 학생들이 코볼이 구식이거나 죽었다고 생각하였다고 믿었다. 동일 조사에서 60%가 코볼을 가르쳐야 한다고 생각함에도 불구하고 학계의 25%만이 그들의 교육과정에 코볼 프로그래밍이 있었다. 반면, 2003년 코볼은 미국에서 정보 시스템 교육과정의 80%에 특별히 포함되었는데 이는 C++와 자바의 비율과 동일하다.
설계 과정에 대한 걱정.
COBOL 2002도 5년이 늦었으며, COBOL 2014는 6년이 늦었다. 지연을 방지하기 위해 표준 위원회는 다음 표준 리비전을 기다리지 않고 더 빨리 추가 기능을 더 빠르게 추가하는 선택적인 부록을 만드는 것을 허용하였다. 그러나 일부 위원회 구성원들은 구현체와 표준의 잦은 수정 간에 따르는 비호환성에 대해 걱정을 드러냈다.
코볼의 자료 구조는 뒤에 나온 프로그래밍 언어들에 영향을 주었다. 레코드와 파일 구조는 PL/I과 파스칼에 영향을 주었고, 절은 파스칼의 변종 레코드의 이전 것이었다. 분명한 파일 구조 정의들은 데이터베이스 관리 시스템의 개발보다 앞섰고 수집된 데이터는 포트란의 배열보다 훨씬 더 앞선 것이었다.
이식성과 표준화에 초점을 둠에 따라 코볼로 작성된 프로그램들은 이식이 가능하였고 언어가 다양한 하드웨어 플랫폼과 운영 체제에 안착할 수 있었다. 게다가 잘 정의된 디비전 구조는 ENVIRONMENT DIVISION의 외부 참조 정의를 제한함으로써 특히 플랫폼 변경을 단순화하는 일에 기여하였다.
스피큘()은 태양에 존재하는 직경 약 500km의 활동적인 제트 기체이다. 스피큘은 광구로부터 20km/s 정도의 속도로 위로 솟구쳐 오른다. 스피큘은 1877년 로마 바티칸 천문대의 안젤로 세치 신부에 의해 발견되었다. 채층은 스피큘만으로 이루어져 있다.
스피큘은 대략 5~10분 정도 지속된다. 태양의 가장자리에 있는 스피큘의 경우는 마치 가늘게 뻗어나와있는 실처럼 보인다. 스피큘은 대개 고자기다발의 영역과 관련 있으며, 질량다발은 태양풍에 비해 100배 정도의 수치이다.
한번에 태양에서 10000에서 70000에 달하는 활동적인 스피큘이 생긴다. 개개의 스피큘은 일반적으로 광구위의 3000-10000km의 고도에까지 도달한다.
캘리포니아주 팔로 알토의 록히드 마틴 태양 우주물리 연구소의 바트 드 폰티유와 영국 셰필드 대학의 로버트 에르델류와 제임스 P.스튜어트는 2004년 스피큘이 태양 표면의 P모드 진동의 결과로 생긴다는 가설을 세웠다. P모드 진동은 수백 m/s의 속도로 태양 표면이 상승하고 하강하는 약 5분간의 음파이다. 수직에서 기울어진 자기다발관은 상승하는 물질을 집중하고 안내하여 태양 대기로 보내 스피큘을 형성한다. 그러나 태양 물리학자 사이에는 이러한 설명에 관해 반론도 있다.
신상호(申相鎬, ? ~ ?)는 대한제국과 일제강점기의 경찰관으로, 충청북도 지역의 의병 운동 진압에 가담했다. 본관은 평산이다.
1908년부터 충북 영동에서 영동경찰분서 소속 경부로 근무했다. 1910년 한일 병합 조약 체결로 조선총독부 산하의 영동경찰서 경부가 되었고, 이 직위에서 1913년까지 근무했다.
1907년 옥천 지역에서 부호의 집을 습격하여 군자금을 모집하던 의병 민한식과 이향운, 곽준희 등 6명의 재판 기록에 신상호가 심문했다는 내용이 들어 있다. 이들은 재판 결과 징역 5년형에서 10년형을 선고받았다. 의병 박동춘, 김달용을 심문했고, 토벌 작전에 쫓겨 도망 중이던 의병 정경수를 일본인 경찰들과 함께 체포하는 데 주도적인 역할을 하기도 했다.
투드할리야 2세는 히타이트 제국(신왕국)의 왕(제위 1385~1380)이었다. 그의 치세에 히타이트 제국은 심각한 영토의 손실을 겪었다. 수도조차도 불타버렸다. 그러나 투드할리야의 아들의 유능한 안내로 히타이트는 복구를 시작하는 한편 투드할리야는 여전히 왕이었다. 그는 3세로 기록되기도 하였다.
하투실리 2세는 기원전 14세기 히타이트 제국의 왕이었다.(약 1370년대~1360년대) 그의 존재는 논쟁의 대상이다. 무와탈리 2세와 탈미사루마(알레포)간의 조약에서 하투실리라는 지배자가 나오지만 알려지지 않은 히타이트 지배자인지 하투실리 1세인지 논쟁되고 있다.
투드할리야 3세(Tudhaliya III, 제위 기원전 1358년)는 히타이트 제국의 단명한 왕이다. 그는 하투실리 2세의 아들로 계승자일 수 있지만 정상적으로 투드할리야 2세의 아들로 다음 계승자로 보지만 그는 왕도 아니었던 것 같다. 히타이트 문헌들은 그를 작은 투드할리야로 언급한다.
그는 그의 후계자 아마도 형제인 수필룰리우마 1세를 포함한 장군들에 의해 살해되었다. 이 투드할리야는 보통 히타이트 왕목록에 포함되지 않고 그의 아버지가 투드 할리야 3세로 목록화되기도 하였다.
수필룰리우마 1세(Šuppiluliuma I)는 히타이트 왕(재위: 기원전 1358년 ~ 기원전 1323년)이었다. 그는 위대한 전사로 그리고 정치 지도자로 명성을 획득하였는데 당시에 강대국 이집트 제국과 지중해와 유프라테스 사이의 땅에서 도전하였다.
히타이트 장군.
수필룰리우마 1세는 투드할리야 3세의 아들로 왕위에 오르기 전부터 외국 군대의 침입을 막는 군 사령관으로서 두각을 드러냈다. 그는 히타이트 사무하를 거점으로 북쪽의 카쉬카족을 성공적으로 막아냈다. 다음으로 그는 서쪽의 카슈야 지역과 훌라나 강 유역에 대한 통제권을 회복하고 보호하기 위해 침략자들에게 반격을 가했다. 이후 피야필리 휘하의 카쉬카족이 또 침공했으며, 이번에는 북동쪽의 아지-하야사의 카라니 왕과도 싸워야했다. 피야필리는 수필룰리우마 1세의 상대가 되지는 않았다. 카라니는 히타이트 영토를 침공하고 심지어 사무하까지 위협했지만, 투드할리야 3세와 수필룰리우마 1세에게 패배하고 오히려 아지-하야사까지 밀리게 된다. 쿠마하(혹은 케마) 전투에서도 히타이트가 승리한 것으로 보이는데, 이후 아지-하야사는 히타이트의 봉신으로 발견되기 때문이다.
북쪽에서 대승을 거둔 투드할리야 3세는 히타이트 수도인 하투샤로 돌아갈 수 있었다. 수필룰리우마 1세는 아르자와에 맞서 남서쪽으로 보내졌으며, 그 곳에서도 여러 번 승리하여 살라파레, 투와누와(혹은 티아나), 타르훈타샤까지 되찾는다. 기원전 1350년대 말, 아르자와의 안자파하두는 히타이트 장군 히무이를 격파했으나, 수필룰리우마 1세가 직접 이끄는 또 다른 침공에는 굴복해야했다. 결국 아르자와 또한 히타이트에게 정복당했다.
투드할리야 3세가 사망하자, 왕위는 그의 아들인 '젊은 투드할리야'에게 계승되었어야 했습니다. 슈필룰리우마를 비롯한 히타이트 지배층은 이미 그에게 충성을 맹세한 바가 있었다. 그가 몇몇 형제들과 함께 슈필룰리우마의 지지자들에게 살해되기 전, '젊은 투드할리야'가 실제로 왕위에 올랐었는지는 명확하지 않다. 투드할리야 3세의 최고 군 사령관으로 오랫동안 함께 했던 슈필룰리우마 1세가 이제 왕이 되었습니다. 훗날 '젊은 투드할리야'의 암살은 신탁에 의해, 슈필룰리우마의 아들이자 두 번째 후계자인 무르실리 2세의 통치 기간까지 20년 동안 히타이트 왕국을 황폐화시킨 역병의 원인으로 지목되었습니다. 전통에 따라, 선왕의 미망인이었던 다두-헤바는 사망할 때까지 '타와난나'라는 수석 왕비 칭호를 계속 유지했습니다.
수필룰리우마는 누이를 하야산 왕 훜카나에게 시집을 보내고 그의 딸 무와티를 아르자와국 뮈라의 마스크휠루와에게 보냈다. 그는 아르자와 영토를 하팔라까지 다시 얻었다. 그의 가장 영원한 승리는 미탄니왕국에서 얻은 것이다. 미탄니 왕국을 그는 그의 사위 샤티와자 아래의 속국으로 축소하였다. 그는 역시 돌 릴리프로 장식된 큰 석재 구조의 제왕 건축가이기도 하였다. 그의 치세중에 왕족 지도자의 고귀한 특성의 개념이 개발되었다.
수필룰리우마는 그 후 파라오 아크나톤의 떠들석한 치세를 이용하였고 시리아에서의 이집트 영토를 장악하였다. 그리고 많은 이집트 속국을 반란하게 자극하였다.
이후 투탕카멘이 이집트 왕으로 되었는데, 안타깝게도 그는 18세의 젊은 나이로 사망하였다. 그러자 그의 미망인인 안케세나멘이 수필룰리우마에게 편지를 보내왔다. 그 내용은 수필룰리우마의 아들이 그녀의 남편이 되어 이집트를 다스릴 것을 요구하는 내용이었다. 투탕카멘은 왕자를 남기지 않았으며, 안케세나멘은 투탕카멘 시절의 권력자 아이와 강제로 결혼할 처지였다. 수필룰리우마는 대사를 이집트로 보내 이 사실을 조사하게 하였다.
그는 편지가 상황이 정확히 기록되었다고 보고하였고 왕은 이 뜻밖의 기회를 이용하기로 결정하였다. 불행히도 왕자 잔난자는 도중에 피살되고 결혼 동맹은 결국 승인되지 않았다. 수필룰리우마는 이번에는 매우 진노하여 가나안과 북시리아의 이집트 속국을 그의 군대로 해방시켰고 많은 영토를 포획하였다.
이란–콘트라 사건(, ), 이란-콘트라 스캔들, 또는 간단히 이란-콘트라는 레이건 행정부의 두번째 임기 때 미국에서 발생한 정치적 스캔들이다. 이란에서는 맥팔레인 사건이라고 불린다. 고위 행정 관료들은 비밀리에 무기 제재의 대상이었던 이란 이슬람 공화국의 호메이니 정부에 비밀리에 무기의 판매를 허용했다. 레이건 행정부는 니카라과의 콘트라에 자금을 지원하기 위해 무기 판매 과정을 이용하기를 바랐다 볼란드 개정을 통해, 미국 정부가 콘트라를 지원하는 것은 미국 의회에서 금지되었다.
무기 선적을 위한 공식적인 정당성은 이슬람 혁명 수비대와 연결된 무장 수비대 헤즈볼라에 의해 레바논에 포로로 갇힌 7명의 미국인 인질을 석방하기 위한 작전의 일부였다는 것이었다. 레이건 행정부 내의 몇몇은 이런 무기 판매가 이란에 영향을 주어 헤즈볼라가 인질을 석방할 것이라고 희망했다. 그러나 이란에 승인된 첫 무기 판매는 1981년으로, 헤즈볼라가 레바논에서 미국인을 인질로 잡기 이전이었다.
1985년 말, 미국 국가안전보장회의의 올리버 노스 중령은 이란에 판매하는 무기의 수익금의 일부를 니카라과의 사회주의 정부에 맞서 싸우는 반산디니스타 반군 연합인 콘트라에 투자하기 위해 전용했다. 미국 대통령 로널드 레이건은 콘트라 반군의 강경한 지지자였지만, 그가 개인적으로 콘트라에 자금을 전용하는 것을 승인했는 지에 대해서는 증거에 논란이 있다. 미국 국방부 장관 캐스퍼 와인버거가 1985년 12월 7일 손으로 적은 기록은, 레이건이 이란과 인질을 교환할 가능성과 이란 내에서 "중요한 요소"를 위해 HAWK와 TOW 미사일을 판매할 수 있음을 인지하고 있었다. 와인버거는 레이건이 "그는 불법 혐의에 대해서는 답변할 수 있지만 '거대 강자인 레이건 대통령이 인질들을 석방할 기회를 놓쳤다'는 혐의에 대해서는 답변할 수 없었다"고 말했다고 적었다. 1986년 11월 무기 판매가 밝혀진 후, 레이건은 국영 TV에 출연하여 무기 이전이 실제로 일어났지만, 미국은 인질들과 무기를 교환하지 않았다고 말했다. 레이건 행정부 관리들이 이 사건과 관련된 많은 양의 문서를 파기하거나 수사관들을 제지하면서 수사가 지연되었다. 1987년 3월 4일, 레이건은 이 사건에 대한 전적인 책임을 지고 전국적으로 방송된 연설에서 "이란에 대한 전략적 개방으로 시작된 것이 인질과 무기를 교환하는 것으로 악화되었다"고 말했다.
미국 의회와 레이건이 임명한 타워 위원회의 3명이 이란-콘트라 사건을 조사했다. 두 조사 모두 레이건 대통령 자신이 여러 계획의 정도를 알고 있다는 증거를 찾지 못했다. 또한 로런스 월시 미 법무차관이 미국 특검청에 임명되었다.1986년 12월 특검은 그 계획에 연루된 관리들에 의한 가능한 범죄 행위들을 조사하기 위해 특별 검사를 실시했다. 결국 당시 국방부 장관 캐스퍼 와인버거를 포함한 수십 명의 행정부 관리들이 기소되었다. 11개의 유죄 판결이 나왔고, 그 중 일부는 항소심에서 기각되었다.
기소되거나 유죄 판결을 받은 나머지 사람들은 사건 당시 부통령이었던 조지 H. W. 부시 대통령 임기 마지막 날에 사면되었다. 전 독립 위원회 소속 웰시는 사면을 발표하면서 부시가 와인버거 재판 과정에서 드러난 증거에 의해 연루되는 것을 미리 차단한 것 같다면서 부시, 와인버거, 그리고 다른 레이건 행정부 고위 관리들에 의한 "기만과 방해" 패턴이 있다고 지적했다. 월시는 1993년 8월 4일에 최종 보고서를 제출했으며, 나중에 자문위원으로써 그의 경험을 '방화벽: 이란-콘트라 음모와 은폐'라는 책으로 저술했다.
1970년대부터 1980년대 초기까지 중동에서는 1979년 이란의 수도 테헤란에서 미국 대사관 직원 52명이 납치되는 사건이 발생하는 등 인질 사건이 끊이지 않았다. 1983년 이라크의 무장 정치 조직인 알다와는 헤즈볼라와 연계하여 쿠웨이트에서 미국인 6명을 포함한 외국인 30명을 인질로 납치한다. 미국은 이란이 헤즈볼라에 영향력을 발휘하여 인질이 석방되게 하는 조건으로 무기 판매를 제안한다.
당시 이란은 이라크와 전쟁 중이었기 때문에 무기가 필요했다. 한편에서는 미국이 이란-이라크 전쟁이 어느 일방의 승리로 끝나는 것을 원치 않았기 때문에 이란에 무기를 제공하였다는 주장이 있다.
콘트라 반군.
폭로.
레바논의 신문사인 아쉬시라(Ash-Shiraa)는 1986년 11월 3일 인질교환을 조건으로한 무기 판매를 최초로 보도한다. 그 후 미국의 CIA 공작원이었던 유진 하센퍼스가 니카라과 상공에서 총기를 투하하는 작전 중에 니카라과 정부에 의해 체포되었다. 이란 정부는 아쉬시라의 보도를 인정하였고 결국 로널드 레이건 미국 대통령은 11월 13일 텔레비전과의 인터뷰에서 "전략의 일환일 뿐"이라면서도 이란에 대한 무기판매를 인정하였다.
재판과 사면.
미 의회는 특별검사로 로런스 월시를 임명하여 사건을 수사하였으며, 1988년 존 포인덱스터, 올리버 노스 등 핵심 인물을 기소했다. 그러나 포인덱스터와 노스의 묵비권 행사와 미 행정부의 정보 공개 거부 및 문서 파기 등 조직적인 은폐에 의해 사건의 본질을 파헤치는데 실패했다.
1992년 미국 대통령 조지 H. W. 부시는 관련자 모두를 사면하였으며 이에 대해 "부시 자신이 이란-­콘트라 스캔들에 깊숙이 관여했음을 자인한 꼴"이라는 비난을 받기도 하였다. 조지 H. W. 부시는 레이건 정부의 부통령이었다.
숲 또는 임야(林野) 또는 삼림(森林)은 지구 전체 면적의 약 9.5%, 육지 면적의 약 30%를 차지하고 있는 나무가 우거진 곳이다. 주로 물의 순환, 토양의 생성과 보존에 영향을 주고 많은 생물의 서식지로서 기능을 하고 있으며, 지구에서 가장 중요한 요소들 중 하나이다.
임야는 숲과 들을 함께 부르는 말이며, 주로 법률이나 임업 또는 생태학 등에서 쓰이는 용어이고, 산림은 산에 있는 숲만을 가리키는 용어이다.
숲은 극지방, 고산지대, 사막과 같은 삼림한계선 이외의 지구 전역에 존재한다. 숲을 이루는 나무의 종류는 기후에 따라 다르다. 온대나 열대에서는 속씨 식물의 활엽수가 주종을 이루나, 냉대, 한대 기후에서는 구과 식물의 침엽수가 주종을 이루기도 한다. 그리고 숲은 1헥타르당 44명이 숨쉴 수 있는 산소를 제공해주며, 한 해에 68톤 정도 되는 먼지를 걸러낼 수 있다.
세계의 삼림 지역을 크게 침엽수림·활엽수림, 그리고 두 가지가 모두 공존하는 혼합림의 셋으로 분류하여 지역과의 관련을 살펴보면 다음과 같다. 침엽수림의 4분의 3은 툰드라와 온대림 사이에 있는 침엽수림대에 있다. 마찬가지로 활엽수의 4분의 3은 적도를 사이에 두는 벨트 안에 포함되며, 연간 강우량에 의해 열대우림에서 열대계절림, 사바나 숲으로 변화하고 있다. 열대림과 북부의 침엽수림대 사이에 위치하는 것이 온대림이다. 침엽수가 많은 온대림도 있지만 대부분은 혼합림 또는 활엽수가 많다. 1987년의 보고에 의하면 전세계에는 40억 6,854만ha(헥타르)의 삼림 면적이 있으며, 이 가운데 절반 이상의 삼림 면적(21억 6,651만ha, 53.3%)을 개발도상국이 차지하고 있으며, 그 대부분은 열대림이다. 그 중에서도 현재 문제가 되고 있는 것은 열대다우림의 감소이다. 주로 상록수림인 열대다우림은 고온 다습하고 일년 내내 비가 많이 내리는 적도 부근의 동남아시아, 남아프리카 중앙부, 중미에서 남미 북부, 오스트레일리아 동북부에 걸쳐 분포한다. 높이가 70m에 이르는 나무가 밀생하고 있는 열대다우림은 어느 정도의 파괴로는 전혀 변화가 없으나 실제로는 매우 약한 자연이다. 고온이기 때문에 토양 속의 유기물 분해가 빨라서 영양분이 금방 수목에 흡수되기 때문에 영양분을 함유한 표토(表土)의 두께는 불과 몇 센티미터밖에 안되고 토양은 빈약하다. 그래서 이를 '녹색의 사막'이라고 부르는 학자도 있다. 토양의 두께가 얇기 때문에 뿌리도 얕고, 50m나 되는 거목이라도 뿌리의 깊이는 1m도 채 되지 않는다. 열대우림은 이러한 약한 토양을 지키는 거대한 댐 역할을 하고 있다. 지상에 내린 비의 4분의 3이 삼림으로 흡수되고 나머지는 하천으로 흘러든다. 수목에 흡수된 수분은 증발하여 하늘로 올라가 다시 비가 되어 내린다. 그리고 그것이 반복됀다
'FAO 산림자원조사'의 정의.
수고가 최소한 5m이상 혹은 자생지에서 이 높이에 도달가능한 입목(tree)이 수관점유율(canopy cover) 10% 이상으로 최소면적 0.5ha 이상 점유하는 토지이다. 이때, 주로 농업용이나 도시용으로 이용되는 토지는 포함되지 않는다.
숲의 분류는 기준에 따라 다양하다. 다음은 생물 군계에 따른 숲의 분류이다.
또 다른 숲의 분류로 UNESCO의 '숲과 임야 분류'가 있으며 이 분류는 6개의 대분류로 나뉜 총 26종의 숲을 구분하여 표기하고 있다. 이 표기에 따른 숲의 구분은 다음과 같다.
숲 보전.
숲에 사는 여러 생물들이 환경과 맺는 관계를 연구하는 학문이 숲 생태학이다. 한편, 숲의 보전과 이용을 다루는 학문은 임학(林學)이라 한다. 임학은 최근 몇 세기 동안 숲의 이용에서 숲의 보전으로 주된 논의가 바뀌었으며 특히 1980년대 이후 "지속가능한 산림 경영()"이 대두되어 숲의 보전에 대한 논의가 활발히 이루어지고 있다.
숲의 보전에 악영향을 미치는 요소로는 산불, 산성비, 벌채, 외래종의 침입 등이 있다. 이 외에도 병충해, 가뭄 등으로 인해 숲이 줄어들고 있다. 또한 인간의 활동인 농업, 광산 개발 등과 같은 행위도 숲 보전을 방해하는 즉, 삼림파괴의 요소로 지적되고 있다. 지금 이 순간에도 매 2초마다 축구장 한 개 면적에 해당하는 숲이 벌채나 삼림파괴 행위로 지구상에서 사라지고 있다. 인도네시아 원시림의 72%, 아마존 원시림의 15%는 이미 사라졌다.
열대 우림(熱帶雨林, Tropical rainforest)은 일반적으로 적도를 기준으로 남북 10° 사이에 위치하며 비가 많이 내리고 울창하며 따뜻한 우림이다. 저지 적도 상록우림(lowland equatorial evergreen rain forests)이라고도 한다. 열대 우림은 대략 28° 위도(북회귀선과 남회귀선 사이의 열대 기후대) 내에 분포하는 열대림 생물 군계의 하위 집합이다. 진정한 열대 우림은 일반적으로 건기가 없는 열대 우림 기후에서 발생하며, 모든 달에 평균 강수량이 최소 이다. 열대 몬순 기후 또는 사바나 기후를 가진 계절성 열대림은 때때로 더 넓은 정의에 포함되기도 한다.