- Versi Elixir 1.19 memungkinkan lebih banyak bug terdeteksi lebih cepat melalui penguatan sistem tipe dan peningkatan performa kompilasi
- Inferensi tipe kini diperluas hingga fungsi anonim dan protokol, sehingga validasi otomatis yang lebih luas dapat dilakukan tanpa anotasi tipe dari pengguna
- Pada proyek besar, versi ini menghadirkan kecepatan kompilasi hingga 4 kali lebih cepat, termasuk optimasi kompilasi paralel dan pemuatan kode
- Dukungan Erlang/OTP 28, adopsi sertifikasi OpenChain, dan penguatan transparansi rantai pasok dalam ekosistem juga ditambahkan
- Selain itu, rilis ini juga mencakup berbagai fitur seperti peningkatan parsing opsi, peningkatan kemampuan debug ExUnit, dan peningkatan aksesibilitas dokumentasi berbasis shell
Peningkatan utama di Elixir 1.19
Peningkatan sistem tipe
Inferensi tipe untuk semua komponen
- Type inference (inferensi tipe) adalah fitur untuk menentukan tipe ekspresi secara otomatis pada saat kompilasi
- Sebelumnya, inferensi tipe terutama ditujukan untuk pola, guard, dan nilai kembalian, tetapi pada rilis ini diperkenalkan inferensi tipe untuk semua komponen (kecuali guard)
- Karena tipe diinferensikan dengan merujuk juga ke dalam modul dan pemanggilan fungsi pustaka standar Elixir, fungsi yang sebelumnya diinferensikan sebagai
dynamic() -> boolean() kini dapat diinferensikan lebih jelas seperti integer() -> boolean()
- Inferensi tipe melibatkan berbagai trade-off seperti kecepatan kompilasi, daya ekspresif, kompilasi bertahap, dan kejelasan error, sehingga ke depannya akan ditambahkan inferensi tipe guard serta informasi tipe dependensi
- Jika fungsi memiliki signature tipe yang dinyatakan secara eksplisit, maka yang berlaku bukan inferensi tipe melainkan pemeriksaan tipe eksplisit, sehingga hanya tipe yang sesuai dengan anotasi pengguna yang diizinkan
Pemeriksaan tipe saat dispatch dan implementasi protokol
- Elixir kini menerapkan pemeriksaan tipe saat pemanggilan dan implementasi protokol
- Misalnya, jika tipe yang tidak mengimplementasikan protokol
String.Chars diberikan ke interpolasi string, maka akan muncul pesan peringatan
- Pada for comprehension, jika tipe yang tidak memenuhi protokol
Enumerable diberikan sebagai generator, peringatan juga akan muncul
- Pemeriksaan tipe ini memungkinkan lebih banyak bug dicegah pada saat kompilasi
Inferensi dan pemeriksaan tipe untuk fungsi anonim
- Elixir 1.19 mendukung inferensi tipe dan pemeriksaan tipe untuk fungsi anonim
- Sebagai contoh, jika tipe yang salah seperti
"hello" diberikan ke fungsi anonim yang mengharapkan tipe %{}, hal itu dapat langsung dideteksi sebagai peringatan saat kompilasi
- Inferensi tipe juga diterapkan pada function capture (
&String.to_integer/1 dan sebagainya), sehingga cakupan validasi tipe otomatis menjadi lebih luas
Referensi dan mitra
- Sistem tipe ini dikembangkan melalui kemitraan antara CNRS dan Remote
- Fresha, *Starfish* *, Dashbit, dan lainnya turut mendukung
Kecepatan kompilasi yang lebih cepat pada proyek besar
Perbaikan bottleneck pemuatan kode
- Sebelumnya, modul langsung dimuat begitu didefinisikan, tetapi pada rilis ini strategi tersebut diubah menjadi lazy loading (pemuatan tertunda)
- Dengan perubahan ini, beban pada code server berkurang dan performa kompilasi paralel meningkat, sehingga kecepatan kompilasi proyek besar menjadi lebih dari 2 kali lebih cepat
- Dua hal penting yang perlu diperhatikan
- Jika selama kompilasi membuat proses terpisah lalu mengakses modul dalam proyek yang sama, pemuatan bisa terlewat; untuk mengatasinya gunakan
Kernel.ParallelCompiler.pmap/2 atau Code.ensure_compiled!/1
- Di dalam callback
@on_load, pemanggilan modul dalam proyek yang sama dapat menimbulkan error; bila perlu gunakan opsi @compile {:autoload, true}
- Pada kedua kasus tersebut, sebelumnya dapat muncul error kompilasi yang non-deterministik, tetapi dengan perbaikan kali ini lingkungan kompilasi yang deterministik (dapat direproduksi) dapat dijamin
Kompilasi paralel dependensi
- Dengan memanfaatkan variabel lingkungan
MIX_OS_DEPS_COMPILE_PARTITION_COUNT, kini didukung kompilasi paralel dependensi
- Karena dependensi dikompilasi secara paralel menggunakan beberapa proses OS sekaligus, performa kompilasi dapat meningkat hingga 4 kali tergantung skala proyek dan jumlah core CPU
- Secara eksperimental, menetapkan nilai sekitar setengah dari total core efektif untuk pemanfaatan sumber daya
- Karena paralelisasi dapat meningkatkan penggunaan memori, perlu kehati-hatian saat menerapkannya di CI atau server build
Dukungan Erlang/OTP 28
- Elixir 1.19 secara resmi mendukung Erlang/OTP 28.1+
- Seiring perubahan representasi regular expression di Erlang/OTP 28, regular expression tidak lagi bisa digunakan sebagai nilai default struct
- Saat inisialisasi struct, regular expression tetap dapat digunakan
Adopsi sertifikasi OpenChain
- Rilis ini adalah versi pertama yang mulai mematuhi spesifikasi OpenChain
- Setiap rilis menyertakan SBoM (Source Bill of Materials) dalam format CycloneDX 1.6/SPDX 2.3
- Hal ini meningkatkan transparansi rantai pasok atas komponen rilis dan lisensi, serta membantu pengelolaan yang lebih ketat
- Pekerjaan ini dikerjakan oleh Jonatan Männchen dan didukung oleh Erlang Ecosystem Foundation
Peningkatan lainnya
- Berbagai peningkatan alat dan pustaka juga ditambahkan, termasuk parsing opsi, debug dan performa ExUnit, serta aksesibilitas dokumentasi berbasis shell
- Untuk catatan rilis yang lebih rinci, lihat CHANGELOG
1 komentar
Pendapat Hacker News
Ditekankan bahwa cara Elixir memperkenalkan fitur pemeriksaan tipe otomatis secara bertahap adalah contoh peningkatan bahasa yang sangat baik dan layak dijadikan acuan oleh bahasa pemrograman lain. Sudah banyak contoh bahasa yang ekosistemnya terbelah dua akibat perubahan besar, dan José sendiri sudah dengan jelas menyatakan sejak 2018 bahwa bahasanya pada dasarnya sudah selesai, sehingga terasa menenangkan. Dijelaskan juga bahwa bahasa dan core-nya tidak akan berubah secara merusak lagi, yang memberi rasa stabilitas besar. Merekomendasikan video presentasi terkait. Sangat terkesan dengan pengelolaan yang konsisten dan sangat baik.
Elixir terus menghadirkan fitur dan peningkatan yang hebat secara konsisten sambil berkembang dengan stabil. Struktur bahasanya luar biasa, dan para pembuatnya terus menjaga arah yang benar, yang benar-benar mengesankan. Justru yang disayangkan adalah tidak adanya kesempatan memakai Elixir dalam keseharian.
Membagikan data eksperimen terkait kecepatan kompilasi dependency Phoenix. Di Mac M1 Max, berdasarkan aplikasi kecil yang hanya berisi dependency Phoenix bawaan, waktu kompilasi berikut diukur menurut nilai environment variable
MIX_OS_DEPS_COMPILE_PARTITION_COUNT.Cache dibersihkan setiap kali di tengah pengujian dengan perintah
rm -rf _build._build.Dalam beberapa bulan terakhir benar-benar jadi sangat menyukai Gleam. Menyambut baik masuknya sistem tipe ke Elixir, tetapi dulu hal ini adalah salah satu faktor utama yang membuat Elixir sulit diadopsi. Ingin suatu saat mencoba Elixir lagi, tetapi khawatir jangan-jangan seperti TypeScript di JavaScript: secara tampilan bertipe, tetapi pada praktiknya banyak lib atau package yang akhirnya hanya menjadi dynamic/any. Bertanya apakah kekhawatiran ini tidak beralasan. Beam memang luar biasa.
Elixir terasa sebagai salah satu lingkungan pengembangan web yang paling menjanjikan. Setiap kali bertemu organisasi atau tim yang memakai Elixir di dunia kerja nyata, kualitas mereka tampak lebih tinggi daripada rata-rata. Dalam lingkungan yang membutuhkan pengembangan berkelanjutan, Elixir dinilai terus menghadirkan arah dan standar yang jelas.
Diperkenalkan bahwa rilis Elixir mulai mendukung format Source SBoM untuk CycloneDX 1.6 ke atas dan SPDX 2.3 ke atas. Sangat patut disyukuri bahwa pengelolaan SBOM dilakukan di tingkat bahasa. Sayangnya saat ini perusahaan tersebut tidak memakai Elixir.
Jika ingin berkontribusi ke proyek Elixir open source yang benar-benar dipakai, komponen utama bekas Mozilla Hubs masih terus dikembangkan sebagai proyek independen dengan Elixir. Lihat Hubs Foundation/reticulum.
Berdasarkan standard library Elixir, type inference pada compile time dimungkinkan sesuai konteks spesifik aplikasi, misalnya dari dynamic ke boolean, atau dari integer ke boolean.
Belum punya pengalaman mengembangkan dengan Elixir, tetapi tetap penggemar. Dulu menyukai kepraktisan dan keindahan Ruby, tetapi kemudian berpindah bahasa setelah tertarik pada sistem tipe. Elixir dan Ruby sama-sama memperkenalkan sistem tipe, tetapi sekarang lebih banyak memakai Kotlin yang secara sintaks terasa seperti "Ruby yang sudah diberi tipe".
Sedang memakai Soketi yang terhubung dengan pusher sdk untuk menangani broadcast event. Struktur aplikasi mencampur endpoint real-time dan endpoint rest, dan beban komputasi real-time tidak terlalu besar, tetapi jika perlu berencana menanganinya terpisah dengan Go. Fitur kolaborasi juga akan segera ditambahkan, dan sedang mempertimbangkan apakah masuk akal mengadopsi Phoenix dalam situasi seperti ini.