Tôi cũng ném hai xu của mình vào loại muộn, nhưng tôi chỉ mới nhìn thấy chủ đề này và tôi cảm thấy rằng, đối với hậu thế, có một vài điểm rất cần được thực hiện.
Lưu ý sau đây tôi sẽ nói về C chứ không phải C ++. Tại sao? Chà, nếu không, đó là táo và cam để so sánh một ngôn ngữ hướng đối tượng được đánh máy đầy đủ với một thứ gì đó tĩnh như Fortran. Vâng, một số triển khai hiện đại của các tiêu chuẩn Fortran mới nhất có thể làm được nhiều hơn thế, nhưng rất ít người thực sự sử dụng chúng, và vì vậy khi chúng ta nói về Fortran, chúng tôi nghĩ rằng ngôn ngữ đơn giản, tĩnh và bắt buộc. Đó là nơi C cũng vậy, vì vậy tôi sẽ thay thế C bằng C ++ cho các mục sau.
Trước hết, bất kỳ cuộc thảo luận nào về việc Fortran / C có trình biên dịch tốt hơn là tranh luận. Trình biên dịch C / Fortran chuyên dụng là một điều của quá khứ. Cả gcc / gfortran và icc / ifc chỉ là các giao diện người dùng khác nhau cho cùng một back-end, tức là chương trình của bạn sẽ được chuyển đổi thành một mô tả trừu tượng bởi front-end và sau đó được tối ưu hóa và lắp ráp bởi back-end. Nếu bạn viết, về mặt ngữ nghĩa, cùng một mã trong Fortran hoặc trong C, trình biên dịch, trong cả hai trường hợp, sẽ tạo ra cùng một hội đồng sẽ chạy nhanh như vậy.
Điều này bây giờ dẫn đến điểm thứ hai của tôi: tại sao chúng ta vẫn thấy sự khác biệt? Vấn đề là hầu hết các so sánh được thực hiện bởi các lập trình viên Fortran đang thử một cái gì đó bằng C hoặc ngược lại. Bạn có bao giờ nhận thấy hầu hết các tác giả hoặc nhà thơ thích viết bằng ngôn ngữ bản địa của họ không? Bạn có muốn viết thơ bằng ngôn ngữ mà bạn không cảm thấy hoàn toàn tự tin hoặc ở nhà không? Tất nhiên là không ... Bản thân tôi coi C là ngôn ngữ lập trình "bản địa" của mình. Tuy nhiên, tôi cũng đã dành ba năm làm việc trong một nhóm chỉ sử dụng Fortran, trong đó tôi đã đạt được một mức độ lưu loát nhất định. Tuy nhiên, tôi sẽ không bao giờ tự viết bất cứ điều gì ở Fortran vì tôi cảm thấy thoải mái hơn với C và do đó, mã kết quả sẽ tốt hơn , bất kể bạn định nghĩa như thế nào.
Vì vậy, sự khác biệt chính là ở lập trình viên, không phải ngôn ngữ. Vậy có khác biệt gì không? Vâng, không hoàn toàn. Đây là vài ví dụ:
SIMD: Cho dù đó là SSE, SSE3 hay AltiVec, nếu bạn muốn sử dụng chúng trong Fortran, bạn nên hy vọng và cầu nguyện rằng trình biên dịch sẽ đoán chính xác những gì bạn muốn và làm như vậy. Chúc may mắn. Trong C, bạn thường có các hàm nội tại cho từng kiến trúc hoặc gần đây hơn là các loại vectơ SIMD chung trong gcc . Hầu hết các trình biên dịch Fortran sẽ chỉ sử dụng các hướng dẫn SIMD để hủy bỏ các vòng lặp, nhưng nếu bạn có một hạt nhân hoạt động trên các vectơ dữ liệu ngắn theo cách không rõ ràng, trình biên dịch rất có thể sẽ không nhìn thấy nó.
Các kiến trúc phần cứng khác nhau: Toàn bộ kiến trúc CUDA được xây dựng xung quanh các hạt nhân trong C. Có, Tập đoàn Portland hiện cũng có trình biên dịch fortran có khả năng CUDA , nhưng nó mang tính thương mại và quan trọng nhất là không phải từ NVIDIA. Điều tương tự cũng xảy ra với OpenCL, trong đó dự án tốt nhất tôi có thể tìm thấy là một dự án gần đây chỉ hỗ trợ một vài cuộc gọi cơ bản.
Lập trình song song: Có, cả MPI và OpenMP đều hoạt động tốt với cả C và Fortran. Tuy nhiên, nếu bạn muốn kiểm soát thực sự các chủ đề của mình, tức là nếu bạn có tính toán bộ nhớ chia sẻ hoàn toàn năng động, bạn sẽ bị lạnh với Fortran. Trong C, bạn có các pthread tiêu chuẩn, dù không ấm và mờ, vẫn sẽ giúp bạn vượt qua cơn bão. Nói chung, hầu hết các tính toán dựa trên quyền truy cập vào hệ điều hành, ví dụ như các luồng, quy trình, hệ thống tệp, v.v ... được phục vụ tốt hơn với C. Oh, và đừng cố gắng thực hiện kết nối mạng của riêng bạn với Fortran.
Dễ sử dụng: Fortran gần với Matlab hơn C. Khi bạn đã nhận được tất cả các từ khóa khác nhau và cách khai báo các biến, phần còn lại của mã trông giống như Matlab, giúp người dùng có kinh nghiệm lập trình hạn chế hơn.
Khả năng tương tác: Khi bạn tạo một cấu trúc trong C, bố cục của dữ liệu thực tế là đơn giản và mang tính quyết định. Trong Fortran, nếu bạn sử dụng mảng con trỏ hoặc dữ liệu có cấu trúc, bố cục thực của dữ liệu phụ thuộc nhiều vào trình biên dịch, không đơn giản và thường không hoàn toàn không có tài liệu. Bạn có thể gọi C từ Fortran và ngược lại, nhưng đừng bắt đầu nghĩ rằng có thể dễ dàng vượt qua mọi thứ hơn một mảng tĩnh từ cái này sang cái khác và ngược lại.
Đây là tất cả những thứ tầm thường, cấp độ thấp, nhưng đây là Máy tính hiệu suất cao mà chúng ta đang nói đến, phải không? Nếu bạn không quan tâm đến cách khai thác tốt nhất các mô hình phần cứng cơ bản, tức là triển khai và / hoặc phát triển các thuật toán tốt nhất cho bộ nhớ chia sẻ / phân phối, luồng, vectơ SIMD, GPU sử dụng SIMT, v.v. chỉ làm toán trên máy tính.
Điều này đã kéo dài hơn nhiều so với bất cứ điều gì tôi tham gia, vì vậy đây là một bản tóm tắt - một tập hợp các thông điệp mang về nhà:
- Bạn sẽ viết mã tốt nhất bạn có thể bằng ngôn ngữ mà bạn biết rõ nhất.
- Không có sự khác biệt về chất lượng mã được tạo bởi hai trình biên dịch sử dụng cùng một back-end - chính chúng ta là người viết mã xấu bằng ngôn ngữ này hay ngôn ngữ khác.
- Mặc dù cảm thấy mức độ thấp hơn, Fortran khá trừu tượng ở mức độ cao và sẽ không cho phép bạn truy cập trực tiếp một số tính năng phần cứng / hệ điều hành, ví dụ như SIMD, luồng, kết nối mạng, v.v ...