포트란

website = https://wg5-fortran.org *The Fortran Automatic Coding System for the IBM 704* (1956년 10월 15일): 포트란을 위한 최초의 프로그래머 참조 매뉴얼 **포트란**(Fortran, 이전 명칭 **FORTRAN**)은 1954년 IBM 704에서 과학적인 계산을 하기 위해 시작된 컴퓨터 프로그램 언어이다. FORTRAN은 수식(**For**mula) 변환기(**Tran**slation)의 약자이다.(IBM Mathematical *For*mula *Tran*slating 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 704https://www.ibm.com/history/700 메인프레임머신에 사용할 프로그래밍 언어로 어셈블리어에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고archive-url=https://web.archive.org/web/20131124171040/http://www.fh-jena.de/~kleine/history/languages/FortranAutomaticCodingSystemForTheIBM704.pdf, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 그 이전의 프로그래머들은 손수 어셈블리어를 이용해야 했다.
## 초창기
IBM은 1958년 FORTRAN II, 1962년 FORTRAN IV를 출시하였다. IBM이 포트란을 내놓자 다른 여러 벤더에서 포트란 컴파일러를 각자의 시스템에 맞게 제작하기 시작하였다. 벤더들 각자의 이름을 가진 컴파일러를 개발하기도 하였지만 다수에서 IBM 포트란 버전과의 문법적 동일성을 강조하며 FORTRAN II, FORTRAN IV를 그 이름으로 컴파일러를 출시하였다. 하지만 각각의 기계 의존적 문법이 존재하였으며, 같은 코드로 여러 머신에서 동일한 동작과 결과를 얻고자 하는 사람들의 요구가 커졌다.
## FORTRAN 66
Business Equipment Manufacturers Association(BEMA)현재 The Information Technology Industry Council (ITI)은 포트란 표준화에 대한 논의를 시작하며, ANSI(당시는 ASA)에 표준 문법을 제출한다. IBM이 가장 영향력이 높았으므로 표준화는 IBM FORTRAN IV 컴파일러를 바탕으로 진행되었다. 1966년 ANSI의 승인을 얻게 되며, 첫 미국 포트란 표준이 발표된다. 대중에게 FORTRAN IV와 FORTRAN 66은 혼용되어 불리게 된다. 표준이라는 용어는 아직 생소하여 대중은 본인들이 사용하는 컴파일러의 이름인 FORTRAN IV를 사실상 표준과 같은 의미로 사용하였다. 이 표준은 산업 표준으로 널리 받아들여지게 된다.https://wg5-fortran.org/ARCHIVE/Fortran66.pdf 이후 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이다.https://wg5-fortran.org/ARCHIVE/Fortran77.html ISO는 이 ANSI FORTRAN 77을 수용하여 포트란 국제 표준으로 받아들인다. 공식 문서는 ISO 1539:1980이다.http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=6127 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.https://wg5-fortran.org/ARCHIVE/mil_std_1753.html 다음과 같은 사항이 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년에 이루어진다.https://wg5-fortran.org/N001-N1100/N692.pdf 포트란의 현대화가 진행된 표준이며, 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이다.http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=26933 이는 Fortran 90에 대한 확장 기능을 제공하던 High Performance Fortran(HPF) 프로젝트의 영향을 받아 병렬 프로그래밍에 대한 지원을 목적으로 한다. 다음의 추가적 기능을 특징으로 한다. # 벡터화를 목적으로 한 FORALL 문Forall 문법의 실패 : 2013 WG5 회의에서 UK(영국)측의 차기 표준에서 제외에 대한 제안 - https://wg5-fortran.org/N1951-N2000/N1975.txt, 중첩 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이 계획되었으나John Reid. 2001. International Fortran standards committee (WG5). SIGPLAN Fortran Forum 20, 3 (December 2001), 24–26. https://doi.org/10.1145/570822.570827 , 합의가 늦어지고 Fortran 2003으로 발표된다. Fortran 2003은 ISO/IEC 1539-1:2004가 공식 문서이다.https://wg5-fortran.org/N1551-N1600/N1579.pdf # 상속과 다형성객체, type-bound 프로시저, 추상 데이터형 지원 등으로 OOP(Object Oriented Programming) 지원 # IEEE 부동소수점 표준 내장 모듈 # 비동기 전송, 스트림 타입 I/O 도입에 따른 I/O 개선 # 명령 라인에 대한 지원, 시스템 환경 변수 지원 등 사용자 환경에 대한 구성 추가 # 프로시저포인터 # 데이터 조작성 강화 # C언어와 상호호환성 BINDING # 할당 특성에 대한 강화 # 기타 기능 강화
## Fortran 2008
Fortran 2008은 2010년에 발표된 표준으로 ISO/IEC 1539-1:2010이 공식 문서이다http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=50459. Fortran 2003에 대한 minor revision으로 다음과 같은 기능의 추가를 특징으로 한다.https://wg5-fortran.org/N1801-N1850/N1828.pdf # Do concurrent를 이용한 병렬 처리 지원 강화Forall을 대체 역할을 맡는 문법 Do ConcurrentParallel Programming Features in the Fortran Standard, Steve Lionel, 12.4.2012 # Cray 포트란의 기능이었던 Coarray의 표준화제안 문서 - https://wg5-fortran.org/N1601-N1650/N1642.pdf # 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) 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