포트란

150px|섬네일|The Fortran Automatic Coding System for the IBM 704 (1956년 10월 15일): 포트란을 위한 최초의 프로그래머 참조 매뉴얼
포트란(Fortran, 이전 명칭 FORTRAN)은 1954년 IBM 704에서 과학적인 계산을 하기 위해 시작된 컴퓨터 프로그램 언어이다.

FORTRAN은 수식(Formula) 변환기(Translation)의 약자이다.(IBM Mathematical Formula Translating System에서 유래.) 포트란은 알골과 함께 과학 계산용으로 주로 사용되는 언어이며, 당시 7명의 전문가가 약 2년 반 동안에 걸쳐 완성한 것이 포트란의 기본을 이루었고, 그 후 ANSI와 ISO에서 표준화하였다.

포트란은 산술 기호(+, -, *, / 등)를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 자연스럽게 불러내어 쓸 수 있으며, 최근 첨단 과학계산에서 필수적인 벡터, 행렬계산기능 등이 내장되어 있는 과학 기술 전문언어이다.

포트란은 기후 및 기상예측, 자원탐사, 우주항공, 유체 및 구조해석, 계산화학, 양자 및 분자 동역학 계산, 천문학, 인공위성을 포함한 군사과학, 자동차 선박 설계, 반도체설계, 금융계산 등 거의 모든 산업분야의 초대형 과학계산 문제의 프로그래밍에 필수적인 언어이다.
위와 같이 특히 자연과학이나 공학에서의 중요한 거대한 계산문제들을 슈퍼컴퓨터들을 이용하여 해결하는 데 있어서 C언어와 같이 범용프로그래밍 언어에 속하는 프로그래밍언어들에 비해 탁월한 효율이 있는 과학계산 전문 언어이다. FORTRAN 66, FORTRAN 77, Fortran 90/95, Fortran 2003, Fortran 2008, Fortran 2018, Fortran 2023 으로 지속적으로 표준이 개정되고 있다.

전문적인 과학계산 문제를 풀기 위하여 프로그래밍하는 데 있어서 범용 프로그래밍 언어에 비해서 간단 명료하고 신속하게 프로그래밍을 작성할 수 있고 디버깅하는 데도 시간을 단축할 수 있으며 그 계산속도 또한 일반적으로 더 빠르다.

 표기 
FORTRAN 77까지 초기의 버전은 그 이름에 대문자를 사용하였으나, 현재는 Fortran으로 첫 문자만을 대문자로 표기한다.
Fortran 90부터 현재에까지 ISO, ANSI 모두 포트란에 대한 명칭은 "Fortran"을 사용한다.

 표준화 기구 
다른 컴퓨터 프로그래밍 언어에서도 그렇듯이 ANSI (미국 국가표준 협회) 와 ISO (국제 표준화 기구)의 두 표준이 통용된다.
포트란에 대한 ANSI 표준을 담당하는 위원회는 INCITS PL22.3(과거 X3J3)으로 짧게 J3로 부른다.
포트란에 대한 ISO 국제 표준을 담당하는 실무그룹은 ISO/IEC JTC1/SC22/WG5 로 WG5로 부른다.
현재 J3는 WG5의 지시 하에 활동하고 있으며, WG5를 구성하는 가장 큰 부분이다.

 역사 
1953년 존 배커스(John Warner Backus) 가 IBM 704 메인프레임머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 그 이전의 프로그래머들은 손수 어셈블리어를 이용해야 했다.

 초창기 
IBM은 1958년 FORTRAN II, 1962년 FORTRAN IV를 출시하였다. IBM이 포트란을 내놓자 다른 여러 벤더에서 포트란 컴파일러를 각자의 시스템에 맞게 제작하기 시작하였다. 벤더들 각자의 이름을 가진 컴파일러를 개발하기도 하였지만 다수에서 IBM 포트란 버전과의 문법적 동일성을 강조하며 FORTRAN II, FORTRAN IV를 그 이름으로 컴파일러를 출시하였다. 하지만 각각의 기계 의존적 문법이 존재하였으며, 같은 코드로 여러 머신에서 동일한 동작과 결과를 얻고자 하는 사람들의 요구가 커졌다.

 FORTRAN 66 
Business Equipment Manufacturers Association(BEMA)은 포트란 표준화에 대한 논의를 시작하며, ANSI(당시는 ASA)에 표준 문법을 제출한다. IBM이 가장 영향력이 높았으므로 표준화는 IBM FORTRAN IV 컴파일러를 바탕으로 진행되었다. 1966년 ANSI의 승인을 얻게 되며, 첫 미국 포트란 표준이 발표된다. 대중에게 FORTRAN IV와 FORTRAN 66은 혼용되어 불리게 된다. 표준이라는 용어는 아직 생소하여 대중은 본인들이 사용하는 컴파일러의 이름인 FORTRAN IV를 사실상 표준과 같은 의미로 사용하였다. 이 표준은 산업 표준으로 널리 받아들여지게 된다.

이후 ISO(국제 표준화 기구)에서는 1972년 이 ANSI FORTRAN 66을 그대로 받아들여 포트란 국제 표준으로 받아들인다. ISO R1539-1972

ANSI FORTRAN 66 표준은 다음과 같은 문법을 포함하고 있다.

 Main program, SUBROUTINE, FUNCTION, BLOCK DATA 프로그램 유닛
 INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL 데이터 형
 COMMON, DIMENSION, EQUIVALENCE 문
 초기값 할당을 위한 DATA 문
 INTRINSIC(내장), EXTERNAL(외부) 함수
 Assignment 문
 GOTO, assigned GOTO, computed GOTO 문
 Logical(논리) IF 문, Arithmatic(산술) IF 문
 DO 루프 반복구조
 순차 I/O를 위한 READ, WRITE, BACKSPACE, REWIND, ENDFILE 문
 FORMAT 문
 CALL, RETURN, PAUSE, STOP 문
 DATA 문과 FORMAT 문과 프로시저의 실인수에 대한 Hollerith 상수
 식별자의 길이를 6까지 지원
 주석문

 FORTRAN 77 
FORTRAN 66 표준이 발표된 이후에도 각 컴파일러 벤더들은 표준에 포함되지 않는 각자의 부가적 확장 문법을 포함하는 포트란 컴파일러들을 출시하였으며, 이에 미 포트란 표준화 위원회(ANSI committee X3J3 - J3)가 1969년 결성되었다. J3는 FORTRAN 66 표준에 대한 개정을 논의하기 시작했다.

최종 안이 1977년에 확정되었으며 1978년 4월 ANSI의 승인을 얻게 된다. 이 ANSI 표준은 FORTRAN 77 이란 이름으로 불리고 그 공식 문서는 ANSI X3.9-1978이다.

ISO는 이 ANSI FORTRAN 77을 수용하여 포트란 국제 표준으로 받아들인다. 공식 문서는 ISO 1539:1980이다.

FORTRAN 66에 비해서 FORTRAN 77표준은 다음과 같은 몇 가지 특징적인 기능을 포함하게 된다.

 구조적 프로그래밍에 대한 지원을 향상 하기 위한 block IF 와 END IF 문, 추가적인 ELSE 와 ELSE IF 절
 파라미터 확장, 음의 방향으로 증가, 0까지 이동 등에 대한 DO 반복 구조 확장
 I/O에 대한 개선을 위해 OPEN, CLOSE, INQUIRE 문 도입
 직접 접근 파일 I/O
 IMPLICIT 문
 CHARACTER 형 데이터 타입
 PARAMETER 문
 SAVE 문
 내장 함수에 대한 일반명(generic)접근
 ASCII 문자집합을 기반에 둔 (LGE, LGT, LLE, LLT) 같은 내장 함수

 미 국방부 표준 
한편 ANSI FORTRAN 77에 몇 가지 문법이 추가된 미국 국방부(Department of Defence: DoD) 포트란 표준이 발표된다. 1980년대 이후에 전 미국에서 발표된 포트란 77 컴파일러 제품들은 대부분 ANSI 표준 뿐만 아니라 이 국방부 표준을 지원하도록 설계되었다. MIL-STD-1753 in 1978.

다음과 같은 사항이 ANSI FORTRAN 77에 비해 추가되었다.
 IMPLICIT NONE
 END DO
 DO WHILE 문
 INCLUDE 문
 END-OF-FILE 레코드를 만난 이후에도 READ, WRITE 수행
 비트필드 연산에 대한 내장 함수들

위 사항 중에서 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으로 바뀐 것을 포함하여, 다음과 같은 사항을 표준에 추가하였다.
 자유 형식 도입. 포트란 키워드에 소문자 허용
 식별자의 길이는 31문자까지 허용
 인라인 형태의 주석문
 배열 이름을 이용한 배열 전체 요소에 대한 연산 기능
 RECURSIVE 키워드를 이용한 재귀호출 프로시저
 MODULE을 이용한 모듈화 프로그래밍
 INTERFACE 문을 이용한 명시적 프로시저 선언
 연산자 오버로딩
 사용자 제너릭 프로시저
 Derived type - 유도 타입(타 언어의 구조체 - structure)
 속성을 부여한 타입 선언
 동적 메모리 할당
 포인터 속성을 이용한 자료구조와 동적 접근 알고리즘에 대응
 EXIT, CYCLE 문, NAMED 구조
 SELECT CASE 문
 사용자 지정 정밀도 선언
 RANDOM_NUMBER, DATE_AND_TIME 등 각종 다양한 목적의 내장 프로시저의 추가
 표준 문서에 Obsolescent(비 권장 문법, 이후 삭제 예정 사항) 와 Deleted(삭제) 분류 문법의 등장

Fortran 90 은 FORTRAN 77의 기존의 문법 중 몇 가지 사항을 Obsolescent로 분류하였다. 그에 비해 Deleted 항목은 0으로 FORTRAN 77문법 중 삭제가 일어난 것이 없게 된다. 즉, 모든 FORTRAN 77 표준 코드가 Fortran 90 표준에 부합하도록 정의되었다.

Obsolescent features
 Arithmetic IF
 Real and double precision DO control variables and DO loop control expressions
 Shared DO termination and termination on a statement other than END DO or CONTINUE
 Branching to an END IF statement from outside its IF block
 Alternate return
 PAUSE statement
 ASSIGN and assigned GO TO statements
 Assigned FORMAT specifiers
 cH edit descriptor

 Fortran 95 
포트란 표준 위원회는 10년단위의 major update 와 5년 단기의 minor update를 계획하는데, Fortran 95는 Fortran 90에 대한 minor update로 계획된다. 공식 문서는 ISO/IEC 1539-1:1997이다. 이는 Fortran 90에 대한 확장 기능을 제공하던 High Performance Fortran(HPF) 프로젝트의 영향을 받아 병렬 프로그래밍에 대한 지원을 목적으로 한다.

다음의 추가적 기능을 특징으로 한다.
 벡터화를 목적으로 한 FORALL 문, 중첩 WHERE 구조
 PURE, ELEMENTAL 프로시저의 사용자 정의
 포인터 초기화를 포함한 유도체 구성 요소의 초기화
 데이터 개체에 대한 초기화 문 기능 확장
 명시적 DEALLOCATION 없이 프로시저의 종료 시 동적 할당 메모리 해제
 기존 문법의 삭제

Fortran 95에서는 Fortran 90에서 Obsolescent로 분류되었던 항목 중에서 몇몇 문법이 Deleted 항목으로 변화되었다. 즉, 과거 표준과의 일부 단절이 일어났다.

Deleted
 Real and double precision DO variables.
 Branching to a END IF statement from outside its block.
 PAUSE statement.
 ASSIGN and assigned GO TO statements and assigned format specifiers.
 H edit descriptor.

Obsolescent
 Arithmetic IF
 Shared DO termination and termination on a statement other than END DO or CONTINUE
 Alternate return
 Computed GO TO statement
 Statement functions
 DATA statements amongst executable statements
 Assumed length character functions
 Fixed form source
 CHARACTER* form of CHARACTER declaration

 Fortran 2003 
원래는 90에 대한 10년 단위 major update로 Fortran 2000이 계획되었으나, 합의가 늦어지고 Fortran 2003으로 발표된다.

Fortran 2003은 ISO/IEC 1539-1:2004가 공식 문서이다.

 상속과 다형성객체, type-bound 프로시저, 추상 데이터형 지원 등으로 OOP(Object Oriented Programming) 지원
 IEEE 부동소수점 표준 내장 모듈
 비동기 전송, 스트림 타입 I/O 도입에 따른 I/O 개선
 명령 라인에 대한 지원, 시스템 환경 변수 지원 등 사용자 환경에 대한 구성 추가
 프로시저포인터
 데이터 조작성 강화
 C언어와 상호호환성 BINDING
 할당 특성에 대한 강화
 기타 기능 강화

 Fortran 2008 
Fortran 2008은 2010년에 발표된 표준으로 ISO/IEC 1539-1:2010이 공식 문서이다. Fortran 2003에 대한 minor revision으로 다음과 같은 기능의 추가를 특징으로 한다.

 Do concurrent를 이용한 병렬 처리 지원 강화
 Cray 포트란의 기능이었던 Coarray의 표준화
 Submodule을 이용한 OOP 지원 강화
 기타 기능 개선

 Fortran 2018 
Fortran 2018은 2018년에 발표된 표준으로 ISO/IEC 1539-1:2018이 공식 문서이다. Fortran 2008에 대한 minor revision에 해당한다.

 Fortran 2023 
Fortran 2023은 가장 최근의 포트란 국제 표준이며 2023년 11월 17일 발표되었다. ISO/IEC 1539-1:2023이 공식 문서이다.

 예제 
 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 > 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

 각주 

 외부 링크 

 WG5 - ISO/IEC JTC1/SC22/WG5
 J3 - US Fortran standards committee
 List of Fortran Compilers
 GNU - Fortran Standards Documents
 GNU fortran wiki
 High Performance Fortran - HPFF
 IEEE 754 - 1985 부동소수점 표준
 에이다 2012 표준은 포트란에 대한 공식 바인딩을 포함.

 
분류:프로그래밍 언어
분류:명령형 프로그래밍 언어
분류:절차적 프로그래밍 언어
분류:객체 지향 프로그래밍 언어
분류:1957년 개발된 프로그래밍 언어
분류:포트란 프로그래밍 언어 계열
분류:수치 프로그래밍 언어
분류:컴퓨터 표준
분류:배열 프로그래밍 언어
분류:정적 타입 프로그래밍 언어
분류:ISO 표준 프로그래밍 언어
분류:고급 프로그래밍 언어