Fortran memiliki tempat khusus dalam pemrograman numerik. Anda tentu dapat membuat perangkat lunak yang baik dan cepat dalam bahasa lain, tetapi Fortran tetap berkinerja sangat baik meskipun usianya sudah lanjut. Selain itu, lebih mudah membuat program cepat di Fortran. Saya telah membuat program cepat di C ++, tetapi Anda harus lebih berhati-hati tentang hal-hal seperti pointer alias. Jadi, harus ada alasan untuk ini, dan alasan yang sangat teknis. Apakah karena kompiler dapat mengoptimalkan lebih banyak? Saya benar-benar ingin mengetahui detail teknis, jadi jika saya menggunakan bahasa lain saya dapat mempertimbangkan hal-hal ini.
Sebagai contoh, saya tahu - atau saya pikir - bahwa satu hal adalah bahwa standar menentukan bahwa pointer selalu bersebelahan dalam memori yang berarti akses memori lebih cepat. Saya percaya Anda bisa melakukan ini di C ++ dengan memberikan bendera ke kompiler. Dengan cara ini membantu mengetahui apa yang Fortran lakukan dengan baik, sehingga jika menggunakan bahasa lain kita bisa meniru ini.
sumber
Jawaban:
Desainer bahasa menghadapi banyak pilihan. Ken Kennedy menekankan dua: (1) abstraksi yang lebih baik dan (2) tingkat yang lebih tinggi atau lebih rendah (kurang seperti mesin). Sementara bahasa fungsional seperti Haskell dan Skema fokus pada yang pertama, bahasa komputasi ilmiah tradisional seperti Fortran dan C / C ++ berfokus pada yang terakhir. Mengatakan bahwa satu bahasa lebih cepat dari yang lain biasanya cukup menyesatkan: setiap bahasa memiliki domain masalah yang unggul. Harga Fortran lebih baik dalam domain kode numerik berbasis array daripada bahasa lain karena dua alasan dasar: model array dan kesederhanaannya.
Model Array
Programmer Fortran sebagian besar melakukan manipulasi array. Untuk itu, Fortran memfasilitasi beberapa optimisasi kompiler yang tidak tersedia dalam bahasa lain. Contoh terbaik adalah vektorisasi: mengetahui tata letak data memungkinkan kompiler untuk memanggil intrinsik tingkat perakitan di atas array.
Penjelasan Bahasa
Meskipun tampaknya bahasa yang lebih sederhana harus dikompilasi "lebih baik" daripada yang lebih kompleks, itu sebenarnya tidak terjadi. Ketika seseorang menulis dalam bahasa assembly , tidak banyak kompiler yang dapat melakukannya: semua yang dilihatnya adalah instruksi yang sangat bagus. Fortran membutuhkan kesaksian (dengan demikian, lebih banyak pekerjaan oleh programmer) hanya dalam kasus yang menghasilkan hadiah nyata untuk komputasi berbasis array. Fortran menggunakan tipe data sederhana, aliran kontrol dasar, dan ruang nama terbatas; sebaliknya, ia tidak memberi tahu komputer cara memuat register (yang mungkin diperlukan untuk waktu-nyata ). Dimana Fortran adalah eksplisit, memungkinkan hal-hal seperti inferensi tipe lengkap, yang membantu pemula untuk memulai. Itu juga menghindari satu hal yang sering membuat C lambat:pointer buram .
Fortran Bisa Lambat
Fortran tidak cepat untuk setiap tugas: itu sebabnya tidak banyak orang menggunakannya untuk membangun GUI atau bahkan untuk komputasi ilmiah yang sangat tidak terstruktur. Setelah Anda meninggalkan dunia array untuk grafik, pohon keputusan, dan bidang lainnya, keunggulan kecepatan ini dengan cepat hilang. Lihat tolok ukur bahasa komputer untuk beberapa contoh dan angka.
sumber
Desain Fortran memungkinkan kompiler melakukan optimasi yang lebih kuat dalam beberapa kasus, optimisasi yang umumnya tidak tersedia untuk C.
Salah satu contoh terkenal adalah penanganan aliasing . Di Fortran, Anda dapat mengakses area memori tertentu hanya melalui simbol spesifik yang terkait dengan area memori itu. Pengetahuan ini memungkinkan kompiler untuk menggunakan trik pintar ketika saatnya untuk melakukan cache: ia tahu jika suatu nilai berpotensi berubah atau tidak. Hingga F90, ini diverifikasi dengan mudah. Ketika Fortran 90 diperkenalkan
pointers
, anggapan itu tidak lagi benar: Anda bisa mengakses area memori yang sama melalui dua (atau lebih) simbol. Ini adalah alasan mengapa Anda harus menentukantarget
untuk array yang ingin Anda alamatkan melalui pointer.Fakta lain yang menarik adalah bahwa banyak konstruksi memungkinkan kompiler untuk melakukan paralelisasi tanpa campur tangan pengguna. Kemewahan semacam itu dimungkinkan karena "agnostisisme platform" relatif Fortran sebagai bahasa.
Ada banyak trik halus lainnya seperti ini. Selain itu, ingatlah bahwa tidak ada yang menggunakan Fortran hari ini, kecuali untuk perhitungan numerik, yang berarti bahwa fitur inti dan nilai jual kompiler Fortran adalah kecepatan kode yang dihasilkan. Akibatnya, vendor fokus pada ini.
Meskipun demikian, Anda dapat menghasilkan kode performan juga dengan bahasa lain. Namun, hal itu mungkin memerlukan perawatan khusus atau intervensi manusia. Poin umum, bagaimanapun, adalah bahwa kinerja tidak menjadi masalah sampai ada masalah, dan waktu kerja jauh lebih mahal daripada waktu komputer. Jadi praktik pengkodean harus fokus pada penghematan waktu manusia, bukan waktu komputer.
sumber
Saya tidak berpikir Fortran dekat dengan logam (lihat jawaban lain) tetapi cenderung mengoptimalkan dengan sangat mudah. Loop sederhana, dan bahasa siap mendukung ekstensi vektorisasi (oke ketika saya menggunakannya dalam pekerjaan pertama kami, kami menargetkan berbagai vektor besar besi).
Ada juga faktor inersia yang besar. Banyak kode numerik di Fortran, jadi pembangun server dan superkomputer kelas atas memastikan mereka menulis kompilator Fortran yang optimal. Kompilernya bagus (bahkan pada mesin dengan relatif tidak ada kompiler berkualitas tinggi) sehingga pengguna terus menggunakan Fortran dan bahkan menulis kode baru di dalamnya. Jadi pembangun memastikan generasi berikutnya memiliki kompiler yang baik, dll ...
sumber
Hati-hati dengan mitos urban di sini. Jika dua kompiler menghasilkan kode perakitan yang sama, maka program yang dihasilkan akan memiliki kinerja yang sama.
Untuk setiap bagian logika, ada program dalam bahasa rakitan yang meminimalkan waktu eksekusi. Program itu tidak peduli kompiler mana yang membuatnya.
Yang mengatakan, ada bahasa yang dikompilasi untuk membuat hidup lebih mudah bagi programmer. Bagian dari biaya ini adalah mereka dapat menggoda pengguna untuk menggunakan fitur yang tidak menghasilkan waktu eksekusi minimal. Contoh utama dari ini adalah
new
dalam C ++. (Seberapa lambatnya - hanya tiga karakter?) Praktis meminta Anda untuk mengalokasikan memori secara dinamis, dan tidak memperhatikan biaya runtime. Jika itu yang ingin Anda lakukan, itu hebat, tetapi Fortran bisa lebih cepat hanya karena itu tidak membuat Anda kesal melakukan itu.Tetapi jauh lebih dari itu, saya belum pernah melihat sebuah program yang, seperti yang ditulis pertama, tidak memiliki ruang besar untuk peningkatan kinerja seperti yang tidak pernah dapat dilakukan oleh kompiler untuk Anda. Sebagai satu contoh, menghabiskan sebagian besar waktu untuk menelepon
exp
dan / ataulog
berulang kali dengan argumen yang sama. Sebagai contoh lain, memanggil DGEMM untuk melipatgandakan matriks dan mengetahui bahwa sebagian besar waktu digunakan untuk memanggil LSAME hanya untuk menguraikan argumen karakter inputnya.Ini pada saat yang sama karena orang mengatakan Fortran lebih cepat karena penunjuk alias atau loop terbuka. Itu seperti mengatakan bus yang dibuat oleh Porsche pasti akan lebih cepat daripada bus yang dibuat oleh Chevrolet. Perlu ada sedikit akal sehat.
sumber