최근 수정 시각 : 2024-11-05 00:34:00

포트란

fortran에서 넘어옴

프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: 2em;"
{{{#!folding [ IEEE Spectrum 2024 ]
{{{#!wiki style="margin: -5px 0"
<rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 SQL
2 Java 2 Python
3 JavaScript 3 Java
4 C++ 4 TypeScript
5 TypeScript 5 SAS
6 SQL 6 JavaScript
7 C# 7 C#
8 Go 8 HTML
9 C 9 Shell
10 HTML 10 C++
}}}
}}}
}}}
[ Stack Overflow 2024 ]
[ TIOBE 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 MATLAB
2 C++ 12 Delphi / Object Pascal
3 C 13 PHP
4 Java 14 Rust
5 C# 15 Ruby
6 JavaScript 16 Swift
7 SQL 17 Assembly language
8 Visual Basic 18 Kotlin
9 Go 19 R
10 Fortran 20 Scratch
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
21 COBOL 36 Scala
22 Classic Visual Basic 37 Transact-SQL
23 LISP 38 PL/SQL
24 Prolog 39 ABAP
25 Perl 40 Solidity
26 (Visual) FoxPro 41 GAMS
27 SAS 42 PowerShell
28 Haskell 43 TypeScript
29 Dart 44 Logo
30 Ada 45 Wolfram
31 D 46 Awk
32 Julia 47 RPG
33 Objective-C 48 ML
34 VBScript 49 Bash
35 Lua 50 Elixir
}}}}}}}}} ||
[ PYPL 2024 ]

}}} ||
프로그래밍 언어 목록 · 분류 · 문법

program main
    write(*,*) "Hello World!"
end program main

1. 개요2. 표준화의 진행
2.1. 표준에 대한 오해들
3. 특징4. 속도 논쟁
4.1. 주장 14.2. 주장 2
5. 포트란이 사용되는 예6. 문법7. 기타8. 관련 문서

1. 개요


포트란(Fortran)은 1950년대 말에 IBM 존 배커스(John Backus) 외 6명의 전문가가 완성한 세계 최초의 고급 프로그래밍 언어 중 하나이다.[1] 1953년 IBM에서 존 배커스 주도로 IBM 701 컴퓨터를 위해 개발한 언어인 스피드코딩(Speedcoding)[2]의 기술적 후계자이다. 알골과 함께 과학 계산용으로 주로 사용되고 매우 간결하고 엄격한 구문 형식을 가지고 있다. ANSI ISO에서 표준화되었다. 이름은 수식 변환기(FORmula TRANslator)라는 뜻으로, 이름 그대로 수식을 계산하는데 특화되어 있다. 수식 계산에 특화되어 있다는 것은 아래와 같은 이념을 가지고 설계되어 있다는 것이다.
  1. 수식을 간단하게 표현할 수 있다.
  2. 수치 계산이 빠르게 수행된다.

컴퓨터 공학에서는 죽은 언어로 인식하고 있지만 계산수학에서는 아직도 C와 더불어 활발하게 쓰인다. 역사가 유구한 것을 연구하는 전공의 공대나 자연대 대학원 학과에 진학할 경우 접할 수도 있는 언어이며 슈퍼컴퓨터로 뭔가를 해야 할 일이 생길 경우 높은 확률로 사용하게 될 언어이다.

포트란을 쓸 수 있는 IDE에 대해서는 위키피디아에 잘 정리되어 있으니 참고하도록 하자.

TIOBE에 따르면, 2020년대 들어 수학 및 과학적 계산을 실행하는 프로그램의 중요성이 커짐에 따라 포트란의 인기가 다시 증가하고 있다고 한다. 출처 점유율 1.24%에 10위로, 루비나 스위프트, 매트랩보다 높다고 한다. 이 원인으로 최근에는 수학, 과학용으로 파이썬이 많이 쓰이는 추세이기는 하나 구동 속도가 느리고, 강력한 경쟁자인 매트랩은 유료 라이선스가 부담되기 때문에 여전히 슈퍼컴퓨터나 항공우주, 계산과학 분야에서 자주 쓰이는 전통의 강자인 포트란이 우세를 점한 것으로 보인다고 한다.

2. 표준화의 진행

WG5[3]로 불리는 ISO(국제 표준화 기구) 포트란 위원회에서 ISO표준 논의가 진행되며 J3[4]로 불리는 US Fortran committee 에서 ANSI(미국 국립 표준 협회) 표준이 논의된다.

대체적으로 ANSI 표준은 거의 변화 없이 ISO 표준으로 받아들여 진다. 현재의 WG5의 구성원은 J3와 대동소이하며 J3는 WG5의 부분으로 활동하고 있다.

1956년 개발, 1957년 IBM에서 "THE FORTRAN AUTOMATIC CODING SYSTEM FOR THE IBM 704 EPDM"이란 이름으로 발표한 이후의 약 10여년간은 포트란계의 춘추전국시대였다. 이 후 IBM에서 FORTRAN II, FORTRAN IV를 개발하여 발표하였고, 여러 벤더에서 II와 IV의 명칭을 사용한 포트란 컴파일러를 발표하였다. 또 여러 벤더에서 그들만의 언어적 특징과, 아이디어, 문법을 가지며 이런 저런 포트란을 만들었기 때문에 그 시절에도 40여 가지의 컴파일러들이 있었다 한다.

1966년에 BEMA(Business Equipment Manufacturers Association)의 주도하에 첫 ANSI(당시는 ASA) 표준이 지정되었으며, 이 표준은 36페이지 짜리 문서로 발간되었고 FORTRAN66으로 불린다. 이는 대중에게는 FORTRAN IV 라고도 혼용되어 불리는데, 당시 IBM의 영향력이 가장 컷으므로 IBM FORTRAN IV 컴파일러를 그 기반으로 표준화가 진행되었기 때문이다. 해당 표준문서의 명칭은 ANSI 3.9-1966이다. FORTRAN IV는 컴파일러 제품명이며 FORTRAN66은 표준의 이름이다. 최초의 ANSI표준이 등장하면서 기존의 난해한 상황은 약간 정리가 되었다. FREQUENCY 문, SENSE 문 같은 여러 벤더에서 자의적으로 사용하던 문법들이 사라지기 시작했기 때문이다. ISO R1539:1972는 FORTRAN66에 대응하는 ISO 표준에 해당한다.(해당 표준의 ISO의 승인은 1972년에 되었다.)

이후 가장 널리 알려지고 유명해진 표준은 1978년에 ANSI에 의해 승인된 FORTRAN77로 그 문법 만으로도 260여 페이지가 되었다. 현재 대대로 내려오고 있는 많은 수치해석 코드들은 이 표준을 따라 작성된 예가 많다. FORTRAN77은 처음으로 공식적으로 OPEN문, CHARACTER 형 선언이 추가되었다. CHARACTER형이 추가되기 이전엔 각 컴파일러 자의적으로 사용하고 있거나, Hollerith 수식을 사용했다.[5] ISO 1539:1980 이 ISO FORTRAN77에 해당이 된다.

한편, 미 국방부에서는 이 ANSI FORTRAN77 에 추가적인 기능이 포함된 표준을 발표했다.[6] 이 미국방부 77표준에는 다음과 같은 문법이 적용되었다.
  1. END DO 문
  2. IMPLICIT NONE 문
  3. INCLUDE 문
  4. 정수연산에 대한 비트연산 내장함수 추가
  5. DO WHILE 루프 문

이 중에서 INCLUDE 문을 제외한 문법 사항은 Fortran90 표준에 공식적으로 포함이 된다.(현재도 INCLUDE문은 표준 문법이 아니다.)

차기 포트란 표준을 모색하던 포트란 위원회의 구상은 FORTRAN88 이었으나(66, 77, 88... 이런 규칙을 가지려고 노력했었던 것 같다.) 몇 가지 문법사항이 추가되며 결국 Fortran90으로 발표된다. ISO/IEC 1539 : 1991 (E) 가 ISO Fortran90의 공식 문서가 된다. 분량은 388쪽에 달한다. 이 버전에선 Modern한 언어로서 포트란이 가져야 할 특징들이 대대적으로 정의되었고, 기타 빠르게 변하고 있는 컴퓨팅 업계의 흐름을 따라잡기 위한 시도가 반영되었다. 이때부터 FORTRAN → Fortran으로 표준의 이름에 소문자가 쓰이기 시작한다.

Fortran95는 Fortran90에 추가적인 기능의 필요성이 있어서 발표된 마이너 업데이트다. 병렬컴퓨팅을 지원하기 위한 FORALL문[7] 같은 문법이 추가되었고, Non-Modern한 구식의 몇 개의 문법이 Obsolescent에서 Deleted로 바뀌어 삭제가 일어난 표준이다. 포트란 위원회는 이때부터 10년 기준의 메이저 업데이트와 중간 5년 단위의 마이너 업데이트를 계획하기 시작한다.[8]

10년 단위 메이저 업데이트로 Fortran2000이 계획되었으나 이전 표준과 마찬가지로 합의가 늦어지고 Fortran2003으로 발표된다. ISO/IEC 1539-1:2004(E) 가 공식 ISO Fortran2003의 문서가 된다. 문서의 양은 585쪽으로 늘어났다. C언어 바인딩 공식 지원, 객체 지향 프로그래밍, IEEE 부동소수점연산 예외 처리 모듈 지원등을 큰 특징으로 한다. 사용자들이 이 표준으로 체감하는 가장 큰 기능은 ISO_C_BINDING 내장 모듈이며, C언어와 Mixing에 대한 방법론을 하나로 통일시킨 혁신적인 표준이다.

Fortran2008은 5년 단위의 마이너 업데이트에 해당한다. Fortran95에 추가된 문법인 Forall 문이 그 의도와 다르게 병렬화를 제대로 지원하지 못했는데, 이는 문법의 제약상 모호한 부분에 의해 정확한 고려가 없다면 거의 모든 컴파일러에서 그냥 Do Loop를 사용하는 것과 비교해 퍼포먼스상의 이득이 발생하지 않는 형태로 구현되어 버렸다. 이를 보완하기 위해서 Do concurrent를 추가하였고, Fortran95 때와 마찬가지로 병렬 프로그래밍에 대한 지원으로 HPF(High performance fortran)프로젝트 의 기능들이 대거 추가되었으며, Cray 포트란의 기능이었던 Coarray 기능이 추가되었다.

현재 최신의 포트란 표준은 2023년 11월 17일 발표된 Fortran2023이다.

대부분의 " 컴파일러"는 레거시( 하위 호환)를 기본으로 유지해 주며 자기들만의 다양한 확장기능을 추가적으로 제공한다. 초기 시대에 각 컴파일러마다 제각각 지원하던 기능들에 대해서도 보편적으로 계속 지원하고 있으며, 컴퓨터 환경의 추가적 요구들에 표준보다 먼저 앞서가는 것은 컴파일러를 판매하는 상업회사의 기본적 태도이다. 생태계가 오래되었으며 초창기 표준의 제정 이전에 다양한 변형문법이 존재했던 이유로 표준은 아니지만 여러 컴파일러에서 비슷하게 지원하는 문법이 존재하고, 이는 사용자에게 착각을 일으키기도 한다. 현재 어떤 회사에서 특징적으로 제공하는 문법이 미래의 표준으로 들어갈 수도 있고 아닐 수도 있다. 여러 컴파일러에서 지원하지만 표준은 아닌 문법/내장프로시저들이 다수 존재한다. 이는 본질적으로 코드의 이식성과 유지에 어려움을 만들며, 각 컴파일러에 대한 의존성을 낮추기 위해서는 표준에 부합하는 코드를 작성해야 한다.

표준이 지속적으로 발표되면서 obsolescent[9], deleted[10]로 분류되는 문법 사항들이 나온다.

이하는 Fortran90에서 obsolescent로 분류되었던 문법이다.
  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 statement
  4. Branching to an END IF statement from outside its IF block
  5. Alternate return
  6. PAUSE statement
  7. ASSIGN statement and assigned GO TO statements
  8. Assigned FORMAT specifiers
  9. H edit descriptor (일명 홀러리스 문자열)

90에선 obsolescent로 분류된 항목은 있지만 77의 문법 중에서 deleted 된 것이 없다. 따라서, 90 표준은 77 표준의 모든 문법을 포함하는 하위 호환을 유지하여 77 표준의 모든 문법은 90 표준의 부분집합이 되었다.

이하는 95에서 삭제(deleted)된 문법이다. Fortran95에서 Fortran90에서 obsolescent로 분류되었던 6가지 문법사항이 삭제 되었다.따라서 Fortran95 이후부터 포트란 표준이 아닌 문법이다.
  1. ASSIGN and assigned GO TO statements (할당형 GO TO)
  2. Assigned FORMAT specifier (할당형 FORMAT)
  3. Branching to an END IF statement from outside its IF block (IF 블록의 외부에서 END IF 문으로 분기)
  4. H edit descriptor (홀러리스 문자열)
  5. PAUSE statement (PAUSE 문)
  6. Real and double precision DO control variables and DO loop control expressions (DO 루프 제어를 실수형 변수로 하는 것)

Fortran2008의 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
  5. Statement functions
  6. DATA statements amongst executable statements
  7. Assumed length character functions
  8. Fixed form source
  9. CHARACTER* form of CHARACTER declaration
  10. ENTRY statements
  11. Vertical format control.

character선언시 * 를 사용하는 것, 고정형식소스 형식 등등이 모두 obsolescent 인 점을 눈여겨 봐야 한다.

2.1. 표준에 대한 오해들

포트란 사용자들은 유독 77, 90을 떠벌리기를 좋아하지만 제대로 쓰인 자료가 별로 없다. 심지어 많은 책들도 그러하지 못하다. 1972년에 탄생한 C언어도 여럿 표준을 개정해가고 있고 바뀌어 가고 있음에도, 유독 포트란을 고대어라고 치부하는 치기어린 오해들이 넘친다.
  1. FORTRAN77은 Fortran90의 부분집합으로 모든 "표준에 부합하는" FORTRAN77 코드는 완전하게 Fortran90으로 부를 수 있다. 즉, "Fortran90이 아닌 FORTRAN77"과 같은 표현은 완전히 잘 못 사용하는 표현이다. 코드의 "모양"이나 "확장자명"은 77과 90을 나누는 기준이 아니다. 소스코드를 77과 90등으로 나눌 수 있는 기준은 소스코드에 포함된 문법의 유무이다. 95 이후에 삭제된 문법이 존재하므로 "95코드가 아닌 90코드"는 가능한 표현이다.
  2. Fixed form(고정형식)이냐 Free form(자유형식)이냐는 코딩 스타일 문제이다. 물론 77에선 Fixed form 밖에 없다. 90 이후의 기준으로 그저 선택의 문제이며 대부분의 컴파일러에서 fixed, free form을 확장자로 체크한다. 확장자에 쓰인 숫자(.f90, .f95 등)에 명백한 표준의 의미는 담겨있지 않다.
  3. 77의 이름을 달고 있는 컴파일러들도 90에서야 표준인 기능들을 다수 "확장 기능"으로 지원한다. 77표준만 지원하는 것이 아니다. 1980년대 후반이나 1990년대 이후 만들어진 77이름을 단 컴파일러들은 대다수가 (END DO, IMPLICIT NONE 문 같은 - ANSI 표준이 아닌 미국 국방부버전의 확장77부터 추가된 기능. 공식적으론 90 이상의 문법으로 불려야 한다.) 이후에 표준화된 문법을 확장기능으로 지원한다.

3. 특징

산술 기호를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 그대로 불러내어 쓸 수 있다. 또 실수만이 아니라 복소수를 그대로 변수 형으로 쓸 수 있다. 물론 이러한 장점은 현재의 각종 프로그래밍 언어에서는 표준 라이브러리 등을 통해서 기본적으로 제공되는 기능이지만, 당시에는 굉장히 획기적인 방법이었다. 배열에 대해서도 많이 지원해 줘서, 옛날에 나온 언어임에도 불구하고 MATLAB에서처럼 쉽게 배열을 다룰 수 있다.

기본적으로 절차적 프로그래밍(procedural programming)이지만 90, 2003을 거치면서 OOP의 요소를 많이 넣게 되었다. 하지만 하위호환을 유지해야 하므로 아무래도 C++[11]에 비해서는 문법적/구조적으로 불편한 부분이 많다.

C와의 큰 차이점 중 하나로 배열의 배치 순서가 서로 다르다. C는 Row-Major Order를 따르며, Fortran은 Column-Major Order를 따른다. C에서는 (1,1) 다음이 (1,2)이지만, 포트란에서는 (2,1)가 된다. 따라서 다른 언어와 함께 프로그래밍을 할 때는 변수를 넘겨줄 때 순서를 바꾸어 주어야 한다. 또한 반복 계산을 할 때 가장 처음 인수부터 돌려 줘야 성능의 저하가 없다. 또한, 배열의 시작 숫자가 0이 아닌 1부터 시작이다. 사용자가 배열의 인덱스를 조정하는 것이 가능한 것은 포트란의 특징 중 하나이다. 배열의 인덱스를 -100 ~ 100처럼 지정하는 것이 가능하다.

초기 버전은 대문자만 인정했기 때문에 가독성이 떨어진다. 그 이유는 키보드가 없던 시절 천공 카드로 프로그램을 입력해야 했는데 여기엔 소문자가 없었기 때문.

국내 대부분의 대학교에서 수치해석 등의 과목을 포트란을 이용한 수업을 했었다. 허나 지금은 수치해석도 매트랩으로 하며 기타 다른 분야에서도 포트란은 거의 가르치지 않는 추세다. 다만 항공우주공학과에선 요즘도 자주 쓰이며, 그 이외 일부 기계공학과나 자연과학대학에서 여전히 가르치기도 한다.

4. 속도 논쟁

4.1. 주장 1

물리학 커뮤니티에서 종종 볼수 있는 만년 떡밥. 수치해석에 있어서 포트란을 사용하는 것이 항상 좋다는 이야기는 아니지만, Fortran 77의 역량을 맘껏 발휘할 수 있는 알고리즘을 돌릴 경우 C++의 2배 정도의 속도를 낸다. 참조[12]

역량을 발휘할 수 있는 예로는 재귀적 호출을 쓰지 않고 해결할 수 있는 종류가 있다. 포트란은 원래 재귀함수를 지원하지 않았다. 재귀함수를 호출하면 그때마다 필요한 오버헤드를 수행해야 하고, 스택에 있는 변수를 참조할 때 한다리 건너 간접적으로 접근해야 하는 등 속도에 불리한 점이 있다. 포트란의 속도가 빠른 이유가 바로 이것. 90 표준에서는 재귀함수를 지원하지만, 사용에 주의를 요한다.

물론 복잡한 자료구조를 가진 알고리즘을 짜야 할 경우, 포트란77로 짜다가 돌아버릴지도 모른다.

4.2. 주장 2

속도 차이가 생기는 원인은 언어의 컴파일러의 프로그램 최적화, 또는 Application 프로그래머의 프로그래밍 최적화 문제다. 어떤 컴파일러가 어떤 문법을 어떤 Architecture에 맞게 최적화 해내는가를 고급 프로그래밍 언어의 레벨에서 결정될 수 없다. C와 Fortran 두 언어 모두 고급 프로그래밍 언어로 컴파일러에 의해 바이너리 코드로 변환되어야 한다. 즉, 엄밀히 말하자면 C가 포트란보다 빠른 게 아니라 C 컴파일러를 거친 프로그램이 포트란 컴파일러를 거친 프로그램보다 빠른 거다. 또한 포트란 컴파일러들 조차도 C언어로 작성되기 때문에 근본적으로 C언어가 포트란보다 느리다 라는 이야기가 얼마나 형편없는 소리인지 금방 이해할 수 있다. 80, 90년대 까지 일반적으로 포트란이 활용되던 기기와 C언어가 사용되던 환경의 특성차이에 오는 면을 간과하고 고급 언어와 고급 언어 사이의 속도를 논쟁하는 '비 프로그래밍 분야의 전문가'들이 프로그래밍 언어에 대한 부족한 이해가 결합된 논쟁이라 할 수 있다. 또한 포트란77 표준에는 명시적인 재귀호출 문법이 존재하지 않았지만, 다수의 주요 포트란77 컴파일러에서는 재귀호출을 (확장기능으로) 지원하였다.

C99 표준 발표 이전에 포트란이 (C에 대해 상대적으로)가진 최적화의 유일한 이점은 프로시저의 인수가 (pointer 또는 target 속성을 가지지 않는다면) 메모리가 오버랩되지 않음을 가정하므로 컴파일러의 입장에서 최적화된 코드를 생성하는데 적합했다는 것이다. C언어에서 C99 표준부터는 restrict keyword를 프로그래머가 명시하여 포인터가 가리키는 메모리 영역이 오버랩 될 수 있는지 그렇지 않은 지를 컴파일러에게 명시적, 선택적으로 알려줄 수 있도록 하여 해결하였다.[13][14][15] 즉, 포인터 앨리어싱의 선택을 과거에는 각 컴파일러에서 컴파일 시 최적화 옵션을 통해 결정하였으나 현재는 언어의 문법 표준으로 포함하도록 하였다.

5. 포트란이 사용되는 예

포트란은 과학 계산용 언어를 목표로 IBM이 1950년대 개발한 언어다. 다만, 쓸만한 범용 개발언어가 부족했던 시기였고 언어 사용자층이 두꺼웠던 만큼 범용적인 용도로도 언어가 사용되기는 하였다. 과학기술용 언어로는 포트란, 상업용 언어로는 코볼이라고 할 만큼 대표적인 제 3세대 언어였지만 1980년대 이후로 보다 사용하기 쉬운 제 4세대 언어의 출현으로 이제는 범용 목적으로는 거의 쓰이지 않게 되었으며, 대부분 C로 교체되었다. 하지만 애당초 수치해석용에 특화시켜 개발되었고, 방대한 수치해석 라이브러리를 가지고 있기 때문에 대량의 계산을 해야 하는 특정 분야에서는 중요한 언어로 명맥을 이어가고 있다.

수치계산분야로 연구관련 코드를 찾으면 포트란 코드로는 거의 모든 분야가 다 있다. 그것도 소위 듣보잡들이 만든게 아니라 교과서에 이름이 실릴만한 유명한 사람들이 만들어서 저널에서 실렸고 수십년간 사용되고 수도 없이 검증됐다.

예를 들어, 수퍼컴퓨터 등의 클러스터를 이용한 대량의 계산을 위한 MPI(Message passing interface)의 경우, 포트란과 C 라이브러리로만 나온다. 즉 슈퍼컴퓨터에서는 무조건 C 아니면 포트란을 사용해야 하는 것. 엄청난 양의 수치계산이 필요한 분야의 경우 수퍼컴퓨터를 사용하는데 수퍼컴퓨터는 가격이 아주 비싸고 유지비가 많이 들기 때문에 종량제처럼 돈을 받아서 운영하는 경우가 많다. 돈을 받던 받지않던 실제 자신이 소속된 연구소나 회사 소유의 수퍼컴퓨터라도 직급이나 소속에 따라서 수퍼컴퓨터 사용시간과 사용범위가 제약된다. 그래서 연구자들은 수퍼컴퓨터를 사용할때 자신의 컴퓨터에서 최대한 코드를 완성하고 수퍼컴퓨터에 업로드해서 실행 시켜본후 수정하고 또 수정하는일을 반복한다. 물론 한번에 실행되길 소원하면서. 자기의 수퍼컴퓨터 사용시간을 조금이라도 절약하길 바라는 건 모든 수퍼컴퓨터 사용자의 소망이다. 이런 이유로 수퍼컴퓨터에서 가장 단기간에 성과를 내고 가장 많이 입증된 수퍼컴퓨터 관련 프로그램 코드가 바로 포트란으로 만들어진 코드이다. 이게 현재 포트란의 아주 강력한 장점인 것.

물리학과에서 사용하는 예시로는, 다음과 같은 것들이 있다. 원자핵 약한 상호작용에 의한 핵자간 상호작용을 구하는 것은 굉장한 연산을 필요로 하는데 최대한 효율을 올리기 위해서 포트란으로 프로그래밍을 한다. 다입자계 시간에 의존하는 섭동을 구하려면 수치계산밖에 없는데 막대한 계산에는 시간이 걸리니 거기서 포트란이 다시 등장하는 것이다. 정밀한 Multi-loop 상호작용을 관찰하기 위해서, 경로적분 매개변수화의 복잡한 수치계산을 담당하는 SecDec 툴에 지원되는 주요 언어중 하나에 포트란이 있다.

양자계산, 흔히 제일원리계산이라고 불리는 분야에서도 포트란으로 짜여져 있는 프로그램들을 많이 볼 수 있다. 이러한 프로그램들은 물질 내부의 원자와 전자 구조를 계산하고 해석할 때 사용되며, 역시 막대한 계산을 효율적으로 수행하기 위해 포트란으로 짜여져 있는 경우가 많다.

대기과학 해양학의 경우, 일기예보에 쓰이는 해석모델과 수치모델 분야의 수치모델이 거의 100% 포트란으로 짜여져있다. 앞에서 언급했듯이 굉장한 계산을 해야하기 때문에 다른 언어보다 빠르고 간결한 포트란을 계속 사용해오고 있다(포트란으로만 짜둬서 다른 언어로 변환하기 어렵다). 대기과학이 세계 슈퍼컴퓨터 사용량의 2위를 차지한다는 점을 고려하면 앞으로도 포트란이 잊혀지지는 않을 것 같다.

X-ray를 다루는 시뮬레이션에도 사용되는데, PENELOPE라는 몬테 카를로 시뮬레이터가 이 언어로 짜여져 있다. 몬테 카를로 시뮬레이션이란 해석적으로 일정 모델을 도입해서 계산하는 게 아니고, 무작정 다수의 입자(이 경우엔 X-ray 광자)를 뿌려서 객체 하나하나당 랜덤하게 경우의 수를 적용해 계산하는 것이라 역시 무지막지한 계산량이 필요하다. 때문에 포트란을 사용한다. 반도체 물성 시뮬레이션을 하는 TCAD도 마찬가지. 스탠포드에서 최초로 출하(?)된 PISCES 부터 다 이 언어로 되어 있다.

전문분야에서는 매우 많은 계산 알고리즘이 포트란 형식으로 되어 있다. 이들 코드를 다른 언어로 포팅하여 사용하는 것 보다는 포트란을 배워서 쓰는 것이 더 빠르고 계산도 효율적이기 때문에 오래된 자연과학/ 공학의 계산 코드는 포트란으로 된 것이 많다. 얼핏 봐서 C로 짰다고 생각되는 프로그램이나 아무리 봐도 비주얼 스튜디오에서 윈도우 기본 함수를 무지막지하게 갖다 쓴 것처럼 보이는 프로그램도 나중에 알고보면 10MB도 안되는 실행파일 하나, 혹은 라이브러리 파일이 핵심 계산 모듈이고 저것은 포트란으로 만든 경우가 많다. 예를 들어 프로그래밍 언어 파이선의 대표적인 과학계산용 라이브러리인 SciPy의 핵심코드는 포트란이나 C로 만들어져 있다.[16][17]

이처럼 학술 또는 연구 용도의 코드에는 아직까지 포트란이 많이 애용되는데, 여기에는 효율성 측면 이외에도 굳이 다른 언어로 다시 만들 유인이 없다는 사실 또한 작용한다. 연구에 사용되는 코드의 코어 부분은 유서깊고 오래된 것들이 많으며, 어떤 것은 지도 교수의 지도 교수의 지도 교수로부터 내려온 것들도 있다. 이러한 코드는 당연히 포트란으로 짜여져 있는데, 이 경우에는 코드가 확장되고 덩치가 커져도 코어와의 호환을 위해 포트란을 사용하는 경우가 많다. 이 경우 잠정적인 사용자는 연구원 내지는 대학원생이 되는데, 이들에게 있어서 문법이 단순한 포트란을 익히는 것은 크게 부담이 되지 않는다. 결국 포트란을 익히면 될 일을 굳이 속도가 더 느린 다른 언어로 옮기는 것 자체가 시간 낭비, 인력 낭비가 되는 셈. 그레고리 맨큐는 학부생 1학년 때부터 포트란을 매우 잘 사용했기 때문에 프린스턴에서 연구 조교로 여름 인턴이 가능했다.

잘 쓰고 있는 포트란을 굳이 에러를 무릅 써가며 다른 프로그래밍 언어로 변환할 필요는 없다. 그런 행동을 하려고 시간을 쓰다가 지도교수한테 걸리면 바로 "그냥 기존에 있는 포트란 가져다 써" 란 말을 듣기 십상이다. 자신이 포트란과 다른 언어 둘 다 아주 잘 한다면 지도교수에게 안 걸리게 변환해보라. 물론 에러가 나면 지도교수 입에서 나오는 첫말은 "그냥 포트란 쓰지 쓸데없는 짓 하다가 논문 언제 쓸래". 이 말을 듣고 연구실 분위기는 급락. 실제로 물리학 전공자가 컴퓨터공학 전공자에게 이 언어에 대해서 이야기하면 컴퓨터공학 전공자는 '역사 속으로 사라진 줄 알았던 언어가 아직도 활발히 쓰이고 있다니!'하면서 놀라는 경우가 있다.

가끔 오래된 팜탑 PC ( 휴렛팩커드의 200LX나 IBM의 PC110같은...)에다가 포트란 컴파일러 깔고 공학용 계산기 대신으로 쓰는 괴인들도 존재한다.

다만 요즘은 대학교에서도 학원에서도 포트란을 가르치는 곳이 거의 없기 때문에 (심지어 책도 거의 없다) 적어도 한국에서는 잊혀진 언어 취급을 받게될 날이 멀지 않았다. 데이터베이스 프로그램이 코볼을 대체했듯이 포트란 역시 대부분의 경우에는 MATLAB, 매스매티카 같은 강력한 수치계산 프로그램들에게 자리를 내주고 있다.[18] 하지만 포트란 컴파일러는 GNU에서 무료로 배포하는 반면에, MATLAB과 매스매티카는 상용 프로그램이라 완벽하게 대체하기는 힘들다. 다만 2010년 초반까지도 포트란을 고집하던 사용자층을 오픈 소스 언어인 Julia가 일부 흡수하고 있다.

6. 문법

#!syntax markdown
program main
    write(*,*) "Hello World!"
end program main
  • program mainmain은 프로그램 이름이다. C언어와는 달리 굳이 main일 필요는 없다. abcd라고 해도 정상작동한다.
  • end program main에서 main은 생략할 수 있다.
  • end program은 붙여쓸 수 있다.
  • 포트란은 대소문자를 구분하지 않는다.
  • 포트란의 문자열은 큰 따옴표와 작은 따옴표를 구분하지 않는다. 다만 큰 따옴표로 열었으면 큰 따옴표로 닫아야 하고 작은 따옴표로 열었으면 작은 따옴표로 닫아야 한다.
  • 포트란은 행 끝에 ;을 붙이지 않아도 된다. 붙여도 아무 일도 일어나지 않아 다른 언어에 익숙한 사람은 습관적으로 붙이기도 한다.

7. 기타

  • 전투기 소프트웨어로 사용된 전적이 있다. F-15S의 소스코드가 포트란으로 코딩되어있는 것. 항공전자 장비에는 보통 Ada C언어, Jovial 같은 언어가 사용되며 포트란이 사용된 예는 흔치 않다.
  • 우주개발 역사의 한 기둥이었던 언어이기도 하다. 예를 들어 태양계를 벗어난 탐사선인 보이저는 원래 포트란 5로 코드가 짜여졌다. 나중에 유례없는 원격 리프로그래밍을 통해 포트란 77을 이식했다가, 현재는 대부분의 코드를 C 계열 언어로 업그레이드한 상태이지만 계산 효율 등의 이유로 일부 코드에는 포트란 77이 계속 사용되고 있다.
    • 보이저의 '탑재'용 소프트웨어가 FORTRAN 5로 작성되었다가, 이후에 FORTRAN 77로 원격 재프로그래밍되었다는 오보가 확산되었는데, 이는 '담당자 인터뷰기사'와 '나사의 보이저호 유지용 구인 정보'로부터 시작된 오해이다. 보이저에 '탑재'된 소프트웨어는 전부 어셈블리어로 작성되었다. 단지 '지상에서의 궤도 분석, 수신 데이터 분석'용 소프트웨어에 포트란이 주로 사용되었다. 보이저에 탑재된 CPU는 우주선 탑재용으로 특수제작된 CPU이고, FORTRAN V[19]는 UNIVAC에서 사용되던 포트란 컴파일러이기 때문에 기본적으로 호환성의 문제가 있다. 이를 해결하려면 보이저용 포트란 컴파일러의 제작이라는 과정을 거쳐야 한다. 이후에 FORTRAN 77로의 이식 또한 같은 문제를 가지게 된다. 포트란 프로그래밍 인력은 보이저 프로젝트의 지상 관제에 사용되는 소프트웨어를 유지보수하기 위해 구했던 것이다. 보이저 프로젝트 담당자(Suzanne Dodd)와의 간단한 인터뷰를 실은 Wired지의 기사에서 포트란을 언급하면서[20] 'ground'와 같은 단어는 삭제된 채로 사용되었고, 해당 기사가 재인용되며 이와 같은 소문을 퍼뜨리게 되었다. 한국의 주요 과학잡지/신문의 포트란이나 보이저관련 기사에서도 이와 같은 표현을 감초처럼 삽입하는 모습을 보였다. 아래는 관련 정보들이다.
      1. 나사(NASA)의 공식 보이저 관련 FAQ 문서에도 "The programming is a form of assembly language."라고 어셈블리어로 명시되어 해당 정보가 왜곡되어 퍼진 것을 바로잡으려 하고 있다.[21]
      2. Sun Kang Matsumoto[22], 2016. Voyager Interstellar Mission: Challenges of Flying a Very Old Spacecraft on a Very Long Mission, SpaceOps 2016 Conference. - 대전에서 열린 제14회 국제우주운영대회(SpaceOps 2016)에 제출된 논문의 언급[23]
      3. 인터넷에 포트란에 대한 밈처럼 퍼진 해당 문제를 분석한 웹사이트도 등장하였다.[24]
  • 한편, 포트란으로 나온 게임도 있다. 세계 최초의 어드벤처 게임이라고 볼 수 있는 Colossal Cave Adventure라는 게임으로, 현재도 소스 코드를 받아서 컴파일해볼 수 있다.
  • 띄어쓰기를 무시한다.(고정형식 소스에서만 가능하다.) 그래서 변수 등의 식별자에 공백 문자를 포함해서 써도 된다. CNT X 라고 적어도 잘 동작한다는 소리. 반면 줄바꿈은 의미를 가진다.
  • 여러 문법 키워드(keywords)에 대해서 자유형식과 고정형식 모두 공백이 포함된 형태와 그렇지 않은 형태의(go to와 goto, end if와 endif 등) 두 종류의 표현을 인정한다. 다만 식별자(identifiers, 변수 이름등)에 대해서는 고정형식 소스에서만 공백이 인정된다.
  • 루프의 사용하는 int i 의 기원이기도 하다. 포트란은 미리 변수들을 선언해 두었는데, 이때 i 부터 N 까지 int 형 이였다. ( 나머지는 실수형 ) 그래서 int 형의 첫번째 오는 i 가 루프의 인덱스로 쓰이기 시작한 것이다.
  • 한편 엔비디아에서는 포트란을 CUDA를 통해 GPU 연산 및 프로그래밍에 이용할 수 있도록 CUDA 포트란을 개발했다.[25] 이 CUDA 프레임워크를 이용해 수행한 연구에 따르면, GPU의 병렬처리 연산을 포트란을 이용해 실행하게 하는 것이기에 해당 연구 실험환경 기준으로 CPU를 이용해 연산하는 것보다 최대 100배 정도 빠르다고 한다.[26]

8. 관련 문서


[1] 최초의 고급 언어는 아니다. 개념상 제시된 최초의 고급 언어는 1941년 독일에서 개발한 최초의 전자식 컴퓨터인 Z1용으로 개발된 플란칼킬(Plankalkül)이고, 실제로 구현된 최초의 고급 언어는 애니악용 코딩 언어를 발전시켜 만든 쇼트 코드(Short code)이다. 포트란은 최초로 상업적, 대중적으로 사용된 고급 언어이다. [2] 언어 이름이 꽤 특이한데, 이전 세대 IBM의 고성능 컴퓨터인 IBM SSEC가 수식 계산 코드를 짜는 것이 매우 불편해 빠르고 간결하게 코딩할 수 있게 하겠다는 목적으로 개발한 언어라 그렇다 [3] JTC1/SC22/WG5 [4] US Fortran Standards Committee [5] 홀러리스식은 FORMAT 문과 문자열상수에 H표시를 이용한 기법이다. 허먼 홀러리스의 이름을 땄다. 현재 이 홀러리스 표현은 의미가 없지만, 아직도 멋 모르고 사용하는 습관을 가지고 있는 사람들이 많이 있고, 그런 오래된 코드들과 정신적 교감을 나누며 코딩 고고학을 지향하는 일들이 벌어지고 있다. 영문 위키백과 참조. [6] ftp://ftp.nag.co.uk/sc22wg5/ARCHIVE/mil_std_1753.html [7] 이 문법은 실패한 기능이다. Fortran2008에 추가된 Do Concurent를 "제대로 된 Forall"로 여기면 된다. [8] http://en.wikipedia.org/wiki/Fortran_95_language_features [9] 아직 표준이지만, 앞으로의 표준에서 삭제될 것을 미리 알리는 것. 다른 언어의 deprecated를 의미 [10] 과거의 표준이었지만, 현재는 지워진 표준 [11] 포트란을 많이 사용하는 사용자들에게 대안은 속도 문제로 C나 C++밖에 없다. [12] 2000년대 초반 내지는 90년대 말 얘기 [13] https://en.wikipedia.org/wiki/Restrict [14] https://en.wikipedia.org/wiki/Pointer_aliasing [15] https://lwn.net/Articles/255364 [16] https://scipy.org/faq/ [17] https://archive.ph/f4u7j [18] 해외는 수치해석, 슈퍼컴퓨터 분야에서 포트란이 여전히 흔들림이 없는 강자의 위치에 있다. [19] 고유명사이므로 FORTRAN 5와 구별되어 V로 칭함. FORTRAN 5는 UNIVAC이 아닌 다른 벤더에서 사용한 컴파일러 명이다. [20] The spacecrafts’ original control and analysis software was written in Fortran 5 (later ported to Fortran 77). Some of the software is still in Fortran, though other pieces have now been ported to the somewhat more modern C. [21] NASA - Voyager FAQs [22] JPL 보이저 팀에서 1985년부터 소프트웨어관련 담당자로 있는 전주 출신의 한국계 이민 1세의 여성이다. 진주 강씨(晉州姜氏)이나 일본계 미국인과 결혼 후 일본식 성이 추가되었다. [23] Both the AACS and FDS use assembly language. The CCS uses assembly language and Voyager-unique pseudo code (interpreter). As a result, it is difficult to attract younger programmers to join the project. [24] Alex Measday의 Web page - Forget Crazy Earth, Look to the Future: Voyager and Fortran 5 [25] NVIDIA CUDA-fortran Programming Guide [26] 김보람, 김형준, 윤광석(2021). 'CUDA FORTEAN기반 확산파 강우유출모형 개발', 한국수자원학회 - 논문 링크