- Kiểu theo lý thuyết tập hợp tiệm tiến suy luận kiểu từ pattern và đưa ra cảnh báo tại thời điểm biên dịch, bổ sung khả năng tìm lỗi và khiếm khuyết trong codebase mà không cần thay đổi phần mềm hiện có
- Các cảnh báo kiểu mới hiện tập trung vào atom và map/struct, phát hiện pattern matching với khóa không tồn tại và truy cập field, gọi hàm không phải module, gọi hàm ẩn danh sai, so sánh cấu trúc giữa các struct, so sánh các kiểu không giao nhau, pattern binary không hợp lệ, rescue exception chưa được định nghĩa, v.v.
- Type checker hiện chỉ suy luận kiểu từ các pattern trong cùng một hàm; phân tích guard và qua ranh giới hàm dự kiến sẽ được bổ sung trong các bản phát hành sau
- Đã thêm hỗ trợ Erlang/OTP 27 và ngừng hỗ trợ Erlang/OTP 24; khuyến nghị di chuyển lên Erlang/OTP 26 trở lên, bao gồm cả trên Windows
- Hỗ trợ WERL, giao diện đồ họa terminal Erlang cho Windows, dự kiến sẽ bị gỡ bỏ trong Elixir v1.18
- Thêm kiểu dữ liệu
Durationmới vàDate.shift/2, cho phép dịch chuyển ngày, giờ và date time theo duration; trongDateTime, xử lý cả thay đổi múi giờ và Daylight Saving Time - Thêm
Kernel.to_timeout/1, giúp chuẩn hóa duration và integer thành giá trị timeout dùng trong nhiều API nhưProcess,GenServer, v.v. - Tính năng process label của Erlang/OTP 27 có thể được dùng trong Elixir qua
Process.set_label/1; Logger định dạng báo cáogen_statemvà đưa process label của Erlang/OTP 27 vào các sự kiện logger - Thêm
Keyword.intersect/2,3, profiler Mix mớimix profile.tprof, và guardKernel.is_non_struct_map/1để giảm bẫy trong đó%{}cũng match với struct - Cùng với việc thêm
mix profile.tprof,mix profile.cprofvàmix profile.eprofđược đưa vào diện soft-deprecation
1 bình luận
Ý kiến trên Hacker News
Trong vài năm gần đây, hệ sinh thái Elixir thực sự đang trở thành giải pháp đơn giản nhất cho rất nhiều mục đích
Với Phoenix và LiveView, phát triển web vừa nhanh vừa thú vị; với NX/Axon/Bumblebee thì làm trí tuệ nhân tạo; với Membrane thì streaming và xử lý âm thanh/video; với Commanded thì CQRS và event sourcing; với Nerves thì chế tạo thiết bị nhúng; và với LiveView Native đang được phát triển thì thậm chí có thể làm cả ứng dụng di động
Hàng đợi, pipeline và xử lý theo lô cũng có thể được xử lý phù hợp với từng nhu cầu bằng tính năng có sẵn hoặc GenStage, Broadway, Oban
Dù vậy, cá nhân tôi thấy tính năng cốt lõi là IEx, REPL của Elixir. Việc có thể tương tác trực tiếp với code đang phát triển hoặc đang chạy production, nhìn vào bên trong và debug thật sự có thể thay đổi cuộc sống
Việc bổ sung kiểu dữ liệu vào đây là mảnh ghép cuối cùng giúp chúng ta tự tin hơn nhiều vào code mình triển khai
Ecto cho phép làm việc với cơ sở dữ liệu SQL theo phong cách hàm; tôi vẫn chưa biết nên nhìn nhận ORM thế nào, nhưng nếu chỉ với vài truy vấn có thể kết hợp mà loại bỏ được 90% SQL thì tôi xem đó là thành công
Sau vài tháng vật lộn với triển khai, uptime, lỗi segmentation fault, thời gian xử lý package và những thứ tương tự, chúng tôi đã chuyển web server và tầng dữ liệu sang Elixir + Phoenix; giờ mọi thứ được test tốt hơn nhiều, dễ suy luận hơn, có khả năng mở rộng đáng tin cậy và triển khai cũng dễ hơn
Nhờ quy ước thay vì cấu hình, có thể bắt đầu với Phoenix nhanh đến phi lý, còn nhanh hơn FastAPI rất nhiều. Tôi nghĩ lẽ ra mình nên làm việc này từ vài tháng trước
Hiện giờ tôi đang huấn luyện model bằng Nx, thử nghịch Bumblebee/Livebook, và gần như miễn phí mà gắn được các tính năng presence và live vào ứng dụng
Tất cả đều dùng nguyên các khái niệm, hiệu năng và sự tiện lợi khi phát triển của LiveView
Có lẽ sẽ khó quay lại những nơi như Erlang hay Elixir
Mỗi lần viết code bằng ngôn ngữ khác, đặc biệt là mỗi khi viết code để kiếm tiền, tôi đều rất nhớ nó
Một REPL tốt giúp giảm đáng kể ma sát thường gặp trong lập trình. Thay vì chạy toàn bộ ứng dụng để chọc thử đoạn code có vấn đề, ta có thể xây dựng ý tưởng từng chút một và kiểm thử ngay tại chỗ
Thư viện chuẩn của Elixir cũng rất tuyệt, việc truy cập tài liệu từ REPL cực kỳ dễ, nên giúp giữ được dòng suy nghĩ. Khi code bằng Elixir, tôi hiếm khi mở trình duyệt để tìm những câu hỏi nhỏ, vì thường có thể tìm được câu trả lời mà không cần rời REPL
Vì thế nó cũng khuyến khích tôi viết docstring tốt cho code của mình
Điểm hay hơn nữa là có thể chạy REPL cùng với code đang chạy. Ngay cả khi phải chạy ứng dụng, cứ để nó chạy như vậy, rồi trong môi trường phát triển có thể thao tác với dữ liệu live và quan sát trạng thái bên trong. Đây là việc bất khả thi ở các stack khác, hoặc phải cần đến debugger
Giờ khi các tính năng liên quan đến type được đưa vào, tôi kỳ vọng công cụ sẽ còn tốt hơn nữa
Thêm vào đó là sự thú vị và sức mạnh của paradigm lập trình hàm, cũng có những cách vững chắc để xử lý tính biến đổi và trạng thái, mà lại không phải chịu cú pháp LISP. Cá nhân tôi rất thích vì đây là ngôn ngữ chạm đúng mọi nốt nhạc với mình
IEx làm được điều gì mà IRB không có không?
Trong vài năm qua, đội ngũ Elixir và Erlang đã làm rất tốt, và cũng không thể bỏ qua công sức của các tác giả thư viện và sách
Chưa bao giờ tôi mong chờ một bản phát hành như thế này. Tôi đã theo dõi các commit của Elixir và OTP một thời gian, và có cảm giác Elixir/Erlang rõ ràng đang có đà phát triển
Tôi đang dùng Elixir cho backend của side project, còn frontend là Remix; làm backend rất dễ chịu và năng suất
Tôi công nhận năng suất của LiveView, nhưng trong trường hợp của tôi phải xử lý kết nối mạng không ổn định nên trải nghiệm LiveView đúng như dự đoán là không tốt
Mong rằng trong đầu các lập trình viên, Elixir sẽ được tách khỏi LiveView ở một mức nào đó. Ngay cả khi chỉ dùng làm backend API đơn giản, không có LiveView hay kênh thời gian thực, Elixir vẫn thật sự rất thú vị
Nhưng LiveView thì tôi không làm tốt được. Nó khá khó hiểu và có nhiều cạm bẫy dưới chân. Ví dụ có trường hợp phải nhớ xử lý kiểm tra xác thực ở cả
pipe_throughcủa router lẫn callbackon_mountcủa LiveView. Xem [0]Chỉ riêng việc câu trên hoàn toàn vô nghĩa với một lập trình viên mới tiếp cận Phoenix và LiveView cũng đã đủ là bằng chứng rằng LiveView không nên là cách mặc định
Nó tạo ra một đường cong học tập rất dốc ở những nơi không cần thiết. Bản thân Elixir/Phoenix thì dễ
Nếu là lập trình viên mới học Elixir/Phoenix, tôi cho rằng trình tự đúng là trước hết dùng Phoenix dead views theo kiểu MVC, rồi đọc “Elixir in Action” để học các nền tảng OTP. Cuốn sách này dễ đọc, mở mang tầm mắt và đã thay đổi gần như toàn bộ cách tôi lập trình
Và chỉ sau đó mới nên chuyển sang LiveView
[0]: https://hexdocs.pm/phoenix_live_view/security-model.html#liv...
mix phx.newvới cờ—no-livethì có thể dùng Phoenix không có LiveView. Trong các dự án hiện có cũng có thể gỡ ra thủ côngVấn đề không phải là kiến thức kỹ thuật hay mặc định khi cài đặt, mà là nhận thức của lập trình viên. Quá nhiều người nghĩ đến LiveView trước khi nghĩ đến Elixir và phần còn lại của hệ sinh thái, rồi bỏ qua các phần khác của hệ sinh thái
Elixir rộng hơn thế rất nhiều, và ngay cả Phoenix cũng lớn hơn LiveView
Hoàn toàn có thể xây dựng ứng dụng Elixir năng suất và hiệu quả về chi phí mà không cần LiveView, thậm chí không cần Phoenix. Việc chọn Elixir cho backend nên phổ biến hơn hiện nay, nhưng tôi cũng hiểu những định kiến và nỗi sợ khiến người ta chọn phương án khác
Tôi đang xây startup của mình theo hướng full-stack 100% Elixir, và đây là công nghệ tuyệt vời nhất tôi từng dùng cho đến nay
Tôi liên tục truyền giáo cho những người bạn kỹ thuật nghiêm túc rằng nó tốt đến mức nào
Giờ chỉ mong RabbitMQ và client của nó chạy được trên OTP 27. Tôi muốn nâng cấp
Chúng tôi đã dùng cơ chế đăng nhập client bằng chứng chỉ SSL trong vài năm và rất hài lòng với độ ổn định
Nói tốt về Elixir và Phoenix bao nhiêu cũng không đủ. Khi có thêm kiểu nữa thì sẽ còn tốt hơn
Bạn sẽ nghe nhiều về BEAM và sức mạnh của nó, nhưng theo kinh nghiệm, bạn có thể đi được rất xa trước khi phải nghĩ đến phần đó của stack. Phoenix trừu tượng hóa phần đó rất tốt, nên bạn nhận được lợi ích mà không cần nỗ lực
Ví dụ có Oban. Bạn gần như miễn phí có được các tác vụ nền mạnh mẽ, linh hoạt và dễ dùng bằng code Elixir bên trong Postgres. Thật sự tuyệt vời
Khuyên bạn nên thử
Vì LiveView và sự ám ảnh marketing xung quanh nó, những người vốn có thể chưa cần biết OTP lâu hơn lại phải đối mặt với OTP từ rất sớm trong hành trình, có khi ngay từ route controller đầu tiên
Việc viết và kiểm thử tốt một luồng LiveView chắc chắn phức tạp về mặt trí tuệ không kém việc viết một GenServer có trạng thái với nhiều luồng phi tuyến tính và nhiều điểm vào call/cast khác nhau
LiveView dùng thuật ngữ khác và có một số lớp tiện ích nhỏ như async assigns, nhưng về mặt cơ chế thì đúng nghĩa là GenServer. Tôi nghĩ để dùng hiệu quả thì điều quan trọng là phải hiểu rõ điểm này
Tôi thật sự thích Oban, và rất nhớ nó trong các hệ sinh thái khác
Nhân tiện, có ai đã dùng elixir-desktop [1] chưa? Nó là gói wxWidgets + LiveView nên khá giống ứng dụng Electron
Ở [2], Wojtek Mach giải thích cách nhóm Elixir tạo Livebook Desktop. Nội dung nói về dự án bắt đầu như thế nào, các lỗi tinh vi phát hiện khi làm ứng dụng cho macOS, giới hạn của wxWidgets trên Windows và nhiều chi tiết triển khai
Sẽ thật tốt nếu nhóm Elixir chính thức phát hành thứ gì đó như elixir-desktop dựa trên Livebook. Tức là fork kho Livebook và cung cấp một dự án template chính thức để tạo ứng dụng desktop dựa trên LiveView
Hiện Livebook được phân phối dưới dạng file thực thi cho Windows và Mac. Nếu làm theo cùng cách để lập trình viên có thể phân phối file thực thi độc lập như Electron thì sao?
Tôi cũng biết LiveView Native [3], nhưng nghĩ rằng hướng đi đó khác
[1] https://github.com/elixir-desktop/desktop-example-app
[2] https://www.youtube.com/watch?v=Kiw6eWKcQbg
[3] https://native.live/
Tôi mong đến ngày cái cớ không có kiểu từng cản trở Elixir phổ biến sẽ biến mất
Trong suốt 10 năm qua tôi đã đọc những câu chuyện Elixir rất hay ở đây, và cũng thích ngôn ngữ này
Nhưng tôi đã từ bỏ việc tìm việc Elixir từ vài năm trước. Vì lương dường như luôn thấp hơn các ngôn ngữ chủ đạo
Có thể đó là ngôn ngữ tôi muốn dùng nhất, nhưng với tôi lương và một sản phẩm tuyệt vời quan trọng hơn tech stack, nên có lẽ thực tế tôi sẽ không làm được. Dù vậy, theo dõi từ xa vẫn rất thú vị
Không biết bạn đang tìm ở Mỹ hay khu vực khác?
Tính năng hay trong bản phát hành này là việc bổ sung
get_in/1hoạt động cùng struct. Ví dụ có thể viết nhưget_in(struct.foo.bar)Nếu
footrả vềnilthì khi truy cậpbarsẽ không phát sinh ngoại lệVới các tầng không phải map thông thường thì cần
Access.keynhư sauget_in(struct, [Access.key(:foo), :bar])Đây là mảnh ghép cuối cùng mà tôi mong muốn. Tôi cũng kỳ vọng các bước tiếp theo
Ngoài ra, theo tiêu chí của tôi thì ngôn ngữ này về mặt chức năng đã hoàn thiện 100%
Bây giờ vẫn vậy không, hay không còn cần phải xuống đến Erlang nữa?