포트란

포트란(Fortran, 이전 명칭 FORTRAN)은 1954년 IBM 704에서 과학적인 계산을 하기 위해 시작된 컴퓨터 프로그램 언어이다.
FORTRAN은 수식(Formula) 변환기(Translation)의 약자이다.(IBM Mathematical "For"mula "Tran"slating System에서 유래.) 포트란은 알골과 함께 과학 계산용으로 주로 사용되는 언어이며, 당시 7명의 전문가가 약 2년 반 동안에 걸쳐 완성한 것이 포트란의 기본을 이루었고, 그 후 ANSI와 ISO에서 표준화하였다.
포트란은 산술 기호(+, -, *, / 등)를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 자연스럽게 불러내어 쓸 수 있으며, 최근 첨단 과학계산에서 필수적인 벡터, 행렬계산기능 등이 내장되어 있는 과학 기술 전문언어이다.
포트란은 기후 및 기상예측, 자원탐사, 우주항공, 유체 및 구조해석, 계산화학, 양자 및 분자 동역학 계산, 천문학, 인공위성을 포함한 군사과학, 자동차 선박 설계, 반도체설계, 금융계산 등 거의 모든 산업분야의 초대형 과학계산 문제의 프로그래밍에 필수적인 언어이다.
위와 같이 특히 자연과학이나 공학에서의 중요한 거대한 계산문제들을 슈퍼컴퓨터들을 이용하여 해결하는 데 있어서 C언어와 같이 범용프로그래밍 언어에 속하는 프로그래밍언어들에 비해 탁월한 효율이 있는 과학계산 전문 언어이다. 1990년대까지 널리 사용되어 왔던 FORTRAN 77에서 현재 Fortran 90/95, Fortran 2003, Fortran 2008등으로 계속 진보하고 있다.
전문적인 과학계산 문제를 풀기 위하여 프로그래밍하는 데 있어서 C보다 포트란이 훨씬 간단 명료하고 신속하게 프로그래밍을 작성할 수 있으며, 디버깅하는 데도 시간이 현저하게 단축될 뿐만 아니라, 그 계산속도 또한 일반적으로 훨씬 빠르다.
표기.
FORTRAN77까지 초기의 버전은 그 이름에 대문자를 사용하였으나, 현재는 Fortran으로 첫 문자만을 대문자로 표기한다.
Fortran90부터 현재에까지 ISO, ANSI 모두 포트란에 대한 명칭은 "Fortran"을 사용한다.
표준화 기구.
다른 컴퓨터 프로그래밍 언어에서도 그렇듯이 ANSI (미국 국립 표준 협회) 와 ISO (국제 표준화 기구)의 두 표준이 통용된다.
포트란에 대한 ANSI 표준을 담당하는 위원회는 J3로 불린다.
포트란에 대한 ISO 국제 표준을 담당하는 실무그룹은 ISO/IEC JTC1/SC22/WG5 로 WG5로 불린다.
현재 J3는 WG5의 지시 하에 활동하고 있으며, WG5를 구성하는 가장 큰 부분이다.
역사.
1953년 존 배커스(John Warner Backus) 가 IBM 704 메인프레임머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 이는 첫 번째 "고급 프로그래밍 언어"의 등장이었다. 그 이전엔 프로그래머들이 손수 어셈블리어를 이용해야 했다.
FORTRAN 66.
"최초의 고급 프로그래밍 언어"가 등장하게 되자, 여러 벤더에서 다양한 문법을 가진 포트란 컴파일러를 각자의 시스템에 맞게 제작하기 시작하였으며, 1960년대에도 40여가지의 포트란 컴파일러가 존재했다고 한다.
이에 Business Equipment Manufacturers Association(BEMA)은 표준화에 대한 논의를 시작하며, ANSI에 표준 문법을 제출한다. 1966년 ANSI의 승인을 얻게 되며, 첫 미국 포트란 표준이 발표된다. IBM이 가장 영향력이 높았으므로 표준화는 FORTRAN IV 컴파일러를 바탕으로 진행되었으며, 대중에게 FORTRAN IV와 FORTRAN 66은 혼용되어 불리게 된다. 이 표준은 산업 표준으로 널리 받아들여지게 된다.
이후 ISO(국제 표준화 기구)에서는 1972년 이 ANSI FORTRAN 66을 그대로 받아들여 포트란 국제 표준으로 받아들인다. ISO R1539-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을 수용하여 포트란 국제 표준으로 받아들인다. ISO 1539:1980
FORTRAN 66에 비해서 FORTRAN 77표준은 다음과 같은 몇 가지 특징적인 기능을 포함하게 된다.
미 국방성 표준.
한편 ANSI FORTRAN 77에 몇 가지 문법이 추가된 미국 국방성(Department of Defence: DoD) 포트란 표준이 발표된다. 이 후 1980년대 이후에 전 미국에서 발표된 포트란 77 컴파일러 제품들은 대부분 ANSI 표준 뿐만 아니라 이 국방성 표준을 지원하도록 설계되었다. MIL-STD-1753 in 1978.
다음과 같은 사항이 ANSI FORTRAN 77에 비해 추가되었다.
위 사항 중에서 INCLUDE 문법을 제외한 기능들이 이후 Fortran 90 포트란 표준에 추가된다.
Fortran 90.
컴퓨터 환경은 무어의 법칙이 지배하게 되면서 빠르게 변화되어가는 도중에 FORTRAN 77 표준에 대한 개정은 지지부진하게 되었다. 차기 버전이 나오기에 15년의 시간이 걸렸으며, 이 길었던 기간 동안 FORTRAN 77 표준은 포트란의 역사에서도 가장 중요한 표준이 되어 버렸다.
Fortran 90은 1991년에 ISO에서 먼저 승인을 얻었으며, ISO/IEC 1539:1991(E) 가 ISO Fortran90 이 된다. 이전 FORTRAN XX 표준의 의미가 ANSI를 칭하였던 것에 비해, Fortran XX 형태의 표기는 ISO 국제 표준을 의미하는 것으로 여겨지게 되었다. ANSI의 승인은 1992년에 이루어진다. 포트란의 현대화가 진행된 표준이며, Ada와 같은 여러 다른 언어에서 많은 아이디어를 가져왔다.
공식적인 표기가 FORTRAN에서 Fortran으로 바뀐 것을 포함하여, 다음과 같은 사항을 표준에 추가하였다.
Fortran 90 은 FORTRAN 77의 기존의 문법 중 몇 가지 사항을 Obsolescent로 분류하였다. 그에 비해 Deleted 항목은 0으로 FORTRAN 77문법 중 삭제가 일어난 것이 없게 된다. 즉, 모든 FORTRAN 77 표준 코드가 Fortran 90 표준에 부합하도록 정의되었다.
Obsolescent features
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 95에서는 Fortran 90에서 Obsolescent로 분류되었던 항목 중에서 몇몇 문법이 Deleted 항목으로 변화되었다.
Deleted
Obsolescent
Fortran 2003.
원래는 90에 대한 10년 단위 major update로 Fortran 2000이 계획되었으나, 합의가 늦어지고 Fortran 2003으로 발표된다.
Fortran 2003은 ISO/IEC 1539-1:2004가 공식 문서이며이다. 다음과 같은 사항을 주요 사항으로 한다.
Fortran 2008.
Fortran 2008은 가장 최근에 발표된 표준으로 ISO/IEC 1539-1:2010가 공식 문서이다. Fortran 2003에 대한 minor update로 다음과 같은 기능의 추가를 특징으로 한다.
Fortran 2015.
차기 표준 예정으로 다음과 같은 사항이 논의되고 있다.
Fortran 2018.
2017년 11월 12일 WG5의 투표에서 차기 포트란 표준의 이름을 Fortran 2015에서 Fortran 2018로 바꾸는 것이 가결되었다.
예제.
FORTRAN 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 &gt; 0) average_points = sum(points) / number_of_points
 ! Now form average over positive and negative points only
 if (count(points &gt; 0.) &gt; 0) then
 positive_average = sum(points, points &gt; 0.) / count(points &gt; 0.)
 end if
 if (count(points &lt; 0.) &gt; 0) then
 negative_average = sum(points, points &lt; 0.) / count(points &lt; 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