- Tác giả, một lập trình viên coi trọng lập trình hàm và các đảm bảo tĩnh, sau khi trải nghiệm nhiều ngôn ngữ đã đánh giá cao thiết kế cân bằng của OCaml
- So với hệ thống kiểu phức tạp và tốc độ biên dịch chậm của Haskell, OCaml mang lại cả sự đơn giản lẫn tính thực dụng
- Có nét giống Go ở tốc độ biên dịch nhanh và runtime gọn nhẹ, nhưng vẫn giữ được các thế mạnh của ngôn ngữ hàm như pattern matching và sum type
- Build nhanh, binary tĩnh, công cụ tài liệu phong phú (
odig, utop) giúp nâng cao năng suất và khả năng tiếp cận
- Sự cân bằng giữa tính đơn giản và khả năng biểu đạt, cùng với thiết kế ngôn ngữ tinh tế, được xem là sức hấp dẫn lớn nhất của OCaml
Kinh nghiệm với các ngôn ngữ lập trình và so sánh
- Từ kinh nghiệm phát triển phần mềm nghiệp dư lẫn chuyên nghiệp bằng nhiều ngôn ngữ, tác giả tổng hợp các đặc điểm của một ngôn ngữ tốt
- Các yếu tố quan trọng được nêu ra gồm tốc độ biên dịch nhanh, runtime đơn giản, đảm bảo tĩnh mạnh, thành phần hàm, hiệu năng tốt và chất lượng tài liệu
- Haskell giúp tác giả học được tư duy của lập trình hàm, nhưng bị chỉ ra vấn đề về cú pháp phức tạp và biên dịch chậm
- Xu hướng theo đuổi sự phức tạp trong cộng đồng cùng các vấn đề runtime như space leak khiến việc bảo trì trở nên khó khăn
- Go cho phép đạt được sự đơn giản, biên dịch nhanh, hệ công cụ tốt và khả năng hiểu code ngắn gọn
- Tuy nhiên, do thiết kế bảo thủ, xử lý lỗi dài dòng và thiếu kiểm tra null tường minh, nó gây bất tiện và làm tăng khả năng phát sinh bug
- Việc thiếu REPL và thái độ tiêu cực với các ý tưởng lập trình hàm cũng được nhắc tới như những hạn chế
Các điểm mạnh chính của OCaml
- OCaml được đánh giá là ngôn ngữ đáp ứng phần lớn các tiêu chí trên
- Đảm bảo tĩnh mạnh: hỗ trợ sum type, polymorphic variant, pattern matching
- Runtime đơn giản: dùng garbage collection nhưng vẫn hoạt động như một ngôn ngữ ở mức hệ thống
- Tốc độ biên dịch nhanh: nhờ hệ thống build Dune, nhanh hơn Haskell hay Rust
- Tạo ra binary đơn tĩnh liên kết sẵn, thuận tiện cho việc triển khai
- Công cụ tài liệu xuất sắc:
odig (duyệt tài liệu offline), utop (REPL), cùng cấu trúc tách biệt file interface và implementation
- Tính năng suy luận kiểu tự động giúp nâng cao hiệu quả viết code
- Cấu trúc định nghĩa kiểu trong file interface hỗ trợ việc dò tìm code rõ ràng hơn
Thiết kế ngôn ngữ và ấn tượng
- Dù là một ngôn ngữ lâu đời, OCaml vẫn giữ được cảm quan thiết kế tinh tế
- Một số tính năng hướng đối tượng hoặc thư viện phức tạp được đánh giá là không cần thiết
- Nhìn chung, sự cân bằng giữa tính đơn giản và khả năng biểu đạt, cùng với tài liệu và hệ sinh thái công cụ tốt, là sức hút cốt lõi của OCaml
- Tác giả đánh giá cao OCaml như một “ngôn ngữ đơn giản nhưng giàu khả năng biểu đạt”, và nhắc đến cảm giác thỏa mãn khó tìm thấy ở các ngôn ngữ khác
1 bình luận
Ý kiến trên Hacker News
Tôi đã thử dùng OCaml một chút và gặp khá nhiều vấn đề
Hỗ trợ Windows rất tệ, phải đến OCaml 5 mới được cải thiện lên mức “đỡ tệ hơn đôi chút”
Cú pháp thì khó đọc với con người, và khi có lỗi cú pháp thì chỉ cần sai một ký tự cũng có thể hiện ra thông báo lỗi dài tới 1000 dòng
Ocamlfmt còn biến cả những câu lệnh
matchphức tạp thành một dòng, làm giảm khả năng đọcTài liệu cũng quá ngắn gọn và hầu như không có ví dụ
OPAM về lý thuyết có vẻ hay, nhưng thực tế thì đầy lỗi; từng có cả lỗi không tìm được
curlnếu bạn thuộc hơn 32 nhóm UnixViệc chú thích kiểu trong chữ ký hàm là tùy chọn nên làm giảm lợi ích của static typing
Hệ sinh thái cũng nhỏ, đến cả sao chép tệp còn không có hàm tích hợp sẵn
Việc ám ảnh với danh sách liên kết đơn cũng kém hiệu quả
Dù vậy nó vẫn tốt hơn C hay Python, nhưng có lẽ tôi sẽ không chọn nó thay vì Rust
Vì nhắm tới CLR nên việc triển khai dễ hơn nhiều, đồng thời có thể tận dụng nguyên vẹn hệ sinh thái .NET
Bạn có thể dùng gần như nguyên xi các thư viện NuGet dành cho C# hay VB.NET nên hệ sinh thái rất đồ sộ
Tài liệu của F# phong phú hơn nhiều và cũng có nhiều ví dụ hơn
Tham khảo: F# Language Reference, F# Core Docs, F# Cheatsheet
curlcủa OPAM có thật không, và xác nhận được trong issue #5373Thực ra đây là vấn đề liên quan đến musl, xảy ra vì OPAM được build bằng binary đó
ocamlformatnếu cấu hình theo profile janestreet thì tốt hơn mặc định rất nhiềuVấn đề chú thích kiểu trong chữ ký hàm có thể giải quyết bằng cách cung cấp file
.mli, nhưng đa số không làm vậyBù lại, plugin OCaml cho VS Code mang lại trải nghiệm tốt nhất cho người mới bắt đầu
Với phần cứng hiện nay, tôi nghĩ collection mặc định lẽ ra nên là vector
Trước đây còn không thể cài trực tiếp từ ocaml.org, mà phải đi qua mingw hoặc wsl
Nên thực chất có thể xem như không hề có OCaml cho Windows
Lý do các nhà thiết kế Go gần như không tiếp nhận các ý tưởng của lập trình hàm là rất rõ ràng
Như Rob Pike từng nói, đa số lập trình viên ở Google khi đó còn trẻ và đã quen với các ngôn ngữ họ C, nên họ cần một ngôn ngữ dễ học
Vì việc chuyển đổi sang tư duy của ngôn ngữ hàm tốn rất nhiều thời gian, Go đã cố tránh cái chi phí đó
Mỗi lần nhìn thấy từ “ML” tim tôi vẫn đập nhanh một nhịp, rồi lại thất vọng khi nhận ra đó là Machine Learning chứ không phải Meta Language
Dạo này tôi ghét hơn việc từ “AI” bị lạm dụng khắp nơi
Tôi ước gì người ta đừng dùng từ AI cho đến khi AGI thật sự xuất hiện
Xem bài nói chuyện của Richard Feldman sẽ thấy giải thích rất rõ vì sao ngôn ngữ hàm không thể trở nên phổ biến
Hoặc là ngôn ngữ độc quyền của một nền tảng, hoặc có killer app, hoặc có nguồn tiền marketing khổng lồ
Python tăng trưởng bùng nổ cũng là vì nó trở thành ngôn ngữ trung tâm của hệ sinh thái AI
Tôi cũng đã học lập trình hàm bằng OCaml và làm dự án với Haskell lẫn Zig, nhưng cuối cùng vẫn quay lại thực tế là “dùng công cụ nào dùng được thì dùng”
OCaml, Rust và Haskell đều phổ biến ở mức “ngôn ngữ mà người ta muốn học”, nhưng không phải là “ngôn ngữ thực sự được dùng rộng rãi”
Torch ban đầu dựa trên Lua, rồi mới chuyển sang Python vốn đã rất phổ biến từ trước
Phe FP đã thờ ơ với những thay đổi công nghệ ngoài đời thực, và trong lúc đó các ngôn ngữ như C, Pascal, Perl, Tcl đã chiếm lĩnh thị trường
Cuối cùng FP vẫn là “các giáo sĩ trong nhà thờ”, còn ngôn ngữ mệnh lệnh thì giành được quần chúng
Tôi từng dùng F# và thấy concurrency dựa trên Actor khá dễ hiểu
Nhưng cứ khi mutable Array xuất hiện thì mọi thứ lại trở nên phức tạp
Tôi tò mò không biết có lý do gì để thích OCaml trong công việc hơn F#
Trong khi đó OCaml có loại bỏ global lock, biên dịch nhanh, cùng các tính năng mạnh như module, GADT, effect
F# vẫn nhỉnh hơn ở hỗ trợ Windows, SIMD và unboxed types, nhưng OCaml cũng đang dần bắt kịp
Thư viện thì nhiều, nhưng phần lớn lại không mang phong cách F#
OCaml có hệ sinh thái native lớn hơn
Khả năng tương tác với C# thì tốt, nhưng việc dùng thư viện F# từ C# là một cơn ác mộng
Cuối cùng vẫn phải giữ một lớp vỏ C#, và codebase trở thành thứ lai tạp
Hệ sinh thái .NET rất phong phú, nhưng lại mang nặng tư duy OOP nên hay xung đột với phong cách FP
Visual Studio thì tiện, nhưng lại bất tiện với workflow dựa trên CLI
Tốc độ biên dịch ngày càng chậm, việc test cũng gượng gạo
Sau khi dùng OCaml, tôi thấy thiết kế ergonomic của ngôn ngữ này tự nhiên hơn hẳn
F# thường được gọi là “OCaml for .NET”, nhưng thực tế nó chỉ là một ngôn ngữ thuộc họ ML và gần như là một ngôn ngữ khác
Vì OCaml là ngôn ngữ lâu đời nên có thể nghĩ rằng các tính năng OOP có thể bỏ đi, nhưng tôi lại thấy Standard ML hoàn thiện hơn
Nó hữu ích cho record kiểu cấu trúc, open recursion, và các binding JS như
Js_of_ocamlNó cũng không hỗ trợ cập nhật record nên khá bất tiện
Từ đầu những năm 2000, OCaml lúc nào cũng là một “ngôn ngữ gần như hoàn hảo”
Nhưng đến khi các điểm gây ma sát được giải quyết thì những ngôn ngữ khác đã hấp thụ hết các ý tưởng đó rồi
Ít người học nó, nhưng ai đã học thì lại đi tạo ra ngôn ngữ mới
Nguồn
Đã có rất nhiều dự án chạy tốt bằng OCaml rồi,
giờ còn được bổ sung cả effect system nên thậm chí còn đi trước hơn
Độ phổ biến và năng lực là hai thứ khác nhau
Phổ biến ≠ ưu việt, âm nhạc cũng vậy
Nó chỉ được quyết định bởi xu hướng và quán tính
Ngôn ngữ càng được dùng nhiều thì càng có nhiều người ghét nó,
còn ngôn ngữ càng ít người biết thì càng dễ bị đánh giá quá cao
Lý do OCaml kém phổ biến hơn là vì tệp người dùng cảm nhận được hiệu quả đó nhỏ hơn
Và thái độ giáo điều của phe FP cũng góp phần không nhỏ
Tôi nghĩ Elixir là ngôn ngữ giống OCaml nhưng có tiềm năng phổ cập hơn
Nó có các ưu điểm của FP như immutability, pattern matching, mô hình Actor,
và chạy ổn định trên runtime BEAM
Nó không có static typing, nhưng đang đưa vào kiểm tra kiểu dần dần
Dù có thể dùng nguyên cả hệ sinh thái .NET, nó vẫn ít được biết đến hơn OCaml
Thực tế cũng có nhiều công ty dùng nó cho backend SaaS
Vì thế ngôn ngữ FP vẫn luôn ở ngoài dòng chính
OCaml giống Go ở chỗ là một system language dựa trên GC
Tôi thích GC hơn là quản lý bộ nhớ thủ công hay borrow checking
GC của D cũng rất tuyệt, nhưng vấn đề là chính từ “GC” đã khiến mọi người e ngại