Crystal 1.22.0 chính thức phát hành: aarch64-linux lên Tier 1, DWARF nhanh hơn và nhiều thay đổi quan trọng

Công nghệ22 tháng 10, 2026·6 phút đọc

Crystal 1.22.0 vừa ra mắt với 251 thay đổi từ 33 nhà đóng góp, bao gồm việc aarch64-linux được nâng lên Tier 1, DWARF parser được viết lại giúp tăng tốc độ, hỗ trợ LLVM 23 & 24, và hàng loạt cải thiện về HTTP, event loop cùng Kernel TLS.

Crystal 1.22.0 chính thức phát hành: aarch64-linux lên Tier 1, DWARF nhanh hơn và nhiều thay đổi quan trọng

Crystal 1.22.0 chính thức phát hành: aarch64-linux lên Tier 1, DWARF nhanh hơn và nhiều thay đổi quan trọng

Crystal vừa phát hành phiên bản 1.22.0, đánh dấu bước tiến đáng kể về hiệu năng và khả năng hỗ trợ nền tảng. Bản cập nhật này gồm 251 thay đổi do 33 nhà đóng góp thực hiện, trong đó nổi bật là việc nâng aarch64-linux lên Tier 1 và viết lại hoàn toàn bộ phân tích DWARF.

Tác giả đóng góp cho CrystalTác giả đóng góp cho Crystal

Tổng quan về bản phát hành

Crystal 1.22.0 là phiên bản mới nhất của ngôn ngữ lập trình mang phong cách Ruby nhưng biên dịch ra mã máy native. Các gói dựng sẵn (pre-built package) đã có mặt trên GitHub Releases và các kênh phân phối chính thức; người dùng có thể xem hướng dẫn cài đặt tại crystal-lang.org/install.

Kể từ phiên bản 1.21.1, cộng đồng đã đóng góp 251 thay đổi từ 33 lập trình viên, cho thấy tốc độ phát triển đều đặn của dự án.

Thay đổi đáng chú ý nhất

Thoát khi lỗi pipe

Đây là thay đổi mang tính breaking change: tiến trình Crystal sẽ thoát ngay lập tức khi ghi vào STDOUT hoặc STDERR gặp lỗi EPIPE. Hành vi này mô phỏng sát với cơ chế mặc định của tín hiệu SIGPIPE trên hệ điều hành.

Trước đây, khi ghi thất bại, Crystal sẽ ném ra IO::Error, thường in thông báo lỗi rồi mới thoát. Thông báo lỗi này nay đã được loại bỏ. Nếu cần giữ hành vi cũ, lập trình viên có thể tắt bằng STDOUT.exit_on_broken_pipe = false.

Hằng số có khai báo kiểu

Từ 1.22, hằng số có thể được khai báo kèm kiểu dữ liệu, hoạt động đúng như kỳ vọng khi kết hợp hằng số với khai báo kiểu:

module Foo
  BAR : Int32 = 1
  BAZ : String = ""
  QUX : Int64 = 123 # tự động ép kiểu 123 sang Int64
end

aarch64-linux chính thức lên Tier 1

Hai target aarch64-linux-gnu và aarch64-linux-musl đã được nâng từ Tier 2 lên Tier 1. Yếu tố còn thiếu duy nhất trước đây là bản dựng chính thức, và vấn đề này đã được giải quyết từ phiên bản 1.19. Đây là tin vui cho các nhà phát triển triển khai ứng dụng trên máy chủ ARM — xu hướng ngày càng phổ biến nhờ các dịch vụ cloud dùng chip ARM tiết kiệm điện.

Loại bỏ Process.fork

Process.fork vốn đã bị đánh dấu lỗi thời từ trước phiên bản 1.0, và giờ đây chính thức bị xóa khỏi ngôn ngữ. Các dự án còn sử dụng API này cần chuyển sang giải pháp thay thế trước khi nâng cấp.

Cải thiện trình biên dịch và runtime

Viết lại DWARF parser

Bộ phân tích DWARF — định dạng dữ liệu gỡ lỗi quan trọng — đã được viết lại hoàn toàn nhằm tăng hiệu năng và giảm mức tiêu thụ bộ nhớ. Parser mới quét các section theo nhu cầu và xây dựng bảng chỉ mục hiệu quả một lần, giúp tra cứu nhanh vượt trội. Các dòng backtrace đã giải mã được lưu trong bộ nhớ đệm LRU, đồng thời bổ sung hỗ trợ các tính năng DWARF 5 như DW_FORM_addrx và DW_FORM_strx.

Event loop native trên mọi target

Tất cả các target giờ đây hỗ trợ và mặc định dùng event loop native dựa trực tiếp trên system selector. Cụ thể, epoll đã được bật trên Solaris, còn kqueue được bật trên toàn bộ các target BSD còn lại. Thư viện libevent vẫn tồn tại như phương án dự phòng nhưng phải bật thủ công và dự kiến sẽ bị loại bỏ trong phiên bản tới.

Hỗ trợ Kernel TLS và LLVM mới

Crystal 1.22 hỗ trợ Kernel TLS trong OpenSSL bindings theo mặc định, giúp tăng hiệu năng mã hóa TLS ở tầng nhân hệ điều hành. Bản phát hành cũng bổ sung hỗ trợ LLVM 23.1 và 24.0, cùng hai hằng số mới Crystal::ALL_FLAGS và Crystal::USER_FLAGS cho phép truy cập cờ biên dịch lúc runtime.

Crystal hỗ trợ đa nền tảngCrystal hỗ trợ đa nền tảng

Những cải thiện về HTTP

Module HTTP nhận được rất nhiều bản vá và tối ưu trong lần phát hành này:

  • #remote_address và #local_address được chuyển từ HTTP::Request sang HTTP::Context
  • Thêm HTTP::Headers#merge
  • Serialize IO::Memory trong HTTP body kèm header Content-Length
  • Từ chối các header Transfer-Encoding, Content-Encoding và trailer HTTP không hợp lệ
  • Sửa lỗi Content-Encoding: deflate
  • Đóng HTTP::Client khi gặp IO::Error trong quá trình gửi request

Đáng chú ý, giá trị trả về của HTTP::Request#body= và #content_length= đã thay đổi — đây là thay đổi breaking có thể ảnh hưởng tới code hiện hữu. Nhiều lỗ hổng tiềm ẩn trong việc xác thực header và WebSocket handler cũng được khắc phục, góp phần tăng độ an toàn cho ứng dụng web viết bằng Crystal.

Thay đổi khác và các API bị loại bỏ

Một số cải thiện tiện ích khác gồm:

  • File.exists? và File::Info.readable?, .writable?, .executable? nhận tham số follow_symlinks: false
  • Thêm Char::Reader.new(Bytes)
  • Thêm Time::Span#to_nanoseconds
  • Thêm GC.syscall(&)
  • Sửa lỗi backtrace khi liên kết với -static-pie trên musl-libc
  • Macro mới giúp xử lý văn bản lúc biên dịch: StringLiteral#bytesize, NumberLiteral#chr, và RangeLiteral#each hỗ trợ CharLiteral

Các API bị đánh dấu lỗi thời trong bản này gồm biến instance và biến class viết hoa, HTTP::Request#local_address/#remote_address, cùng LLVM::Type#size và #alignment.

Đây là bản phát hành đầu tiên có bản dựng cho target aarch64-windows-msvc, mở rộng thêm khả năng chạy Crystal trên nền tảng Windows ARM.

Chính sách tương thích và lời cảm ơn

Crystal đã thiết lập chính sách tương thích tiến (forward compatibility) theo RFC 30: để xây dựng Crystal 1.22, cần trình biên dịch stage-0 phiên bản 1.14 trở lên.

Nhóm phát triển gửi lời cảm ơn tới 84codes cùng các nhà tài trợ đã hỗ trợ dự án. Để duy trì và tăng tốc độ phát triển, các khoản quyên góp và bảo trợ vẫn rất cần thiết, có thể thực hiện qua OpenCollective hoặc liên hệ trực tiếp với đội ngũ để trở thành nhà tài trợ.

Với người dùng Việt Nam đang phát triển ứng dụng hiệu năng cao trên máy chủ ARM hoặc cần công cụ gỡ lỗi mạnh mẽ hơn, Crystal 1.22.0 là bản nâng cấp đáng cân nhắc — chỉ cần lưu ý các thay đổi breaking liên quan tới Process.fork, xử lý lỗi pipe và giá trị trả về của một số API HTTP.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗