Berbagai alasan melakukan Programming dalam Rust
Tags: programmer, rust, c, cpp
Published: 2020-06-06 15:45:39

Baru saja membaca artikel tentang [Rust sebagai bahasa pemrograman yang dicintai](https://stackoverflow.blog/2020/06/05/why-the-developers-who-use-rust-love-it-so-much/), membuat saya terpancing untuk menulis artikel tentang Rust. Pengalaman menggunakan bahasa pemrograman Rust ini adalah ketika membuat [wrapper Phoenix Channels client dalam Python](https://github.com/rizki96/phy_channels/) untuk kebutuhan salah satu Python project. Seperti juga C/C++, Rust memiliki native binding dengan Python melalui [pyo3](https://github.com/PyO3/pyo3) atau melalui FFI. Dengan pyo3 melakukan native binding antara Python dan Rust atau sebaliknya menjadi mudah.

Bukan hanya native binding saja, berbagai alasan mengapa Rust akan menjadi sebuah pilihan bahasa pemrograman yang populer, setelah Google mengeluarkan laporan bahwa [70 % masalah keamanan dalam program adalah memory safety](https://nikolanews.com/chrome-70-of-all-security-bugs-are-memory-safety-issues/), kemudian Microsoft mengeluarkan [laporan yang sama](https://www.zdnet.com/article/microsoft-70-percent-of-all-security-bugs-are-memory-safety-issues/). Membuat masa depan Rust menjadi sangat jelas mengapa bahasa pemrograman ini menjadi kebutuhan penting.

Bagi C/C++ programmer, Rust merupakan sebuah doa yang terkabul, banyak fitur dan konsep baru yang dapat membantu C/C++ programmer untuk membuat program sangat stabil dengan pengamanan (safety) di berbagai sisi (type, thread and memory safety). Dengan Rust, programmer diajak untuk membuat spesifikasi dengan aturan-aturan yang telah ditentukan dari tiap variable yang dibuat dan fungsi atau method yang dipanggil. Spesifikasi dan aturan-aturan ini bukan hanya dari tipe, tapi juga hal lain yang dibutuhkan untuk pengamanan program.

Berikut hal-hal dari yang biasa sampai luar biasa mengenai Rust, menurut pengamatan dan mungkin salah satu atau salah duanya bisa menjadi alasan untuk melakukan programming dalam Rust.

## Kompilasi kode
Ini merupakan hal yang biasa ditemukan di bahasa pemrograman seperti C/C++, Golang, dimana dengan kompilasi kita bisa mendapatkan kecepatan yang memuaskan dari program.

## Memiliki Tipe Statik
Tipe statik (Static Type Binding) juga ditemukan di bahasa pemrograman C/C++, Golang, Java. Dapat membantu programmer secara cepat menemukan kesalahan pada penugasan tipe (assignment type mismatch) atau kesalahan tipe dalam alokasi memory pada saat kompilasi sehingga program dapat terhindar dari crash ketika sedang berjalan (runtime).

## Perpaduan antara high level dan low level programming
Di satu sisi Rust mengajak programmer untuk melakukan programming secara high level, misalnya dengan konsep **Container** (vector, hashmap, etc.) untuk data struktur dan konsep **Generic Template** (\<T\>) untuk mendefinisikan tipe. Tapi juga tidak meninggalkan low level programming, seperti pengaksesan memory reference (&), memory pointer (*), dengan catatan low level programming ini memiliki aturan ketat dalam penggunaannya, agar pengamanan tetap terjaga. Perpaduan high level dan low level ini juga bisa ditemukan pada C++.

## Pengamanan thread dan memory / thread and memory safety
Dari thread dan memory, Rust banyak menawarkan konsep baru yang luar biasa. Diantaranya adalah konsep **Ownership**, dimana alamat memory bisa "dipinjam" (borrow) kepada assignment variable atau passing variable (melalui fungsi). Aturan ini akan berlaku berbeda untuk mutable type (tipe yang dapat di tulis ulang) dan immutable type (tipe yang tidak dapat ditulis ulang). Dan aturan ini dijaga ketat oleh kompilator (compiler) dengan istilah "borrow checker". Perlu diketahui juga, konsep dasar [Ownership](https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html) memory di Rust ini yaitu move (borrow), copy, dan clone. Dan ada juga konsep **Lifetime** ('static, 'a, etc.) dari sebuah tipe yang dideklarasikan sebagai variable, yaitu setiap tipe yang dideklarasikan memiliki waktu hidup, waktu hidup ini bisa ditentukan oleh programmer sendiri atau berlaku secara umum (default) dari aturan Rust sendiri, aturan default untuk Lifetime ini disebut [Lifetime Elision](https://doc.rust-lang.org/reference/lifetime-elision.html). Untuk konsep **Mutex** sebagai pengamanan memory pada thread berlaku sebagai Generic Template, dimana penguncian sumber daya (resource locking) memfokuskan pada variable yang dialokasikan dan bukan pada baris kode, ini berbeda dengan konsep mutex lock pada bahasa C/C++ atau Java yang lama. Karena tidak menggunakan locking atau kesalahan menempatkan locking pada baris kode dapat menimbulkan race condition atau deadlock pada program.

## Tidak memiliki pengumpul sampah / garbage collection
Tentu saja hal ini menimbulkan trade off, "there is no such a thing as a free lunch", fitur GC dibebankan pada programmer ketika mendefinisikan variable dan menjadi spesifikasi yang harus dideklarasikan oleh programmer. Dan akan dicek pada saat kompilasi. Fitur ini antara lain adalah **Reference Counting** dimana alamat memory memiliki variable penghitung (counter), yang akan ditambah ketika ada referensi ke variable baru atau akan dikurangi ketika lifetime berakhir atau dilakukan dereferensi. Fitur **Lifetime** yang disebutkan sebelumnya juga adalah salah satu fitur dari GC, dimana pada Rust menjadi tanggung jawab programmer. Keuntungan dengan tidak adanya GC ini adalah pada saat program berjalan (runtime) tidak ada overhead memory yang digunakan, karena pada kebanyakan bahasa, misalnya Java atau Python, GC menjadi salah satu bottleneck performance, karena bisa menghabiskan resource atau memory program.

## Memiliki fitur pemrograman fungsional
Walaupun pemrograman Rust bersifat imperative, tapi ada beberapa fitur pemrograman fungsional yang diadopsi, diantaranya adalah **Immutable Type** atau tipe yang tidak bisa ditulis ulang. **Container Iterator** yang bersifat deklaratif, seperti ".map", ".for_each", ".filter_map", etc. Dan **Pattern Matching** dengan keyword "match" dan generic template "Option". Perlu diketahui juga, karena Rust memaksa programmer untuk selalu melakukan pengamanan, pada tiap pemanggilan method atau fungsi SEBENARNYA dibutuhkan pattern matching untuk menangani Error. Tapi penanganan Error dengan pattern matching ini bisa saja tidak dilakukan dengan cara pemanggilan method "unwrap", konsekuensinya adalah bila terjadi error akan terjadi "panic".

Demikian sedikit pengamatan mengenai bahasa pemrograman Rust. Pendapat saya adalah jika menginginkan stabilitias, performa yang memuaskan dan keamanan pada program, Rust adalah pilihan yang cocok. Tapi jika menginginkan produktivitas, Rust belum tentu bisa menjadi pilihan. Bagi saya Rust sangat dibutuhkan untuk system programming (kebutuhan os, network atau device programming), dan akan menjadi second atau third layer programming laguange, ketika dibutuhkan untuk speed dan stability pengganti C/C++, sebagai wrapper program-program yang ditulis dengan bahasa Python, Ruby atau Elixir. Hal ini seperti yang telah [dilakukan oleh Discord](https://blog.discord.com/using-rust-to-scale-elixir-for-11-million-concurrent-users-c6f19fc029d3), dimana penggunaan Rust dengan rustler (Erlang interface to Rust) dapat meningkatkan speed untuk struktur datanya, tapi untuk konsep distributed system, tetap menggunakan Elixir.