Monday, March 2, 2015

Фортраны хувьсгал /Evaluation of fortran/

Фортран бол инженерчлэл, шинжлэх ухааны судалгаанд зориулагдсан дээд түвшний хэл юм. Дээд түвшний гэдгийг дээгүүр зиндааны гэж ойлгож болохоос гадна сурсан хойноо эргэж харвал дээд түвшний амархан хэл гэж хэлж болно. Фортран нь С++, python, java гэх мэт ач нар шигээ технологийн хөгжил, практикийн шаардлагаар шинэчлэгдэн хувьсаж байдаг динамик шинжтэй хэл юм. Давуу чанар, шинэ гүйцэтгэлийг агуулсан шинэ хувилбар 10 жилийн үечлэлтэй гардаг уламжлал ажиглагдаж байна. Энэхүү шин хувилбар гаргах хариуцлага нь Олон улсын стандарт буюу ISO /International organization for standardization/ -ын харъяанд Fortran working group - Фортран хөгжүүлэх групп үүрдэг байна. Энэ групп нь Америкийн Үндэсний Стандартын Институтын /ANSI гэж өгөгдлийн өргөтгөл байдгыг санаж байгаа байх/ төлөөлөгч байгууллага юм. Фортраны шинэчлэсэн хувилбарыг АҮСИ ноороглож бусад ижил чиглэлийн байгууллага, хувь экспертүүдэд явуулж, санал асуулга, зөвлөмж авч түүнийгээ мөн ноорогтоо шигтгэж дахин явуулж дахин шигтгэж гэх мэт их зөвлөлдсөн процессын үр дүнд шинэ хувилбар гарч ирнэ. Шинэ хувилбарын фортран нь өмнөх хувилбарын шинж чанар онцлогийг агуулсан байх заавалчгүй шаардлагатай ба өмнөх хувилбарын дутагдлыг сайжруулах эсвэл огт шинэ зүйл хийх "тушаал" нэмсэн байх ёстой. Програмчлалын хэл хэт шинэчлэгдвэл /бичиглэлийн формат огт өөр болох/ хэрэглэгчидэд таагүй байх нь ойлгомжтой. Учир нь програмчлалын хэл бол судлаач, инженер, эрдэмтдийн хэрэглээ юм. 
Фортран бол орчин үеийн чадварлаг тооцооллын хэлнүүдийн буурал аав юм.
Фортран хэлний анхны хувилбар 1954 онд гарч 1960 он хүртэл хэрэглэгдсэн. IBM Type 407 компьютер Фортраны анхны хэрэглэгч байсан ба 409 хувилбар нь анхны фортраны хувилбарыг халсан байна. 
Фортран хэлтэй IBM 704 компьютер. Энэ компьютер орчин үеийн бидний утас шиг их олон функц ажиллуулж чадахгүй боловч секундэд 4000 орчим бүхэл тоог үржиж хуваах, 8000 орчин бутархай тооны дунджыг олох чадвартай байжээ.

Тухайн үед фортран бол гайхалтай санаа байсан. Учир нь тухайн үед машинд томъёог  /FORmula/ хөрвуулж /TRANslate/ өгч бодуулах цор ганц арга нь байсан юм. Нэр нь ч бас гайхалтай. Фортраны 2 дахь хувилбар 1958 оны намар хэрэглэгчдэд хүрсэн ба бүхий л IBM компьютерт зориулсан програмууд энэ хэлээр бичигдэж эхэлжээ. Энэ үеийн фортран хэл нь одоогийн хувилбартай харьцуулахад цомхон тооны тушаалтай /statement/, зөвхөн бүхэл /integer/ ба бутархай /real/ тоотой харьцдаг байжээ. Мөн ямар нэгэн дэд програм байхгүй зөвхөн нэг файлд багтсан цомхон програм бичигдэж практикт зарим нэг зүйлийг гүйцэтгэхэд маш олон учир дутагдал үүсэж байсан. Эдгээр учир дутагдлыг нэгтгэн 1958 онд Фортран II (FORTRAN II) хувилбарыг гаргаж ирсэн. Улмаар баяжуулсаар 1962 онд Фортран IV (FORTRAN IV) хувилбар бүтээгдсэн ба байвал зохих бүхий л зүйлүүдийг агуулсан стандартын програм болж чадсан байна. Удалгүй 1966 онд АҮСИ-ийн стандартаар батлагдаж Фортран 66 (FORTRAN 66) нэртэй болсон байна. Ингээд 1977 онд дараачийн хувилбар болох Фортран 77 (FORTRAN 77) гарсан ба энэ нь маш чухал өөрчлөлтүүдийг багтаасан учир одоо хүртэл хэрэглээнд байсаар байна. Фортран 77 - дээр суурилж дараачийн хувилбар болсон Фортран 90 (Fortran 90) хэвлэгдсэн ба зарим нэг бичиглэлийн стандарт өөрчлөгдөж, тоон бүрдлийг /array буюу массив/ илүү дээд түвшинд ашиглах боломжийг бүрдүүлсэн гэх мэт давуу талуудтай. Үүний дараа 1996 онд Фортран 95 (Fortran 95) гарсан ба энэ нь FORALL бүтцийг агуулсан, зарим цэвэр функцыг оруулсан гэх мэт шинэчлэлээс гадна өмнөх 77 ба 90 хувилбарууд дахь хуучирсан болон хэрэгцээгүй болсон тушаалуудыг үгүй хийсэн хувилбар юм. Фортраны хувилбарууд дээр бичсэн кодыг ажвал орсон өөрчлөлт хувьслууд нь харагах болно. 

1:  C   SOLVE QUADRATIC EQUATION IN FORTRAN I  
2:     READ 100,A,B,C  
3:  100  FORMAT(3F12.4)  
4:     DISCR = B**2-4*A*C  
5:     IF (DISCR) 10,20,30  
6:  10  X1=(-B)/(2.*A)  
7:     X2=SQRTF(ABSF(DISCR))/(2.*A)  
8:     PRINT 110,X1,X2  
9:  110  FORMAT(5H X = ,F12.3,4H +i ,F12.3)  
10:     PRINT 120,X1,X2  
11:  120  FORMAT(5H X = ,F12.3,4H -i ,F12.3)  
12:     GOTO 40  
13:  20  X1=(-B)/(2.*A)  
14:     PRINT 130,X1  
15:  130  FORMAT(11H X1 = X2 = ,F12.3)  
16:     GOTO 40  
17:  30  X1=((-B)+SQRTF(ABSF(DISCR)))/(2.*A)  
18:     X2=((-B)-SQRTF(ABSF(DISCR)))/(2.*A)  
19:     PRINT 140,X1  
20:  140  FORMAT(6H X1 = ,F12.3)  
21:     PRINT 150,X2  
22:  150  FORMAT(6H X2 = ,F12.3)  
23:  40  CONTINUE  
24:     STOP 25252  
Дээрх код нь анхны хувилбар буюу фортран I дээр бичигдсэн квадрат тэгшитгэлийн шийд олох програмын код юм. 


1:     PROGRAM QUAD4  
2:  C  
3:  C   This program reads the coefficients of a quadratic equation of   
4:  C   the form  
5:  C      A * X**2 + B * X + C = 0,  
6:  C   and solves for the roots of the equation (FORTRAN 77 style).  
7:  C  
8:  C   Get the coefficients of the quadratic equation.  
9:  C  
10:     WRITE (*,*) 'Enter the coefficients A, B and C: '  
11:     READ (*,*) A, B, C  
12:  C  
13:  C   Echo the coefficients to make sure they are entered correctly.  
14:  C   
15:     WRITE (*,100) 'The coefficients are : ', A, B, C  
16:  100  FORMAT (1X,A,3F10.4)  
17:  C  
18:  C   Check the discriminant and calculate its roots.  
19:  C  
20:     DISCR = B**2-4.*A*C  
21:     IF ( DISCR .LT. 0) THEN  
22:       WRITE (*,*) ' This equation has complex roots:'  
23:       WRITE (*,*) ' X = ', -B/(2.*A), ' +i ', SQRT(ABS(DISCR))/(2.*A)  
24:       WRITE (*,*) ' X = ', -B/(2.*A), ' -i ', SQRT(ABS(DISCR))/(2.*A)  
25:     ELSE IF ( (B**2 - 4.*A*C) .EQ. 0) THEN  
26:       WRITE (*,*) ' This equation has a single repeated real root:'  
27:       WRITE (*,*) ' X = ', -B/(2.*A)  
28:     ELSE  
29:       WRITE (*,*) ' This equation has two distinct real roots:'  
30:       WRITE (*,*) ' X = ', (-B + SQRT(ABS(DISCR)))/(2.*A)  
31:       WRITE (*,*) ' X = ', (-B - SQRT(ABS(DISCR)))/(2.*A)  
32:     END IF  
33:  C  
34:     END  
Энэ нь Фортран 77 дээр бичигдсэн квадрат тэгшитгэлийн шийд олох програмын код юм.


1:  PROGRAM roots  
2:  ! Purpose:  
3:  !  This program solves for the roots of a quadratic equation of the form  
4:  !  A * X**2 + B * X + C = 0. It calculates the answers regardless of the  
5:  !  type of roots that the equation possesses (Fortran 95/2003 style).  
6:  !  
7:  IMPLICIT NONE  
8:  ! Declare the variables used in this program  
9:  REAL :: a       ! Coefficient of X**2 term of equation  
10:  REAL :: b       ! Coefficient of X term of equation  
11:  REAL :: c       ! Constant term of equation  
12:  REAL :: discriminant  ! Discriminant of the equation  
13:  REAL :: imag_part   ! Imaginary part of equation (for complex roots)  
14:  REAL :: real_part   ! Real part of equation (for complex roots)  
15:  REAL :: x1       ! First solution of equation (for real roots)  
16:  REAL :: x2       ! Second solution of equation (for real roots)  
17:  ! Prompt the user for the coefficients of the equation  
18:  WRITE (*,*) 'This program solves for the roots of a quadratic '  
19:  WRITE (*,*) 'equation of the form A * X**2 + B * X + C = 0. '  
20:  WRITE (*,*) 'Enter the coefficients A, B, and C:'  
21:  READ (*,*) a, b, c  
22:  ! Echo back coefficients  
23:  WRITE (*,*) 'The coefficients A, B, and C are: ', a, b, c   
24:  ! Calculate discriminant  
25:  discriminant = b**2 - 4. * a * c   
26:  ! Solve for the roots, depending upon the value of the discriminant  
27:  IF ( discriminant > 0. ) THEN ! there are two real roots, so...  
28:    X1 = ( -b + sqrt(discriminant) ) / ( 2. * a )  
29:    X2 = ( -b - sqrt(discriminant) ) / ( 2. * a )  
30:    WRITE (*,*) 'This equation has two real roots:'  
31:    WRITE (*,*) 'X1 = ', x1  
32:    WRITE (*,*) 'X2 = ', x2  
33:  ELSE IF ( discriminant == 0. ) THEN ! there is one repeated root, so...  
34:    x1 = ( -b ) / ( 2. * a )  
35:    WRITE (*,*) 'This equation has two identical real roots:'  
36:    WRITE (*,*) 'X1 = X2 = ', x1  
37:  ELSE ! there are complex roots, so ...  
38:    real_part = ( -b ) / ( 2. * a )  
39:    imag_part = sqrt ( abs ( discriminant ) ) / ( 2. * a )  
40:    WRITE (*,*) 'This equation has complex roots:'  
41:    WRITE (*,*) 'X1 = ', real_part, ' +i ', imag_part  
42:    WRITE (*,*) 'X2 = ', real_part, ' -i ', imag_part  
43:  END IF  
44:  END PROGRAM roots  
Энэ нь Фортран 95 дээр бичигдсэн квадрат тэгшитгэлийн шийд олох програмын код юм. Дээрх кодуудыг ажиглавал коммандын мөрны хэмжээ ихэссэн нь тайлбар болон тодорхойлолт оруулдаг болсоных юм. Гол гүйцэтгэлийн мөрийг авч үзвэл анхны фортран форматад 20, фортран 77 хувилбарт 12, фортран 95 хувилбарт 14 байна. Фортран хэлээр бичигдсэн кодууд ерөнхийдөө гуравхан хэсгээс бүрдэнэ. Үүнд зарлах хэсэг /declaration section/, гүйцэтгэл хэсэг /execution section/, төгсгөл хэсэг /termination section/ багтана. Сүүлийн үеийн хувилбаруудад гүйцэтгэлийн хэсэг зарлах хэсгээс ихээхэн хамаарах болсон нь кодонд ашиглагдаж байгаа бүх түр ба байнгын хэмжигдэхүүнүүд зарлагдсан байх ёстой гэдэгтэй холбоотой. Фортран 77 болон түүнээс өмнөх хувилбарт томоохон хэмжээний програмын кодонд зарлагдаагүй хэмжигдэхүүнүүд алдаа их үүсгэдэг байсан учир гэнэтийн алдаанаас сэргийлэх зорилгоор ийнхүү бүх хэмжигдэхүүнийг зарлаж "далд биш" /IMPLICIT NONE/ тушаалыг ашиглах болжээ. 
Кодын эх сурвалж: Fortran 95/2003 for Scientists & Engineers

No comments:

Post a Comment