7 poin oleh GN⁺ 2025-05-07 | 4 komentar | Bagikan ke WhatsApp
  • 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

 
cronex 2025-05-08

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?

 
coremaker 2025-05-08

Akan lebih baik kalau unsafe tidak disediakan.

 
codemasterkimc 2025-05-08

Bahasa yang fundamental = Rust

 
GN⁺ 2025-05-07
Komentar Hacker News
  • Kelebihan terbesar Rust adalah tipe Result yang menyeragamkan cara propagasi error. Menarik karena kita tidak perlu memikirkan penanganan exception atau berbagai cara pengembalian error yang berbeda-beda

    • Berkat shortcut ? dan antarmuka fungsional dari Result, penanganan error jadi menyenangkan dan mudah ditangani
    • Dibandingkan cara penanganan error C++ yang rumit, kurangnya konsistensi menjadi hal yang dikeluhkan
  • Ada banyak keluhan terhadap C++. Khususnya, kita harus mengingat banyak aturan, dan jika salah satu saja keliru, kode bisa menjadi rentan

    • Untuk meningkatkan keamanan C++, dibutuhkan pendekatan yang mirip dengan cara aman di Rust
  • Kode C++ yang ditulis saat ini mirip dengan Rust. Menggunakan tipe yang eksplisit dan kuat, serta pengelolaan lifetime yang jelas

    • Kompiler Rust lebih membantu dalam menangkap bug dan melaporkan error
  • Masalah konversi implisit di C++ lebih merupakan masalah library daripada bahasanya sendiri

    • Di C++ juga bisa diimplementasikan fitur yang mirip Rust, tetapi membutuhkan dukungan library
  • Rust tidak memiliki keyword argument atau tuple bernama, sehingga penggunaan struct Args/Options terasa kurang nyaman

  • Opsi -Wconversion bisa menangkap masalah konversi tertentu, tetapi tidak berlaku untuk semua kasus

    • Misalnya, mengonversi 1000.0 menjadi 1000 dianggap tidak menyebabkan kehilangan presisi
  • Hal yang membuat Rust lebih baik adalah tidak adanya konversi numerik implisit. Di C++, sebaiknya tidak menggunakan atoi dan lebih baik memakai fungsi konversi dari STL

  • Fitur 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