포트란

포트란(Fortran)은 1954년 IBM 704에서 과학적인 계산을 하기 위해 시작된 컴퓨터 프로그램 언어이다.
FORTRAN은 수식(Formula) 변환기(Translation)의 약자이다.(IBM Mathematical Formula Translating 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 2018

2017년 11월 12일 WG5의 투표에서 차기 포트란 표준의 이름을 Fortran 2015에서 Fortran 2018로 바꾸는 것이 가결되었다.

FORTRAN II

다음은 데이터 카드(천공 카드나 천공 테이프)에서 삼각형의 세 변의 길이를 읽은 후, 헤론의 공식으로 넓이를 구하여 출력하는 예이다.
C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTIONC INPUT - CARD READER UNIT 5, INTEGER INPUTC OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUTC 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 NEGATIVEC FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLEC 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 1C USING HERON'S FORMULA WE CALCULATE THEC 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