Daftar Isi
- Elixir, Bahasa Alternatif Untuk Menulis Kode Di Mesin BEAM
- Peningkatan Fitur Yang Dilakukan Elixir
- Kekurangan Elixir
- Referensi
Elixir, Bahasa Alternatif Untuk Menulis Kode Di Mesin BEAM
Pada artikel sebelumnya, kita telah membahas Erlang dan beberapa fitur pentingnya. Jika Erlang sudah baik, mengapa kita harus belajar Elixir? Artikel ini bertujuan untuk menjawab pertanyaan tersebut!
Elixir adalah bahasa pemrograman yang dirancang untuk dijalankan di Erlang Virtual Machine (BEAM). José Valim menciptakan Elixir untuk membuat penulisan kode di BEAM lebih mudah dan efisien. Proyek ini bersifat open-source, dan source code-nya dapat diakses di halaman GitHub proyek tersebut.
Saat kode Elixir dikompilasi, hasilnya adalah bytecode yang kompatibel dengan kode Erlang. Hal ini memungkinkan kita untuk menggunakan pustaka Erlang di proyek Elixir dan sebaliknya. Singkatnya, apapun yang bisa dilakukan di Erlang, juga bisa dilakukan di Elixir!
Secara sintaksis, Elixir mirip dengan Erlang, tetapi dengan fitur tambahan yang mengurangi kode boilerplate, merapikan pustaka standar Erlang, menyediakan kode yang syntactic sugar dan alat-alat (tools) yang terintegrasi mulai dari proses pembuatan hingga pengemasan sistem (packaging) suatu proyek Elixir. Hal ini menjadikan bahasa ini ideal bagi pengembang yang ingin menulis kode yang lebih mudah dikembangkan dan dipelihara.
Sekarang Mari kita bahas bagaimana Elixir meningkatkan beberapa beberapa aspek Erlang:
Peningkatan Fitur Yang Dilakukan Elixir
Menyederhanakan Kode Erlang
Salah satu keuntungan menggunakan Elixir adalah kemampuannya untuk mengurangi kode berlebih (boilerplate) dan kebisingan (noise) yang terdapat pada kode Erlang, sehingga kode menjadi lebih mudah ditulis dan dipelihara. Untuk memberikan gambaran yang lebih jelas, mari kita bandingkan potongan kode di Erlang dan Elixir. Kita mulai dengan kode Erlang:
% Contoh kode Erlang dari buku Elixir In Action 3rd Edition
-module(sum_server).
-behaviour(gen_server).
-export([
start/0, sum/3,
init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
code_change/3
]).
start() -> gen_server:start_link(?MODULE, [], []).
sum(Server, A, B) -> gen_server:call(Server, {sum, A, B}).
init(_) -> {ok, undefined}.
handle_call({sum, A, B}, _From, State) -> {reply, A + B, State}.
...
Meskipun tanpa pengetahuan tentang Erlang, contoh di atas menunjukkan bahwa struktur kodenya memerlukan banyak penjelasan yang tidak langsung berkaitan dengan operasi dasar penjumlahan dua bilangan. Masalahnya dengan Erlang adalah kode boilerplate-nya hampir tidak bisa dihilangkan, hal ini menjadi kendala terutama saat kita ingin mengembangkan aplikasi yang lebih kompleks.
Sekarang mari kita lihat versi kode Elixir untuk kasus yang sama:
# Contoh kode Erlang dari buku Elixir In Action 3rd Edition
defmodule SumServer do
use GenServer
def start do
GenServer.start_link(__MODULE__, nil)
end
def sum(server, a, b) do
GenServer.call(server, {:sum, a, b})
end
def handle_call({:sum, a, b}, _from, state) do
{:reply, a + b, state}
end
end
Kode yang ditulis dengan Elixir jauh lebih singkat dan lebih mudah dibaca dibandingkan dengan kode Erlang. Struktur kode menjadi lebih jelas dan tidak dibebani dengan banyak detail teknis yang tidak langsung berkaitan dengan fungsi utama, yaitu penjumlahan dua bilangan. Pengurangan kode boilerplate dan noise ini membuat kode Elixir lebih mudah untuk dipahami dan dipelihara, serta membantu mengurangi kemungkinan kesalahan. Dengan demikian, Elixir menawarkan keuntungan signifikan dalam hal pengembangan aplikasi besar dan kompleks.
Menyusun Fungsi Dengan Pipe Operator
Erlang dan Elixir adalah bahasa pemrograman fungsional yang mengikuti prinsip immutability, di mana data yang telah dibuat tidak dapat diubah. Dalam paradigma pemrograman fungsional, perubahan data dilakukan melalui "transformasi data," yaitu dengan membuat salinan baru dari data yang ingin dimodifikasi lalu menyimpannya di lokasi memori yang berbeda.
Salah satu kelebihan pendekatan ini adalah kemampuan untuk membagi kode menjadi beberapa fungsi kecil yang dapat digunakan kembali (reusable) dan dirangkai/disusun (composable). Hal ini membuat kode lebih mudah dikembangkan, dipelihara, dan dipahami, karena setiap fungsi memiliki tugas spesifik dan dapat digabungkan untuk membentuk solusi yang lebih kompleks.
Meskipun kedua bahasa ini adalah bahasa pemrograman fungsional, terdapat perbedaan dalam cara mereka menyusun fungsi. Di Erlang, fungsi sering kali disusun menggunakan teknik yang disebut staircasing, di mana fungsi disusun dari dalam ke luar. Pendekatan ini bisa membingungkan dan meningkatkan risiko kesalahan.
Berikut adalah contoh kode Erlang yang menggunakan teknik staircasing:
% Contoh Kode dari buku Elixir In Action 3rd Edition
process_xml(Model, Xml) ->
persist(
process_changes(
update(Model, Xml)
)
).
Di sisi lain, Elixir menyederhanakan penyusunan fungsi dengan menggunakan pipe operator |>
, yang membuat kode lebih mudah dibaca dan dipahami:
# Contoh Kode dari buku Elixir In Action 3rd Edition
def process_xml(model, xml) do
model
|> update(xml)
|> process_changes()
|> persist()
end
Pada contoh di atas, pipe operator |>
di Elixir mengambil hasil dari satu fungsi dan meneruskannya sebagai argumen pertama ke fungsi berikutnya. Pendekatan ini tidak hanya membuat alur logika kode lebih mudah diikuti, tetapi juga mengurangi gangguan visual dan memudahkan pengembang untuk memahami bagaimana data "bertransformasi" melalui berbagai tahapan.
Manfaat menulis kode dengan Elixir tidak hanya terbatas pada aspek visual. Cara ini juga mendukung prinsip pemrograman fungsional dengan lebih baik. Elixir memungkinkan kita menulis kode dengan cara yang lebih cerdas dan efektif, dengan memikirkan fungsi sebagai cara untuk mengubah data dan menggabungkannya secara fungsional.
Peningkatan Lainnya Yang Dilakukan Elixir
Elixir menawarkan sintaks yang lebih modern dan ringkas dibandingkan Erlang, serta beberapa perbaikan yang menyederhanakan dan memperkaya pengalaman pengembangan perangkat lunak. Berikut adalah beberapa peningkatan utama:
Menyederhanakan API Pustaka Standar Erlang
Elixir menyederhanakan API pustaka standar Erlang, membuatnya lebih konsisten dan mudah dipahami. Peningkatan ini mencakup penamaan fungsi yang lebih logis dan konvensi yang lebih intuitif, yang membantu mengurangi kurva pembelajaran bagi pengembang baru dan meningkatkan produktivitas bagi pengembang berpengalaman.
Syntactic Sugar dan Kesederhanaan Sintaks
Elixir memperkenalkan berbagai syntactic sugar, seperti pipe operator |>
, yang menyederhanakan implementasi dan meningkatkan keterbacaan kode. Bahasa ini juga menyederhanakan interaksi dengan struktur data seperti tuple dan list, serta menawarkan dukungan Unicode yang lebih baik untuk string. Kesederhanaan ini membuat kode lebih mudah ditulis, dibaca, dan dikembangkan.
Alat dan Manajer Paket
Elixir dilengkapi dengan alat (tool) bernama Mix yang membantu berbagai tugas pengembangan, mulai dari membuat proyek baru hingga menguji (testing) kode yang kita tulis. Selain itu, Elixir memiliki sistem manajer paket (package manager) yang disebut Hex (Hex.pm). Hex memudahkan pengemasan (packaging) dan penerapan paket (installing), serta bekerja dengan baik bersama Mix untuk mengelola dependensi dan berbagi paket (publishing) antar pengembang.
Kompabilitas Dengan Erlang
Elixir berjalan di platform BEAM yang sama dengan Erlang, memungkinkan penggunaan pustaka Erlang saat mengonversi ke Elixir. Dengan cara ini, Elixir memanfaatkan keandalan dan kekuatan Erlang sambil menawarkan cara kerja yang lebih modern dan sederhana bagi pengembang.
Kekurangan Elixir
Meskipun Erlang dan Elixir menawarkan banyak kelebihan, mereka juga memiliki kekurangan yang perlu dipertimbangkan saat memilihnya untuk suatu proyek atau solusi.
Kecepatan
Erlang, dan dengan demikian Elixir, tidak dikenal sebagai platform tercepat. Berdasarkan berbagai benchmark, Erlang sering kali tidak berada di posisi teratas dibandingkan dengan bahasa yang dikompilasi langsung seperti C++, Go, atau Rust.
Tujuan utama Erlang adalah memastikan kinerja yang dapat diprediksi dan stabil, bukan memaksimalkan requests per second (RPS). Dengan BEAM, kinerja sistem diharapkan tetap konsisten pada suatu mesin tanpa penurunan signifikan, misalnya menghindari masalah yang mungkin disebabkan oleh garbage collector.
Seiring bertambahnya beban, BEAM memanfaatkan semua sumber daya perangkat keras secara optimal. Jika kapasitas perangkat keras tidak memadai, BEAM akan menurunkan kinerja secara bertahap, sehingga permintaan (request) mungkin memerlukan waktu lebih lama untuk diproses, tetapi sistem tidak akan mengalami kegagalan total. Hal ini dimungkinkan berkat sifat preemptive dari BEAM scheduler, yang sering melakukan context switches dan mendukung proses berjangka pendek, menjaga sistem tetap responsif. Tentunya, penambahan kapasitas perangkat keras dapat mengatasi peningkatan beban.
Namun, untuk komputasi yang intensif pada CPU, kinerja Erlang tidak seefisien bahasa yang dikompilasi seperti C++, Go, atau Rust. Oleh karena itu, mungkin perlu mempertimbangkan implementasi tugas-tugas berat CPU dalam bahasa lain dan kemudian mengintegrasikan komponen tersebut ke dalam sistem Erlang. Jika sebagian besar logika sistem bergantung pada pemrosesan CPU, mungkin lebih baik mempertimbangkan teknologi lain yang lebih sesuai.
Ekosistem Yang Masih Kecil
Dibandingkan dengan bahasa pemrograman populer lainnya, Erlang dan Elixir memiliki ekosistem yang lebih kecil. Misalnya, pencarian cepat di GitHub menunjukkan bahwa terdapat lebih sedikit repositori berbasis Erlang dan Elixir dibandingkan dengan bahasa seperti Ruby, PHP, atau JavaScript. Ini berarti pilihan pustaka dan alat yang tersedia terbatas, sehingga mungkin memerlukan lebih banyak waktu dan upaya untuk mengembangkan solusi spesifik atau mengintegrasikannya dengan teknologi lain.
Referensi
- Juric, S. (2024). Elixir in action (3rd ed.). Manning Publications.
Top comments (1)
Thanks