포트란 77
1. 개요
1. 개요
포트란 77은 1977년에 제정된 포트란 프로그래밍 언어의 ANSI 표준이다. 공식 표준 번호는 ANSI X3.9-1978이며, 1978년 4월에 공식 발표되었다. 이 표준은 1966년의 이전 표준인 포트란 66을 대체하고, 이후 1990년대에 등장한 포트란 90 표준의 기반이 되었다.
포트란 77은 과학 및 공학 계산 분야에서 수십 년간 사실상의 표준 언어로 자리 잡았다. 이 표준은 구조화 프로그래밍을 지원하는 제어 구조를 도입하고, 문자열 처리 기능을 개선하는 등 포트란 66의 주요 한계를 극복하고자 했다. 그 결과, 복잡한 수치 계산 프로그램을 보다 체계적으로 작성할 수 있게 되었다.
이 언어는 주로 벡터 프로세서나 슈퍼컴퓨터를 위한 대규모 수치 해석 및 시뮬레이션 소프트웨어 개발에 널리 사용되었다. 당시의 많은 상용 및 학술용 과학 계산 라이브러리들이 포트란 77로 작성되었으며, 그 영향력은 오랫동안 지속되었다.
2. 역사
2. 역사
포트란 77은 1978년 4월 ANSI에 의해 공식 표준(ANSI X3.9-1978)으로 채택되었다. 이는 1966년에 제정된 이전 표준인 포트란 66을 대체하며, 약 12년 만에 이루어진 주요 개정판이었다. 표준화 작업은 ISO와의 협력을 통해 진행되어 국제적으로도 널리 인정받는 기준이 되었다.
이 표준은 기존의 고정 형식 소스 코드를 유지하면서도 현대적인 구조화 프로그래밍의 요구를 부분적으로 수용하기 위해 언어를 확장했다. 특히 IF-THEN-ELSE 블록과 같은 향상된 제어 구조를 도입하여 프로그램의 논리적 흐름을 더 명확하게 구성할 수 있게 했다. 또한 문자열 데이터 타입에 대한 직접적인 지원이 추가되는 등 실용성이 크게 개선되었다.
포트란 77은 과학 및 공학 계산 분야에서 수십 년 동안 사실상의 표준 언어로 자리 잡았다. 그 영향력은 매우 커서, 이 표준을 기반으로 한 컴파일러와 수치해석 라이브러리가 광범위하게 개발되고 사용되었다. 이 시기의 포트란은 슈퍼컴퓨터와 벡터 프로세서에서의 고성능 컴퓨팅을 주도하는 핵심 도구였다.
포트란 77의 통합된 표준은 1990년대 초에 새롭게 등장한 포트란 90 표준에 의해 공식적으로 대체되기까지 장기간 사용되었다. 그러나 그 유산은 여전히 강력하여, 많은 레거시 과학 코드가 포트란 77 문법으로 작성되어 있으며, 현대적인 포트란 컴파일러들도 대부분 이 버전에 대한 호환성을 유지하고 있다.
3. 언어 특징
3. 언어 특징
3.1. 고정 형식
3.1. 고정 형식
포트란 77의 가장 큰 특징은 고정 형식 소스 코드를 사용한다는 점이다. 이는 포스트스크립트나 펀치 카드 시대의 유산으로, 프로그램의 각 줄이 80칸으로 구성되며 각 칸의 위치에 따라 특정한 의미를 갖는다. 예를 들어, 1번째 칸은 주석 줄을 나타내는 'C'나 '*' 문자가 올 수 있으며, 2번째부터 5번째 칸까지는 문장 번호(라벨)를, 6번째 칸은 연속 줄을 나타내는 기호를, 7번째 칸부터 72번째 칸까지가 실제 실행문을 작성하는 영역이다. 73번째부터 80번째 칸까지는 일반적으로 무시되는 영역으로, 초기에는 카드의 일련번호를 기록하는 데 사용되기도 했다.
이러한 고정 형식은 컴파일러가 소스 코드를 해석하는 방식을 단순화했지만, 프로그래머에게는 엄격한 형식 준수를 요구했다. 코드는 반드시 지정된 칸 열에 맞춰 작성되어야 하며, 특히 7번째 칸 이전에 실행문이 시작되면 오류가 발생했다. 이는 현대의 자유 형식 언어들과는 대조적인 특징으로, 코드의 가독성과 작성 편의성 측면에서 제약이 컸다. 포트란 77의 이러한 형식은 포트란 66에서 계승되었으며, 이후 포트란 90 표준에서 자유 형식이 도입되면서 공식적으로 폐지되었다.
3.2. 자료형 및 변수
3.2. 자료형 및 변수
포트란 77은 명시적인 자료형 선언과 함께 암시적 자료형 규칙을 계승하여 사용한다. 변수 이름의 첫 글자에 따라 자료형이 암시적으로 결정되는 규칙이 적용되는데, I, J, K, L, M, N으로 시작하는 변수는 정수형으로, 그 외의 문자로 시작하는 변수는 실수형으로 간주된다. 이는 초기 포트란부터 이어져 온 특징이다.
주요 자료형으로는 정수형(INTEGER), 실수형(REAL), 배정밀도 실수형(DOUBLE PRECISION), 복소수형(COMPLEX), 논리형(LOGICAL), 문자형(CHARACTER)이 있다. 특히 포트란 77에서 문자형 자료가 공식적으로 언어 표준에 도입되었다는 점이 중요한 변화이다. 배열과 변수는 DIMENSION, INTEGER, REAL 등의 선언문을 사용하여 명시적으로 선언할 수 있다.
자료형의 정밀도나 길이를 제어하는 종류 매개변수(KIND parameter) 개념은 아직 도입되지 않았으며, 변수의 정밀도는 컴파일러와 하드웨어에 의존했다. 문자열 처리를 위한 문자형 변수는 CHARACTER*길이 또는 CHARACTER 길이 형식으로 선언하며, 고정 길이를 가진다.
변수의 유효 범위는 기본적으로 프로그램 전체에 걸친 전역 변수 성격이 강했으나, 서브루틴이나 함수 내부의 지역 변수 개념도 존재했다. 공통 블록(COMMON block)을 이용하면 서로 다른 프로그램 단위 간에 데이터를 공유할 수 있었다. 저장 공간의 할당 방식은 대부분 정적 메모리 할당이었다.
3.3. 제어 구조
3.3. 제어 구조
포트란 77의 제어 구조는 이전 표준인 포트란 66에 비해 크게 확장되어 현대적인 구조적 프로그래밍의 기초를 제공한다. 핵심적인 추가 사항으로는 블록 IF 문과 DO 루프의 개선이 있다. 블록 IF 문은 IF (조건식) THEN으로 시작하여 END IF로 끝나는 구조로, 조건이 참일 때 실행될 여러 개의 문장을 하나의 논리적 블록으로 묶을 수 있게 했다. 이는 단일 문장만을 제어할 수 있었던 포트란 66의 산술 IF 문과 논리 IF 문에 비해 코드의 가독성과 유지보수성을 크게 향상시켰다. 또한 ELSE IF와 ELSE 절을 지원하여 다중 분기 로직을 명확하게 표현할 수 있게 되었다.
DO 루프 역시 중요한 발전을 이루었다. 포트란 77의 DO 루프는 명시적인 루프 종료 지점을 CONTINUE 문과 같은 문장 번호로 지정해야 했지만, 인덱스 변수의 시작값, 종료값, 증가값(스텝)을 지정하여 반복 횟수를 정밀하게 제어할 수 있었다. 루프 내부에서는 CYCLE에 해당하는 기능은 없었으나, GO TO 문을 사용하여 루프의 시작 부분으로 점프하는 방식으로 유사한 흐름 제어가 가능했다. 반복문과 조건문의 조합은 프로그램의 논리를 구성하는 기본 골격이 되었다.
이외에도 포트란 77은 무조건 분기인 GO TO 문, 서브루틴 호출을 위한 CALL 문, 프로그램 실행을 종료하는 STOP 문, 서브루틴에서 복귀하는 RETURN 문 등을 제공했다. GO TO 문은 여전히 유용한 도구였으나, 새로 도입된 블록 IF와 구조화된 DO 루프는 불필요한 점프를 줄여 프로그램의 흐름을 더 예측 가능하고 체계적으로 만드는 데 기여했다. 이러한 제어 구조의 확장은 포트란 언어가 과학기술 계산 분야에서 복잡한 알고리즘을 구현하는 데 필수적인 토대를 마련했으며, 이후 포트란 90에서 더욱 발전된 선택문과 반복문의 등장으로 이어지는 계기가 되었다.
3.4. 입출력
3.4. 입출력
포트란 77의 입출력 시스템은 고정 형식 소스 코드와 함께 이 언어의 특징적인 부분을 형성한다. 이 표준은 READ 문과 WRITE 문을 중심으로 한 명시적이고 구조화된 입출력 모델을 정의한다. 사용자는 이러한 문장에서 논리 장치 번호를 지정하여 특정 입출력 장치를 참조하며, 이 번호는 표준 입력 장치나 표준 출력 장치를 의미하는 * 기호를 포함할 수 있다. 데이터의 형식은 FORMAT 문을 통해 세밀하게 제어되며, 이는 문자열 출력의 너비, 실수의 소수점 위치, 정수의 자릿수 등을 지정하는 데 사용된다.
파일 기반 입출력도 지원되며, OPEN 문을 사용하여 외부 파일을 특정 논리 장치 번호에 연결하고, CLOSE 문으로 연결을 해제한다. 파일의 접근 방식(순차 접근 또는 직접 접근)과 같은 속성을 지정할 수 있어 데이터 처리의 유연성을 제공한다. 또한 내부 파일이라는 개념을 도입하여 메모리 내의 문자 변수나 배열을 마치 파일처럼 읽고 쓸 수 있게 하여, 데이터 변환 작업을 용이하게 한다.
이러한 입출력 체계는 당시의 배치 처리 환경과 카드 리더, 라인 프린터 같은 주변 장치에 최적화되어 있었다. 형식 지정 입출력은 출력물의 레이아웃을 정확하게 조정하는 데 필수적이었으며, 포트란 77로 작성된 수많은 과학기술계산 프로그램의 표준적인 데이터 처리 방식을 정립했다.
3.5. 서브루틴과 함수
3.5. 서브루틴과 함수
포트란 77은 서브루틴과 함수를 통해 모듈화 프로그래밍을 지원한다. 이들은 프로그램을 논리적 단위로 분할하여 코드의 재사용성과 유지보수성을 높이는 핵심 요소이다. 서브루틴은 SUBROUTINE 문으로 정의되며, 호출 시 CALL 문을 사용한다. 서브루틴은 값을 반환하지 않고, 인자를 통해 데이터를 주고받는 데 주로 사용된다. 함수는 FUNCTION 문으로 정의되며, 하나의 값을 반환한다. 내장 함수와 사용자 정의 함수로 구분되며, 삼각 함수나 제곱근 계산과 같은 수학 연산을 위한 다양한 내장 함수를 제공한다.
서브루틴과 함수는 명시적인 인터페이스 없이도 사용할 수 있으나, 이로 인해 인자의 개수나 자료형 불일치 오류가 발생할 수 있다. 이들은 호출 프로그램과 별도의 컴파일이 가능한 독립적인 프로그램 단위이다. 데이터 교환은 주로 인자 목록을 통해 이루어지지만, COMMON 블록을 사용하여 전역 변수처럼 공유 데이터 영역을 정의할 수도 있다. SAVE 문을 사용하면 서브루틴이나 함수 내의 지역 변수 값이 호출 사이에 보존된다.
포트란 77의 서브루틴과 함수는 이후 포트란 90에서 크게 발전한 모듈 시스템과 명시적 인터페이스의 기초를 마련했다. 또한, 재귀 호출을 공식적으로 지원하지 않는다는 제약은 후속 표준에서 해결되었다. 이러한 구조는 과학 및 공학 계산에서 복잡한 알고리즘을 체계적으로 구현하는 데 널리 사용되었다.
4. 프로그래밍 예제
4. 프로그래밍 예제
포트란 77의 기본적인 프로그래밍 구조를 보여주는 간단한 예제로, 두 수를 더하는 프로그램을 들 수 있다. 이 예제는 포트란 77의 고정 형식, 즉 소스 코드의 각 줄이 특정 열 위치를 따라야 하는 규칙을 따른다. 프로그램은 PROGRAM 문으로 시작하여 END 문으로 종료되며, 변수 선언과 계산, 그리고 결과를 화면에 출력하는 기본적인 흐름을 포함한다.
보다 복잡한 예제로는, 배열을 사용하여 데이터를 처리하고 조건문과 반복문을 활용하는 프로그램이 있다. 예를 들어, 일련의 숫자를 배열에 저장한 후, DO 루프를 사용하여 그 합계를 계산하거나 최대값을 찾는 것이 일반적이다. 또한, 사용자 정의 서브루틴이나 함수를 작성하여 특정 계산을 모듈화하는 방법도 포트란 77의 중요한 특징이다. 이러한 서브프로그램은 CALL 문으로 호출되며, 프로그램의 구조를 명확하게 하고 코드 재사용성을 높인다.
입출력 처리도 포트란 77 프로그래밍의 핵심 요소이다. READ와 WRITE 문을 사용하여 표준 입력(키보드)과 표준 출력(모니터) 또는 외부 파일과 데이터를 주고받는다. 형식 지정자(FORMAT 문)를 함께 사용하면 숫자나 문자열의 출력 형식을 세밀하게 제어할 수 있어, 과학기술 계산에서 필요한 표 형태의 결과 출력에 유용하다.
아래 표는 포트란 77에서 자주 사용되는 제어 구조와 그 용도를 간략히 정리한 것이다.
제어 구조 키워드 | 주요 용도 |
|---|---|
| 조건에 따른 분기 실행 |
| 지정된 횟수만큼 반복 실행 |
| 프로그램의 흐름을 특정 라벨로 무조건 점프 |
이러한 예제와 요소들을 통해 포트란 77이 과학 및 공학 분야의 수치 계산을 위해 어떻게 구조화되었는지를 이해할 수 있다.
5. 영향과 유산
5. 영향과 유산
포트란 77은 포트란 66 이후 12년 만에 등장한 새로운 ANSI 표준으로, 당시 널리 사용되던 포트란 IV 구현체의 기능을 대부분 표준화하여 실질적인 통일을 이루었다. 이 표준은 과학 계산과 공학 분야에서 수십 년간 산업 표준으로 자리 잡으며 막대한 영향력을 발휘했다. 특히 수치 해석, 유체 역학, 구조 해석, 기상학 등 대규모 수치 시뮬레이션 코드의 기반 언어로 광범위하게 사용되었다.
포트란 77의 가장 큰 유산은 구조화 프로그래밍의 제한적이지만 본격적인 도입이다. IF-THEN-ELSE 블록과 DO WHILE 루프를 공식 표준에 포함시켜, 이전까지 GOTO 문과 레이블에 의존하던 제어 흐름을 보다 체계적으로 작성할 수 있게 했다. 또한 CHARACTER 자료형의 표준화는 문자열 처리를 용이하게 했고, PARAMETER 문을 통한 명명된 상수 지원은 코드 가독성과 유지보수성을 크게 향상시켰다.
이 표준의 영향력은 후속 표준인 포트란 90이 등장한 후에도 오랫동안 지속되었다. 수많은 중요한 레거시 코드와 과학적 서브루틴 라이브러리(예: LINPACK, EISPACK)가 포트란 77로 작성되어 있었기 때문에, 새로운 프로젝트에서도 호환성을 위해 포트란 77을 계속 사용하는 경우가 많았다. 이는 포트란 90이 포트란 77의 상위 호환성을 유지하도록 설계된 주요 이유이기도 하다.
결국 포트란 77은 포트란 언어가 현대적인 구조화 프로그래밍 언어로 진화하는 데 필요한 핵심 디딤돌 역할을 했다. 그 확고한 표준과 실용성은 과학 컴퓨팅 커뮤니티에 깊은 뿌리를 내리게 했으며, 오늘날에도 일부 분야에서 그 코드와 프로그래밍 관행이 여전히 영향력을 미치고 있다.
