
포트란 언어는 프로그래밍 실습과 컴퓨팅 기술의 발전에 발맞추려고 끊임없이 발전하는 역동적인 언어이다. 10년에 한 번 정도 새로운 버전이 등장했다.
포트란 언어의 새로운 버전을 개발하는 책임은 국제표준화기구(ISO)의 포트란 작업 그룹인 WG5에 있다. 이 조직은 실제로 새로운 버전의 언어를 준비할 권한을 국제정보기술표준위원회(INCITS)의 J3 위원회에 위임했다. 각 새로운 버전의 준비는 언어에 포함될 제안을 먼저 요청하고, 어떤 제안을 구현할 수 있는지 결정하고, 전 세계 모든 이해 당사자에게 초안을 작성 및 배포하며, 초안을 수정하고 일반적인 합의에 도달할 때까지 다시 시도하는 확장된 과정이다. 결국 전 세계적인 투표가 벌어져 표준이 채택된다.
새로운 버전의 포트란 언어 설계자들은 기존의 포트란 프로그램과 바람직한 새로운 기능의 도입 사이에서 섬세한 균형을 맞춰야 한다. 현대적으로 구조화된 프로그래밍 기능과 접근 방식이 언어에 도입되었지만, 이전 버전의 포트란에서 나온 많은 바람직하지 않은 기능들은 하위 호환성을 위해 유지되었다.
설계자들은 더 이상 사용할 필요없는 포트란 언어의 바람직하지 않고 쓸모없는 특징을 식별하고, 결국 이 기능을 언어에서 제거하는 메커니즘을 개발했다. 새로운 더 나은 방법으로 대체된 언어의 일부는 구식 특징으로 선언되었다.
구식으로 선언된 기능은 새로운 프로그램에서 절대 사용해서는 안 됩니다. 기존 포트란 코드 베이스에서 이러한 기능의 사용이 감소함에 따라 해당 언어에서 삭제되는 것으로 간주된다. 이전 버전에서 최소한 하나 이상의 구식 목록에 포함되지 않고, 해당 기능의 사용이 무시할 수 있을 정도로 감소하지 않는 한, 어떤 기능도 버전에서 삭제되지 않는다. 이러한 방식으로 언어는 기존 포트란 코드 베이스를 위협하지 않고 발전할 수 있다.
다음 코드를 살펴봄으로써 포트란 언어가 수년에 걸쳐 얼마나 발전했는지 알 수 있다. 이 세 가지 코드는 원래의 포트란 I, 포트란 77, 포트란 2008의 스타일에서 2차 방정식 ax2 + bx + c = 0의 해를 계산하는 프로그램을 보여준다. 이 언어가 수년에 걸쳐 더 읽기 쉽고 구조화되었다는 것은 분명하다. 하지만 놀랍게도 포트란 2008 컴파일러는 여전히 몇 가지 사소한 변경 사항만으로 포트란 I 프로그램을 컴파일할 것이다!
FORTRAN I 코드
C SOLVE QUADRATIC EQUATION IN FORTRAN I
READ 100,A,B,C
100 FORMAT(3F12.4)
DISCR = B**2-4*A*C
IF (DISCR) 10,20,30
10 X1=(-B)/(2.*A)
X2=SQRTF(ABSF(DISCR))/(2.*A)
PRINT 110,X1,X2
110 FORMAT(5H X = ,F12.3,4H +i ,F12.3)
PRINT 120,X1,X2
120 FORMAT(5H X = ,F12.3,4H -i ,F12.3)
GOTO 40
20 X1=(-B)/(2.*A)
PRINT 130,X1
130 FORMAT(11H X1 = X2 = ,F12.3)
GOTO 40
30 X1=((-B)+SQRTF(ABSF(DISCR)))/(2.*A)
X2=((-B)-SQRTF(ABSF(DISCR)))/(2.*A)
PRINT 140,X1
140 FORMAT(6H X1 = ,F12.3)
PRINT 150,X2
150 FORMAT(6H X2 = ,F12.3)
40 CONTINUE
STOP 25252
FORTRAN 77 코드
PROGRAM QUAD4
C
C This program reads the coefficients of a quadratic equation of
C the form
C A * X**2 + B * X + C = 0,
C and solves for the roots of the equation (FORTRAN 77 style).
C
C Get the coefficients of the quadratic equation.
C
WRITE (*,*) 'Enter the coefficients A, B and C: '
READ (*,*) A, B, C
C
C Echo the coefficients to make sure they are entered correctly.
C
WRITE (*,100) 'The coefficients are : ', A, B, C
100 FORMAT (1X,A,3F10.4)
C
C Check the discriminant and calculate its roots.
C
DISCR = B**2 - 4.*A*C
IF ( DISCR .LT. 0) THEN
WRITE (*,*) ' This equation has complex roots:'
WRITE (*,*) ' X = ', -B/(2.*A), ' +i ', SQRT(ABS(DISCR))/(2.*A)
WRITE (*,*) ' X = ', -B/(2.*A), ' -i ', SQRT(ABS(DISCR))/(2.*A)
ELSE IF ( (B**2 - 4.*A*C) .EQ. 0) THEN
WRITE (*,*) ' This equation has a single repeated real root:'
WRITE (*,*) ' X = ', -B/(2.*A)
ELSE
WRITE (*,*) ' This equation has two distinct real roots:'
WRITE (*,*) ' X = ', (-B + SQRT(ABS(DISCR)))/(2.*A)
WRITE (*,*) ' X = ', (-B - SQRT(ABS(DISCR)))/(2.*A)
END IF
C
END
FORTRAN 2008 코드
PROGRAM roots
! Purpose:
! This program solves for the roots of a quadratic equation of the form
! A * X**2 + B * X + C = 0. It calculates the answers regardless of the
! type of roots that the equation possesses (Fortran 95/2003 style).
!
IMPLICIT NONE
! Declare the variables used in this program
REAL :: a ! Coefficient of X**2 term of equation
REAL :: b ! Coefficient of X term of equation
REAL :: c ! Constant term of equation
REAL :: discriminant ! Discriminant of the equation
REAL :: imag_part ! Imaginary part of equation (for complex roots)
REAL :: real_part ! Real part of equation (for complex roots)
REAL :: x1 ! First solution of equation (for real roots)
REAL :: x2 ! Second solution of equation (for real roots)
! Prompt the user for the coefficients of the equation
WRITE (*,*) 'This program solves for the roots of a quadratic '
WRITE (*,*) 'equation of the form A * X**2 + B * X + C = 0. '
WRITE (*,*) 'Enter the coefficients A, B, and C:'
READ (*,*) a, b, c
! Echo back coefficients
WRITE (*,*) 'The coefficients A, B, and C are: ', a, b, c
! Calculate discriminant
discriminant = b**2 - 4. * a * c
! Solve for the roots, depending upon the value of the discriminant
IF ( discriminant > 0. ) THEN ! there are two real roots, so...
X1 = ( -b + sqrt(discriminant) ) / ( 2. * a )
X2 = ( -b - sqrt(discriminant) ) / ( 2. * a )
WRITE (*,*) 'This equation has two real roots:'
WRITE (*,*) 'X1 = ', x1
WRITE (*,*) 'X2 = ', x2
ELSE IF ( discriminant == 0. ) THEN ! there is one repeated root, so...
x1 = ( -b ) / ( 2. * a )
WRITE (*,*) 'This equation has two identical real roots:'
WRITE (*,*) 'X1 = X2 = ', x1
ELSE ! there are complex roots, so ...
real_part = ( -b ) / ( 2. * a )
imag_part = sqrt ( abs ( discriminant ) ) / ( 2. * a )
WRITE (*,*) 'This equation has complex roots:'
WRITE (*,*) 'X1 = ', real_part, ' +i ', imag_part
WRITE (*,*) 'X2 = ', real_part, ' -i ', imag_part
END IF
END PROGRAM roots| [FORTRAN] 포트란의 줄 바꿈과 주석 (0) | 2025.12.13 |
|---|---|
| [FORTRAN] 포트란의 문자 집합 (0) | 2025.12.13 |
| [FORTRAN] 포트란의 역사 (0) | 2025.12.12 |
| DATCOM 예제 1. 항공기 기체 비교 (1) | 2025.06.22 |
| DATCOM 초보자 따라하기 : 미그-17 모델링 (1) | 2025.06.21 |