Oleh: Yohanes Nugroho, S.T (Alumni IF’98)
GNU Fortran 77 adalah salah satu compiler keluarga gcc (GNU Compiler Collection), yang meliputi gcc (C), gpc (Pascal), g++ (C++), g77 (Fortran 77) dan gcj (Java). GCC sudah sangat terkenal sejak beberapa belas tahun yang lalu karena sifatnya yang free, kecepatannya yang tinggi, dukungan mesin yang luas (Seluruh compiler di GCC dapat dijalankan hampir di semua OS yang ada saat ini dengan target hampir seluruh mikroprosessor yang ada di bumi saat ini), dan kode yang dihasilkan sangat optimum.
GNU Fortran 77 mengimplementasikan hampir seluruh standar Fortran 77, ditambah dengan ekstensinya sendiri (misalkan layout free form).
Ada beberapa alasan mengapa g77 lebih baik dipakai dibanding compiler lain:
- Sifatnya yang Open Source
o Kita tidak bergantung pada satu vendor tertentu
o Kita dapat memodifikasi source code compilernya
o Kita dapat mem-port g77 ke mesin baru yang kita miliki, atau ke OS baru yang kita miliki
o Kita tidak perlu membayar lisensi untuk produk komersial
- Dukungan platform yang luas
o g77 dapat berjalan di semua OS populer saat ini, termasuk juga OS-OS yang sudah dianggap kuno. Dengan menulis program memakai g77, kita dapat yakin program kita dapat berjalan di berbagai OS
o g77 memakai backend gcc yang memungkinkannya menghasilkan kode mesin untuk berbagai arsitektur mikroprosessor yang ada.
o Kita dapat membuat program di satu OS dan menjalankannya di OS yang lain
- Kecepatan yang tinggi
o GCC terkenal sebagai koleksi compiler yang menghasilkan kode optimal berkecepatan tinggi [lihat Open source: Voices From The Open Source Revolution]
Bagi banyak orang, kelemahan g77, seperti compiler lain dalam paket GCC adalah bahwa dia hanyalah sebuah compiler, bukan sebuah IDE. Untuk mengedit file kita butuh program lain, untuk mendebug program kita juga butuh program lain.
Namun hal ini merupakan hal yang memang disengaja, program-program yang dibuat oleh FSF (Free Software Foundation) memakai prinsip bahwa sebuah program hanya perlu melakukan hal yang seperlunya saja. Hal ini akan terlihat jelas ketika melakukan porting program, melakukan porting seluruh IDE beserta GUI-nya akan menjadi tugas yang sangat berat dibandingkan jika hanya melakukan porting bagian compilernya saja, atau editor saja.
Delphi adalah salah satu produk yang sangat sukses yang dikembangkan oleh Borland Corp. Delphi merupakan RAD (Rapid Application Development) Tool yang memungkinkan pembuatan aplikasi GUI secara cepat. Delphi sangat cocok digunakan untuk membuat aplikasi bisnis dan aplikasi-aplikasi yang membutuhkan GUI yang baik.
Fortran merupakan salah satu bahasa tingkat tinggi pertama yang sukses. Sudah sangat banyak, dan saat ini masih banyak aplikasi yang ditulis menggunakan Fortran. Sampai saat ini Fortran masih layak untuk dipelajari, bahkan masih menjadi kewajiban bagi seorang ilmuwan untuk menguasai Fortran.
Aplikasi Fortran umumnya adalah aplikasi modus teks. Modus teks artinya bahwa aplikasi tersebut tidak bisa menampilkan gambar karena keterbatasan fungsi Fortran standar. Saat ini hasil yang berupa grafik dari suatu program sudah menjadi kebutuhan yang umum sehingga diperlukan cara untuk menampilkan hasil di Fortran menjadi grafik.
Beberapa Vendor mengadakan pendekatan dengan membuat versi Fortran yang dapat membuat tampilan grafik, namun cara ini memiliki kelemahan. Program Fortran yang ditulis menjadi tidak portabel lagi. Artinya, program yang dapat di-compile untuk compiler tersebut tidak akan dapat dikompilasi di compiler yang lain. Padahal dengan menggunakan Fortran standar, kita dapat menjalankan program di komputer apapun, bahkan di super komputer.
Pendekatan lain untuk membuat aplikasi grafik memanfaatkan Fortran adalah dengan interfacing dengan bahasa lain yang mendukung GUI yang baik. Dan salah satu pilihan yang terbaik saat ini adalah Borland Delphi, dan alternatif lain adalah Microsoft Visual Basic serta Borland C++ Builder. Ada dua metode interfacing, pertama adalah dengan mengkompilasi file object Fortran dengan file dari bahasa lain, dan yang kedua adalah dengan menggunakan DLL.
Metode pertama sulit dilakukan karena dalam proses kompilasi, setiap compiler menghasilkan object code yang formatnya berbeda, sehingga metode interfacing hanya dapat dilakukan jika masing-masing compiler menggunakan object code yang sama. Biasanya metode kedua yang dipilih dalam interfacing.
Di Windows, suatu koleksi fungsi dapat dibuat sebagai suatu pustaka (library) program yang disebut dengan Dynamic Link Library (DLL). DLL dapat diakses oleh aplikasi apa saja di Windows. Jadi untuk menghubungkan program yang ditulis dalam Fortran dengan Delphi atau bahasa apapun, kita cukup membuat DLL dari program Fortran yang kita miliki.
Ada 3 langkah untuk membuat DLL dengan g77, yaitu membuat file definisi fungsi-fungsi yang akan diekspor, mengkompilasi program Fortran, dan membentuk DLL dari hasil kompilasi tersebut. Detail dari setiap langkah tersebut adalah sebagai berikut:
Isi file itu adalah seperti ini:
LIBRARY namalibrary
EXPORTS
fungsi1 = fungsi1_
fungsi2 = fungsi2_
Perhatikan bahwa kata LIBRARY dan EXPORTS harus ditulis dalam huruf besar. Baris-baris setelah EXPORTS berisi daftar fungsi-fungsi yang akan diekspor oleh DLL (daftar fungsi yang akan dapat dipanggil oleh program lain).
Untuk menuliskan daftar fungsi yang diekspor, gunakan sintaks:
Namafungsidiekspor=namafungsidifortran_
Artinya, gunakan namafungsi sebagai ganti dari namafungsi_. Contoh:
jumlah=jumlah_
g77 secara otomatis akan memberikan underscore (garis bawah) di belakang nama fungsi, sehingga kita perlu memberikan nama baru tanpa underscore (ini sebenarnya tidak wajib, hanya untuk memudahkan). Jadi sebenarnya sintaks seperti ini boleh
EXPORTS
jumlah_
artinya kita akan mengekspor fungsi jumlah_ sesuai namanya, yaitu jumlah_.
Atau kita bisa juga melakukan hal seperti ini:
EXPORTS
sum=jumlah_
artinya kita akan mengekspor fungsi jumlah_ dengan nama sum (di DLL yang tercantum adalah nama sum).
Untuk mengkompilasi source code Fortran dengan g77, ketikkan:
g77 –mrtd –c
namafile.for
hasilnya adalah file namafile.obj jika tidak terjadi kesalahan apa-apa. Kesalahan yang paling umum adalah kesalahan peletakan kode program (seharusnya di kolom 7 atau setelahnya).
Anda juga dapat menambahkan opsi lain di g77, misalnya:
g77 –mrtd –Wall –c
namafile.for
yang artinya agar g77 memberi peringatan jika ada bagian program yang mencurigakan. Yang penting option –c dan –mrtd harus ada. Parameter –c yang artinya: compile program, tapi jangan jalankan linker (Linker hanya perlu dijalankan untuk membuat file EXE Fortran). Parameter –mrtd artinya, gunakan calling convention (konvensi pemanggilan fungsi) stdcall. Secara default g77 akan memakai calling convention C.
Untuk menciptakan DLL, gunakan tools yang bernama dllwrap.exe, untuk membuat dll, kita cukup mengetikkan:
dllwrap --def
namaflile.def namafile.o -o namadll.dll
Jika tidak terjadi kesalahan maka file namadll.dll akan tercipta di direktori yang aktif saat itu.
Delphi, seperti bahasa pemrograman lain di Windows dapat mengakses DLL. Cara yang mengimpor DLL yang disebutkan di sini berlaku juga untuk DLL apapun yang ada di Windows.
Untuk mendefinisikan bahwa suatu fungsi berasal dari sebuah DLL, gunakan sintaks seperti berikut ini:
function nama_fungsi_delphi(var
nama_parameter:tipe):tipe_kembalian;stdcall;
external 'namadll.dll' name ‘nama_fungsi_di_dll';
atau, untuk prosedur:
procedure nama_prosedur_delphi(var
nama_parameter:tipe);stdcall; external
'namadll.dll' name
‘nama_prosedur_di_dll';
Parameter selalu dilewatkan sebagai referensi di g77, sehingga di Delphi, kita perlu menyebutkan kata kunci (keyword) var, yang berarti bahwa kita akan melewatkan alamat dari variabel dan bukan nilainya.
Setelah fungsi tersebut diimpor, kita dapat mempergunakannya seperti fungsi biasa. Contohnya, jika kita mengimpor fungsi jumlah, di file jumlah.dll, dan kita ingin menyebut fungsi jumlah itu sebagai fungsi sum, kita bisa melakukannya sebagai berikut:
function sum(var a, b:double):double;stdcall; external 'jumlah.dll' name
'jumlah';
dan untuk memanggilnya:
var
a, b:double;
begin
a:=4.0;
b:=5.0;
writeln(sum(a,b));
end.
Untuk memudahkan memahami
File jumlah.for
REAL*8
FUNCTION JUMLAH(A, B)
REAL*8
A, B, S
S = (A + B)
JUMLAH = S
END
File jumlah.def
LIBRARY jumlah
EXPORTS
jumlah=jumlah_
File testarray.for
SUBROUTINE
ISIARRAY(TABEL)
INTEGER
TABEL(10,20)
DO
15, I=1, 10
DO 10, J=1, 20
TABEL(I,J)
= 100*I+J
10
CONTINUE
15
CONTINUE
END
File testarray.def
LIBRARY testarray
EXPORTS
isiarray=isiarray_
File test.pas
Program test;
type
array20x10 = array [1..20, 1..10] of integer;
function jumlah(var
a, b:double):double;stdcall; external 'jumlah.dll' name 'jumlah';
procedure
isiarray(var a:array20x10);stdcall; external 'testarray.dll' name 'isiarray';
var a, b: double;
c: array20x10;
i,j:integer;
begin
a:=5.0;
b:=7.0;
writeln(jumlah(a, b):3:4);
isiarray(c);
for i:=1 to 20 do
for j:=1 to 10 do
writeln('C[',i,',',j,'] = ', c[i,j]);
end.
Perhatikan bahwa passing parameter dilakukan by reference, artinya dalam memanggil fungsi jumlah, Anda tidak bisa melakukannya seperti ini:
Jumlah(3.0,
4.0); (*hanya bisa dilakukan jika passing by value*)
Tapi harus seperti ini:
A:=3.0;
B:=4.0;
(*dapat
dilakukan pada passing by value maupun by reference *)
Jumlah(A,
B);
Cara kompilasi seluruh program adalah sebagai berikut:
g77
-c -mrtd jumlah.for
dllwrap
--def jumlah.def jumlah.o -o jumlah.dll
g77
-c -mrtd testarray.for
dllwrap
--def testarray.def testarray.o -o testarray.dll
dcc32
/cc test.pas
Baris terakhir dalam langkah kompilasi sebenarnya memanggil compiler Delphi versi command line (Delphi tidak hanya menyediakan interface GUI, tapi juga Interface Command Line). Parameter /CC yang diberikan ke dcc32 artinya kita ingin membuat file EXE yang berjalan di mode console (tidak di mode grafis Windows). Setelah selesai mengcompile, kita dapat mencobanya dengan menjalankan file test.exe (cukup ketikkan test.exe di command prompt).
Delphi dan Fortran memiliki nama yang berbeda untuk suatu tipe data, berikut ini adalah tipe data yang ada di Fortran
Delphi |
G77 |
Besar Tipe |
Keterangan |
Integer |
INTEGER |
32 bit |
|
Real |
REAL |
64 bit |
Sebaiknya tidak digunakan (tidak kompatibel antar versi Delphi)* |
Double |
REAL*8 atau REAL(KIND=2) |
64 bit |
|
Boolean |
LOGICAL |
32 bit |
Sama dengan integer |
* Di versi sebelumnya, besar tipe data real adalah 48 bit dengan format milik Borland (tidak standar), pada versi 7.0 ke atas Real sama dengan Double (Format IEEE)
Perlu diperhatikan bahwa baris dan kolom array di Delphi terbalik dengan milik Fortran. Dalam hal ini standar Fortran yang tidak umum. Hampir di semua implementasi bahasa lain, array disusun seperti di Delphi.
Jika Anda mendefinisikan array seperti ini di Fortran:
INTEGER TAB(10, 50)
Di Delphi Anda harus mendefinisikannya sebagai berikut:
Type TTAB=array[1..50, 1..10] of integer;
var
TAB: TTAB
Jadi jika di Fortran Anda mengakses tabel seperti ini:
TABEL(1, 7) = 5
Maka di Delphi, Anda harus mengaksesnya seperti ini:
TABEL[7, 1] = 5
GNU Fortran 77 merupakan salah satu implementasi Fortran 77 yang sangat baik dan gratis. G77 dapat dijadikan alternatif untuk compiler Fortran yang ada saat ini. Dalam tulisan singkat ini juga dibahas cara membuat DLL dari source code Fortran, sehingga kode program tersebut dapat dipakai di program lain.
Yohanes Nugroho
7 Februari 2003