Saya juga melempar dua sen saya agak terlambat, tapi saya baru saja melihat utas ini dan saya merasa bahwa, untuk anak cucu, ada beberapa poin yang sangat perlu dibuat.
Perhatikan di bawah ini bahwa saya akan berbicara tentang C dan bukan C ++. Mengapa? Nah, kalau tidak itu apel dan jeruk untuk membandingkan bahasa berorientasi objek mengetik dinamis penuh dengan sesuatu yang statis seperti Fortran. Ya, beberapa implementasi modern dari standar Fortran terbaru dapat melakukan lebih dari itu, tetapi sangat sedikit orang yang menggunakannya, dan ketika kita berbicara tentang Fortran, kita berpikir bahasa yang sederhana, statis, dan imperatif. Di situlah C juga, jadi saya akan mengganti C dengan C ++ untuk yang berikut ini.
Pertama-tama, setiap diskusi tentang Fortran / C yang memiliki kompiler yang lebih baik adalah moot. Kompiler C / Fortran khusus adalah sesuatu dari masa lalu. Baik gcc / gfortran dan icc / ifc hanya ujung depan yang berbeda dengan ujung belakang yang sama, yaitu program Anda akan diubah menjadi deskripsi abstrak oleh ujung depan dan kemudian dioptimalkan dan disusun oleh ujung belakang. Jika Anda menulis, secara semantik, kode yang sama di Fortran atau di C, kompiler akan, dalam kedua kasus, menghasilkan rakitan yang sama yang akan berjalan sama cepatnya.
Ini sekarang mengarah pada poin kedua saya: mengapa kita masih melihat perbedaan? Masalahnya adalah bahwa sebagian besar perbandingan dibuat oleh programmer Fortran mencoba sesuatu dalam C atau sebaliknya. Pernah perhatikan bagaimana sebagian besar penulis atau penyair lebih suka menulis dalam bahasa ibu mereka? Apakah Anda ingin menulis puisi dalam bahasa yang Anda tidak merasa percaya diri atau betah? Tentu saja tidak ... Saya sendiri menganggap C sebagai bahasa pemrograman "asli" saya. Namun, saya juga menghabiskan tiga tahun bekerja dalam sebuah kelompok yang hanya menggunakan Fortran, di mana saya telah mencapai tingkat kefasihan tertentu. Namun, saya tidak akan pernah menulis apa pun di Fortran karena saya lebih nyaman dengan C dan, sebagai akibatnya, kode yang dihasilkan akan lebih baik , apa pun yang Anda definisikan sebagai.
Jadi perbedaan utamanya ada pada programmer, bukan bahasa. Jadi tidak ada perbedaan? Ya tidak cukup. Berikut ini beberapa contoh:
SIMD: Apakah itu SSE, SSE3 atau AltiVec, jika Anda ingin menggunakannya dalam Fortran, Anda harapan yang lebih baik dan berdoa bahwa dugaan compiler persis apa yang Anda inginkan dan melakukannya begitu. Semoga berhasil. Dalam C Anda umumnya memiliki fungsi intrinsik untuk setiap arsitektur, atau, yang lebih baru, tipe vektor SIMD umum dalam gcc . Kebanyakan kompiler Fortran hanya akan menggunakan instruksi SIMD untuk membuka gulungan, tetapi jika Anda memiliki kernel yang bekerja pada vektor data pendek dengan cara yang tidak jelas, kompiler kemungkinan besar tidak akan melihatnya.
Arsitektur perangkat keras yang berbeda: Seluruh arsitektur CUDA dibangun di sekitar kernel di C. Ya, Grup Portland sekarang memiliki kompiler fortran yang mampu CUDA juga, tetapi komersial, dan yang paling penting, itu bukan dari NVIDIA. Hal yang sama berlaku untuk OpenCL, yang terbaik yang bisa saya temukan adalah proyek terbaru yang hanya mendukung beberapa panggilan dasar.
Pemrograman paralel: Ya, baik MPI dan OpenMP bekerja dengan baik dengan C dan Fortran. Namun, jika Anda ingin kontrol nyata dari utas Anda, yaitu jika Anda memiliki komputasi shared-memory yang sepenuhnya dinamis, Anda akan kedinginan bersama Fortran. Di C Anda memiliki pthreads standar yang, meskipun tidak hangat dan tidak jelas, masih akan membantu Anda melewati badai. Secara umum, sebagian besar perhitungan yang mengandalkan akses ke sistem operasi, mis. Utas, proses, sistem file, dll ... lebih baik disajikan dengan C. Oh, dan jangan coba-coba membuat jaringan sendiri dengan Fortran.
Kemudahan penggunaan: Fortran lebih dekat ke Matlab daripada C. Setelah Anda mempelajari semua kata kunci yang berbeda dan cara mendeklarasikan variabel, sisa kode tersebut terlihat seperti Matlab, membuatnya lebih mudah diakses oleh pengguna dengan pengalaman pemrograman terbatas.
Interoperabilitas: Ketika Anda membuat struct dalam C, tata letak data aktual bersifat langsung dan deterministik. Di Fortran, jika Anda menggunakan array pointer atau data terstruktur, tata letak data yang sebenarnya sangat bergantung pada kompiler, tidak lurus ke depan, dan biasanya tidak berdokumen. Anda dapat memanggil C dari Fortran dan sebaliknya, tetapi jangan mulai berpikir mungkin lebih mudah untuk melewatkan sesuatu lebih dari array statis dari satu ke yang lain dan kembali.
Ini semua agak aneh, hal-hal tingkat rendah, tapi ini Komputasi Kinerja Tinggi yang sedang kita bicarakan, kan? Jika Anda tidak tertarik pada cara terbaik mengeksploitasi paradigma perangkat keras yang mendasarinya, yaitu menerapkan dan / atau mengembangkan algoritma yang terbaik untuk memori bersama / didistribusikan, utas, vektorisasi SIMD, GPU menggunakan SIMT, dan sebagainya, maka Anda hanya mengerjakan matematika di komputer.
Ini telah menjadi jauh lebih lama dari apa pun yang saya maksudkan, jadi inilah ringkasannya - satu set pesan yang dapat dibawa pulang:
- Anda akan menulis kode terbaik yang Anda bisa dalam bahasa yang Anda tahu paling baik.
- Tidak ada perbedaan dalam kualitas kode yang dihasilkan oleh dua kompiler yang menggunakan back-end yang sama - kitalah yang menulis kode buruk dalam satu bahasa atau lainnya.
- Meskipun merasa lebih rendah, Fortran adalah abstraksi tingkat tinggi dan tidak akan membiarkan Anda mengakses fitur perangkat keras / OS tertentu secara langsung, misalnya SIMD, utas, jaringan, dll ...