"포트란"의 두 판 사이의 차이
(→등장배경) |
(→등장배경) |
||
8번째 줄: | 8번째 줄: | ||
==등장배경== | ==등장배경== | ||
− | |||
1953년 존 배커스(John Warner Backus)가 IBM 704 메인 프레임 머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 이는 첫 번째 "고급 프로그래밍 언어"의 등장이었다. 그 이전엔 프로그래머들이 손수 어셈블리어를 이용해야 했다.<ref name="포트란">포트란 위키원드 - https://www.wikiwand.com/ko/%ED%8F%AC%ED%8A%B8%EB%9E%80</ref> | 1953년 존 배커스(John Warner Backus)가 IBM 704 메인 프레임 머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 이는 첫 번째 "고급 프로그래밍 언어"의 등장이었다. 그 이전엔 프로그래머들이 손수 어셈블리어를 이용해야 했다.<ref name="포트란">포트란 위키원드 - https://www.wikiwand.com/ko/%ED%8F%AC%ED%8A%B8%EB%9E%80</ref> | ||
2020년 8월 4일 (화) 16:20 판
포트란(fortran)은 formula translator의 약어이자 과학 기술 계산용의 프로그래밍 언어의 하나다. 본래, 수치 계산을 행하기 위한 프로그램 언어이다. 과학 기술 계산을 위해서 1956년에 개발된 프로그래밍 언어이며, 광범위한 계산식을 간단한 연산 명령의 형태로 컴퓨터에 줄 수 있다.
개요
포트란(Fortran)은 1954년 IBM 704에서 과학적인 계산을 하기 위해 시작된 컴퓨터 프로그램 언어이다. 포트란은 수식(Formula) 변환기(Translation)의 약자이다(IBM Mathematical Formula Translating System에서 유래). 포트란은 알골과 함께 과학 계산용으로 주로 사용되는 언어이며, 당시 7명의 전문가가 약 2년 반 동안에 걸쳐 완성한 것이 포트란의 기본을 이루었고, 그 후 ANSI와 ISO에서 표준화하였다. 포트란은 산술 기호(+, -, *, / 등)를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 자연스럽게 불러내어 쓸 수 있으며, 최근 첨단 과학 계산에서 필수적인 벡터, 행렬 계산 기능 등이 내장되어 있는 과학 기술 전문 언어이다. 포트란은 기후 및 기상예측, 자원 탐사, 우주항공, 유체 및 구조해석, 계산화학, 양자 및 분자 동역학 계산, 천문학, 인공위성을 포함한 군사과학, 자동차 선박 설계, 반도체 설계, 금융계산 등 거의 모든 산업분야의 초대형 과학 계산 문제의 프로그래밍에 필수적인 언어이다. 위와 같이 특히 자연과학이나 공학에서의 중요한 거대한 계산문제들을 슈퍼컴퓨터들을 이용하여 해결하는 데 있어서 C 언어와 같이 범용 프로그래밍 언어에 속하는 프로그래밍 언어들에 비해 탁월한 효율이 있는 과학 계산 전문 언어이다. 1990년대까지 널리 사용되어 왔던 포트란 77에서 현재 포트란 90/95, 포트란 2003, 포트란 2008 등으로 계속 진보하고 있다. 전문적인 과학 계산 문제를 풀기 위하여 프로그래밍하는 데 있어서 C보다 포트란이 훨씬 간단 명료하고 신속하게 프로그래밍을 작성할 수 있으며, 디버깅하는 데도 시간이 현저하게 단축될 뿐만 아니라, 그 계산속도 또한 일반적으로 훨씬 빠르다.[1]
등장배경
1953년 존 배커스(John Warner Backus)가 IBM 704 메인 프레임 머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 이는 첫 번째 "고급 프로그래밍 언어"의 등장이었다. 그 이전엔 프로그래머들이 손수 어셈블리어를 이용해야 했다.[2]
- FORTRAN 66
"최초의 고급 프로그래밍 언어"가 등장하게 되자, 여러 벤더에서 다양한 문법을 가진 포트란 컴파일러를 각자의 시스템에 맞게 제작하기 시작하였으며, 1960년대에도 40여가지의 포트란 컴파일러가 존재했다고 한다. 이에 BEMA(Business Equipment Manufacturers Association)은 표준화에 대한 논의를 시작하며, ANSI에 표준 문법을 제출한다. 1966년 ANSI의 승인을 얻게 되며, 첫 미국 포트란 표준이 발표된다. IBM이 가장 영향력이 높았으므로 표준화는 FORTRAN IV 컴파일러를 바탕으로 진행되었으며, 대중에게 FORTRAN IV와 FORTRAN 66은 혼용되어 불리게 된다. 이 표준은 산업 표준으로 널리 받아들여지게 된다. 이후 ISO(국제 표준화 기구)에서는 1972년 이 ANSI FORTRAN 66을 그대로 받아들여 포트란 국제 표준으로 받아들인다.
- FORTRAN 77
FORTRAN 66 표준이 발표된 이후에도, 각 컴파일러 벤더들은 표준에 포함되지 않는 각자의 부가적 확장 문법을 포함하는 포트란 컴파일러들을 출시하였으며, 이에 미 포트란 표준화 위원회(ANSI committee X3J3 - J3)가 1969년 결성되었으며, FORTRAN 66 표준에 대한 개정을 논의하기 시작했다. 최종 안이 1977년에 확정되었으며, 1978년 4월 ANSI의 승인을 얻게 된다. 이 ANSI 표준은 FORTRAN 77 이란 이름으로 불리며, 그 공식 문서는 ANSI X3.9-1978이다. ISO는 이 ANSI FORTRAN 77을 수용하여 포트란 국제 표준으로 받아들인다.
- 미 국방성 표준
한편 ANSI FORTRAN 77에 몇 가지 문법이 추가된 미국 국방성(Department of Defence: DoD) 포트란 표준이 발표된다. 이 후 1980년대 이후에 전 미국에서 발표된 포트란 77 컴파일러 제품들은 대부분 ANSI 표준 뿐만 아니라 이 국방성 표준을 지원하도록 설계되었다.
- Fortran 90
컴퓨터 환경은 무어의 법칙이 지배하게 되면서 빠르게 변화되어가는 도중에 FORTRAN 77 표준에 대한 개정은 지지부진하게 되었다. 차기 버전이 나오기에 15년의 시간이 걸렸으며, 이 길었던 기간 동안 FORTRAN 77 표준은 포트란의 역사에서도 가장 중요한 표준이 되어 버렸다. Fortran 90은 1991년에 ISO에서 먼저 승인을 얻었으며, ISO/IEC 1539:1991(E) 가 ISO Fortran 90 이 된다. 이전 FORTRAN XX 표준의 의미가 ANSI를 칭하였던 것에 비해, Fortran XX 형태의 표기는 ISO 국제 표준을 의미하는 것으로 여겨지게 되었다. ANSI의 승인은 1992년에 이루어진다. 포트란의 현대화가 진행된 표준이며, Ada와 같은 여러 다른 언어에서 많은 아이디어를 가져왔다. 공식적인 표기가 FORTRAN에서 Fortran으로 바뀌었다.
- Fortran 95
포트란 표준 위원회는 10년단위의 major update 와 5년 단기의 minor update를 계획하는데, Fortran 95는 Fortran 90에 대한 minor update로 계획된다. 공식 문서는 ISO/IEC 1539-1:1997이다. 이는 Fortran 90에 대한 확장 기능을 제공하던 High Performance Fortran(HPFF) 프로젝트의 영향을 받아 병렬 프로그래밍에 대한 지원을 목적으로 한다.
- Fortran 2003
원래는 90에 대한 10년 단위 major update로 Fortran 2000이 계획되었으나, 합의가 늦어지고 Fortran 2003으로 발표된다. Fortran 2003은 ISO/IEC 1539-1:2004가 공식 문서이다.
- Fortran 2018
차기 표준 예정으로 2017년 11월 12일 WG5의 투표에서 차기 포트란 표준의 이름을 Fortran 2015에서 Fortran 2018로 바꾸는 것이 가결되었다.
특징
산술 기호를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 그대로 불러내어 쓸 수 있다. 또 실수만이 아니라 복소수를 그대로 변수 형으로 쓸 수 있다. 물론 이러한 장점은 현재의 각종 프로그래밍 언어에서는 표준 라이브러리 등을 통해서 기본적으로 제공되는 기능이지만, 당시에는 굉장히 획기적인 방법이었다. 배열에 대해서도 많이 지원해 줘서, 옛날에 나온 언어임에도 불구하고 매트랩에서처럼 쉽게 배열을 다룰 수 있다. 기본적으로 절차적 프로그래밍(procedural programming)이지만 90, 2003을 거치면서 OOP의 요소를 많이 넣게 되었다. 하지만 하위 호환을 유지해야 하므로 아무래도 C++에 비해서는 문법적/구조적으로 불편한 부분이 많다. C와의 큰 차이점 중 하나로 배열의 배치 순서가 서로 다르다. C는 행 우선순위(Row-Major Order)를 따르며, 포트란은 열 우선순위(Column-Major Order)를 따른다. C에서는 (1,1) 다음이 (1,2)이지만, 포트란에서는 (2,1)가 된다. 따라서 다른 언어와 함께 프로그래밍을 할 때는 변수를 넘겨줄 때 순서를 바꾸어 주어야 한다. 또한 반복 계산을 할 때 가장 처음 인수부터 돌려줘야 성능의 저하가 없다. 또한, 배열의 시작 숫자가 0이 아닌 1부터 시작이다. 사용자가 배열의 인덱스를 조정하는 것이 가능한 것은 포트란의 특징 중 하나이다. 배열의 인덱스를 -100 ~ 100처럼 지정하는 것이 가능하다. 초기 버전은 대문자만 인정했기 때문에 가독성이 부족하다. 그 이유는 키보드가 없던 시절 천공 카드로 프로그램을 입력해야 했는데 여기엔 소문자가 없었기 때문이다. 학교 교육으로는 서울대학교 수리과학부나 통계학과, 연세대학교 이과대학, 경희대학교 우주과학과와 원자력공학과, 서울시립대학교 토목공학과, 부산대학교 조선해양공학과, 부경대학교 환경대기과학과, 한국항공대학교 항공 우주 및 기계공학과, 한국해양대학교 공과대학, 홍익대학교 기계 시스템 디자인공학과 수치해석 과목, 경북대학교 토목공학과와 지구시스템과학부 천문 대기과학 전공, 안동대학교 기계공학과, 한양대학교 에리카 캠퍼스 소프트웨어 학부 수치해석 과목 등이 존재한다.[3]
구조
포트란 프로그램은 크게 순서대로 선언 영역, 실행 영역, 종료 영역으로 나뉜다.
- 선언 영역
- 프로그램 문
- C에 메인 함수가 있듯이 포트란에는 프로그램 문이 있다. 모든 포트란 프로그램은 프로그램 문에서 시작한다. 프로그램 다음에는 프로그램의 이름이 온다. 이름은 변수명 규칙을 벗어나지 않는 선에서 마음대로 지을 수 있다. 변수명 규칙은 아래 변수의 선언에서 이어진다.
- 변수의 선언
- 변수 선언은 type :: name과 같은 형식으로 선언된다. 포트란은 기본 타입으로 정수형(integer), 실수형(real 및 double precision), 문자(character), 논리형*:(logical), 복소수(complex)를 지원하고 여기에 추가로 클래스를 만들어 쓸 수 있다. 변수의 이름은 변수명 규칙을 따라야 하는데, 상식적이다. 변수 이름은 알파벳 a – z, 언더 스코어 _, 숫자 0 – 9만을 포함할 수 있다. 변수 이름은 숫자로 시작할 수 없다. 변수 이름은 최대 63자이다. 타입과 변수 이름 사이에 들어가는 : 두 개는 생략할 수 있으나 매우 권장하지 않는다. 그리고 프로그램 이름과 변수 이름은 겹칠 수 없다(이후 후술할 함수의 이름도 마찬가지이다).
- 임플리시트 문
- 사실 포트란은 파이썬과 매트랩처럼 변수를 선언하지 않아도 되는 언어이다. 따로 선언되지 않은 변수는 첫 글자에 따라 타입을 정하여 자동으로 선언된다. 기본적으로 첫 글자가 i – n인 변수는 정수형, 그 외는 실수형으로 정해진다.
program implicit_test integer :: xyz abc = 0 ! 첫 글자가 a이므로 실수형으로 자동 선언 ijk = 0 ! 첫 글자가 i이므로 정수형으로 자동 선언 xyz = 0 ! 첫 글자가 x이지만 정수형으로 이미 선언됨 (실수형으로 자동 선언되지 않음) write(*, *) abc, ijk, xyz end program implicit_test
실행해보면 abc는 실수형이라서 0.00000000이, ijk와 xyz는 정수형이라서 0이 출력된다. 이 첫 글자 규칙은 임플리시트 문을 써서 바꿀 수 있다. 임플리시트 다음에 타입을 적고, 그 다음 괄호 속에 알파벳을 적으면 해당 알파벳으로 시작하는 변수들은 해당 타입으로 자동 선언된다. -을 쓰면 일일이 적지 않고 범위로 나타낼 수 있다.
! 모든 변수가 정수형 implicit integer (a-z) ! u, v, w로 시작하면 복소수, c로 시작하면 문자 ! 나머지는 기본 설정을 따름 implicit complex (u, v, w) implicit character (c) ! 컴파일 에러: i-n에 대해 설정 중복 implicit real (a-n) implicit integer (i-z)
여기에 특수한 구문 하나가 추가된다. 임플리시트 논은 자동 선언 자체를 꺼버린다. 이때 모든 변수는 프로그래머가 명시적으로 선언해야 한다. 자동 선언이 일으키는 혼란을 막기 위해 포트란 프로그래밍에서는 반드시 임플리시트 논을 사용할 것을 강력히 권장한다.[4]
- 실행 영역
이름 그대로 계산을 실행하는 부분이다.[4]
- 종료 영역
- 엔드 프로그램 문
- 포트란 프로그램은 프로그램 정의의 마지막 줄 엔드 프로그램을 만나면 종료한다. 이때 종료 상태(exit status)로 0이 반환된다. C/C++에서 메인 함수의 닫는 중괄호와 같다고 보시면 된다. 엔드 프로그램 뒤에 프로그램 이름을 적어도 되고 안 적어도 되는데 프로그램의 끝임을 명확하게 표시해 주기 위해 적는 걸 추천한다.
- 스톱 문
- 엔드 프로그램에 도달하기 전에 프로그램을 끝내는 방법으로 스톱 문이 있다. 스톱 뒤에는 메시지를 적을 수 있다. 메시지가 없으면 엔드 프로그램과 동일하게 0을 반환하고 프로그램이 끝난다. 메시지가 정수면 해당 정수를 반환하고 프로그램이 끝난다. 메시지가 문자열이면 0을 반환하고 프로그램이 끝난다. 메시지가 있다면 프로그램 종료 시 메시지가 콘솔에 출력된다.
- 에러 스톱 문
- 단순히 프로그램을 종료하는 것이 아니라 의도적으로 런타임 에러를 띄운다. 에러 스톱 뒤에는 에러 메시지를 적을 수 있다.[4]
활용
포트란은 과학 계산용 언어를 목표로 IBM이 1950년대 개발한 언어다. 다만, 쓸만한 범용 개발 언어가 부족했던 시기였고 언어 사용자층이 두꺼웠던 만큼 범용적인 용도로도 언어가 사용되긴 하였다. 과학기술용 언어로는 포트란, 상업용 언어로는 코볼이라고 할 만큼 대표적인 제3세대 언어였지만 1980년대 이후로 보다 사용하기 쉬운 제4세대 언어의 출현으로 이제는 범용 목적으로는 거의 쓰이지 않게 되었으며, 대부분 C 언어로 교체되었다. 하지만 애당초 수치해석용에 특화 시켜 개발되었고, 방대한 수치해석 라이브러리를 가지고 있기 때문에 대량의 계산을 해야 하는 특정 분야에서는 중요한 언어로 명맥을 이어가고 있다. 수치계산 분야로 연구 관련 코드를 찾으면 포트란 코드로는 거의 모든 분야가 다 있다. 그것도 교과서에 이름이 실릴만한 유명한 사람들이 만들어서 저널에서 실렸고 수십 년간 사용되고 수도 없이 검증됐다. 예를 들어, 슈퍼컴퓨터 등의 클러스터를 이용한 대량의 계산을 위한 MPI(Message passing interface)의 경우, 포트란과 C 라이브러리로만 나온다. 즉 슈퍼컴퓨터에서는 무조건 C 아니면 포트란을 사용해야 하는 것이다. 엄청난 양의 수치계산이 필요한 분야의 경우 슈퍼컴퓨터를 사용하는데 슈퍼컴퓨터는 가격이 아주 비싸고 유지비가 많이 들기 때문에 종량제처럼 돈을 받아서 운영하는 경우가 많다. 돈을 받던 받지 않던 실제 자신이 소속된 연구소나 회사 소유의 슈퍼컴퓨터라도 직급이나 소속에 따라서 슈퍼컴퓨터 사용시간과 사용범위가 제약된다. 그래서 연구자들은 슈퍼컴퓨터를 사용할 때 자신의 컴퓨터에서 최대한 코드를 완성하고 슈퍼컴퓨터에 업로드해서 실행시켜본 후 수정하고 또 수정하는 일을 반복한다. 자기의 슈퍼컴퓨터 사용시간을 조금이라도 절약하기를 바라는 건 모든 슈퍼컴퓨터 사용자의 소망이다. 이런 이유로 슈퍼컴퓨터에서 가장 단기간에 성과를 내고 가장 많이 입증된 슈퍼컴퓨터 관련 프로그램 코드가 바로 포트란으로 만들어진 코드이다. 이게 현재 포트란의 아주 강력한 장점인 것이다.[3]
예시
- 포트란 II
다음은 데이터 카드(천공 카드나 천공 테이프)에서 삼각형의 세 변의 길이를 읽은 후, 헤론의 공식으로 넓이를 구하여 출력하는 예이다.
C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION C INPUT − CARD READER UNIT 5, INTEGER INPUT C OUTPUT − LINE PRINTER UNIT 6, REAL OUTPUT C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5) C IA, IB, AND IC MAY NOT BE NEGATIVE C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE C IS GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO IF (IA) 777, 777, 701 701 IF (IB) 777, 777, 702 702 IF (IC) 777, 777, 703 703 IF (IA+IB−IC) 777,777,704 704 IF (IA+IC−IB) 777,777,705 705 IF (IB+IC−IA) 777,777,799 777 STOP 1 C USING HERON'S FORMULA WE CALCULATE THE C AREA OF THE TRIANGLE 799 S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S − FLOATF(IA)) * (S − FLOATF(IB)) * + (S − FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA 601 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2, + 13H SQUARE UNITS) STOP END
- 포트란 90
다음은 대화형으로 사용자의 숫자 입력을 받아서 평균을 출력하는 프로그램이다.
program average ! Read in some numbers and take the average ! As written, if there are no data points, an average of zero is returned ! While this may not be desired behavior, it keeps this example simple implicit none real, dimension(:), allocatable :: points integer :: number_of_points real :: average_points=0., positive_average=0., negative_average=0. write (*,*) "Input number of points to average:" read (*,*) number_of_points allocate (points(number_of_points)) write (*,*) "Enter the points to average:" read (*,*) points ! Take the average by summing points and dividing by number_of_points if (number_of_points > 0) average_points = sum(points) / number_of_points ! Now form average over positive and negative points only if (count(points > 0.) > 0) then positive_average = sum(points, points > 0.) / count(points > 0.) end if if (count(points < 0.) > 0) then negative_average = sum(points, points < 0.) / count(points < 0.) end if deallocate (points) ! Print result to terminal write (*,'(a,g12.4)') 'Average = ', average_points write (*,'(a,g12.4)') 'Average of positive points = ', positive_average write (*,'(a,g12.4)') 'Average of negative points = ', negative_average end program average
전망
포트란은 당시 주목을 받았던 프로그래밍 언어다. 그 시대에 FACT와 코볼이라는 사무용 언어가 생겨났다. FACT는 포트란보다 문서 작성 능력이 우수했으며 대용량 데이터도 처리하기 수월했으나 코볼에 밀려 사라지게 되었다. 포트란은 코볼과 비교하여 매우 간결함을 예로 들 수 있다. 기상청과 같은 기후, 과학에 관련된 계산을 할 때는 아직 포트란을 사용 중이다. 방대한 데이터를 빠르게 처리하고, 그만큼 라이브러리가 쌓인 포트란을 쉽게 바꾸지는 못할 것이다.
각주
- ↑ 1.0 1.1 1.2 포트란 위키백과 - https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8%EB%9E%80
- ↑ 포트란 위키원드 - https://www.wikiwand.com/ko/%ED%8F%AC%ED%8A%B8%EB%9E%80
- ↑ 3.0 3.1 포트란 나무위키 - https://namu.wiki/w/%ED%8F%AC%ED%8A%B8%EB%9E%80
- ↑ 4.0 4.1 4.2 〈[Fortran 2018 포트란의 문법적 특징과 포트란 프로그램의 구조]〉, 《캐스터리언》, 2019-04-19
참고 자료
- 포트란 위키백과 - https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8%EB%9E%80
- 포트란 위키원드 - https://www.wikiwand.com/ko/%ED%8F%AC%ED%8A%B8%EB%9E%80
- 포트란 나무위키 - https://namu.wiki/w/%ED%8F%AC%ED%8A%B8%EB%9E%80
- 〈[Fortran 2018 포트란의 문법적 특징과 포트란 프로그램의 구조]〉, 《캐스터리언》, 2019-04-19
같이 보기