*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언어와 같이 범용프로그래밍 언어에 속하는 프로그래밍언어들에 비해 탁월한 효율이 있는 과학계산 전문 언어이다. 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 표준은 다음과 같은 문법을 포함하고 있다.

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

### 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표준은 다음과 같은 몇 가지 특징적인 기능을 포함하게 된다.

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

#### 미 국방성 표준

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

다음과 같은 사항이 ANSI FORTRAN 77에 비해 추가되었다.

1. IMPLICIT NONE
2. END DO
3. DO WHILE 문
4. INCLUDE 문
5. END-OF-FILE 레코드를 만난 이후에도 READ, WRITE 수행
6. 비트필드 연산에 대한 내장 함수들

위 사항 중에서 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으로 바뀐 것을 포함하여, 다음과 같은 사항을 표준에 추가하였다.

1. 자유 형식 도입. 포트란 키워드에 소문자 허용
2. 식별자의 길이는 31문자까지 허용
3. 인라인 형태의 주석문
4. 배열 이름을 이용한 배열 전체 요소에 대한 연산 기능
5. RECURSIVE 키워드를 이용한 재귀호출 프로시저
6. MODULE을 이용한 모듈화 프로그래밍
7. INTERFACE 문을 이용한 명시적 프로시저 선언
8. 연산자 오버로딩
9. 사용자 제너릭 프로시저
10. Derived type - 유도 타입(타 언어의 구조체 - structure)
11. 속성을 부여한 타입 선언
12. 동적 메모리 할당
13. 포인터 속성을 이용한 자료구조와 동적 접근 알고리즘에 대응
14. EXIT, CYCLE 문, NAMED 구조
15. SELECT CASE 문
16. 사용자 지정 정밀도 선언
17. RANDOM\_NUMBER, DATE\_AND\_TIME 등 각종 다양한 목적의 내장 프로시저의 추가
18. 표준 문서에 Obsolescent(비 권장 문법, 이후 삭제 예정 사항) 와 Deleted(삭제) 분류 문법의 등장

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

Obsolescent features

1. Arithmetic IF
2. Real and double precision DO control variables and DO loop control expressions
3. Shared DO termination and termination on a statement other than END DO or CONTINUE
4. Branching to an END IF statement from outside its IF block
5. Alternate return
6. PAUSE statement
7. ASSIGN and assigned GO TO statements
8. Assigned FORMAT specifiers
9. 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(HPFF) 프로젝트의 영향을 받아 병렬 프로그래밍에 대한 지원을 목적으로 한다.

다음의 추가적 기능을 특징으로 한다.

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

Fortran 95에서는 Fortran 90에서 Obsolescent로 분류되었던 항목 중에서 몇몇 문법이 Deleted 항목으로 변화되었다.

Deleted

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

Obsolescent

1. Arithmetic IF
2. Shared DO termination and termination on a statement other than END DO or CONTINUE
3. Alternate return
4. Computed GO TO statement
5. Statement functions
6. DATA statements amongst executable statements
7. Assumed length character functions
8. Fixed form source
9. CHARACTER\* form of CHARACTER declaration

### Fortran 2003

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

Fortran 2003은 ISO/IEC 1539-1:2004가 공식 문서이며이다. 다음과 같은 사항을 주요 사항으로 한다.

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

### Fortran 2008

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

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

### 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

```