Berkenalan dengan Rust
Bab ini membahas tentang pengetahuan dasar untuk mulai berkenalan dengan Rust. Pembahasan pada bab ini diantaranya adalah :
Apa itu Rust?
Instalasi Rust dan Paket Pendukung
Instalasi Text Editor
Command
1. Apa itu Rust?
Rust adalah bahasa pemrograman low-level yang mulai dikembangkan sejak tahun 2006 oleh Graydon Hoare salah seorang engineer di Mozilla. Rust adalah bahasa pemrograman sistem (system programming) yang difokuskan pada tiga tujuan: keamanan, kecepatan, dan concurrency. Rust memelihara tujuan ini tanpa garbage collector yang membuatnya menjadi bahasa yang berguna untuk sejumlah kasus penggunaan bahasa lain. Tidak hanya itu rust juga bahasa dengan general purpose language, bahasa low-level yang bisa membantu kita untuk mengeksplorasi potensi sisi system, embedded system, dan hal-hal kritis terkait performance.
2. Instalasi Rust dan Paket Pendukung
Instalasi Rust
Untuk menginstal rust kita akan menggunakan rustup, namun sebelum itu kita perlu mengetahui apa itu rustup. Rustup adalah official toolchain manajemen dari The Rust Programming Language. Dengan rustup kita dapat dengan mudah : menginstal, mengupdate, mengganti versi compiler (stable, beta, dan nightly) dan mempermudah kita dalam mengkompilasi kode sumber berikut dengan standard library agar aplikasi kita dapat dijalankan platform yang didukung oleh Rust. Untuk menginstal rust sangat mudah sekali, kita hanya perlu menjalankan :
$ curl https://sh.rustup.rs -sSf | sh
Jika perintah diatas dijalankan rustup akan memberikan pilihan apakah kita akan menginstal rust secara custom atau default.
info: downloading installer
Welcome to Rust!
This will download and install the official compiler for the Rust programming
language, and its package manager, Cargo.
It will add the cargo, rustc, rustup and other commands to Cargo's bin
directory, located at:
/home/<user>/.cargo/bin
This path will then be added to your PATH environment variable by modifying the
profile file located at:
/home/<user>/.profile
You can uninstall at any time with rustup self uninstall and these changes will
be reverted.
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
Pada saat kita menginstal Rust maka kita akan mendapatkan tiga buah tool yaitu : cargo, rustc dan rustup.
cargo adalah package manager untuk Rust.
rustc adalah compiler yang digunakan untuk mengkompilasikode sumber ke static binary.
rustup adalah toolchain manajemen yang sudah kita bahas diatas.
Instalasi paket pendukung
Pada tahap instalasi diatas sebenarnya kita sudah dapat bermain dengan Rust, namun, ada "the most useful tools" yang sangat berguna bagi kita yaitu : racer, rustfmt, rustsym.
- racer
Tool ini berfungsi untuk auto-suggestion pada saat kita menuliskan keyword, library, dan lainnya yang hendak kita pakai. Untuk menginstal racer jalankan perintah :
$ cargo install racer
Contoh penggunaan racer :
$ racer complete std::io::R
// Output
MATCH Read,427,10,/home/<user>/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/io/mod.rs,Trait,pub trait Read
MATCH Result,48,9,/home/<user>/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/io/error.rs,Type,pub type Result<T> = result::Result<T, Error>;
MATCH Repeat,107,11,/home/<user>/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src/libstd/io/util.rs,Struct,pub struct Repeat
- rustfmt
Tool ini berfungsi untuk memformat penulisan kode sumber yang kita buat
$ cargo install rustfmt
- rustsym
Tool ini berfungsi untuk meng-query atau mencari karakter didalam kode sumber yang kita buat
$ cargo install rustsym
Instalasi Text Editor
Arch Linux sudo
pacman -S atom
atauyaourt atom-editor-git
Ubuntu / Debian download file binari pada website atom lalu jalankan
sudo dpkg -i atom-amd64.deb
Setelah instalasi text editor selesai kita perlu mengintegrasikan tool tambahan yang sudah kita install tadi seperti : racer, rustfmt dan rustsym ke text editor, untuk menginstalnya cukup jalankan perintah :
$ apm install racer
$ apm install rustfmt
$ apm install rustsym
Jika proses instalasi selesai kita juga perlu setup racer agar dapat berjalan di text editor kita, buka atom text editor lalu masuk ke Preferences atau CTRL+, > Packages klik package racer lalu kita isikan PATH Variable yang dibutuhkan racer contoh :
Nama Kolom | Deskripsi |
---|---|
Path Racer | /home/<user>/.cargo/bin/racer |
Path kode sumber Rust | /home/<user>/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src |
Direktori Cargo | /home/<user>/.cargo/ |
Note : Ubah
<user>
dengan nama user pada komputer anda.
Command
Pada sub bab ini kita akan membahas tentang penggunaan command line interface dari tool : rustc, rustup dan cargo yang berguna pada saat kita membangun aplikasi.
Rust Compiler (rustc)
Rust Compiler (rustc
) adalah tool yang digunakan untuk mengkompilasikode sumber kedalam static-binary _karena Rust adalah bahasa pemrogramman ahead-of-time compiled
yang artinya kita mengkompilasi aplikasi kita lalu kita dapat mendistribusikan aplikasi kita dan langsung dapat di-_running tanpa harus menginstal Rust terlebih dahulu, tidak seperti bahasa lainnya misalnya .rb, .py atau .js yang mana kita harus menginstal ruby, python, atau javascript _terlebih dahulu sebelum me-_running file tersebut.
Untuk mengkompilasi caranya cukup mudah hanya dengan rustc <nama-file>.rs
. Contohnya terdapat program sederhana yang menampilkan kalimat "Hello!, Aku <3 Rust." dengan nama file hello.rs
dibawah ini :
fn main() {
println!("Hello!, Aku <3 Rust.");
}
maka untuk mengkompilasi file tersebut :
$ rustc hello.rs
dan untuk menjalankan nya :
$ ./hello
// Output
Hello!, Aku <3 Rust.
bagaimana jika ingin mengganti nama file hasil kompilasi? mudah saja, kita tambahan options -o
diikuti dengan nama file yang kita inginkan lalu nama file kode sumber, contoh :
$ rustc -o program_pertama hello.rs
ketika menjalankan kembali hasil kompilasi hasilnya akan sama saja.
Rustup
Rustup digunakan untuk berhubungan dengan toolchain dan kita perlu mengetahui standard penamaan rilis channel toolchain :
<channel>[-<date>][-<host>]
<channel> = stable|beta|nightly|<version>
<date> = YYYY-MM-DD
<host> = <target-triple>
Untuk menggunakan rustup sangat mudah format penulisan nya adalah rustup [FLAGS] [SUBCOMMAND]
, berikut daftar subcommand yang ada :
- Show digunakan untuk melihat daftar toolchain yang terinstall dan aktif, contoh :
$ rustup show
// Output
Default host: x86_64-unknown-linux-gnu
installed toolchains
--------------------
stable-x86_64-unknown-linux-gnu (default)
nightly-x86_64-unknown-linux-gnu
active toolchain
----------------
stable-x86_64-unknown-linux-gnu (default)
rustc 1.15.1 (021bd294c 2017-02-08)
- Update digunakan untuk mengupdate toolchain, contoh :
$ rustup update
// Output
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: downloading component 'rustc'
36.4 MiB / 36.4 MiB (100 %) 291.2 KiB/s ETA: 0 s
info: downloading component 'rust-std'
50.0 MiB / 50.0 MiB (100 %) 217.6 KiB/s ETA: 0 s
info: downloading component 'cargo'
4.7 MiB / 4.7 MiB (100 %) 288.0 KiB/s ETA: 0 s
info: downloading component 'rust-src'
27.4 MiB / 27.4 MiB (100 %) 233.6 KiB/s ETA: 0 s
info: installing component 'rustc'
info: installing component 'rust-std'
info: installing component 'cargo'
info: installing component 'rust-src'
info: syncing channel updates for 'nightly-x86_64-unknown-linux-gnu'
info: checking for self-updates
stable-x86_64-unknown-linux-gnu updated - rustc 1.16.0 (30cf806ef 2017-03-10)
nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.17.0-nightly (0aeb9c129 2017-03-15)
atau bisa juga mengupdate per-toolchain, tambahkan saja nama toolchain nya
$ rustup update nightly
// Output
info: syncing channel updates for 'nightly-x86_64-unknown-linux-gnu'
282.9 KiB / 282.9 KiB (100 %) 121.6 KiB/s ETA: 0 s
info: downloading component 'rustc'
41.0 MiB / 41.0 MiB (100 %) 211.2 KiB/s ETA: 0 s
info: downloading component 'rust-std'
65.5 MiB / 65.5 MiB (100 %) 188.8 KiB/s ETA: 0 s
info: downloading component 'cargo'
8.6 MiB / 8.6 MiB (100 %) 252.3 KiB/s ETA: 0 s
info: installing component 'rustc'
info: installing component 'rust-std'
info: installing component 'cargo'
nightly-x86_64-unknown-linux-gnu updated - rustc 1.17.0-nightly (0aeb9c129 2017-03-15)
- Default digunakan untuk mengubah default toolchain yang kita gunakan seperti merubah channel toolchain dari stable ke nightly, contoh :
$ rustup default nightly
// Output
info: using existing install for 'nightly-x86_64-unknown-linux-gnu'
info: default toolchain set to 'nightly-x86_64-unknown-linux-gnu'
nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.17.0-nightly (b1e31766d 2017-03-03)
Toolchain digunakan untuk mencari dan menampilkan daftar toolchain yang terinstall.
- Install toolchain
$ rustup toolchain install beta // Output info: syncing channel updates for 'beta-x86_64-unknown-linux-gnu' 156.4 KiB / 156.4 KiB (100 %) 129.9 KiB/s ETA: 0 s info: downloading component 'rustc' 37.1 MiB / 37.1 MiB (100 %) 224.0 KiB/s ETA: 0 s info: downloading component 'rust-std' 61.6 MiB / 61.6 MiB (100 %) 220.8 KiB/s ETA: 0 s info: downloading component 'cargo' 8.6 MiB / 8.6 MiB (100 %) 281.6 KiB/s ETA: 0 s info: installing component 'rustc' info: installing component 'rust-std' info: installing component 'cargo' beta-x86_64-unknown-linux-gnu installed - rustc 1.17.0-beta.1 (408d49e60 2017-03-14)
- Uninstall toolchain
$ rustup toolchain uninstall beta // Output info: uninstalling toolchain 'beta-x86_64-unknown-linux-gnu' info: toolchain 'beta-x86_64-unknown-linux-gnu' uninstalled
- Menampilkan daftar toolchain
$ rustup toolchain list // Output stable-x86_64-unknown-linux-gnu nightly-x86_64-unknown-linux-gnu (default)
- Link (membuat custom toolchain)
$ rustup toolchain link custom-toolchain /path/to/my/toolchain/sysroot
Component
- Menambahkan component
$ rustup component add rust-src
- Melihat daftar component
$ rustup component list // Output cargo-x86_64-unknown-linux-gnu (default) rust-docs-x86_64-unknown-linux-gnu rust-src (installed) rust-std-aarch64-apple-ios rust-std-aarch64-linux-android ...
- Menghapus component
$ rustup component remove rust-src
Override digunakan untuk memberitahu compiler agar memakai toolchain tertentu pada direktori proyek secara spesifik.
- Melihat direktori yang telah di override
$ rustup override list
- Menentukan (setup) toolchain
$ rustup override set ~/Code/aplikasi-ku
- Menghapus override (unset) toolchain
$ rustup override unset
Run digunakan untuk menjalankan toolchain yang tersedia.
- Penggunaan bersamaan dengan compiler.
$ rustup run nightly rustc ~/Desktop/hello.rs
- Penggunaan bersamaan dengan shell.
$ rustup run nightly bash
Which digunakan untuk menampilkan lokasi aplikasi binari yang sedang dijalankan.
$ rustup which rustc
// Output
/home/<user>/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc
Doc digunakan untuk menampilkan dokumentasi Rust
- Buku
$ rustup doc --book
- Standard Library
$ rustup doc --std
Ketika perintah diatas kita jalankan maka secara otomatis dokumentasi akan ditampilkan dibrowser.
Note : Agar kita dapat menggunakan fitur ini, component
rust-docs
harus sudah terinstallSelf digunakan untuk memodifikasi rustup seperti mengupdate dan menguninstall.
- Update rustup
$ rustup self update
- Uninstall rustup
$ rustup self uninstall
Set digunakan untuk melakukan pengaturan (settings) pada rustup seperti merubah default host, tapi fitur ini sangat jarang digunakan karena pada saat instalasi rustup, secara otomatis rustup sudah mengatur keperluan ini.
$ rustup set default-host
Completion fitur ini digunakan untuk menambahkan penyempurnaan CLI (command line interface) yang sangat berguna sekali pada saat bermain dengan rustup agar lebih cepat penilaiannya.
- Bash
# rustup completions bash > /etc/bash_completion.d/rustup.bash-completion
- Zsh
$ rustup completions zsh > ~/.zfunc/_rustup // Lalu tambahkan kode dibawah ini didalam file zshrc : fpath+=~/.zfunc
- Fish
$ rustup completions fish > ~/.config/fish/completions/rustup.fish
Target digunakan untuk kompilasi ke platform yang dinginkan karena Rust mendukung kompilasi untuk berbagai platform (cross-compilation)
- Menambahkan target
Dengan fitur target ini kita dapat membuild aplikasi untuk android dengan cargo dan menambahkan flag --target. Penggunaan Cargo akan kita bahas pada subbab berikutnya.
rustup target add arm-linux-androideabi // Output info: downloading component 'rust-std' for 'arm-linux-androideabi' 16.0 MiB / 16.0 MiB (100 %) 172.8 KiB/s ETA: 0 s info: installing component 'rust-std' for 'arm-linux-androideabi'
- Melihat daftar target yang terinstall
rustup target list // Output aarch64-apple-ios aarch64-linux-android aarch64-unknown-fuchsia aarch64-unknown-linux-gnu arm-linux-androideabi (installed) ...
- Menghapus (remove) target yang terinstall
rustup target remove arm-linux-androideabi
Cargo
Cargo adalah package manager atau tool yang memudahkan kita dalam menambahkan dan memanajemen paket-paket yang menjadi ketergantuangan (dependencies). Untuk itu cargo melakukan empat hal diantaranya :
Membuat metadata dengan nama file
Cargo.toml
Menambahkan dependensi yang dibutuhkan
Menjalankan
rustc
untuk keperluan kompilasiMemperkenalkan suatu konvensi agar lebih mudah dalam pengembangan
Cargo sendiri mempunyai beberapa subcommand untuk mendukung pengembangan agar lebih mudah dan efisien berikut command-command yang ada pada cargo :
- New digunakan untuk membuat proyek baru
$ cargo new nama_proyek --bin
atau jika kita ingin membuat proyek library
$ cargo new nama_proyek
jika kita jalankan perintah diatas, maka cargo akan membuatkan direktori dan file-file yang kita butuhkan seperti contoh dibawah ini :
nama_proyek
.
├── .git
│ ├── HEAD
│ ├── config
│ ├── description
│ ├── hooks
│ ├── info
│ ├── objects
│ └── refs
└── src
│ └── main.rs
├── .gitignore
└── Cargo.toml
6 directories, 6 files
direktori proyek yang sesuai dengan nama proyek yang kita sebutkan diatas berikut dengan inisialisasi git
file
Cargo.toml
sebagai manifest proyekdirektori
src
sebagai direktori utama kode sumberfile
main.rs
ataulib.rs
jika kita hendak membuat librariInit digunakan untuk menginisialisasi proyek yang sudah dibuat namun belum terintegrasi dengan cargo
$ cargo init
atau jika proyek yang dibuat akan dijadikan file binari
$ cargo init --bin
- Build digunakan untuk mengkompilasi kode sumber kedalam bentuk file binari
$ cargo build
- Run sama halnya
build
pada perintahrun
sebenarnya cargo terlebih dahulu mengkompilasi namun langsung menjalankan hasil kompilasi tersebut
$ cargo run
- Clean digunakan untuk membersihkan direktori/file yang dihasilkan pada saat
build
yakni direktoritarget
$ cargo clean
- Test ketika bekerja dengan proyek yang cukup besar pastinya kita akan membutuhkan testing, hal ini ditangani oleh cargo maka kita dapat dengan mudah membuat test untuk proyek kita, berikut contoh dari unit testing :
$ cargo test
// Output
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running target/debug/deps/<nama_proyek>-46a021ef15e0c20f
running 11 tests
test containers ... ok
test ping ... ok
test container ... ok
test swarm ... ok
test nodes ... ok
test services ... ok
test networks ... ok
test images ... ok
test tasks ... ok
test volumes ... ok
test info ... ok
test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured
Running target/debug/deps/<nama_proyek>-8a1cf4acd969d628
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
Doc-tests <nama_proyek>
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
- Bench digunakan untuk keperluan benchmarking, berikut contoh benchmarck :
$ cargo bench
// Output
Finished release [optimized] target(s) in 29.70 secs
Running target/release/deps/<nama_proyek>-53cdfcee641cf7b8
running 2 tests
test tests::it_works ... ignored
test tests::bench_add_two ... bench: 0 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured
- Install digunakan untuk menginstal atau menambahkan paket seperti
racer
,rustfmt
danrustsym
yang sudah kita gunakan pada sub bab sebelumnya
$ cargo install <nama_paket>
paket yang terinstall akan ditempat kedalam direktori /home/<user>/.cargo/bin
- Update digunakan untuk pemutakhiran semua paket depencies pada proyek kita
$ cargo update
atau dapat juga mengupdate perpaket
$ cargo update -p <nama_paket>
- Search digunakan untuk mencari paket-paket yang terdapat di registry crates.io
$ cargo search reg
// Output
Updating registry https://github.com/rust-lang/crates.io-index
winreg = "0.4.0" # Rust bindings to MS Windows Registry API
cpuprofiler = "0.0.3" # Bindings to google's cpu profiler
ecp = "0.1.1" # easily build compiler plugins.
- Publish digunakan untuk mempublikasikan paket yang kita buat ke registry
$ cargo publish
- Doc digunakan untuk men-generate dokumentasi paket yang kita buat
$ cargo docs
hasil dokumentasi otomatis akan dibuat didalam direktori target/doc