Jika Rust Ditulis Ulang
(josephg.com)- Rust berangkat dari kesadaran masalah bahwa, meskipun memiliki keunggulan keamanan memori, performa, tipe aljabar, dan Cargo, evolusi bahasa di kanal stabil melambat sehingga terasa seperti “produk generasi pertama yang belum selesai”
- Setelah komunitas membesar, pengambilan keputusan berbasis konsensus menjadi bottleneck, dan fitur yang sudah diimplementasikan seperti coroutine terus menumpuk karena belum bisa digunakan lama di stable Rust
- “seph edition” yang hipotetis adalah gagasan untuk mempertahankan ekosistem Rust dan Cargo yang ada, sambil mengizinkan breaking change untuk bereksperimen dengan sistem efek, izin compile-time, borrow field struct,
comptime, dan lainnya - Untuk mengurangi risiko rantai pasok, fitur sensitif seperti penulisan file, jaringan, FFI, dan
unsafeperlu diberi capability, dan pemanggil harus mengizinkannya secara eksplisit - Sebagian besar usulan tidak kompatibel dengan Rust yang ada, dan menambahkan capability saja menciptakan kondisi kegagalan baru yang memecahkan kompatibilitas semver, sehingga diperlukan edition baru atau fork compiler
Mengapa Rust terasa seperti “produk generasi pertama”
- Pada awalnya Rust terasa sangat menarik berkat tipe aljabar, keamanan memori tanpa kehilangan performa, dan package manager modern
- Setelah digunakan sekitar 4 tahun, bahasanya terasa seperti selalu berada dalam keadaan “sedikit kurang”
- Keluhan utamanya adalah frekuensi fitur baru masuk ke stable Rust menurun, dan laju evolusi bahasa juga melambat tajam
- Rust unstable book memiliki sekitar 700 fitur unstable, dan banyak di antaranya adalah perubahan standard library
- Coroutines adalah fitur dengan RFC yang sudah berusia 7 tahun dan sudah diimplementasikan di compiler, tetapi pengguna stable Rust masih belum bisa memakainya
- Proses RFC Rust terlihat seperti ruang tempat ide bagus berdiam terlalu lama
- Diskusi perbaikan
Mutexdisebut sebagai contoh: 25 orang meninggalkan lebih dari 200 komentar selama 2 tahun, tetapi tidak mencapai kesimpulan yang jelas
- Diskusi perbaikan
Gagasan “seph edition” hipotetis
- Yang dibayangkan adalah mem-fork compiler, tetapi membiarkan kode Rust yang ada tetap apa adanya, lalu menambahkan “seph” sebagai Rust edition terpisah
- Di edition ini, breaking change diizinkan, tetapi selama compiler tetap bisa mengompilasi mainline Rust, crate Cargo yang ada tetap bisa digunakan
- Ada lima poros besar yang ingin diubah
- Function trait dan sistem efek
- Capability compile-time
- Perancangan ulang
Pin, move, dan borrow struct comptimeala Zig- Perbaikan kecil pada sintaks dan standard library
Function trait dan sistem efek
- Rust memiliki trait untuk struct, tetapi usulannya adalah fungsi juga harus bisa diberi trait/effect yang lebih kaya
- Atribut yang bisa dimiliki fungsi dirangkum sebagai berikut
- Apakah bisa panic
- Apakah ukuran stack tetap
- Apakah dieksekusi sampai selesai, atau melakukan
yieldatauawait - Tipe continuation saat berupa coroutine
- Apakah merupakan fungsi murni
- Apakah secara tidak langsung menjalankan kode
unsafe - Apakah terminasi dijamin
- Jika parameter dan return type fungsi diekspos seperti associated type untuk fungsi, referensi tipe yang saat ini mustahil di stable Rust menjadi mungkin
- Contohnya adalah kode yang langsung menamai return type fungsi seperti
some_iter::Outputdan memasukkannya ke field struct - Ketika dibutuhkan jaminan bahwa blok kode tertentu tidak akan pernah panic, seperti di Linux kernel, penanda seperti
#[disallow(Panic)]dapat dipakai untuk memeriksa kemungkinan panic termasuk pada pemanggilan rekursif - Compiler sudah menangani trait terkait fungsi seperti
Fn,FnOnce, danFnMut, tetapi bentuk saat ini dinilai terlalu miskin - Sebagai referensi lebih rinci, ditautkan tulisan dan presentasi Yoshua Wuyts tentang effect system
Mengurangi risiko rantai pasok dengan capability compile-time
- Sebagian besar proyek Rust mengambil banyak crate pihak ketiga, dan crate utilitas kecil pun bisa menciptakan risiko rantai pasok lewat update berbahaya
- Seperti
unsafeyang merupakan opt-in eksplisit dalam keamanan memori, fitur sensitif terkait filesystem, jaringan, FFI, dan raw pointer juga harus diizinkan secara eksplisit - Diusulkan pendekatan memberi marker tag pada fungsi standard library yang sensitif secara keamanan
- Contoh:
std::fs::write(path, contents)menulis file ke path arbitrer, sehingga memiliki tag seperti#[cap(fs_write)] - Compiler secara otomatis men-taint seluruh call tree yang memanggil fungsi tersebut
- Contoh:
- Jika crate pihak ketiga membutuhkan capability
fs_write, pemanggil harus mengizinkannya secara eksplisit lewatCargo.tomlatau anotasi di titik pemanggilan - Jika tidak diizinkan, compiler dapat menghasilkan error bahwa
foo::do_stuff()menulis ke filesystem lokal, tetapi cratefoobelum dipercaya untuk capability tersebut - Banyak crate utilitas seperti
human-sizeatauserdetidak membutuhkan capability khusus, sehingga meskipun penulis menambahkan kode berbahaya, tindakan menulis file atau jaringan dapat dicegah pada tahap kompilasi - Alternatifnya adalah mengubah API sensitif agar menerima parameter
Capabilityterpisah- Contoh:
std::fs::writemengharuskan nilaiFsWriteCapability - Pembuatan objek
Capabilitydibatasi agar hanya mungkin dari root crate
- Contoh:
- Pendekatan ini menambah boilerplate, tetapi lebih fleksibel, dan perlakuan serupa juga diperlukan untuk skrip
build.rsdan blokunsafe - Bahkan dalam situasi crates.io diretas lalu kode cryptolocker dimasukkan ke
serde, dengan pendekatan capability, error kompilasi akan terjadi sebelum kode tersebut berjalan di banyak mesin developer atau disertakan dalam binary
Perancangan ulang Pin, move, dan borrow struct
Pinadalah hack rumit untuk memutar celah borrow checker, dan dinilai sebagai band-aid yang muncul karena ingin mempertahankan kompatibilitas mundur- Yang sebenarnya dibutuhkan dianggap lebih dekat dengan marker trait
Moveuntuk menandai tipe yang bisa dipindahkan - Saat ini Rust tidak memiliki trait
Pin, melainkanUnpindan!Unpin, dan bentuk negasi ganda ini membuat konsepnya lebih sulit - Ada kritik bahwa karena
Pinhanya diterapkan pada tipe referensi, kode yang membungkus denganBoxmuncul di banyak tempat- Sebagai contoh, ditautkan helper library seperti Tokio stream wrapper,
ouroboros,async-trait, danself_cell
- Sebagai contoh, ditautkan helper library seperti Tokio stream wrapper,
- Fungsi yang menerima nilai pinned seperti
Future::poll(self: Pin<&mut Self>, ..)juga menjadi rumit, dan dibutuhkan crate terpisah untuk menangani projection - Di dalam fungsi, borrow checker mengelola variabel dalam status “owned”, “borrowed”, atau “mutably borrowed”, tetapi status ini tidak terlihat langsung oleh programmer
async fnmembuat compiler menghasilkan hidden struct untuk menyimpan status suspend, dan pada saat itu dapat muncul bentuk satu field mem-borrow field lain- Rust tidak memiliki sintaks untuk menyatakan bahwa field struct berada dalam borrowed state, dan lifetime antar-field juga tidak bisa dinyatakan langsung
- Arah yang diusulkan adalah memperluas borrow checker agar borrow field struct dapat ditulis langsung
- Contoh: sintaks “local borrow” seperti
y: &'Self::x Vec<usize> - Compiler mengetahui bahwa
xsedang di-borrow dan menerapkan batasan yang sama seperti variabel borrowed di dalam fungsi
- Contoh: sintaks “local borrow” seperti
- Sintaks seperti ini juga dapat digunakan untuk menangani self-referential struct atau bentuk seperti
source: Stringdanast_nodes: Vec<&'Self::source str>pada AST - Struct yang memiliki borrowed field tidak bisa dipindahkan, sehingga tidak akan mengimplementasikan
Move; lebih jauh, traitMoveruntuk berpindah sendiri secara aman juga dipertimbangkan
comptime ala Zig dan masalah macro Rust
- Compiler Rust pada dasarnya terlihat seperti struktur yang menangani beberapa bahasa sekaligus: Rust, bahasa macro Rust, hingga proc macro
- Penilaian utamanya adalah Rust sendiri bagus, tetapi bahasa macro-nya tidak bagus
- comptime di Zig adalah cara compiler menjalankan sebagian kode pada waktu kompilasi lewat interpreter kecil
- Fungsi, parameter,
if, dan loop dapat ditandai sebagai kode compile-time, sementara kode non-comptime di-emit ke program sebenarnya std printcase study dari Zig adalah contoh yang menerima format string sebagai parameter comptime, lalu mem-parsingnya dalam loopcomptimeuntuk menghasilkan kode output- Implementasi
println!()Rust memanggil fungsi internal sepertiformat_args_nl, dan fungsi ini diduga di-hardcode di compiler - Kritik berlanjut bahwa bahkan penulis compiler Rust tampaknya tidak ingin menggunakan bahasa macro Rust
Usulan perbaikan kecil pada sintaks dan standard library
- Ada poin bahwa masalah
Range<T>mengimplementasikanCopyketikaT: Copyingin diperbaiki - Masalah derive dengan associated type juga disebut sebagai target perbaikan
- Isu terkait: derive with associated types
- Contoh: Playground
- Ada usulan bahwa ekspresi
if letharus mendukung logical AND- Bentuk yang diinginkan:
if let Some(x) = some_var && some_expr { } - Workaround saat ini adalah tuple matching
(some_var, check_foo()), tetapi meskipunsome_varadalahNone,check_foo()tetap dijalankan, berbeda dari perilaku short-circuit padaifbiasa - Contoh: Playground
- Bentuk yang diinginkan:
- Ergonomi raw pointer juga disebut sebagai target perbaikan
- Pada referensi,
myref.xbisa dipakai, tetapi pada pointer harus ditulis seperti(*myptr).xatau(*(*myptr).p).y - Posisinya adalah kode
unsafeharus dibuat semudah mungkin untuk dibaca dan ditulis
- Pada referensi,
- Ada usulan untuk mengubah built-in collection type agar menerima
Allocatorsecara eksplisit di constructor, bukan memakai allocator global asyncjuga perlu diperbaiki, tetapi dibiarkan karena materinya cukup banyak untuk tulisan terpisah
Kompatibilitas dan kelayakan eksekusi
- Sebagian besar usulan tidak kompatibel dengan Rust yang ada
- Penambahan capability keamanan pun menciptakan kondisi kegagalan baru yang membuat crate memecahkan kompatibilitas semver, sehingga membutuhkan Rust edition baru
- Beberapa tahun lalu, mungkin penulis akan membuat RFC, tetapi ia ingin menghindari situasi di mana gagasan itu menjadi satu lagi ide yang tidak terwujud setelah melalui proses panjang komentar RFC GitHub
- Pada akhirnya, bayangan itu kembali ke ide mem-fork compiler sendiri, tetapi masih ada kendala realistis bahwa terlalu banyak proyek yang harus dikerjakan
1 komentar
Pendapat di Hacker News
Berlawanan dengan anggapan bahwa proses RFC Rust adalah kuburan bagi ide-ide bagus, saya rasa tim inti Rust memang berada di arah yang benar dengan membuat penambahan fitur baru ke bahasa pemrograman ini menjadi sulit
Permukaan bahasa harus dijaga agar tidak membengkak, tidak konsisten, dan tidak dapat diprediksi. Awalnya saya juga menyukai Swift, tetapi akhirnya menyerah karena hal-hal seperti nama fungsi duplikatif semacam
isMultiple(of:), aturan parsing kurung kurawal untuk SwiftUI, aturan tipe referensi/nilai dan mutabilitas, serta notasi singkat argumen closure terus bertambah. Ide bagus itu banyak, jadi saya berharap Rust dijaga tetap ramping semaksimal mungkinMisalnya, fungsi yang mengembalikan
impl Traitbisa digunakan dan struct bisa memiliki field arbitrer, tetapi nilai yang dikembalikan sebagaiimpl Traittidak bisa dimasukkan ke field struct. Sebabnya, tipe itu tidak bisa diberi nama.if a && bbisa, danif let Some(x) = xjuga bisa, tetapiif let Some(x) = x && btidak bisa. Hal-hal seperti ini sebaiknya diperbaiki. Dari sisi jumlah baris kode compiler, Rust memang akan membesar, tetapi dari sisi kompleksitas untuk dipelajari dan digunakan, celah fitur seperti ini justru membuat bahasa menjadi lebih kompleks.Pinbukan pekerjaan besar untuk diimplementasikan di standard library, tetapi sama sekali bukan fitur yang ramping, dan beban kognitifnya sangat besar. Menurut saya, daripada compiler yang sederhana tetapi bahasanya sulit dipakai, lebih baik borrow checker yang kompleks dengan kode Rust yang mudah dibacaBahkan seandainya 100% ide yang mengantre diterima dan akhirnya dikerjakan, perbedaan antara laju masuk dan laju keluar akan membuatnya tetap terlihat begitu. Kalau ingin melampaui para penulis RFC, lebih baik jangan menulis RFC; buatlah implementasi siap produksi yang dilengkapi dokumentasi dan pengujian, serta bisa digabungkan dengan rapi ke tree
Tidak bisa dipakai sebagai const generic untuk tipe lain, juga tidak bisa dipakai sebagai panjang array. Kalau hanya butuh nilai, kita bisa mendefinisikan fungsi untuk mengembalikannya, jadi saat ini tidak terlalu berguna. Jika didukung dengan benar, crate pendukung seperti
generic_arraydantypenumdi library kriptografi bisa dihilangkan. Meski begitu, saya tetap setuju bahwa tim Rust harus berhati-hati dalam menambahkan fiturSituasi dependensi cukup serius, tetapi tampaknya tidak banyak orang yang mau mengakuinya. Contoh yang baru-baru ini saya lihat adalah crate cargo-watch
Intinya ini aplikasi sederhana yang memantau perubahan file dan menjalankan ulang compiler, dan implementasinya bahkan tidak sampai 1.000 baris. Namun jika dependensinya di-vendor, kode Rust-nya membengkak hingga hampir 4 juta baris di lebih dari 8.000 file. Itu berlebihan untuk sekadar pemantau file sederhana
https://crates.io/crates/cargo-watch
C/C++ hampir satu-satunya contoh di antara bahasa yang banyak dipakai di mana package manager ala npm tidak populer, sehingga kebanyakan library bersifat mandiri atau dependensinya sedikit dan sering kali opsional.
efswadalah pemantau sistem file C++ 7.000 baris tanpa dependensi. Library single-header dari dunia pemrograman game sepertistb_*,cgltf, dan Dear ImGui termasuk yang paling nyaman yang pernah saya pakai. Menurut saya, package manager baru mungkin secara keseluruhan akan diuntungkan oleh larangan dependensi transitif. Dependensi pada library besar bisa dibuat agar diinstal langsung oleh pengguna, disediakan sebagai callback, atau dijadikan fitur standarhttps://github.com/SpartanJ/efsw
https://github.com/nothings/stb
https://github.com/jkuhlmann/cgltf
https://github.com/ocornut/imgui
Menurut saya, pemantau file sama sekali tidak sederhana, terutama jika mendukung banyak platform
Sebagian dari
cargo watchmenarik library wrapper Win32 API, yang merupakan binding hasil auto-generation untuk panggilan Win32 sehingga memang pasti besar. Standard library di kebanyakan bahasa juga berisi jutaan baris, dan aplikasi hanya memakai sebagian kecil darinya. Boost di C++ juga sangat besar, tetapi developer hanya mengambil sebagian ekstensi yang diperlukan. Dibanding neraka ala npm di mana satu paket sepertiisOddatauis evenbisa merusak ekosistem, lebih baik punya lebih sedikit dependensi besar yang dipelihara dan diandalkan banyak orang; Rust pada umumnya lebih dekat ke arah ituSebagian besar dependensi
cargo-watchtampaknya berasal dari tiga kebutuhan langsung:clap,cargo_metadata, danwatchexec.clapmembawa banyak elemen CLI spesifik platform, dancargo_metadatamau tidak mau membawa banyak hal dari keluargaserde.watchexecmasih bisa diperbaiki: ia bergantung padacommand-groupyang dikelola organisasi yang sama, dan itu secara wajib membutuhkan Tokio. Masalah yang lebih besar adalah sulitnya memperbaiki dependensi berlebihan pada crate lain. Jika ada crate yang terikat padawatchexeclama, kadang masih bisa disesuaikan lewatCargo.lock, tetapi biasanya sulit dan harus diakali dengan[patch]. Akan bagus jika ada cara mudah untuk mendefinisikan “stand-in” sebagai pengganti crate versi tertentu, tetapi bagi package manager yang sudah ada ini tampaknya akan menjadi masalah riset besarRust bukan lagi bahasa baru yang menarik, melainkan sedang memasuki tahap menuju adopsi luas. Melambatnya pengembangan fitur itu wajar dan sehat
Saat ini, kesalahan desain jauh lebih merugikan daripada laju yang lambat. Rust menarik bukan karena fitur-fitur keren, melainkan karena ia merupakan kelas baru bahasa yang memory-safe, tanpa garbage collection, dan siap produksi. Diadopsi secara nyata di tempat-tempat penting lebih menarik daripada membuat bahasanya lebih bagus, dan itu lebih mudah terjadi jika ada kepercayaan bahwa bahasa ini dikelola dengan hati-hati
Spread operator, generator function,
async, arrow function,leftpad,Datebaru, dan daftar fitur pentingnya tidak ada habisnya. JS jauh lebih tua dan jauh lebih banyak digunakan daripada Rust, serta memiliki banyak implementasi produksi, sehingga semua fitur baru harus diimplementasikan secara konsisten. Ada masa stagnasi sekitar ES5, tetapi perbedaannya tampaknya karena komite standar ECMAScript akhirnya sadarKarena Rustacean begitu terobsesi menulis ulang semuanya dalam Rust, saya sungguh mengira tulisan tentang menulis ulang Rust akan menjadi lelucon satir meta
Agak aneh bahwa tulisan ini lebih dulu mengeluhkan pengambilan keputusan yang lambat, lalu menyebutkan deretan fitur yang alasan belum distabilkannya tidak begitu berkaitan dengan pengambilan keputusan
Misalnya, coroutine terhambat karena ada kasus-kasus sudut yang sulit diselesaikan dengan benar. Bukan berarti di dalam compiler sudah ada implementasi lengkap yang “tinggal dinyalakan”, melainkan implementasi yang belum selesai: bekerja dalam banyak kasus, tetapi belum bisa diaktifkan di versi stabil. Function trait juga sudah diputuskan secara eksplisit untuk tidak distabilkan dalam bentuknya sekarang karena berbagai alasan teknis dan interaksi dengan fitur-fitur mendatang. Kalau bisa kembali ke masa lalu, memang ada bagian yang mungkin akan dirancang berbeda, tetapi sebagian besar terkait keputusan pada masa awal Rust ketika tim dan sumber dayanya jauh lebih kecil. Bisa saja ada gagasan bahwa karena sekarang kita bisa membuat pilihan yang lebih baik, sebaiknya dibuat pemutusan ala Rust 2.0, tetapi karena bencana transisi Python 2 ke 3 begitu besar, banyak orang merasa lebih baik menerima sisi-sisi kasarnya. Kalau melihat buletin mingguan Rust, persetujuan RFC dan keputusan stabilisasi diproses setiap minggu. Memang ada kasus yang memakan waktu terlalu lama, tetapi masalah kekurangan orang, koordinasi, dan waktu sering kali lebih sulit diselesaikan daripada masalah teknis
Tulisan ini juga perlu dibaca bersama jawaban Reddit dari Josh Triplett. Salah satu contoh utama dalam tulisan itu, Mutex, memang keliru
https://old.reddit.com/r/rust/comments/1fpomvp/rewriting_rus...
Koreksi: komentar yang sama juga ada di sini
https://news.ycombinator.com/item?id=41655268
Hal pertama yang saya rasakan saat belajar Rust adalah bahwa hampir semua fitur yang bisa dibayangkan sepertinya sudah ada di dalamnya
Bukan berarti tim Rust tidak pernah menolak sesuatu, tetapi orang-orang tetap menginginkan lebih banyak fitur. Sebagian memang beralasan, tetapi sebagian lain tampak seperti fitur yang hanya akan dipakai 2% developer dan hanya dipahami 1% developer, namun dianggap harus dimasukkan ke bahasa. Bahasa yang kompleks tidak perlu menjadi lebih kompleks lagi. Zig lebih sederhana dan mungkin lebih cepat, dan drama komunitasnya juga jauh lebih sedikit. Saya berharap Zig mendapat lebih banyak pendanaan
Rust tidak berusaha memasukkan semua fitur yang mungkin. Namun kalau tidak jelas masalah apa yang diselesaikan oleh sesuatu seperti GAT atau TAIT, memang bisa terasa begitu. Zig mungkin bahasa modern yang bagus, tetapi kalau tujuannya adalah memory safety, itu bukan pilihan
Misalnya, interaksi antara
Pindan future menambahkan kompleksitas yang tidak masuk akal ke bahasa, dan menurut saya sebagian di antaranya tidak perlu. Saya berharap ada bahasa mirip Rust yang sama sekali tidak memilikiPin. Borrow checker juga sepertinya bisa disederhanakan baik dari sisi sintaks maupun implementasi, meski saya belum memikirkannya secara konkret. Sekarang mungkin sulit diubah kecuali dengan mem-fork bahasa, tetapi Rust tidak akan menjadi bahasa terakhir yang memakai borrow checker. Saya berharap generasi berikutnya punya banyak ruang untuk perbaikan tanpa harus membuat bahasa yang lebih besarSaya memang melihat drama terkait Rust, tetapi biasanya datang dari pihak yang menolak penggunaan atau adopsi Rust. Misalnya keributan Rust for Linux baru-baru ini. Sepertinya itu bukan hal yang umum terjadi di dalam komunitas, meski mungkin ada yang saya lewatkan. Zig bagus, tetapi belum siap untuk produksi
Penulis komentar yang ditautkan, setelah menganalisis secara luas primitive sinkronisasi di berbagai bahasa, menulis ulang primitive sinkronisasi Rust seperti
MutexdanRwLockagar langsung memakai primitive OS tingkat bawah di tiap sistem operasi utamaDengan memakai hal seperti
futexdi Linux, ia membuatnya lebih cepat, lebih kecil, dan secara keseluruhan lebih baik; dalam prosesnya, ia praktis juga menulis buku tentang pemrograman paralel Rust. Buku itu juga berguna untuk pemrograman paralel di luar Rusthttps://www.oreilly.com/library/view/rust-atomics-and/978109...
Ia juga bukan sekadar bermain-main di ranah coroutine selama 7 tahun. Ia menambahkan fungsi async, trait yang bisa memuat fungsi async, dan berbagai fitur yang diperlukan untuk menstandarkan
AsyncWritedanAsyncRead; di nightly juga ada implementasi generator. Masih didiskusikan apakah akan menanggung kompleksitas coroutine yang sepenuhnya umum, atau berhenti di generator. Beberapa fitur sepertiAsyncIteratormemang lambat, tetapi ada banyak pekerjaan aktif. Selalu menarik melihat satu pihak mengatakan bahasa ini terlalu lambat, sementara pihak lain mengeluh terlalu cepatTrait fungsi dan effect system juga baru-baru ini mengalami eksplorasi desain besar, dan mereka ingin menemukan solusi agar fungsi tidak perlu ditulis berkali-kali untuk setiap kombinasi
async,try, danconst. Sandboxing crate berbahaya bukan masalah tingkat bahasa; itu memerlukan kombinasi verifier dan sandbox runtime, dan komponen WebAssembly tampak lebih berpotensi. Namun ada banyak minat pada capability waktu kompilasi seperti pilihan allocator atau runtime async, serta asumsi platform 64-bit; sandboxing proc macro diinginkan bukan untuk mencegah niat jahat, melainkan untuk caching yang akuratStruct yang mereferensikan dirinya sendiri bukan masalah sintaks, melainkan masalah yang sangat sulit ditangani borrow checker. Borrow parsial sudah didukung dalam capture closure, tetapi kuncinya adalah bagaimana mempertahankan versioning semantik yang stabil saat diekspos dalam API publik. Opsi seperti “borrow group” bernama tampaknya menjanjikan. Di sisi
comptimejuga sedang ada pekerjaan ke berbagai arah, dan RFC untuk memperkuatmacro_rulesjuga baru-baru ini ditulis.impluntukRangesudah berjalan, dikaitkan dengan perubahan yang tidak kompatibel melalui edition. Penggabunganif letdengan AND logis memiliki fitur unstable dan sudah dekat untuk distabilkan. Ada juga beberapa proposal untuk memperbaiki sintaks akses field pointer, tetapi apakah memperluas permukaan bahasa memberi manfaat atau justru kerugian masih menjadi pertanyaan terbuka. Berkat edition Rust, banyak hal bisa diubah jika desainnya cukup meyakinkan. 700 fitur unstable adalah masalah nyata, sehingga diperlukan pekerjaan besar untuk merapikan fitur-fitur yang kecil kemungkinannya bisa distabilkanMacro yang lebih deklaratif, pendelegasian logika crate
-syske shared library, sertacfg(version)/cfg(accessible)akan sangat mengurangi kebutuhan implementasi oleh pengguna, tetapi runtime tetap tersisa. Semakin dipikirkan, ACL milik cackle tampak seperti cara yang baik dan dapat diperluas untuk melacak pekerjaan di seluruh proc macro, build script, dan kode runtime, serta mengaudit penggunaan dependency tree. Saya dengarcargo-redpenjuga sedang berkembang sebagai alat audit pemanggilan, tetapi saya membayangkan sesuatu di level yang lebih tinggi seperti cacklehttps://github.com/cackle-rs/cackle
Saya paham orang mengeluh bahwa Rust sudah menjadi bahasa besar dan mereka tidak ingin ia makin besar, tetapi mempertahankan implementasi async yang setengah matang saat ini tidak membuat bahasa menjadi lebih kecil atau lebih sederhana. Itu hanya membuat bahasanya menjadi lebih buruk. Untuk borrow parsial juga, akan bagus jika bisa bekerja setidaknya di dalam crate yang sama, meski bukan sebagai API publik. Ini masalah yang terus-menerus ditemui dalam pemrograman nyata. Saya juga bertanya-tanya mengapa sandboxing crate berbahaya mustahil di tingkat bahasa. Jika sebuah fungsi tidak memiliki kode pihak ketiga
unsafedalam call tree dan juga tidak melakukan system call, maka ia hanya bisa menangani argumen yang sudah diberikan, variabel lokal, dan global dalam scope. Jika dinding ini bisa diperkuat dan dipakai sebagai batas keamanan, tampaknya risiko supply chain dependency bisa dikurangi secara besarMisi Rust sejak awal adalah hal sulit: memadukan performa, keamanan, dan daya ekspresi; ketika Mozilla keluar, Rust kehilangan mode pendiri, dan sebagian besar tim inti aslinya juga sudah pergi, jadi tidak mengejutkan jika progresnya melambat
Secara pribadi, saya menganggap itu lebih baik daripada mengambil jalan yang salah
Jika Rust ditulis ulang, rasanya arahnya akan lebih ke mengurangi fitur daripada menambah fitur
Seperti QBE terhadap LLVM, kira-kira menyediakan 70% Rust dengan 10% kode. Mungkin bisa jika macro dan sebagian fitur yang jarang dipakai dihilangkan
https://c9x.me/compile/
Baik untuk Rust maupun yang lain, sulit mengetahui seberapa mungkin itu sebelum benar-benar dicoba