Fortran

1 개요[편집]

포트란은 1954년 중반 IBM 704에서 과학적인 계산을 하기 위해 만들어지게 된 컴퓨터 프로그래밍 언어이다. 전문적인 계산문제에 한해서는 C언어보다 훨씬 직관적이며, 대부분의 경우 계산속도 또한 빠르다.

2 역사[편집]

2.1 FORTRAN[편집]

IBM 704는 자기 드럼, 자기 테이프, 천공 카드로부터 자료를 읽거나 저장할 수 있었고, 프린터와 CRT에 정보를 보여줄 수 있었다. 하지만 보통은 천공 카드를 주로 썼고, 실제로 입력 가능한 도구는 천공 카드밖에 없었다. 때문에 천공카드 기반의 언어가 될 수밖에 없었다....지만, 애초에 폰 노이만이 살아있던 시대에 무엇을 바라는가?...

2.1.1 코드 예제[편집]

IBM 704에서는 80열 천공 카드를 사용한다. 즉, 포트란 코딩 시트(FORTRAN STATEMENT)에 다음과 같이 구멍을 내면[1] 각 줄은 하나의 천공카드를 의미한다. 천공카드에 적힌 수 중에서 가장 큰 수를 찾아서 출력하여 준다.

천공카드에 적힐 수는 A(***)이며, 각 카드마다 12개씩, 6개의 열에 숫자를 적을 수 있다. 999개 이상으로 구성된 집합에서는 찾을 수 없다. 이 코드의 경우 천공 카드가 결과지로 역할한다.

천공 카드는 총 80열로 이루어져 있다.

1열부터 5열까지의 숫자는 Statement number이다. 만약 C 부분에 구멍이 뚫려 있다면 Comment card를 의미한다. 요즘 말로 하면 주석이 되겠다. 컴파일러에서 이게 뚫린 카드는 읽지 않는다. 다른 경우 이는 줄 번호를 이야기하거나 아예 쓰여있지 않다.

6열의 숫자는 Continuation. 1부터 9까지, 카드의 번호를 의미한다.

7열부터 72열까지 컴파일러에서 읽는다. 73열부터 80열까지는 컴파일러에서 읽지 않으며, 카드를 먹거나 순서가 바뀌는 경우를 방지하기 위하여 사용한다.

각 줄 앞에 있는 숫자는 두 가지 의미이다.

이 코드가 필요한 사람은 이미 천공카드 사용법을 알고 있을 것이기 때문에 그 사용법은 더 적지 않는다. [2]

C     PROGRAM FOR FINDING THE LARGEST VALUE 
C  X ATTAINED BY A SET OF NUMBERS
      DIMENSION A(999)
      FREQUENCY 30(2,1,10), 5(100)
      READ 1, N, (A(I), I*1, N)
  1  FORMAT (I3/(12F6.2)
      BIGA = A(1)
  5 DO 20 I = 2,N
  30 IF (BIGA-A(I)) 10,20,20
  10 BIGA = A(I)
  20 CONTINUE
    PRINT 2,N,BIGA
  2 FORMAT (22H1 THE LARGEST OF THERE I3, 12H NUMBERS IS F7.2)
    STOP 77777

다음은 서술형 포트란 코딩 시트(천공 카드에 쓰기 전에 쓰는 형태)에 적는 방법대로 적은 것이다.

C For comment continuation FORTRAN STATEMENT 천공카드 장 수
STATEMENT NUMBER
C PROGRAM FOR FINDING THE LARGEST VALUE 1
C X ATTAINED BY A SET OF NUMBERS 2
DIMENSION A(999) 3
FREQUENCY 30(2,1,10), 5(100) 4
READ 1, N, (A(I), I*1, N) 5
1 FORMAT (I3/(12F6.2) 6
BIGA = A(1) 7
5 DO 20 I = 2,N 8
30 IF (BIGA-A(I)) 10,20,20 9
10 BIGA = A(I) 10
20 CONTINUE 11
PRINT 2,N,BIGA 12
2 FORMAT (22H1 THE LARGEST OF THERE I3, 12H NUMBERS IS F7.2) 13
STOP 77777 14

2.2 FORTRAN II[편집]

포트란 2는 58년에 나왔다. 지난 버전보다 절차적 프로그래밍을 중시하기 위해 사용자-입력 서브루틴과 함수와 변수를 구현하였다.

2.2.1 코드 예제[편집]

다음은 위키백과에 수록된 포트란 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

2.3 FORTRAN III[편집]

2.4 FORTRAN IV[편집]

포트란 4는 1962년 나왔다. 기계적인 부분을 상당 부분 제거했고, 논리 연산자와 같은 것을 추가했다. 1967년 경제기획원 통계국에 도입된 한국 최초로 설치된 컴퓨터인 IBM 1401에서 이 언어를 사용할 수 있었다.

2.4.1 코드 예제[편집]

기계 관련 부분이 제거되었고, 때문에 포트란 2의 예시보다는 읽기 편해졌다.

C AREA OF A TRIANGLE - HERON'S FORMULA
C INPUT - CARD READER UNIT 5, INTEGER INPUT, NO BLANK CARD FOR END OF DATA
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPAYS ERROR MESSAGE ON OUTPUT
  501 FORMAT(3I5)
  601 FORMAT(" A= ",I5,"  B= ",I5,"  C= ",I5,"  AREA= ",F10.2,"SQUARE UNITS")
  602 FORMAT("NORMAL END")
  603 FORMAT("INPUT ERROR OR ZERO VALUE ERROR")
      INTEGER A,B,C
   10 READ(5,501,END=50,ERR=90) A,B,C
      IF(A=0 .OR. B=0 .OR. C=0) GO TO 90
      S = (A + B + C) / 2.0
      AREA = SQRT( S * (S - A) * (S - B) * (S - C) )  
      WRITE(6,601) A,B,C,AREA
      GO TO 10
   50 WRITE(6,602)
      STOP
   90 WRITE(6,603)
      STOP
      END

2.5 FORTRAN 66[편집]

커맨드 라인이 드디어 등장하기 시작하였고, 때문에 이 시기부터는 모니터에 띄우는 방식의 프로그래밍도 가능해졌다.

물론 기존처럼 천공 카드는 사용 가능했다.

2.5.1 코드 예제[편집]

 C     FORTRAN IV WAS ONE OF THE FIRST PROGRAMMING
 C     LANGUAGES TO SUPPORT SOURCE COMMENTS
       WRITE (6,7)
     7 FORMAT(13H HELLO, WORLD)
       STOP
       END

2.6 FORTRAN 77[편집]

가장 범용적인 포트란 메이저 리비전.

이 언어는 70년대부터 90년대 중반까지 코볼과 같이 세상을 나눠먹었다. 현재의 C언어가 갖는 위상보다 더 높을 정도. 상업용은 코볼, 연구용은 포트란. 이란 말이 그 당시를 대표하는 말. 이 시기부터 구조 프로그래밍이 확고하게 가능해 졌고, 반복문이 생겼고, 프로그램을 연 채로 다른 프로그램에 접근할 수 있는 방향성을 개선했고, 드디어 천공 카드에서부터 쓰이던 홀로리스 스트링을 character를 이용한 스트링으로 표현할 수 있게 되었다.

참고로, 오 나의 여신님의 등장인물인 모리사토 케이이치가 다루는 언어는 설정상 바로 이것이다. 작품이 90년대 나온 것을 생각하면 당연한 일이지만, 지금 생각하면...

2.6.1 코드 예제[편집]

2.7 Fortran 90[편집]

쓰기 쉬워진 포트란. 메이저 리비전.

이름이 바뀐 이유는 이 버전부터 소문자와 대문자의 구분을 지원하기 때문이다. 그리고 천공 카드 지원이 사라졌다. 포인터가 들어갔다. 때문에, 대부분의 포트란 호환성은 77과 90을 기점으로 나뉘게 된다. 물론 77과 90 간에도 호환이 되고, 애초에 모든 77 코드는 90 코드이다. 굉장히 배우기 쉽고 쓰기 쉽기 때문에, 어떤 경우 포트란 90을 프로그래밍 입문용으로 쓰기도 한다. 볼 수 있다면, 대한민국에서는 90으로 이뤄진 코드를 많이 볼 수 있다. 하필 95가 97년에 공식적으로 나와서..

2.7.1 코드 예제[편집]

아래의 예제는 편집자가 직접 추가한 예제이다. 이를 triangle.f90 파일로 저장한 뒤 gfortran 등의 컴파일러로 변환하면 된다.

당장 포트란 II에서의 예제와 비교해 보자. 이 예제는 헤론의 공식이 아니라 사인-코사인을 사용하여 넓이를 구하고 있다.

    PROGRAM Triangle
     IMPLICIT NONE
     REAL :: a, b, c, area
     PRINT *, 'AREA OF A TRIANGLE WITH &
     		&Using the length of 3 sides '
     PRINT *, 'PLEASE ENTER THE LENGTHS&
     		& OF THE 3 SIDES.'
     READ *, a, b, c
     PRINT *, 'Triangle's area:  ', Area(a,b,c)
    END PROGRAM Triangle
    FUNCTION Area(x,y,z)
     IMPLICIT NONE
     REAL :: area            ! function type
     REAL, INTENT( IN ) :: x, y, z
     REAL :: theta, height
     theta = ACOS((x**2+y**2-z**2)/(2.0*x*y))
     height = x*SIN(theta); Area = 0.5*y*height
    END FUNCTION Area

2.8 Fortran 95[편집]

정립된 쉬운 포트란 마이너 리비전. 90이 갖고 있던 문제를 일소해준 리비전. 97년에 공식적으로 나왔고, ALLOCATABLE 어레이의 사용을 통해 메모리 낭비 가능성을 획기적으로 줄였다.

2.9 Fortran 2003[편집]

마이너 리비전.

2.10 Fortran 2008[편집]

마이너 리비전.

2.11 Fortran 2015[편집]

2018년 중순에 나올 마이너 리비전.

3 각주

  1. 천공기라고, 이미 그 당시 펀치 카드 작성기가 있었기 때문에 손으로 뚫을 필요는 없다. 하지만 과학자들은 너무 많이 뚫다 보니 두꺼운 종이를 대충 잡아서 때려 뚫으면 맞는 경우도 있었다고 한다.
  2. http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/704/24-6661-2_704_Manual_1955.pdf 를 참조하시오