포트란
포트란(fortran)은 엔지니어, 수학자, 기타 과학적 알고리즘의 제작자나 사용자들을 위해 설계된 3세대 프로그래밍 언어이다. formula(수식)와 translation(변환기)의 합성어로, 1950년대 말 IBM의 존 배커스(John Backus)에 의해 설계됐으며 매우 간결하고 엄격한 구문 형식을 가지고 있다. 처음에는 ‘IBM Mathematical FORmular TRANslation System’으로 불렸으나 후에 이를 줄여 ‘FORmular TRANslation’ 즉 Fortran(포트란)이라 부르게 됐다.
개요[편집]
포트란은 알골(Algol)과 함께 과학 계산용으로 주로 사용되는 언어이다. 1954년 개발 당시 7명의 전문가가 약 2년 반 동안에 걸쳐 완성한 것이 포트란의 기본을 이루었고, 그 후 미국 국가표준 협회(ANSI)와 국제표준화기구(ISO)에서 표준화하였다. 포트란은 산술 기호 더하기(+), 빼기(-), 곱하기(*), 나누기(/) 등을 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 자연스럽게 불러내어 쓸 수 있으며, 최근 첨단 과학 계산에서 필수적인 벡터, 행렬 계산 기능 등이 내장되어 있는 과학 기술 전문 언어이다. 포트란은 기후 및 기상예측, 자원 탐사, 우주항공, 유체 및 구조해석, 계산화학, 양자 및 분자 동역학 계산, 천문학, 인공위성을 포함한 군사과학, 자동차 선박 설계, 반도체 설계, 금융계산 등 거의 모든 산업분야의 초대형 과학 계산 문제의 프로그래밍에 필수적인 언어이다. 특히 자연과학이나 공학에서의 중요한 거대한 계산문제들을 슈퍼컴퓨터들을 이용하여 해결하는 데 있어서 C 언어와 같이 범용 프로그래밍 언어에 속하는 프로그래밍 언어들에 비해 탁월한 효율이 있는 과학 계산 전문 언어이다. 1990년대까지 널리 사용되어 왔던 포트란 77에서 현재 포트란 90/95, 포트란 2003, 포트란 2008 등으로 계속 진보하고 있다. 전문적인 과학 계산 문제를 풀기 위하여 프로그래밍하는 데 있어서 C 언어보다 포트란이 훨씬 간단 명료하고 신속하게 프로그래밍을 작성할 수 있으며, 디버깅하는 데도 시간이 현저하게 단축될 뿐만 아니라, 그 계산속도 또한 일반적으로 훨씬 빠르다.[1]
역사[편집]
- 등장
포트란은 1953년 존 배커스(John Backus)가 IBM 704 메인 프레임 머신에 사용할 프로그래밍 언어로 어셈블리어(assembly language)에 대한 대안으로 제시하였다. 이후 1956년 첫 번째 포트란 매뉴얼이 발표되었고, 1957년 대중에 첫 포트란 컴파일러가 등장한다. 이는 첫 번째 고급 프로그래밍 언어의 등장이라고 평가된다. 그 이전엔 프로그래머들이 손수 어셈블리어를 이용해야 했다.[1]
- 포트란 66
최초의 고급 프로그래밍 언어가 등장하게 되자, 여러 벤더에서 다양한 문법을 가진 포트란 컴파일러를 각자의 시스템에 맞게 제작하기 시작하였으며, 1960년대에도 40여 가지의 포트란 컴파일러가 존재했다고 한다. 이에 BEMA(Business Equipment Manufacturers Association)은 표준화에 대한 논의를 시작하며, 미국 국가표준 협회에 표준 문법을 제출한다. 1966년 미국 국가표준 협회의 승인을 얻게 되며, 첫 미국 포트란 표준이 발표된다. IBM이 가장 영향력이 높았으므로 표준화는 포트란 IV 컴파일러를 바탕으로 진행되었으며, 대중에게 포트란 IV와 포트란 66은 혼용되어 불리게 된다. 이 표준은 산업 표준으로 널리 받아들여지게 된다. 이후 ISO에서는 1972년 미국 국가표준 협회 포트란 66을 그대로 받아들여 포트란 국제 표준으로 받아들인다. 미국 국가표준 협회 포트란 66 표준은 메인 프로그램, 서브루틴, 펑션, 블록 데이터 프로그램 유닛과 정수(integer), 리얼, 배정밀도(double precision), 콤플렉스, 로지컬 데이터 형, 초깃값 할당을 위한 데이터문 등의 문법을 포함하고 있다.[1]
- 포트란 77
포트란 66 표준이 발표된 이후에도, 각 컴파일러 벤더들은 표준에 포함되지 않는 각자의 부가적 확장 문법을 포함하는 포트란 컴파일러들을 출시하였으며, 이에 미 포트란 표준화 위원회(ANSI committee X3J3 - J3)가 1969년 결성되었으며, 포트란 66 표준에 대한 개정을 논의하기 시작했다. 최종 안이 1977년에 확정되었으며, 1978년 4월 미국 국가표준 협회의 승인을 얻게 된다. 이 ANSI 표준은 포트란 77 이란 이름으로 불리며, 그 공식 문서는 ANSI X3.9-1978이다. ISO는 이 ANSI 포트란 77을 수용하여 포트란 국제 표준으로 받아들인다. 포트란 66에 비해서 포트란 77표준은 구조적 프로그래밍에 대한 지원을 향상하기 위한 블록 IF와 엔드 IF 문, 추가적인 엘스와 엘스 IF 절과 파라미터 확장, 음의 방향으로 증가, 0까지 이동 등에 대한 DO 반복 구조를 확장시키는 등의 기능을 포함하게 된다. I/O에 대한 개선을 위해 OPEN, CLOSE, INQUIRE 문 도입하였다. 식별자의 길이를 6까지 지원한다.
한편 ANSI 포트란 77에 몇 가지 문법이 추가된 미국 국방성(Department of Defence: DoD) 포트란 표준이 발표된다. 이후 1980년대 이후에 전 미국에서 발표된 포트란 77 컴파일러 제품들은 대부분 미국 국가표준 협회 표준뿐만 아니라 이 국방성 표준을 지원하도록 설계되었다. 비트 필드 연산에 대한 내장 함수들, INCLUDE 문 등이 ANSI 포트란 77에 비해 추가되었다. 파일 끝(END-OF-FILE) 레코드를 만난 이후에도 리드, 라이트를 수행한다.[1]
- 포트란 90
컴퓨터 환경은 무어의 법칙이 지배하게 되면서 빠르게 변화되어가는 도중에 포트란 77 표준에 대한 개정은 지지부진하게 되었다. 차기 버전이 나오기에 15년의 시간이 걸렸으며, 이 길었던 기간 동안 포트란 77 표준은 포트란의 역사에서도 가장 중요한 표준이 되어 버렸다. 포트란 90은 1991년에 표준화 기구(ISO)에서 먼저 승인을 얻었으며, ISO/IEC 1539:1991(E) 가 ISO 포트란 90 이 된다. 이전 FORTRAN XX 표준의 의미가 미국 국가표준 협회를 칭하였던 것에 비해, Fortran XX 형태의 표기는 ISO 국제 표준을 의미하는 것으로 여겨지게 되었다. 미국 국가표준 협회의 승인은 1992년에 이루어진다. 포트란의 현대화가 진행된 표준이며, 아다와 같은 여러 다른 언어에서 많은 아이디어를 가져왔다. 공식적인 표기가 ‘FORTRAN’에서 ‘Fortran’으로 바뀐 것을 포함하여, 자유 형식이 도입되었다. 또한 포트란 키워드에 소문자를 허용하고 식별자의 길이는 31문자까지 허용, 인라인 형태의 주석문을 쓰는 등의 사항을 표준에 추가하였다. 배열 이름을 이용한 배열 전체 요소에 대한 연산이 가능하다. 포인터 속성을 이용한 자료구조와 동적 접근 알고리즘에 대응한다. 모든 포트란 77 표준 코드는 포트란 90 표준에 부합하도록 정의되었다.[1]
- 포트란 95
포트란 표준 위원회는 10년 단위의 대규모 업데이트와 5년 단기의 소규모 업데이트를 계획하는데, 포트란 95는 포트란 90에 대한 소규모 업데이트로 계획된다. 공식 문서는 ISO/IEC 1539-1:1997이다. 이는 포트란 90에 대한 확장 기능을 제공하던 고성능 포트란(HPFF : High Performance Fortran) 프로젝트의 영향을 받아 병렬 프로그래밍에 대한 지원을 목적으로 한다. 퓨어, 엘레멘탈 프로시저(Elemental Procedure)의 사용자 정의와 포인터 초기화를 포함한 유도체 구성 요소를 초기화하는 등의 추가적 기능이 특징이다. 데이터 개체에 대한 초기화 문 기능이 확장되었다. 기존 문법이 삭제되었다. 포트란 95에서는 포트란 90에서의 몇몇 문법이 Deleted 항목으로 변화되었다.[1]
- 포트란 2003
원래는 90에 대한 10년 단위 대규모 업데이트로 포트란 2000이 계획되었으나, 합의가 늦어지고 포트란 2003으로 발표된다. 포트란 2003은 ISO/IEC 1539-1:2004가 공식 문서이다. 상속과 다형성 객체, 타입 바운드 프로시저(Type-bound Procedure), 추상 데이터형 지원 등으로 OOP(Object Oriented Programming)을 지원하고, IEEE 부동소수점 표준 내장 모듈, 비동기 전송, 스트림 타입 I/O 도입에 따른 I/O 개선 등의 사항을 주요사항으로 하고 있다. 명령 라인에 대한 지원, 시스템 환경 변수 지원 등 사용자 환경에 대한 구성이 추가되었다. 데이터 조작성과 할당 특성 및 기타 기능이 강화되었다.[1]
- 포트란 2018
차기 표준 예정으로 2017년 11월 12일 WG5의 투표에서 차기 포트란 표준의 이름을 포트란 2015에서 포트란 2018로 바꾸는 것이 가결되었다. C 바인딩에 대한 추가적 개선 등의 사항이 논의되고 있다.[1]
특징[편집]
포트란은 산술 기호를 그대로 사용할 수 있으며, 삼각함수·지수함수·대수함수 등과 같은 기초적인 수학 함수들을 그대로 불러내어 쓸 수 있다. 또 실수만이 아니라 복소수를 그대로 변수 형으로 쓸 수 있다. 물론 이러한 장점은 현재의 각종 프로그래밍 언어에서는 표준 라이브러리 등을 통해서 기본적으로 제공되는 기능이지만, 당시에는 굉장히 획기적인 방법이었다. 배열에 대해서도 많이 지원해 줘서, 옛날에 나온 언어임에도 불구하고 매트랩(Matlab)에서처럼 쉽게 배열을 다룰 수 있다. 기본적으로 절차적 프로그래밍(procedural programming)이지만 90, 2003을 거치면서 OOP의 요소를 많이 넣게 되었다. 하지만 하위 호환을 유지해야 하므로 아무래도 C++에 비해서는 문법적/구조적으로 불편한 부분이 많다. C 언어와의 큰 차이점 중 하나로 배열의 배치 순서가 서로 다르다. C는 행 우선순위(Row-Major Order)를 따르며, 포트란은 열 우선순위(Column-Major Order)를 따른다. C에서는 (1,1) 다음이 (1,2)이지만, 포트란에서는 (2,1)가 된다. 따라서 다른 언어와 함께 프로그래밍을 할 때는 변수를 넘겨줄 때 순서를 바꾸어 주어야 한다. 또한 반복 계산을 할 때 가장 처음 인수부터 돌려줘야 성능의 저하가 없다. 또한, 배열의 시작 숫자가 0이 아닌 1부터 시작이다. 사용자가 배열의 인덱스를 조정하는 것이 가능한 것은 포트란의 특징 중 하나이다. 배열의 인덱스를 -100 ~ 100처럼 지정하는 것이 가능하다. 초기 버전은 대문자만 인정했기 때문에 가독성이 부족하다. 그 이유는 키보드가 없던 시절 천공 카드로 프로그램을 입력해야 했는데 여기엔 소문자가 없었기 때문이다.[2]
구성[편집]
- 데이터 유형 상수
일반적으로 데이터 유형은 수치형으로 정수형(Integer), 실수형(Real), 복소수(Complex)로 정의할 수 있다. 이 3가지의 데이터 유형은 포트란에서 자주 사용하는 유형이며 그 외에도 많이 쓰이는 것 중에 하나로는 문자형(Character) 변수가 존재한다.
- 정수형 : 포트란에서 소수점이나 콤마를 갖지 않는 십진수로 나타낸다. 또한 음의 상수는 '-'로 표현이 되지만 '+'의 사용은 선택사항으로 표현이 될 수 있다. 정수형의 수치를 표현할 때 주의해야 할 점으로는 '9.999'의 경우와 같이 수치 상수 사이에 '.(콤마)'가 허용이 안 된다는 점이다. 또한 정수형 상수에서는 '16.0'과 같은 소수점을 허용할 수 없기 때문에 16만으로 정수형 상수를 표현해야 한다.
9,999 (수치 상수에서는 콤마가 허용되지 않는다) 16.0 (정수형 상수는 소수점을 포함할 수 없다) --5 (하나의 대수기호만 허용된다) 7- (대수기호는 숫자열 앞에 위치해 있어야 한다)
- 실수형 : 원래의 십진수나 지수 표현으로 나타낸다. 실수형 상수의 십진수 표현에서는 소수점은 있어야 하지만, 콤마는 절대 허용되지 않는다. 실수형 상수의 지수적 표현은 정수 또는 십진수로 구성된 가수부분 뒤에 절차 'E'로 표현이 되게 된다. 예를 들어 '3.14'라는 실수형은 '314E-2'라는 형식으로서 표현을 할 수 있다. E라는 것은 10의 x 승을 나타내는 것으로 x는 E 다음에 나올 정수형 상수라고 생각하면 된다.
- 문자열 : 문자열 상수는 쌍따옴표 또는 따옴표로 둘러싸여야 하는데, 시작과 끝은 반드시 같은 부호를 사용해야 한다.
"PPP-A" "John Cook Damage" (공백 문자도 포함되어 문자 수에 포함된다) "Don't" (따옴표를 문자열에 포함시키려면 쌍따옴표로 묶어주면 된다)
- 데이터 유형 변수
변수에 부여되는 값의 유형에 따라 정해지므로 각각 변수에 대한 형 선언이 필요하여 ‘형 선언문’을 이용하여 수행될 수 있다. 그래서 정수형과 실수형 변수를 선언하기 위한 형 선언문의 기본적인 형태는 아래와 같이 표현된다.
INTEGER :: A1, A2, ... REAL :: B1, B2, ...
위의 예에서는 A1과 A2는 정수형 변수로서 선언이 되며 B1과 B2는 실수형 변수로 선언되는 것이다. 또한 문자열 변수를 'CHARACTER(LEN=n) :: C1, C2, ...'로 설정을 하거나 'CHARACTER(n) :: C1, C2, ...'으로 정의할 수 있다. 여기서의 CHARACTER는 문자열 변수를 설정하는 부분이며, n은 문자 살수의 길이를 지정하는 정수형 상수를 말한다. 또한 각각 변수의 길이를 지정하기 위해서는 *기호를 통해서 적용할 수 있다.
CHARACTER(15) :: C1, C2*10, C3*20, C4, C5
위의 예에서는 C1, C4와 C5는 문자열 상수의 길이가 15로 정의가 되며 C2는 문자열 상수의 길이는 10으로 정의가 되며, C3의 경우에는 20으로 정의를 시킬 수 있다.
- IMPLICIT NONE 문 : IMPLICIT NONE 문이 있는 경우 모든 상수와 변수 또는 함수의 유형을 형 선언문에서 명시적으로 지정해 주어야 하며 형 선언문에서 명시적으로 선언되지 않은 상수나 변수의 사용은 컴파일러에 의해서 오류로 취급이 된다. 또한 이것을 위해 변수를 초기화하는 일이 필요하다. 여기서 A, B, C의 실숫값은 1, 2, 3이라는 변수로 초기화를 한다고 하면, 아래와 같이 초기화를 시킬 수 있다.
REAL :: A = 1.0, B = 2.0, C = 3.0
- 그 외에 표현할 수 있는 방법은 아래와 같다.
INTEGER, PARAMETER :: A = 10 REAL, PARAMETER :: PI = 3.141593, TwoPI = 2*PI CHARACTER(3), PARAMETER :: B = “ABC”
- 위의 형식은 각 정수형, 실수형, 문자형을 정의하는 방법이며 파라미터의 값을 상수로 지정할 수도 있지만 TwoPI의 변수와 마찬가지로 식을 적용하는 방법도 가지고 있기 때문에 사용자의 판단에 맞춰 적용하는 것이 가능하다.[4]
구조[편집]
포트란 프로그램은 크게 순서대로 선언 영역, 실행 영역, 종료 영역으로 나뉜다.
- 선언 영역
- PROGRAM 문 : C에 메인 함수가 있듯이 포트란에는 프로그램 문이 있다. 모든 포트란 프로그램은 프로그램 문에서 시작한다. 프로그램 다음에는 프로그램의 이름이 온다. 이름은 변수명 규칙을 벗어나지 않는 선에서 마음대로 지을 수 있다. 변수명 규칙은 아래 변수의 선언에서 이어진다.
- 변수의 선언 : 변수 선언은 ‘type :: name’과 같은 형식으로 선언된다. 포트란은 기본 타입으로 정수형(integer), 실수형(real 및 double precision), 문자(character), 논리형*:(logical), 복소수(complex)를 지원하고 여기에 추가로 클래스를 만들어 쓸 수 있다. 변수의 이름은 변수명 규칙을 따라야 하는데, 상식적이다. 변수 이름은 알파벳 a – z, 언더 스코어 _, 숫자 0 – 9만을 포함할 수 있다. 변수 이름은 숫자로 시작할 수 없다. 변수 이름은 최대 63자이다. 타입과 변수 이름 사이에 들어가는 : 두 개는 생략할 수 있으나 매우 권장하지 않는다. 그리고 프로그램 이름과 변수 이름은 겹칠 수 없다(이후 후술할 함수의 이름도 마찬가지이다).
- IMPLICIT 문 : 사실 포트란은 파이썬과 매트랩처럼 변수를 선언하지 않아도 되는 언어이다. 따로 선언되지 않은 변수는 첫 글자에 따라 타입을 정하여 자동으로 선언된다. 기본적으로 첫 글자가 i – n인 변수는 정수형, 그 외는 실수형으로 정해진다.
program implicit_test integer :: xyz abc = 0 ! 첫 글자가 a이므로 실수형으로 자동 선언 ijk = 0 ! 첫 글자가 i이므로 정수형으로 자동 선언 xyz = 0 ! 첫 글자가 x이지만 정수형으로 이미 선언됨 (실수형으로 자동 선언되지 않음) write(*, *) abc, ijk, xyz end program implicit_test
- 실행해보면 abc는 실수형이라서 0.00000000이, ijk와 xyz는 정수형이라서 0이 출력된다. 이 첫 글자 규칙은 implicit 문을 써서 바꿀 수 있다. implicit 다음에 타입을 적고, 그다음 괄호 속에 알파벳을 적으면 해당 알파벳으로 시작하는 변수들은 해당 타입으로 자동 선언된다. -을 쓰면 일일이 적지 않고 범위로 나타낼 수 있다.
! 모든 변수가 정수형 implicit integer (a-z) ! u, v, w로 시작하면 복소수, c로 시작하면 문자 ! 나머지는 기본 설정을 따름 implicit complex (u, v, w) implicit character (c) ! 컴파일 에러: i-n에 대해 설정 중복 implicit real (a-n) implicit integer (i-z)
- 여기에 특수한 구문 하나가 추가된다. implicit non은 자동 선언 자체를 꺼버린다. 이때 모든 변수는 프로그래머가 명시적으로 선언해야 한다. 자동 선언이 일으키는 혼란을 막기 위해 포트란 프로그래밍에서는 반드시 implicit none을 사용할 것을 강력히 권장한다.[5]
- 실행 영역
이름 그대로 계산을 실행하는 부분이다.[5]
- 종료 영역
- 엔드 프로그램 문 : 포트란 프로그램은 프로그램 정의의 마지막 줄 엔드 프로그램을 만나면 종료한다. 이때 종료 상태(exit status)로 0이 반환된다. C/C++에서 메인 함수의 닫는 중괄호와 같다고 보시면 된다. 엔드 프로그램 뒤에 프로그램 이름을 적어도 되고 안 적어도 되는데 프로그램의 끝임을 명확하게 표시해 주기 위해 적는 걸 추천한다.
- 스톱 문 : 엔드 프로그램에 도달하기 전에 프로그램을 끝내는 방법으로 스톱 문이 있다. 스톱 뒤에는 메시지를 적을 수 있다. 메시지가 없으면 엔드 프로그램과 동일하게 0을 반환하고 프로그램이 끝난다. 메시지가 정수면 해당 정수를 반환하고 프로그램이 끝난다. 메시지가 문자열이면 0을 반환하고 프로그램이 끝난다. 메시지가 있다면 프로그램 종료 시 메시지가 콘솔에 출력된다.
- 에러 스톱 문 : 단순히 프로그램을 종료하는 것이 아니라 의도적으로 런타임 에러를 띄운다. 에러 스톱 뒤에는 에러 메시지를 적을 수 있다.[5]
장단점[편집]
포트란은 과학 및 공학을 전공으로 하는 사람들이 필수적으로 익혀야 할 프로그래밍 분야다. C, C++, 자바 같은 언어도 존재하지만 이러한 언어들은 상대적으로 익히기가 어렵고 또한 과학 및 공학 분야에서 포트란만이 지닌 고유한 장점 때문에 포트란은 여전히 많이 사용되고 있다. 포트란의 최대 장점 중 하나는 미국 국가표준 협회와 국제 표준화 기구에 의해 표준화됐다는 것이다. 결국 프로그램을 ANSI 포트란 77로 구현하면 포트란 77 컴파일러가 있는 어떤 컴퓨터에서도 사용 가능하다는 것이다. 즉, 컴퓨터 기종과 운영체제가 다르더라도 옮겨서 사용하기가 쉽다는 의미다. 기존의 포트란 77은 사용하기 쉬운 반면에 한계도 가지고 있다. 그러나 보강된 포트란 90/95는 기존의 포트란 77 표준 문법을 모두 포함하면서 계산 기능을 대폭 개선해 한계를 많이 극복한 까닭에 다른 언어와의 경쟁에서도 결코 뒤처지지 않는 고유의 영역을 형성했다. 아래의 장단점은 포트란 77을 기본으로 한다.
- 장점 : 포트란은 기본적으로 계산 전용 프로그램이어서 배우기 쉽다는 장점이 있다. 평소 사용하고 있는 수식의 형태를 그대로 사용하기 때문에 이해가 쉽다. 수치계산 효율이 높다는 것도 포트란의 장점이다. 계산 전용 프로그램이기 때문에 빠른 연산에 최적화돼 있다. 포트란을 통해서 다양하고 검증된 프로그램을 사용할 수 있다. IMSL 같은 검증된 프로그램도 포트란을 기반으로 하기 때문에 필요한 경우 자신이 작성한 프로그램과 연결해서 사용할 수 있다.
- 단점 : 포트란의 단점은 고정형식의 소스 포맷을 갖는다는 것이다. 1번째 열은 C와 같은 특정문자로 시작되면 주석문이 되고, 2번째에 열에서 5번째 열까지는 문 번호를 적는 곳이다. 6번째 줄은 연결을 나타내는 곳이며, 7번째 열부터 72열 내에서만 프로그램이 작성돼야 한다. 또한 병렬 연산을 할 수 없다는 단점도 있다.
예시[편집]
- 포트란 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
평가[편집]
포트란은 과학 계산용 언어를 목표로 IBM이 1950년대 개발하여 개발 당시 많은 주목을 받았던 프로그래밍 언어이다. 당시 사용되고 있었던 팩트는 포트란보다 문서 작성 능력이 우수했으며 대용량 데이터도 처리하기 수월했으나 코볼에 밀려 사라지게 되었다. 포트란은 코볼과 비교했을 때 매우 간결하다는 것이 특징이다. 다만, 쓸만한 범용 개발 언어가 부족했던 시기였고 언어 사용자층이 두꺼웠던 만큼 범용적인 용도로도 언어가 사용되긴 하였다. 과학기술용 언어로는 포트란, 상업용 언어로는 코볼이라고 할 만큼 대표적인 제3세대 언어였지만 1980년대 이후로 보다 사용하기 쉬운 제4세대 언어의 출현으로 이제는 범용 목적으로는 거의 쓰이지 않게 되었으며, 대부분 C 언어로 교체되었다. 하지만 애당초 수치해석용에 특화 시켜 개발되었고, 방대한 수치해석 라이브러리를 가지고 있기 때문에 대량의 계산을 해야 하는 특정 분야에서는 중요한 언어로 명맥을 이어가고 있다.
수치계산 분야로 연구 관련 코드를 찾으면 포트란 코드로는 거의 모든 분야가 다 있다. 그것도 교과서에 이름이 실릴만한 유명한 사람들이 만들어서 저널에서 실렸고 수십 년간 사용되고 수도 없이 검증됐다. 예를 들어, 슈퍼컴퓨터 등의 클러스터를 이용한 대량의 계산을 위한 MPI(Message passing interface)의 경우, 포트란과 C 라이브러리로만 나온다. 즉 슈퍼컴퓨터에서는 무조건 C 아니면 포트란을 사용해야 하는 것이다. 엄청난 양의 수치계산이 필요한 분야의 경우 슈퍼컴퓨터를 사용하는데 슈퍼컴퓨터는 가격이 아주 비싸고 유지비가 많이 들기 때문에 종량제처럼 돈을 받아서 운영하는 경우가 많다. 돈을 받던 받지 않던 실제 자신이 소속된 연구소나 회사 소유의 슈퍼컴퓨터라도 직급이나 소속에 따라서 슈퍼컴퓨터 사용시간과 사용범위가 제약된다. 그래서 연구자들은 슈퍼컴퓨터를 사용할 때 자신의 컴퓨터에서 최대한 코드를 완성하고 슈퍼컴퓨터에 업로드해서 실행시켜본 후 수정하고 또 수정하는 일을 반복한다. 자기의 슈퍼컴퓨터 사용시간을 조금이라도 절약하기를 바라는 건 모든 슈퍼컴퓨터 사용자의 소망이다. 이런 이유로 슈퍼컴퓨터에서 가장 단기간에 성과를 내고 가장 많이 입증된 슈퍼컴퓨터 관련 프로그램 코드가 바로 포트란으로 만들어진 코드이다. 기상청과 같은 기후, 과학에 관련된 계산을 할 때는 아직 포트란을 사용 중이다. 방대한 데이터를 빠르게 처리하고, 그만큼 라이브러리가 쌓인 포트란을 쉽게 바꾸지는 못할 것이다. 이게 현재 포트란의 아주 강력한 장점이다.[2]
각주[편집]
- ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 포트란 위키백과 - https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8%EB%9E%80
- ↑ 2.0 2.1 포트란 나무위키 - https://namu.wiki/w/%ED%8F%AC%ED%8A%B8%EB%9E%80
- ↑ 시레엔, 〈Fortran :: 데이터 유형 상수〉, 《티스토리》, 2017-06-04
- ↑ 시레엔, 〈Fortran :: 데이터 유형 변수〉, 《티스토리》, 2017-06-06
- ↑ 5.0 5.1 5.2 〈(Fortran 2018) 포트란의 문법적 특징과 포트란 프로그램의 구조〉, 《캐스터리언》, 2019-04-19
참고자료[편집]
- 포트란 위키백과 - https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8%EB%9E%80
- 포트란 나무위키 - https://namu.wiki/w/%ED%8F%AC%ED%8A%B8%EB%9E%80
- 포트란 네이버 지식백과 - https://terms.naver.com/entry.nhn?docId=3533004&cid=58528&categoryId=58528
- 시레엔, 〈Fortran :: 데이터 유형 상수〉, 《티스토리》, 2017-06-04
- 시레엔, 〈Fortran :: 데이터 유형 변수〉, 《티스토리》, 2017-06-06
- 〈(Fortran 2018) 포트란의 문법적 특징과 포트란 프로그램의 구조〉, 《캐스터리언》, 2019-04-19
같이 보기[편집]