Fortran

**Fortran** (hay **FORTRAN**) là một  ngôn ngữ lập trình biên dịch, tĩnh, kiểu mệnh lệnh được phát triển từ thập niên 1950 và vẫn được dùng nhiều trong tính toán khoa học hay phương pháp số cho đến hơn nửa thế kỷ sau đó. Tên gọi này ghép lại từ tiếng Anh **''For**mula **Tran**slator/**Tran**slation* nghĩa là *dịch công thức*. Các phiên bản đầu có tên chính thức là FORTRAN, nhưng chữ hoa được chuyển sang chữ thường từ phiên bản Fortran 90. [[Tiêu chuẩn quốc tế]] cho tên gọi này ngày nay là "Fortran".

Fortran được phát triển ban đầu như là một [[ngôn ngữ thủ tục]]. Tuy nhiên các phiên bản mới của Fortran (từ Fortran 90) đã có các tính năng hỗ trợ [[lập trình hướng đối tượng]].

== Lịch sử ==
Một số phiên bản Fortran tiêu biểu:
* Fortran IV
* Fortran 77
* Fortran 90
* Fortran 95
* Fortran 2003

== Cú pháp ==
Các phiên bản cũ hơn cho đến Fortran 77 có sử dụng định dạng theo cột (*fixed column*) theo quy định:
* Cột thứ 7 đến 72 dành cho các [[câu lệnh]]
* Cột thứ 1 đến 5 dành cho [[nhãn lệnh]]. Nhãn lệnh là những số nguyên đứng đầu dòng lệnh, và trong Fortran không nhất thiết phải theo thứ tự tăng dần.
* Cột thứ 6 dành cho ký tự nối dòng (nếu cần thiết).

Các phiên bản mới hơn (từ Fortran 90 trở đi) cho phép dùng định dạng tự do (*free-form*), không có ràng buộc về vị trí các cột trong chương trình. Dưới đây sẽ trình bày một số ví dụ cú pháp theo định dạng tự do này.

=== Lệnh gán ===
Dạng của lệnh gán tương tự như ngôn ngữ lập trình [[BASIC]]:
<syntaxhighlight lang="fortran"  style="font-size:1.2em;" >
! Tên_biến = Giá_trị
A = 5
LoiChao = "Hello"
</syntaxhighlight>

=== Lệnh gọi chương trình con ===
Các [[chương trình con]] được gọi bằng lệnh <code>CALL</code>:
<syntaxhighlight lang="fortran"  style="font-size:1.2em;" >
! CALL tenCTC tham_so1, tham_so2,...
</syntaxhighlight>

=== Các cấu trúc ===
;Rẽ nhánh:
<syntaxhighlight lang="fortran"  style="font-size:1.2em;" >
IF T > 1.0 THEN
   W = 23.7 * T
ELSE
   W = 23.7 * (T ** 0.75)
END IF
</syntaxhighlight>

;Lặp:
<syntaxhighlight lang="fortran"  style="font-size:1.2em;" >
DO I = 1, N
   B(I) = 2.8 * (I - 0.3)
END DO
</syntaxhighlight>

== Ví dụ ==

=== Chương trình "Hello world" ===
Chương trình "Hello world" có thể chạy được sau khi dịch bằng bất cứ [[trình biên dịch|trình dịch]] nào kể từ Fortran 90 trở đi.

<syntaxhighlight lang="fortran" line  style="font-size:1.2em;" >
program helloworld
print*,"Hello world"
end program helloworld
</syntaxhighlight>

=== Chương trình tìm diện tích hình trụ ===
Chương trình này, tính [[diện tích]] của [[hình trụ]], chạy khi được dịch bởi bất cứ [[trình biên dịch|trình dịch]] nào kể từ Fortran 90 trở đi. Các chữ đứng sau dấu <code>!</code> trên cùng dòng sẽ không được dịch, và coi như [[chú thích (lập trình)|chú thích]] của người viết chương trình, để giúp người đọc dễ hiểu hơn.

<syntaxhighlight lang="fortran" line  style="font-size:1.2em;" >
program HinhTru
! Tinh dien tich Hinh tru.
!
! Khai bao bien.
implicit none ! Yeu cau moi bien can duoc khai bao -- danh cho Fortran 90.
integer:: Loi
real:: BanKinh,ChieuCao,DienTich
real, parameter:: Pi = 3.14159
do
   ! Nhac nguoi dung nhap Ban kinh va Chieu cao.
   write (*,*) "Nhap Ban kinh va Chieu cao, nhan 't' de thoat."
   read (*,*,iostat=Loi) BanKinh,ChieuCao
   ! 
   ! Neu khong nhap duoc, thoat.
   if (Loi /= 0) stop "thoat"
   !
   ! Tinh dien tich. Ky hieu ** nghia la "luy thua".
   DienTich = 2*Pi*(BanKinh**2 + BanKinh*ChieuCao)
   !
   ! Viet (BanKinh, ChieuCao) va (DienTich) ra man hinh.
   write (*,"(1x,'BanKinh=',f6.2,5x,'ChieuCao=',f6.2,5x,'DienTich=',f6.2)") BanKinh,ChieuCao,DienTich
end do
end program HinhTru
</syntaxhighlight>

Chú ý: câu lệnh
  write (*,"(1x,'BanKinh=',f6.2,5x,'ChieuCao=',f6.2,5x,'DienTich=',f6.2)") BanKinh,ChieuCao,DienTich
có sử dụng khai báo định dạng trong Fortran. Có thể giải thích sơ lược như sau:
* <code>1x</code> nghĩa là một [[ký tự trống]]. Số ký tự trống cần in ra đi trước chữ<code>x</code>.
* <code>f6.2</code> tương ứng với số thực có 6 chữ số, trong đó 2 chữ số trong [[phần thập phân]].
Kiểu định dạng chuỗi này của riêng Fortran, nó rất khác so với chuẩn định dạng <code>printf</code> của [[c (ngôn ngữ lập trình)|ngôn ngữ lập trình C]] vốn được sử dụng rộng rãi.

== Tham khảo ==

* Adams, Jeanne; Brainerd, Walter; Martin, Jeanne; Smith, Brian; Wagener, Jerrold (1997). *Fortran 95 Handbook: Complete ISO/ANSI Reference*. MIT Press.
* Metcalf, Michael; Reid, John; Cohen, Malcolm (2004). *Fortran 95/2003 Explained*. Oxford University Press.
* Nyhoff, Larry; Leestma, Sanford (1995). *FORTRAN 77 for Engineers and Scientists with an Introduction to FORTRAN 90*. 4th Edition. Prentice Hall. ISBN 0-13-363003-X.
* ANSI X3.198-1992 (R1997), *Programming Language "Fortran" Extended''. Xuất bản bởi ANSI.

## Liên kết ngoài
### Chung chung
* The Fortran Company
* Fortran Open Directory category
* Fortran 90, 95, 2003 Information and Resources
* How Not to Write FORTRAN in Any Language  Có ví dụ về cách viết chương trình tốt, cho mọi ngôn ngữ lập trình.

### Các chương trình Fortran ví dụ
(bằng tiếng Anh)
* Numerical Recipes for Fortran 77 (Các chương trình tính số cho Fortran 77)
* Numerical Recipes for Fortran 90 (Các chương trình tính số cho Fortran 90)
* Fortran 90 Software Repository 
* National HPCC software repository
* Netlib Repository

### Trình dịch Fortran có bản quyền thương mại
* Absoft 
* Cray
* Fujitsu 
* HP 
* IBM
* Intel
* Lahey
* NA Software 
* NAG 
* PathScale 
* Portland Group
* Salford 
* Sun

### Trình dịch Fortran tự do
* g95 -- Fortran 95 
* Gfortran -- Fortran 95 (đang phát triển)
* Open Watcom -- Fortran 77 và C/C++ 
* g77 -- Fortran 77