Crystal 1.22.0 dirilis 12 Oktober 2026 dengan 251 perubahan sejak 1.21.1 yang dikerjakan 33 kontributor. Perubahan paling berdampak: aarch64-linux naik dari Tier 2 ke Tier 1, Process.fork dihapus, dan parsing DWARF ditulis ulang untuk mempercepat backtrace. Dukungan compiler juga naik ke LLVM 23.1 dan 24.0, dan ini jadi rilis pertama yang menyediakan build untuk aarch64-windows-msvc. Bagi tim yang memakai Crystal di ARM64, perubahan status target itu yang paling terasa karena build resmi sekarang tersedia tanpa harus menyusun sendiri.
TL;DR
- Crystal 1.22.0 rilis 12 Oktober 2026 dengan 251 perubahan dari 33 kontributor.
- aarch64-linux-gnu dan aarch64-linux-musl naik dari Tier 2 ke Tier 1, artinya build resmi tersedia.
- Dua perubahan memecah kompatibilitas: Process.fork dihapus dan proses kini keluar saat pipe putus.
- Parsing DWARF ditulis ulang, dukungan LLVM naik ke 23.1 dan 24.0, dan event loop native dipakai di semua target.
Apa perubahan paling berdampak di Crystal 1.22?
Ada tiga yang paling terasa: status aarch64-linux sebagai Tier 1, penghapusan Process.fork, dan perubahan perilaku saat menulis ke STDOUT atau STDERR yang gagal karena EPIPE. Dua yang terakhir masuk kategori breaking, jadi kode lama perlu diperiksa sebelum upgrade.
Untuk aarch64-linux, target aarch64-linux-gnu dan aarch64-linux-musl naik dari Tier 2 ke Tier 1. Satu-satunya yang kurang sebelumnya adalah build resmi, dan itu sudah tersedia sejak 1.19. Konsekuensinya, pengguna di ARM64 sekarang mendapat jalur dukungan yang setara dengan x86_64, termasuk paket siap pakai dari saluran distribusi resmi.
Perubahan EPIPE mengubah cara program bereaksi. Proses Crystal sekarang keluar segera saat menulis ke STDOUT atau STDERR gagal dengan EPIPE, meniru perilaku default sinyal SIGPIPE. Sebelumnya kegagalan tulis memunculkan IO::Error yang biasanya mencetak pesan error lalu keluar. Pesan error itu kini dihilangkan. Kalau perilaku lama dibutuhkan, ada opsi STDOUT.exit_on_broken_pipe = false untuk mematikannya.
| Perubahan | Jenis | Dampak praktis |
|---|---|---|
| aarch64-linux jadi Tier 1 | Peningkatan dukungan | Build resmi dan paket distribusi untuk ARM64 Linux |
| Process.fork dihapus | Breaking | Kode yang memakai fork harus diganti ke API proses lain |
| Keluar saat EPIPE | Breaking | Pesan error hilang, bisa dimatikan lewat STDOUT.exit_on_broken_pipe |
| Konstanta dengan tipe | Fitur baru | Deklarasi seperti BAR : Int32 = 1 kini valid |
| DWARF ditulis ulang | Performa | Backtrace lebih cepat dan pemakaian memori lebih kecil |
| LLVM 23.1 dan 24.0 | Dependensi | Dukungan toolchain yang lebih baru |
Apakah upgrade ke 1.22 memecah kode yang sudah ada?
Ya, ada dua titik pecah yang eksplisit. Process.fork sudah deprecated sejak sebelum versi 1.0 dan sekarang benar-benar dihapus, jadi kode yang masih memanggilnya tidak akan dikompilasi. Perilaku EPIPE juga berubah, meski ini lebih sering terasa di pipeline shell daripada di logika aplikasi.
Ada satu syarat build yang perlu diperhatikan. Crystal 1.22 menetapkan kebijakan kompatibilitas maju lewat RFC 30: membangun Crystal 1.22 membutuhkan compiler stage-0 versi 1.14 atau lebih baru. Artinya proses bootstrap di lingkungan build harus memakai versi yang cukup baru, bukan compiler lama yang masih tersimpan di image.
Selain itu ada beberapa deprecation yang belum memutus kompatibilitas tetapi sebaiknya dibersihkan: variabel instance dan class dengan huruf besar, HTTP::Request#local_address dan #remote_address, serta LLVM::Type#size dan #alignment. Deprecation biasanya jadi penghapusan di rilis berikutnya, jadi menundanya hanya memindahkan pekerjaan.
Untuk pustaka HTTP, 1.22 membawa cukup banyak perubahan. HTTP::Headers#merge ditambahkan, IO::Memory diserialisasi dalam body HTTP dengan header Content-Length, dan sejumlah validasi diperketat: Transfer-Encoding yang tidak dikenali ditolak, Content-Encoding tidak valid ditolak, trailer HTTP tidak valid ditolak, dan nama header divalidasi. Nilai balik HTTP::Request#body= dan #content_length= juga berubah, dan itu masuk kategori breaking.
Kenapa parsing DWARF ditulis ulang?
Karena parsing DWARF adalah bagian yang lambat dan boros memori saat compiler menghasilkan backtrace. Versi baru memindai section sesuai kebutuhan, membangun tabel indeks sekali, dan menyimpan baris backtrace yang sudah didekode di cache LRU.
Perubahan ini juga menambah dukungan fitur DWARF 5, yaitu DW_FORM_addrx dan DW_FORM_strx. Efek praktisnya terasa saat debugging program besar, ketika simbol dan informasi baris harus dibaca berulang kali. Pemindaian sesuai kebutuhan berarti compiler tidak lagi memuat seluruh section yang tidak dipakai.
Event loop ikut berubah. Semua target sekarang memakai event loop native yang dibangun langsung di atas system selector dan mengaktifkannya secara default. epoll diaktifkan di Solaris dan kqueue di seluruh target BSD yang tersisa. libevent masih tersedia sebagai cadangan, tetapi sekarang sepenuhnya opt-in dan disebut akan deprecated pada rilis berikutnya. Dukungan Kernel TLS di binding OpenSSL juga diaktifkan secara default.
Beberapa penambahan kecil tapi berguna: File.exists? serta File::Info.readable?, writable?, dan executable? menerima argumen follow_symlinks: false. Char::Reader.new(Bytes) ditambahkan, Time::Span#to_nanoseconds tersedia, dan GC.syscall(&) memungkinkan pemanggilan syscall tanpa alokasi. Untuk makro, ada StringLiteral#bytesize, NumberLiteral#chr, dan RangeLiteral#each yang mendukung CharLiteral.
Kapan sebaiknya upgrade ke Crystal 1.22?
Segera kalau proyek berjalan di ARM64 Linux, karena build resmi menghilangkan kebutuhan menyusun compiler sendiri. Untuk proyek yang masih memakai Process.fork atau mengandalkan pesan error saat pipe putus, jadwalkan upgrade setelah kode disesuaikan.
Langkah pemeriksaannya sederhana: cari pemakaian Process.fork di seluruh repositori, cek apakah ada skrip yang bergantung pada pesan IO::Error ketika output dipipe, dan pastikan compiler stage-0 di CI minimal versi 1.14. Setelah tiga hal itu beres, upgrade biasanya berjalan tanpa kejutan.
Catatan rilis lengkap dengan tautan ke setiap pull request ada di pengumuman Crystal 1.22. Daftar perubahan mentahnya tersedia di changelog dan halaman rilis GitHub, sementara instruksi pemasangan per platform ada di halaman install. Kalau proyek memakai LLVM secara langsung, cek juga catatan rilis LLVM untuk memastikan versi 23 atau 24 sudah didukung toolchain yang dipakai.
Yang perlu diuji sebelum naik versi
Setelah tiga prasyarat beres, pengujian yang paling berguna adalah menjalankan test suite di dua lingkungan: x86_64 dan aarch64. Perubahan status target membuat aarch64-linux layak dijadikan lingkungan uji utama, bukan lagi sekadar target tambahan. Kalau proyek mengirim binary untuk kedua arsitektur, jalankan test di keduanya sebelum merilis.
Perhatikan juga skrip yang memakai pipeline shell. Perubahan EPIPE membuat proses keluar lebih cepat tanpa pesan error, sehingga skrip yang selama ini mengandalkan pesan error untuk mendeteksi kegagalan bisa berubah perilakunya. Cara paling aman adalah memeriksa exit code secara eksplisit, bukan mencocokkan teks di stderr.
- Jalankan test suite di x86_64 dan aarch64, bukan hanya di mesin pengembang.
- Cari pemakaian Process.fork di seluruh repositori dan dependensi internal.
- Periksa skrip shell yang membaca pesan error dari program Crystal.
- Pastikan compiler stage-0 di CI minimal versi 1.14.
Untuk pustaka HTTP, pengujian sebaiknya mencakup penanganan header yang tidak valid. Validasi yang diperketat bisa mengubah respons terhadap input yang sebelumnya diterima, dan itu terlihat sebagai kegagalan test yang tidak berkaitan dengan perubahan kode aplikasi. Menambahkan kasus uji untuk Transfer-Encoding, Content-Encoding, dan trailer yang tidak valid membantu memastikan perilaku barunya sesuai harapan.
Kalau proyek memakai binding OpenSSL, aktifnya Kernel TLS secara default juga layak diuji di lingkungan produksi tiruan. Kernel TLS memindahkan sebagian pekerjaan enkripsi ke kernel, dan perilakunya bergantung pada dukungan sistem operasi serta versi OpenSSL yang dipakai. Di lingkungan container dengan kernel lama, hasilnya bisa berbeda dari mesin pengembang.
Untuk referensi, pengumuman rilis memuat ringkasan setiap perubahan dengan tautan ke pull request terkait. Changelog lengkap dan halaman rilis di GitHub berguna saat menelusuri commit tertentu, sementara instruksi pemasangan per platform ada di halaman install. Kalau proyek memakai LLVM secara langsung, catatan rilis LLVM membantu memastikan versi 23 atau 24 sudah didukung toolchain yang dipakai, termasuk untuk target Windows ARM64 yang baru mendapat build di rilis ini.
Untuk proyek yang memakai banyak shard, perubahan pada compiler juga memengaruhi waktu build. Parsing DWARF yang lebih cepat paling terasa pada build dengan informasi debug penuh, sedangkan build rilis tanpa simbol tidak mendapat manfaat sebesar itu. Kalau pipeline memisahkan build debug dan rilis, ukur keduanya secara terpisah agar peningkatan performa tidak disimpulkan dari satu jenis build saja.
Dari sisi ekosistem, dukungan LLVM 23.1 dan 24.0 membuat Crystal 1.22 bisa dibangun dengan toolchain yang lebih baru, tetapi juga berarti lingkungan build lama perlu diperiksa. Distribusi yang masih menyediakan LLVM versi lama sebagai default mungkin butuh penyesuaian sebelum bisa membangun rilis ini. Untuk pengguna yang memasang dari paket distribusi resmi, langkah itu biasanya sudah ditangani maintainer, sehingga yang perlu diperhatikan hanya versi paket yang tersedia di saluran yang dipakai.
Untuk pustaka yang bergantung pada perilaku internal compiler, seperti ekstensi makro, perubahan pada makro bawaan perlu diperiksa. Rilis ini menambah StringLiteral#bytesize, NumberLiteral#chr, dan RangeLiteral#each untuk CharLiteral. Penambahan itu tidak memecah kode lama, tetapi makro yang menangani tipe literal secara manual bisa disederhanakan setelah upgrade, dan pengurangan kode makro manual itu biasanya ikut mempercepat waktu kompilasi proyek.
FAQ
Apakah Crystal 1.22 mendukung ARM64 Linux secara resmi?
Ya. Target aarch64-linux-gnu dan aarch64-linux-musl naik dari Tier 2 ke Tier 1 pada rilis ini, dan build resminya sudah tersedia sejak Crystal 1.19. Artinya paket siap pakai tersedia untuk kedua target tersebut.
Apakah Process.fork masih bisa dipakai?
Tidak. Process.fork sudah deprecated sejak sebelum versi 1.0 dan dihapus di Crystal 1.22. Kode yang masih memakainya perlu diganti sebelum bisa dikompilasi dengan versi ini.
Berapa perubahan yang masuk di rilis ini?
251 perubahan sejak 1.21.1, dikerjakan oleh 33 kontributor. Angka itu mencakup perbaikan bug, fitur bahasa, perubahan compiler, dan pembaruan dependensi.
Apakah libevent masih dipakai?
Tidak secara default. Semua target kini memakai event loop native berbasis system selector. libevent masih tersedia sebagai cadangan yang harus diaktifkan sendiri, dan diperkirakan akan deprecated pada rilis berikutnya.
Compiler versi berapa yang dibutuhkan untuk build?
Minimal stage-0 compiler versi 1.14, sesuai kebijakan kompatibilitas maju di RFC 30. Compiler lama di lingkungan build perlu diperbarui sebelum mencoba membangun Crystal 1.22.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬