Apa itu Elixir?

BEAM, warisan Erlang, dan fault tolerance sebagai fitur bahasa.

Daftar isi

Elixir adalah bahasa pemrograman fungsional yang dikompilasi menjadi bytecode Erlang dan dieksekusi di atas mesin virtual BEAM. Topik ini menjelaskan posisi Elixir dalam tumpukan teknologi tersebut, warisan platform Erlang yang dibawanya, serta alasan fault tolerance, yakni ketahanan terhadap kegagalan, menjadi fitur bahasa dan bukan sekadar pustaka tambahan. Pemahaman ini menjadi dasar sebelum lingkungan kerja disiapkan dan program pertama ditulis.

Bahasa di atas BEAM#

Elixir tidak membawa mesin virtual miliknya sendiri. Kode sumber yang berakhiran .ex atau .exs dikompilasi menjadi bytecode Erlang, yaitu format instruksi yang sama dengan hasil kompilasi bahasa Erlang. Mesin virtual BEAM kemudian mengeksekusi bytecode tersebut. Berkat susunan ini, seluruh kemampuan BEAM, mulai dari penjadwalan, distribusi antarmesin, hingga pengelolaan memori, tersedia bagi program Elixir tanpa lapisan tambahan.

Keputusan paling menentukan pada BEAM adalah model eksekusinya. BEAM menjalankan process, yakni unit eksekusi ringan milik mesin virtual yang berbeda dari proses sistem operasi. Setiap process memiliki memori sendiri, tidak berbagi keadaan dengan process lain, dan dipantau oleh pengumpul sampah tersendiri, sehingga pemulihan memorinya tidak menghentikan process lain. Karena biaya pembuatannya jauh lebih kecil daripada biaya pembuatan proses sistem operasi, ratusan ribu process dapat hidup pada satu mesin virtual.

Sifat tumpukan ini dapat diperiksa langsung dari skrip Elixir. Skrip berikut menampilkan versi Elixir dan rilis OTP di bawahnya.

elixir
# menampilkan versi Elixir dan rilis OTP di bawahnya
IO.puts("Elixir #{System.version()}")
IO.puts("Erlang/OTP #{:erlang.system_info(:otp_release)}")
text Keluaran
Elixir 1.20.5
Erlang/OTP 29

Fungsi System.version/0 mengembalikan versi Elixir, sedangkan :erlang.system_info(:otp_release) memanggil modul Erlang secara langsung. Modul dengan tanda titik dua di depan namanya adalah modul Erlang, dan pemanggilannya bekerja tanpa pengaturan apa pun karena kedua bahasa menghasilkan bytecode yang sama. Susunan lengkapnya digambarkan pada diagram berikut.

Kode sumber Elixir (.ex, .exs)dikompilasiBytecode Erlang (.beam)dieksekusi olehBEAM VMdilengkapi OTP dan penjadwal process ringan
Posisi Elixir di atas BEAM

Warisan Erlang dan OTP#

BEAM bukan mesin virtual yang dirancang untuk Elixir. Mesin ini lahir dari keluarga mesin abstrak Erlang yang dikembangkan di laboratorium riset Ericsson sejak pertengahan dekade 1980-an untuk saklar telepon yang diharuskan berjalan tanpa henti bertahun-tahun. Erlang dirilis sebagai perangkat lunak open source pada tahun 1998, dan sejak itu penggunaannya meluas melampaui ranah telekomunikasi. Elixir sendiri dirancang oleh José Valim, dirilis pertama kali pada tahun 2012, dan mencapai versi 1.0 pada tahun 2014.

Di atas mesin virtual, ekosistem Erlang menyediakan OTP, singkatan dari Open Telecom Platform. OTP adalah himpunan pustaka dan pola rancangan untuk membangun sistem terdistribusi yang tahan kegagalan, misalnya GenServer untuk process berkondisi dan Supervisor untuk pemulihan process yang berhenti. Pustaka standar Elixir dibangun di atas OTP, sehingga program Elixir menggunakan OTP secara langsung tanpa perantara.

Dukungan antarbahasa tersebut dapat dibuktikan dengan satu skrip pendek. Baris pertama memanggil fungsi :math.sqrt/1 milik Erlang, sedangkan baris kedua menggabungkan fungsi Erlang :crypto.hash/2 dengan fungsi Elixir Base.encode16/1 dalam satu baris.

elixir
# memanggil modul Erlang langsung dari Elixir
IO.puts(:math.sqrt(144))
IO.puts(Base.encode16(:crypto.hash(:sha256, "elixir")))
text Keluaran
12.0
60C6ABBFD0F146F9CD5173E79EF56E69787F6B7CB00A83F4E049FFA7B625B12F

Base.encode16/1 mengubah hasil hash menjadi teks heksadesimal agar mudah dibaca. Contoh di atas menunjukkan bahwa data hasil fungsi Erlang dapat diteruskan ke fungsi Elixir tanpa konversi.

Fault tolerance sebagai fitur bahasa#

Isolasi antarprocess menjadikan ketahanan terhadap kegagalan sebagai sifat yang dibawa bahasa, bukan fitur yang ditambahkan kemudian. Apabila sebuah process mengalami error, process tersebut berhenti tanpa merusak process lain karena tidak ada memori bersama yang ikut rusak. Process lain dapat mengamati keberhentian itu dan menentukan tindak lanjutnya, misalnya memulai ulang process yang gagal.

Peran pemulihannya dipegang oleh supervisor, yaitu process yang bertugas memantau process lain dan memulai ulang bagian yang gagal ke kondisi yang diketahui baik. Supervisor dapat disusun bertingkat sehingga membentuk pohon pemantauan yang mengikuti struktur aplikasinya. Pendekatan ini dikenal dengan filosofi let it crash, yaitu membiarkan bagian yang gagal berhenti dan menyerahkan pemulihannya kepada supervisor, alih-alih menangkap setiap error di dalam kode aplikasi.

Membuat process adalah operasi satu baris. Fungsi spawn/1 menjalankan sebuah fungsi anonim pada process baru, dan fungsi is_pid/1 memeriksa bahwa nilai yang dikembalikan memang sebuah process.

elixir
pid = spawn(fn -> :ok end)
IO.puts("process baru berhasil dibuat: #{is_pid(pid)}")
text Keluaran
process baru berhasil dibuat: true

Process pada contoh ini segera selesai setelah fungsi anonimnya tuntas. Pada program nyata, process dibuat untuk pekerjaan yang berlangsung lama dan saling bertukar pesan. Server web Phoenix memanfaatkan sifat ini dengan menjalankan setiap koneksi HTTP pada process tersendiri, sehingga satu koneksi yang bermasalah tidak mengganggu koneksi lainnya.

Ringkasan#

  • Elixir dikompilasi menjadi bytecode Erlang dan dieksekusi di atas BEAM, sehingga seluruh kemampuan mesin virtual Erlang tersedia bagi kode Elixir.
  • Satu process BEAM memiliki memori dan pengumpul sampah sendiri, jauh lebih ringan daripada proses sistem operasi, sehingga ratusan ribu process dapat berjalan sekaligus.
  • OTP menyediakan pustaka dan pola rancangan seperti GenServer dan Supervisor, sedangkan modul Erlang dapat dipanggil langsung dari Elixir dengan tanda titik dua di depan namanya.
  • Fault tolerance dibangun dari isolasi antarprocess serta pemulihan yang dikelola supervisor sesuai filosofi let it crash.

Referensi#