Mencoba Rust System Programming Language
2020/04/05
Sudah dari tahun 2018 kami sudah mendengar rust, terutama ketika AWS me-“Open Source” FireCraker - Engine Lambda,
rust menjadi salah satu bahasa yang digadang-gadang saingan go.
Ya meski tidak ada saingan diantara bahasa pemrograman, karena itu cuma alat bantu untuk menyelesaikan masalah.
Baru ditahun ini ingin mencoba Rust, Karena ada kejenuhan dan ingin mencoba sesuatu yang baru.
Sekilas baca buku Programming Rust, 2nd Edition, bagian Why Rust?. Yang kami tangkap disana itu Rust adalah
a safe, concurrent language with the performance of C and C++.
Rust adalah bahasa yang dikembangkan oleh Mozilla dan komunitasnya. Ia adalah system programming baru.
System programming itu untuk, Sistem Operasi, FileSystem, Database, Bisa jalan di device yang murah, dll. Intinya sistem programming adalahresource-constrained programming` artinya pemrograman yang benar-benar
memperhatikan setiap byte dan CPU.
Kenalan dulu
Instalasi Rust
Instalasinya cukup mudah, hanya perlu googling sekali dan langsung ditujukan ke https://doc.rust-lang.org/book/ch01-01-installation.html.
Mencoba Rust
Setelah sukses melakukan instalasi, Kita bisa mencoba, Bukan hanya rust, instalasi diatas juga memberikan Cargo sebagai package manager.
Apa saja yang cargo lakukan.
cargo --version
# cargo 1.42.0 (86334295e 2020-01-31)
Versi Cargo diatas terpisah dengan versi rust.
cargo new --bin myproject
Dengan syntax diatas, Cargo akan membuatkan folder yang berisi layout dari project.
- myproject
-- Cargo.toml
-- src
Cargo.toml berisi metadata dari project kita
[package]
name = "myproject"
version = "0.1.0"
authors = ["Zeihan Aulia <zeihan@warungpintar.co>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
Disana ada 2 bagian yaitu [package] dan [dependencies]. Package adalah metadata dari project.
Dependencies adalah list library dependency yang kita gunakan.
Didalam folder src, terdapat main.rs. didalamnya tertulis kode hello world.
Selanjutnya kita build project tersebut dengan menggunakan syntax
cargo build
# Compiling myproject v0.1.0 (/Users/zeihanaulia/Programming/research/rust-learning/myproject)
# Finished dev [unoptimized + debuginfo] target(s) in 1.62s
Jika build berhasil, maka kita akan mendapatkan folder baru yaitu target yang didalamnya berisi folder debug.
Yang didalamnya terdapat binary dari hasil build kita.
./target/debug/myproject
# Hello, world!
Kalau kita ingin melakukan analisis dari runtime performance dari kode kita. Pastikan kita melakukan build dengan
cargo build --release
# Compiling myproject v0.1.0 (/Users/zeihanaulia/Programming/research/rust-learning/myproject)
# Finished release [optimized] target(s) in 0.92s
dan mejalankannya
./target/release/myproject
# Hello, world!
Pada phase development dari pada menggunakan build, kita bisa menggunakan
cargo run
Variable
Variable di rust sama seperti variable pada umumnya dibahasa pemrograman lain yang mana variable dapat meletakan isi disebuah wadah.
Gimana sih cara declare variable?
let x = 5;
Variable dimulai dengan kata kunci let dan dilanjutkan dengan x sebagai nama dari variable.
Selanjutya isi vairable x dengan menggunakan = lalu nilainya 5, jangan lupa ditutup dengan semicolon ;.
fn main() {
let x = 5;
let y = 6;
let z = x + y ;
println!("z is {}", z)
}
Coba disini.
Rust itu defaultnya mutable loh.
Perbedaan variable rust dibanding yang bahasa lain adalah mutable by default.
fn main() {
let x = 5;
x += 1;
println!("x is now {}", x);
}
hasilnya
Compiling playground v0.0.1 (/playground)
error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:3:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: make this binding mutable: `mut x`
3 | x += 1;
| ^^^^^^ cannot assign twice to immutable variable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0384`.
error: could not compile `playground`.
To learn more, run the command again with --verbose.
Coba disini.
Kita tidak diizinkan untuk mengubah value dari dari x.
Jadi untuk mengubah nilai dari suatu variable harus menggunakan kata kunci tambahan mut.
fn main() {
let mut x = 5;
x += 1;
println!("x is now {}", x);
}
Coba disini.
Semua variable bisa memiliki type
fn main() {
let mut x: i32 = 5;
}
dengan menambahkan colon atau titik dua kita bisa memberikan tipe pada suatu variable.
Data Types
Data types di rust dibagi menjadi 2 bagian. Simple dan Compound.
Single
- Bool
- Integer
- Floating point
- Charecter
Boolean
Boolean disebut bool. Isinya hanya true atau false.
Boolean biasanya digunakan pada kondisi kontrol flow seperti if dan while.
fn main() {
let a = true;
let b = false;
if a {
println!("a is true!")
}
if b {
println!("b is false!")
}
}
Integer
Number tanpa decimal disebut dengan interger. Ada dua type Signed dan Unsigned. Sebagai tambahan kita dapat memutuskan berapa banyak space integer yang akan digunakan.
| Signed | Unsigned |
|---|---|
| i8 | u8 |
| i16 | u16 |
| i32 | u32 |
| i64 | u64 |
Floating
Number dengan decimal point.
Character
Compund
Tuple
Tuple menungkinkan kita mengelompokan beberapa nilai secara bersamaan dalam ().
Nilai didalamnya tidak harus dengan nilai yang sama.
// structuring
let tup = (1, 'c', true);
// descructuring
ley (x, y, z) = tup;
Array
Array adalah koleksi dimana semua elemen memiliki tipe yang sama.
fn main() {
let a = [0.0, 3.14, -8.8722]
let second = a[1];
println!("{}", second)
}
bisa juga kita ganti nilai didalam array, dengan menambah kata kunci mut
fn main() {
let mut a = [0.0, 3.14, -8.8722]
let a[0] = 1.1;
println!("{}", second)
}
Tapi kita tidak bisa menambah atau mengurangi jumlah dari array
fn main() {
let mut a = [0.0, 3.14, -8.8722]
let a += 1.1;
println!("{}", second)
}
Slices
Slice memberikan kita referesnsi sekumpulan data yang bedekatan dalam structur data lain.
let a = [100,200, 300]
let b = &a[0..1]
Function
Sama seperti function di bahasa lain.
func name(param1: type1, ...) -> return_type {
...body...
}
name(param1: type, ...)
name dapat diisi dengan nama function dan bisa diisi dengan parameter. lalu diakhiri dengan result.
contoh function :
fn next_birthday(name: &str, current_age: u8) {
let next_age = current_age + 1;
println!("Hi {}, on your next birthdat, yuu'll be {}!", name, next_age)
}
fn main() {
next_birthday("Jake", 33);
next_birthday("Vivian", 0);
}
Coba disini.
Function dengan return value
fn square(num: i32) -> i32 {
num * num
}
fn main() {
println!("The answer is {}", square(3));
}
Coba disini
Uniknya return value bisa saja tanpa menggunakan kata kunci return dan tanpa diakhiri semicolon ;.
Tapi kalau mau pake return juga bisa, dan harus diakhiri dengan semicolon.