Cộng đồng phát triển phần mềm đang tích cực thảo luận về khái niệm bộ ngôn ngữ thống nhất như một giải pháp tiềm năng cho những thách thức khi làm việc với nhiều ngôn ngữ lập trình khác nhau trong các dự án. Cuộc thảo luận này xuất phát từ một bài viết đề xuất hệ thống phân loại cho các ngôn ngữ lập trình thành bốn cấp độ riêng biệt dựa trên mô hình thực thi và hệ thống kiểu dữ liệu của chúng, với đề xuất về một bộ ngôn ngữ thống nhất được xây dựng xoay quanh ngôn ngữ lập trình Rust.
Vấn đề Phát triển Đa ngôn ngữ
Phát triển phần mềm hiện đại thường yêu cầu các nhóm làm việc đồng thời với nhiều ngôn ngữ lập trình khác nhau, mỗi ngôn ngữ phục vụ các mục đích khác nhau trong hệ sinh thái dự án. Như một người bình luận đã chỉ ra, chúng ta có xu hướng sử dụng các ngôn ngữ từ các cấp độ khác nhau trong các bối cảnh khác nhau (front end, back end, hệ thống) và chúng ta dành rất nhiều thời gian viết mã kết nối để chúng có thể giao tiếp với nhau. Thực tế này tạo ra chi phí đáng kể về khả năng tương tác, đòi hỏi công việc mở rộng trên các giao diện hàm ngoại (FFI) và tuần tự hóa/giải tuần tự hóa giữa các ranh giới ngôn ngữ. Phương pháp bộ ngôn ngữ được đề xuất nhằm giải quyết vấn đề này bằng cách tạo ra một họ các ngôn ngữ có cú pháp tương tự nhau có thể làm việc cùng nhau một cách liền mạch trong khi nhắm đến các yêu cầu khác nhau về hiệu suất và dễ sử dụng.
Các Phương pháp Hiện có và Các Giải pháp Thay thế
Một số người bình luận đã nêu bật các hệ sinh thái hiện có đã cố gắng giải quyết vấn đề này. Hệ sinh thái Clojure được đề cập như có các phương ngữ rất hữu ích với sự trùng lặp rộng rãi trên các môi trường khác nhau, bao gồm ClojureScript cho trình duyệt, Clojure cho JVM, Babashka cho lập trình script, và Jank cho khả năng tương tác với C/C++. Tương tự, Dart được xác định là một ngôn ngữ có JIT và có thể khởi động khá nhanh và thông dịch ngay lập tức trong khi cũng có thể biên dịch trước thành mã máy hiệu quả khi bạn sẵn sàng phát hành, hiệu quả kết nối các cấp độ đề xuất 2 và 3.
Lập luận Chống lại Sự Thống nhất Bắt buộc
Không phải tất cả các thành viên cộng đồng đều nhiệt tình về cách tiếp cận ngôn ngữ thống nhất. Một số người lập luận rằng các ngôn ngữ dành riêng cho miền cung cấp những lợi ích quan trọng không nên hy sinh cho sự đồng nhất về cú pháp:
Đặc biệt với sự hỗ trợ của các mô hình ngôn ngữ lớn (LLM), chúng ta không còn đạt được nhiều lợi ích từ việc làm cho mọi thứ có một cú pháp, một ngôn ngữ, v.v. Các dự án như Dotnet Blazor/ASP.NET hoặc Python Streamlit/Dash theo ý kiến của tôi là bị ép buộc và gây ra nhiều rắc rối hơn là giá trị mang lại. Đề xuất của tác giả, nơi mọi thứ đều là Rust, cũng gặp vấn đề tương tự; nó quá gượng ép.
Quan điểm này cho thấy việc chấp nhận các ngôn ngữ chuyên biệt có thể hiệu quả hơn so với việc cố gắng tạo ra một giải pháp phù hợp cho tất cả, đặc biệt là khi các công cụ như mô hình ngôn ngữ lớn ngày càng giúp các nhà phát triển làm việc trên các cú pháp khác nhau.
Các Cấp Độ Phân Loại Ngôn Ngữ Lập Trình
- Cấp 4: Thông dịch, kiểu dữ liệu động ( JavaScript , Python , PHP )
- Cấp 3: Thông dịch, kiểu dữ liệu tĩnh ( Hack , Flow , TypeScript , mypy )
- Cấp 2: Biên dịch với quản lý bộ nhớ tự động ( Go , Java , C , Haskell , Objective-C , Swift )
- Cấp 1: Biên dịch với quản lý bộ nhớ thủ công ( Rust , C , C++ )
Bộ Ngôn Ngữ Đề Xuất
- Rust: Cấp 1 - Hiệu suất tối đa với quản lý bộ nhớ thủ công
- RustGC: Cấp 2/3 lai - Thu gom rác với biên dịch để triển khai
- RustScript: Cấp 4 - Kiểu dữ liệu động để tạo nguyên mẫu nhanh
Tính khả thi và Hướng đi Kỹ thuật
Một hiểu biết kỹ thuật thú vị từ cuộc thảo luận liên quan đến hướng tương thích của ngôn ngữ. Một người bình luận lưu ý rằng việc thông dịch một ngôn ngữ bị ràng buộc dễ dàng hơn là biên dịch một ngôn ngữ động được thiết kế với trình thông dịch trong tâm trí. Điều này cho thấy việc bắt đầu với một ngôn ngữ cấp thấp hơn như Rust và xây dựng các biến thể cấp cao hơn (như đề xuất với RustGC và RustScript) có thể khả thi hơn so với việc cố gắng làm cho một ngôn ngữ như JavaScript hoặc Python dễ biên dịch hơn.
Cộng đồng cũng thảo luận về tiềm năng của việc thêm thu gom rác tự động vào Rust, với một người bình luận bày tỏ sự ủng hộ mạnh mẽ trong khi thừa nhận rằng mã RustGC sẽ không dễ dàng để chuyển đổi sang Rust truyền thống. Nhưng việc đi theo hướng ngược lại nên là đơn giản.
Cuộc thảo luận xoay quanh các bộ ngôn ngữ phản ánh những căng thẳng rộng hơn trong phát triển phần mềm giữa tiêu chuẩn hóa và chuyên môn hóa. Trong khi một cách tiếp cận thống nhất có thể giảm tải nhận thức và thách thức tích hợp của phát triển đa ngôn ngữ, nó cũng có thể hy sinh những lợi thế dành riêng cho miền mà các ngôn ngữ chuyên biệt cung cấp. Khi các công cụ phát triển tiếp tục phát triển, đặc biệt là với sự hỗ trợ của AI, sự cân bằng giữa các cách tiếp cận này có thể thay đổi, có khả năng làm cho phát triển đa ngôn ngữ ít gánh nặng hơn mà không đòi hỏi sự đồng nhất về cú pháp.
Tham khảo: From Languages to Language Sets