- Penulis, yang telah menggunakan C++ selama lebih dari 20 tahun, memperkenalkan bagaimana ceramah Matt Godbolt membuatnya menemukan kembali keunggulan Rust
- Di C++, kesalahan akibat kebingungan tipe tidak tertangkap dengan baik oleh compiler, tetapi Rust mencegahnya dengan kuat saat waktu kompilasi
- Rust memiliki desain yang menguntungkan bukan hanya untuk keamanan memori sederhana, tetapi juga untuk mencegah penyalahgunaan API
- Khususnya saat menangani input runtime, Rust memaksa penanganan error secara eksplisit, sehingga mengurangi risiko
- Pada akhirnya, ini menunjukkan bahwa desain bahasa dapat menjadi alat yang kuat untuk mencegah kesalahan pengembang
Pendahuluan
- Ceramah Matt Godbolt, "Correct by Construction", menyoroti masalah desain API di C++, dan ini juga selaras dengan filosofi Rust
- Ceramah ini merupakan materi pengantar yang baik untuk memahami keunggulan Rust
What's in a type — keterbatasan C++
- Signature fungsi seperti
void sendOrder(const char *symbol, bool buy, int quantity, double price) sangat rentan terhadap kesalahan
- Jika hanya menggunakan tipe dasar seperti
bool, int, double, compiler tidak memberi peringatan meski tipe yang dimasukkan salah
- Alias tipe seperti
using Price = double tidak benar-benar memiliki kemampuan membedakan tipe
- Setelah membuat
Quantity dan Price menggunakan class dan konstruktor explicit, compiler memang bisa menangkap sebagian error, tetapi:
- Nilai negatif tetap diperbolehkan, dan ini baru menjadi masalah saat runtime
- Dengan memanfaatkan
static_assert dan template, pemeriksaan saat waktu kompilasi bisa dipaksakan
- Namun konversi runtime seperti
atoi tetap dapat menyebabkan integer overflow dan compiler tidak bisa mendeteksinya
Apa yang berbeda di Rust?
- Bahkan dengan definisi fungsi yang sama, Rust menandai ketidakcocokan tipe sebagai error yang jelas pada saat kompilasi
- Definisi tipe baru seperti
struct Price(pub f64); struct Quantity(pub u64); juga sederhana, dan pemblokiran input negatif berjalan secara alami
- Seperti pada
"string".parse::<u64>(), konversi string runtime juga memerlukan penanganan error yang eksplisit
- Jika nilai dipaksa di-unwrapping dengan
.expect(), akan terjadi crash saat runtime, tetapi ditekankan bahwa ini lebih baik daripada error diam-diam di C++
Kesimpulan
- Rust melindungi pengembang bukan hanya melalui stabilitas memori, tetapi juga lewat pencegahan penyalahgunaan API, pemeriksaan saat kompilasi, dan sistem tipe yang jelas
- Ini menunjukkan bahwa kekuatan desain bahasa dapat mencegah kesalahan pengembang sebelum terjadi
- Pemula Rust bisa mengalami kesulitan karena harus "berjuang" dengan borrow checker, tetapi ini akan teratasi seiring waktu
- C++ secara historis telah banyak berkembang, tetapi tetap terlihat sulit untuk memberikan keamanan dan kejelasan yang mendasar seperti Rust
Referensi
4 komentar
Sebagian besar hal yang sering disebut sebagai kekurangan C++ tampaknya memang dipertahankan demi kompatibilitas dengan bahasa C.
Apakah mungkin mengubahnya agar bisa dikembangkan dengan meninggalkan kompatibilitas dengan C?
Akan lebih baik kalau
unsafetidak disediakan.Bahasa yang fundamental = Rust
Komentar Hacker News
Kelebihan terbesar Rust adalah tipe
Resultyang menyeragamkan cara propagasi error. Menarik karena kita tidak perlu memikirkan penanganan exception atau berbagai cara pengembalian error yang berbeda-beda?dan antarmuka fungsional dari Result, penanganan error jadi menyenangkan dan mudah ditanganiAda banyak keluhan terhadap C++. Khususnya, kita harus mengingat banyak aturan, dan jika salah satu saja keliru, kode bisa menjadi rentan
Kode C++ yang ditulis saat ini mirip dengan Rust. Menggunakan tipe yang eksplisit dan kuat, serta pengelolaan lifetime yang jelas
Masalah konversi implisit di C++ lebih merupakan masalah library daripada bahasanya sendiri
Rust tidak memiliki keyword argument atau tuple bernama, sehingga penggunaan struct Args/Options terasa kurang nyaman
Opsi
-Wconversionbisa menangkap masalah konversi tertentu, tetapi tidak berlaku untuk semua kasusHal yang membuat Rust lebih baik adalah tidak adanya konversi numerik implisit. Di C++, sebaiknya tidak menggunakan
atoidan lebih baik memakai fungsi konversi dari STLFitur yang mirip dengan constraint di SQL atau custom type dan validator di pydantic masih belum ada di Rust maupun Golang
Jika tertarik dengan podcast pemrograman Matt dan Ben Rady, "Two's Complement" layak untuk didengarkan