1 điểm bởi GN⁺ 2024-04-07 | 1 bình luận | Chia sẻ qua WhatsApp

Kết hợp Fortran và WebAssembly

  • Fortran là một ngôn ngữ lập trình lâu đời, xuất hiện lần đầu vào năm 1957, còn cổ hơn cả ngôn ngữ C, CPU Intel 4004 và máy tính mainframe IBM System/360.
  • Fortran từ lâu đã được օգտագործված cho các tác vụ đòi hỏi tính toán lớn trong các ứng dụng khoa học và kỹ thuật, và một số người cho rằng nó hiệu quả hơn C trong các phép tính số.
  • Bài viết blog này giải thích cách biên dịch mã Fortran hiện có sang WebAssembly để có thể chạy trong trình duyệt web.

Vấn đề là gì?

  • Có nhiều cách khác nhau để biên dịch Fortran sang WebAssembly, nhưng không có cách nào hỗ trợ đầy đủ mọi tính năng.
  • Mỗi cách đều có nhược điểm riêng và không phải là một giải pháp cắm vào là chạy.

Tóm tắt về trình biên dịch

  • Đã có một số thay đổi đối với các trình biên dịch Fortran dựa trên LLVM.
  • Tiện ích f2c chuyển đổi Fortran 77 sang mã C, nhưng không tương thích với mã Fortran hiện đại.
  • Trình biên dịch LFortran hiện đã hỗ trợ nhiều tính năng hơn, nhưng vẫn có thể phát sinh vấn đề với một số dự án.
  • Dragonegg là một plugin của GCC tạo ra LLVM IR, nhưng yêu cầu các phiên bản GCC và LLVM cũ.
  • Classic Flang không hỗ trợ đầu ra 32-bit, còn LLVM Flang hiện tại không tạo đầu ra WebAssembly theo mặc định.

Xây dựng và sử dụng WebAssembly với LLVM Flang

  • Cần sửa mã nguồn LLVM Flang để triển khai target WebAssembly.
  • Có thể tận dụng thiết kế mô-đun của LLVM để dùng frontend Flang và backend WebAssembly.

Gọi chương trình con Fortran từ C

  • Bài viết ôn lại cách biên dịch và liên kết một chương trình con Fortran như một phần của chương trình C.

Quay lại với LLVM Flang

  • Có thể dùng trình biên dịch LLVM Flang để biên dịch các chương trình con Fortran, nhưng vì target WebAssembly vẫn chưa được triển khai nên cần áp dụng patch vào mã nguồn.

Gọi routine Fortran từ JavaScript

  • Có thể dùng Emscripten để liên kết đối tượng Fortran và gọi trực tiếp từ JavaScript.

Thư viện runtime Fortran: hành trình đến với "Hello, World!"

  • Bài viết mô tả các vấn đề phát sinh khi cố gắng build chương trình "Hello, World!" bằng Fortran.
  • Cần biên dịch thư viện runtime Fortran của LLVM cho WebAssembly.

Ý kiến của GN⁺

  • Bài viết này cho thấy nỗ lực tích hợp các ngôn ngữ truyền thống như Fortran với công nghệ web hiện đại. Cách tiếp cận này có thể hữu ích để đưa các thư viện tính toán số đã được kiểm chứng lên web.
  • Quá trình biên dịch Fortran sang WebAssembly cho thấy rõ những thách thức trong việc chuyển một codebase hiện có sang nền tảng mới. Đặc biệt, các vấn đề liên quan đến cross-compiling là yếu tố quan trọng cũng cần được cân nhắc khi port sang ngôn ngữ hoặc nền tảng khác.
  • Dù công nghệ này khá thú vị, việc thực hiện các tác vụ tính toán số đòi hỏi hiệu năng cao trực tiếp trên web vẫn còn những giới hạn thực tế. WebAssembly có thể vẫn chưa mang lại hiệu năng ngang với các ứng dụng native truyền thống.
  • Việc phát triển LLVM Flang đang diễn ra rất tích cực, và những nỗ lực này được kỳ vọng sẽ tạo ảnh hưởng tích cực đến cộng đồng Fortran. Tuy vậy, nhiều vấn đề được nhắc đến trong bài cũng cho thấy vẫn còn những thách thức cần giải quyết.
  • Bài viết này cung cấp thông tin hữu ích cho các nhà phát triển muốn tích hợp Fortran với công nghệ web, đặc biệt là những người đang cân nhắc phát triển các công cụ dựa trên web trong lĩnh vực phân tích số hoặc tính toán khoa học.

1 bình luận

 
GN⁺ 2024-04-07
Ý kiến Hacker News
  • George đã nghiên cứu về Fortran khi tham gia dự án WebR để chạy R trong trình duyệt web

    • Mã nguồn R có chứa một lượng đáng kể mã Fortran
    • Ban đầu WebR sử dụng f2c, công cụ chuyển Fortran sang C, nhưng nhờ các bản vá cho LLVM Flang nên giờ có thể build bằng trình biên dịch Fortran thực thụ
    • Dù George không nói thẳng điều này trong bài blog, nhưng có vẻ ông hy vọng Flang sẽ chấp nhận bản vá của mình hoặc tự triển khai một bản vá tốt hơn
    • Nếu những bản vá như vậy không còn phải duy trì riêng lẻ, và Flang nguyên bản có thể biên dịch sang wasm, thì điều đó cũng sẽ giúp ích cho các dự án khác dùng Fortran
  • Chia sẻ trải nghiệm từng làm việc với trình biên dịch FORTRAN tại Xilinx cách đây 20 năm

    • Điều đáng nhớ là trong file header f2c.h có một định nghĩa tên là barf
  • Khuyến nghị build f18 bằng mã nguồn mới nhất của dự án LLVM

    • Dự án LLVM thay đổi rất nhanh, và việc debug những lỗi đã được sửa hoặc bỏ lỡ các tính năng đã có sẵn là một sự lãng phí thời gian
  • Khen ngợi cách giải thích theo hướng tiếp cận “ví dụ phi tầm thường đơn giản nhất”

    • Họ nói đã học được rất nhiều từ một vấn đề cụ thể là “gọi hàm BLAS từ JavaScript”
  • Nhắc đến việc bản thân không có nhiều kiến thức về phát triển WebAssembly

    • Họ tự hỏi liệu WebAssembly hiện có mang lại điều gì cho người dùng cuối hay không, hay tất cả mới chỉ là đặt nền móng cho tương lai của các chương trình thực sự có tính di động
    • Họ có nghe nói WebAssembly giúp hạn chế truy cập mạng và tệp, nhưng không chắc đó là lý thuyết hay đã được triển khai trên thực tế
  • Đặt câu hỏi liệu có tồn tại một hệ sinh thái “sẵn sàng cho sản xuất” dành cho đại số tuyến tính trong JavaScript hay không

    • Khi tìm kiếm, họ thường chỉ thấy các thư viện cũ được port sang JavaScript, nên tự hỏi liệu mình có đang bỏ sót điều gì không
  • Một ý kiến nói rằng giá như họ còn lưu đoạn mã Fortran 78 viết vào năm 1981/82 để xem giờ có thể chạy lại nó hay không

    • Đồng thời nhắc đến một trình định dạng mã nguồn cho ngôn ngữ lập trình Jovial, thứ mà khi đó họ buộc phải dùng Fortran để viết
  • Cho rằng thật lạ khi không thấy LFortran được nhắc đến nhiều hơn

    • LFortran có những ví dụ WASM trực tuyến rất tốt và khá ấn tượng
  • Cung cấp thông tin về việc dùng Fortran trong .NET và Java

    • Các liên kết liên quan cho thấy Fortran có thể được sử dụng trong .NET và Java
  • Chia sẻ kinh nghiệm biên dịch TensorFlow cho trình duyệt

    • Họ nói TensorFlow dùng Eigen, nên may mắn là không phải dùng các thư viện toán học phổ biến viết bằng Fortran như BLAS hay Lapack, nhờ đó tránh được rất nhiều công việc hơn