포트란 (Fortran) 은 FORmula TRANslation 의 약자로, 수학/과학 계산을 위한 프로그래밍 언어이다.
C 가 더 범용적인데 반해, 포트란은 빠른 계산속도를 자랑한다.

사실 C 로 도 충분한데, 포트란을 쓰는 이유는,
1. 이미 짜여진 방대한 수학/과학 라이브러리와
2. 수퍼컴퓨터(병렬컴퓨터) 때문이라나...

이러한 이유라면, 포트란 77 에 관한 내용을 기록해 두는것이 맞다고 할 수 있다. 방대한 양의 코드가 이미 포트란 77 로 짜여져있으니까.
그럼에도 불구하고, 포트란 90/95 관련 메모를 남기는 건 90/95 가 더 좋기 때문이다 -_- 특히, 각종 짜증나는 규칙들이 제거되었다.
게다가 77 코드는 90/95 에서 대부분 호환이 되는데, 90으로 버전업을 할 때, 77 로 짜여진 방대한 라이브러리를 염두에 두었기 때문이다.
즉, 90/95 에서는 77의 장점도 쓸 수 있고, 90/95 의 장점도 쓸 수 있다. 말하자면, 짬뽕 규약의 코드를 짤 수 있다.
반면, 90 형식으로 짠 코드는 77 에서 호환이 안된다. 당연한게, 77의 짜증나는 규칙들을 상당수 제거했기 때문에, 77 입장에서는 형식에 맞지 않는 코드가 되어버리기 때문이다. 포트란의 버전업은, C의 장점들을 차용한 것들이 많다.

확장자는 77 이 .for 이고, 픽스트 포맷이며, 90 은 .f90 이고, 프리포맷이다. 간단히 말하면, 줄맞춰야 되느냐 막짜느냐 의 차이이다.
다른 언어와 마찬가지로, 컴파일과 링크는 컴퓨터 아키텍쳐 및 운영체제에 종속적이다. 따라서, 운영체제등을 고려하여 컴파일러를 결정한다.
예전에 MS 비주얼 씨 6.0 쓸때, CVF 6.6 같이 깔아서 썼었는데, VS 2008로 업글한 뒤에는 포트란을 써본적이 없다. 게다가 지금은  VS 2010 을 쓴다. 찾아보니, 인텔 포트란이 VS 2010 에 물려서 쓸수가 있다고 한다. 음...갖고 싶...   ( 인텔 싸이트 들어가보니, 리눅스용은 무료배포다. )

개인적으로 나는 "포트란으로는 코드 안짜지 말입니다. " 지만, 대충 읽고 C 로 다시 짜야되는데, 안쓰는 언어라 자꾸 까먹고 그래서 매번 레퍼런스 보기도 귀찮고, 그래서 기초적인걸 남겨두는게 좋을것 같다. 안쓰는 언어는 상상을 초월할 정도로 빠르게 까먹는다. 아 ...영어 ㅠㅠ...





1. 주석

포트란 77 까지는 주석문의 시작을 레이블링 하는 컬럼에 C ( comment ) 로 나타냈으나,
90/95 는 프리포맷으로, 아무 위치에서나 ! 를 사용한다.  컴파일러는 주석문을 무시한다.

! 주석문은 그줄의 끝 까지 이다.





2. 코딩문자

포트란 90/95 코딩에서 사용되는 문자들은 대충 다음과 같은 것들이다.

알파벳 26 개 ( 혹은 42개 )              주의. case insensitive : 대소문자 구별 안함 , 반면 C 는 대소문자를 엄격히 구분한다.

숫자 9 개

언더스코어 _

사칙연산  + - * /
거듭제곱    **
대입연산자 =

각종 기호들 ( ) < > : ; . , ' " ! ? % & $
빈칸




3. 문장 (statement)

C 처럼 문장 끝에 세미콜론 ; 같은게 붙지 않는다.

기본적으로 한 문장은 한 줄에서 작성하고, 너무 길거나 가독성의 이유로, 여러줄로 쓸때는 & 를 사용한다.


예)

a = b + c              와                      a  =   b   &
                                                           +  c                              는                     같다.


포트란의 문장은 실행문(executable statement) 와 비실행문(nonexecutable statement) 로 구분된다.
실행문은 연산과 같이 어떠한 액션 수행의 문장이고, 비실행문은 프로그램이 잘 작동하기위한 정보를 제공해주는 문장이다.
가령, 연산의 수행 및 대입 따위는 실행문이고, 변수의 선언은 비실행문이다.






4. 레이블링 (labeling)

문장에 고유번호를 부여해서, 레이블링 할수 있는데,  1 부터 99999 까지의 숫자를 사용한다.





5. 기본구조

프로그램의 큰 틀은 크게 3 가지 영역으로 구성된다.

1. 선언영역 (Declaration section)
2. 실행영역 (Execution Section)
3. 종료영역 (Termination Section)

선언영역에서 프로그램명, 변수 따위가 선언된다.
실행영역에서 각종 계산 및 명령을 수행한다.
종료영역에서 프로그램을 닫아준다.

서브루틴이나 모듈 등도 위와 같은 구조를 갖는다. 이에 대해서는 나중에 자세히 살펴보도록 한다.




6. 선언영역

6.1. 프로그램 명 선언

구문은 다음과 같다.
PROGRAM program_name

PROGRAM 문은 비실행문으로, 코드 첫줄에 오며, 프로그램의 이름을 컴파일러에게 전달한다.
포트란은 대소문자 구별 안하니까 당연히 program 이라고 써도 되는데, 보통 키워드를 대문자로 쓰는 관습이 있다.

프로그램 명에는 알파뉴머릭 (alphanemeric) 과 언더스코어(_) 를 쓸 수 있다.


6.2. 변수선언

정수변수의 선언은 INTEGER , 실수형 변수의 선언은 REAL  을 사용한다. 
문자변수는 CHARACTER 를 사용한다.

기본적인 구문은 다음과 같다.

INTEGER ::  variable names
REAL :: real_variables

CHARACTER [ ( len = length ) ] :: variable names
CHARACTER [ ( length ) ] :: variable names

length 부분에 숫자를 써넣으면, 문자열 데이터가 된다. ( len = ) 부분을 생략하면, 자동으로 길이가 1 로 설정되고, 단일문자 변수가 된다.
( len = 숫자 ) 대신 그냥 ( 숫자 ) 로 써도 된다.



7. 실행영역

기본적인 4칙 연산은 C 랑 같고, C에는 거듭제곱이 없는데, 포트란의 경우 계산언어답게 거듭제곱이 있다.
MS 계열의 프로그램이나, 각종 계산기에서 거듭제곱으로 많이 쓰는 ^ 의 경우, ALGOL인가(?) 에서 유래되었는데,
포트란에서는 ** 를 사용한다.

기본적인 입출력함수로 출력은 WRITE , 입력은 READ 문을 사용한다. ( 출력으로 PRINT 문도 있는데 권장되지 않는다고 한다. )

WRITE 와 READ 의 구문에 대해서는 따로 살펴보기로 한다.



8. 종료영역

종료영역에서는 STOP 문과  END PROGRAM 문을 사용한다.

STOP 문은 프로그램의 실행을 정지시키라는 명령으로, C로 치자면 BREAK 같은 것으로 생각할 수 있다.

END PROGRAM 은 컴파일러에게 더이상 컴파일될 문장이 없음을 알려주는 문장이다.

그런데, END PROGRAM 을 만나면, 어차피 컴파일러가 자동으로 STOP 명령을 내기때문에,
STOP 과 END PROGRAM 문이 연달아 붙어있는 경우에는 굳이 쓰지 않아도 상관없다.

END PROGRAM [ program name ]

END PROGRAM 뒤에, 종료시킬 프로그램을 명시적으로 나타내줄수도 있다.




예제코드 (.f90)

간단한 코드를 살펴봄으로써, 기본적인 구조를 살펴보자.
C 나 Java 였다면, Hello World 를 찍었겠지만, 그래도 명색이 계산용 언언데...

다음의 예제코드는 두 실수를 입력받아서, 그 첫번째 수에 두번째 수를 거듭제곱한 값을 출력하는 프로그램이다.


실행결과.



똑같은 프로그램을 C로 작성해보면, 포트란이 상당히 계산에 특화되어 있음을 느낄수 있다.