Rust'ı yeniden yazacak olsaydım
(josephg.com)- Rust, bellek güvenliği ve performans, cebirsel tipler ve Cargo'nun avantajlarına rağmen, stable kanalda dil evriminin yavaşlaması nedeniyle “henüz tamamlanmamış bir 1. nesil ürün” gibi hissettirdiği düşüncesinden yola çıkıyor
- Topluluk büyüdükten sonra uzlaşma temelli karar alma bir darboğaz haline geldi ve coroutine gibi, uygulanmış olsa bile stable Rust'ta uzun süre kullanılamayan özellikler birikmeye devam ediyor
- Varsayımsal bir “seph edition”, mevcut Rust ve Cargo ekosistemini korurken breaking change'lere izin vererek effect system, derleme zamanı yetkileri, struct alanı borrow, comptime gibi fikirleri denemeyi amaçlıyor
- Tedarik zinciri riskini azaltmak için dosya yazma, ağ, FFI,
unsafegibi hassas işlevlere capability eklenmeli ve çağıran taraf bunlara açıkça izin vermeli - Önerilerin çoğu mevcut Rust ile uyumlu değil; yalnızca capability eklemek bile semver uyumluluğunu bozan yeni hata koşulları doğurduğu için yeni bir edition veya derleyici fork'u gerekiyor
Rust neden “1. nesil bir ürün” gibi hissettiriyor?
- Rust başlangıçta cebirsel tipler, performans kaybı olmadan bellek güvenliği ve modern bir paket yöneticisi sayesinde son derece çekici bir dil olarak öne çıktı
- Yaklaşık 4 yıl kullandıktan sonra dilin “hep biraz eksik kalmış” bir durumda kaldığı hissi oluşuyor
- Asıl şikayet, stable Rust'a yeni özelliklerin geliş sıklığının azalması ve dilin evrim hızının ciddi biçimde yavaşlaması
- Rust unstable book içinde yaklaşık 700 unstable feature bulunuyor ve bunların önemli bir kısmı standart kütüphane değişikliklerinden oluşuyor
- Coroutines, RFC'si 7 yıllık bir özellik; derleyicide uygulanmış olmasına rağmen stable Rust kullanıcıları hâlâ kullanamıyor
- Rust RFC süreci, iyi fikirlerin uzun süre bekletildiği bir alan gibi görünüyor
Mutexiyileştirmesi tartışması, 25 kişinin 2 yıl boyunca 200'den fazla yorum bırakmasına rağmen belirgin bir sonuca ulaşmayan bir örnek olarak anılıyor
Varsayımsal “seph edition” fikri
- Mevcut Rust kodunu olduğu gibi bırakıp derleyiciyi fork ederek ayrı bir Rust edition olan “seph” ekleme fikri hayal ediliyor
- Bu edition'da breaking change'lere izin verilirken, derleyici ana Rust hattını derlemeye devam edebildiği sürece Cargo'daki mevcut crate'ler kullanılmaya devam edebilir
- Değiştirilmek istenen ana eksenler beş başlıkta toplanıyor
- function trait'leri ve effect system
- derleme zamanı capability
Pin, move ve struct borrow tasarımının yeniden ele alınması- Zig tarzı
comptime - küçük sözdizimi ve standart kütüphane iyileştirmeleri
Function trait'leri ve effect system
- Rust'ta struct'lar için trait'ler var, ancak işlevlere de daha zengin trait/effect tanımları eklenebilmesi gerektiği öneriliyor
- Bir fonksiyonun sahip olabileceği özellikler şöyle sıralanıyor
- panic üretip üretemediği
- sabit stack boyutuna sahip olup olmadığı
- sona kadar çalışıp çalışmadığı,
yieldya daawaityapıp yapmadığı - coroutine ise continuation tipi
- saf fonksiyon olup olmadığı
- dolaylı olarak
unsafekod çalıştırıp çalıştırmadığı - sonlanma garantisi olup olmadığı
- Fonksiyonun parametre ve dönüş tipleri, fonksiyona ait associated type gibi dışa açılırsa, bugün stable Rust'ta mümkün olmayan tip başvuruları mümkün hale gelebilir
- Örnek olarak
some_iter::Outputbenzeri şekilde fonksiyonun dönüş tipine doğrudan ad verip struct alanına koyan bir kod gösteriliyor - Linux kernel'de olduğu gibi belirli kod bloklarının asla panic etmeyeceğinin garanti edilmesi gerektiğinde,
#[disallow(Panic)]benzeri bir işaretle özyinelemeli çağrılar dahil panic olasılığı denetlenebilir - Derleyici zaten
Fn,FnOnce,FnMutgibi fonksiyonla ilgili trait'leri ele alıyor, ancak mevcut yapının fazlasıyla yetersiz olduğu savunuluyor - Daha ayrıntılı referans olarak Yoshua Wuyts'nin effect system yazısı ve sunumu bağlantısı veriliyor
Derleme zamanı capability ile tedarik zinciri riskini azaltmak
- Çoğu Rust projesi çok sayıda üçüncü taraf crate kullanıyor ve küçük utility crate'ler bile kötü niyetli güncellemeler yoluyla tedarik zinciri riski yaratabiliyor
- Bellek güvenliğinde
unsafenasıl açık bir opt-in ise, dosya sistemi, ağ, FFI ve raw pointer ile ilgili hassas işlevler de açıkça izin verilmesi gereken alanlar olmalı - Standart kütüphanedeki güvenlik açısından hassas fonksiyonlara marker tag eklenmesi öneriliyor
- Örn:
std::fs::write(path, contents), rastgele bir yola dosya yazabildiği için#[cap(fs_write)]benzeri bir etiket taşır - Derleyici bu fonksiyonu çağıran tüm call tree'yi otomatik olarak taint eder
- Örn:
- Bir üçüncü taraf crate
fs_writecapability'sine ihtiyaç duyuyorsa, çağıran taraf bunuCargo.tomliçinde veya çağrı noktasındaki annotation ile açıkça izinli hale getirmelidir - İzin verilmezse derleyici,
foo::do_stuff()işlevinin yerel dosya sistemine yazdığını ancakfoocrate'ine ilgili capability için güvenilmediğini belirten bir hata verebilir human-sizeveyaserdegibi pek çok utility crate özel capability gerektirmez; bu yüzden yazarı kötü niyetli kod eklese bile dosya yazma ya da ağ davranışı derleme aşamasında engellenebilir- Alternatif olarak hassas API'lerin ayrı bir
Capabilityparametresi alacak şekilde değiştirilmesi de düşünülüyor- Örn:
std::fs::write, birFsWriteCapabilitydeğeri gerektirir Capabilitynesnesinin oluşturulması yalnızca root crate ile sınırlandırılır
- Örn:
- Bu yaklaşım boilerplate'i artırır ama daha esnektir; ayrıca
build.rsbetikleri veunsafeblock'ları için de benzer bir ele alış gerekir crates.iohack'lenipserdeiçine cryptolocker kodu eklense bile, capability yaklaşımında bu kod çeşitli geliştirici makinelerinde çalışmadan veya binary içine girmeden önce derleme hatası üretir
Pin, move ve struct borrow'un yeniden tasarlanması
Pin, borrow checker'daki boşlukları aşmak için kullanılan karmaşık bir hack olarak görülüyor ve geriye dönük uyumluluğu koruma çabasının ürettiği bir band-aid olarak değerlendiriliyor- Aslında gereken şeyin, taşınabilir tipleri işaretleyen bir
Movemarker trait'ine daha yakın olduğu savunuluyor - Bugünkü Rust'ta
Pintrait'i yok; bunun yerineUnpinve!Unpinvar ve bu çifte olumsuz yapı kavramı daha da zorlaştırıyor Pinyalnızca referans tiplerine uygulanabildiği için her yerdeBoxile sarmalanmış kodlar ortaya çıkıyor eleştirisi yapılıyor- Örnek olarak Tokio stream wrapper,
ouroboros,async-trait,self_cellgibi helper library'lere bağlantı veriliyor
- Örnek olarak Tokio stream wrapper,
Future::poll(self: Pin<&mut Self>, ..)gibi pinned değer alan fonksiyonlar da karmaşıklaşıyor ve projection ile uğraşmak için ayrı crate'ler gerekiyor- Fonksiyon içinde borrow checker değişkenleri “owned”, “borrowed”, “mutably borrowed” durumlarıyla takip ediyor, ancak bu durumlar programcıya doğrudan görünmüyor
async fn, duraklama durumunu saklamak için derleyicinin gizli bir struct üretmesine yol açıyor; bu sırada bir alanın başka bir alanı borrow etmesi gibi durumlar oluşabiliyor- Rust'ta bir struct alanının borrowed state'te olduğunu ifade edecek sözdizimi yok ve alanlar arası lifetime da doğrudan ifade edilemiyor
- Önerilen yön, borrow checker'ı genişleterek struct alanı borrow ifadesinin doğrudan yazılabilmesini sağlamak
- Örn:
y: &'Self::x Vec<usize>gibi bir “local borrow” sözdizimi - Derleyici
x'in borrow edildiğini bilir ve fonksiyon içindeki borrowed değişkenlerdekiyle aynı kısıtları uygular
- Örn:
- Bu sözdizimi, self-referential struct'lar veya
source: Stringileast_nodes: Vec<&'Self::source str>biçimindeki AST yapıları için de kullanılabilir - Borrow edilmiş alan içeren struct'lar taşınamaz olacağı için
Moveuygulamaz; daha ileri bir adım olarak kendini güvenle taşıyabilen birMovertrait'i de düşünülebilir
Zig tarzı comptime ve Rust macro sorunu
- Rust derleyicisi fiilen Rust, Rust macro dili ve proc macro dahil birden çok dili birlikte ele alan bir yapı gibi görünüyor
- Temel eleştiri, Rust'ın kendisinin iyi ama macro dilinin iyi olmaması
- Zig'in comptime yaklaşımı, derleyicinin küçük bir interpreter ile kodun bir kısmını derleme zamanında çalıştırmasına dayanıyor
- Fonksiyonlar, parametreler,
ifve loop'lar derleme zamanı kodu olarak işaretlenebiliyor; non-comptime kod ise gerçek programa emit ediliyor - Zig'in
std printcase study örneğinde, format string comptime parametresi olarak alınıyor vecomptimeloop içinde parse edilerek çıktı kodu üretiliyor - Rust'taki
println!()uygulamasıformat_args_nlgibi iç fonksiyonları çağırıyor ve bunun derleyiciye hardcode edildiği tahmin ediliyor - Hatta Rust derleyicisini yazanların bile Rust macro dilini kullanmak istemiyor gibi göründüğü eleştirisi yapılıyor
Sözdizimi ve standart kütüphanede küçük değişiklik önerileri
Range<T>tipininT: CopyolduğundaCopyuygulamasıyla ilgili sorununu düzeltme isteği var- associated type içeren derive sorunu da düzeltilmesi istenen konular arasında
- İlgili issue: derive with associated types
- Örnek: Playground
if letifadesinin logical AND desteklemesi gerektiği öneriliyor- İstenen biçim:
if let Some(x) = some_var && some_expr { } - Mevcut dolaylı çözüm
(some_var, check_foo())tuple matching, ancaksome_varNoneolsa bilecheck_foo()çalıştığı için normalifshort-circuit davranışıyla aynı değil - Örnek: Playground
- İstenen biçim:
- raw pointer ergonomics de iyileştirilmesi gereken alanlardan biri olarak anılıyor
- Referanslarda
myref.xyazılabilirken pointer'larda(*myptr).xveya(*(*myptr).p).yyazmak gerekiyor - Görüşe göre
unsafekod mümkün olduğunca kolay okunur ve yazılır olmalı
- Referanslarda
- built-in collection type'ların küresel allocator yerine kurucuda
Allocator'ı açıkça alacak şekilde değiştirilmesi öneriliyor asynciçin de iyileştirmeler gerektiği, ancak bunun ayrı bir yazı gerektirecek kadar geniş bir konu olduğu belirtiliyor
Uyumluluk ve uygulanabilirlik
- Önerilerin çoğu mevcut Rust ile uyumlu değil
- Güvenlik capability'lerinin eklenmesi bile crate'ler için semver uyumluluğunu bozan yeni türde hata koşulları yarattığından yeni bir Rust edition gerektiriyor
- Birkaç yıl önce olsa RFC yazılabileceği, ancak uzun GitHub RFC yorum süreçlerinden geçip bir başka hayata geçmemiş fikir haline gelmekten kaçınılmak istendiği söyleniyor
- Sonunda düşünce yine derleyiciyi bizzat fork etme fikrine dönüyor, ancak yapılması gereken çok fazla proje olduğu için bunun önünde gerçekçi kısıtlar bulunduğu kabul ediliyor
1 yorum
Hacker News yorumları
Rust RFC sürecinin iyi fikirlerin mezarlığı olduğu söylenir ama bunun aksine, Rust çekirdek ekibinin programlama diline yeni özellik eklemeyi zorlaştırmasının doğru yönde olduğunu düşünüyorum
Dilin yüzeyinin şişkin, tutarsız ve öngörülemez hale gelmesi engellenmeli. Swift’i de başta sevmiştim, ama
isMultiple(of:)gibi mükerrer fonksiyon adları, SwiftUI için süslü parantez ayrıştırma kuralları, referans/değer tipi ve değiştirilebilirlik kuralları, closure argümanları için kısa gösterimler derken bunlar sürekli arttı ve sonunda vazgeçtim. İyi fikirler bol; Rust’ın mümkün olduğunca yalın kalmasını isterimÖrneğin
impl Traitdöndüren fonksiyonlar kullanılabiliyor ve struct’lar rastgele alanlara sahip olabiliyor, amaimpl Traitile döndürülen bir değeri bir struct alanına koyamıyorsunuz. Çünkü tipe ad veremiyorsunuz.if a && bveif let Some(x) = xçalışıyor, amaif let Some(x) = x && bçalışmıyor. Bunların düzeltilmesini isterim. Derleyici kod satırı sayısı açısından Rust büyür; ama öğrenme ve kullanım karmaşıklığı açısından bu tür özellik boşlukları dili aslında daha karmaşık hale getiriyor.Pin’i standart kütüphanede uygulamak büyük bir iş değildi, ama hiç de yalın bir özellik değil ve bilişsel yükü muazzam. Basit bir derleyici ve kullanması zor bir dil yerine, karmaşık bir ödünç alma denetleyicisi ve okunması kolay Rust kodu bana daha iyi geliyorBekleyen fikirlerin %100’ü kabul edilip eninde sonunda üzerinde çalışılsa bile, içeri girme hızıyla dışarı çıkma hızı arasındaki fark yüzünden böyle görünür. RFC yazarlarının önüne geçmek istiyorsanız RFC yazmak yerine, belgeleri ve testleriyle birlikte üretime hazır bir uygulama yapıp ağaca temiz biçimde birleştirilebilir hale getirmek daha iyi olur
Ne başka bir tipin const generic’i olarak ne de dizi uzunluğu olarak kullanılabiliyorlar. Sadece bir değere ihtiyacınız varsa bir fonksiyon tanımlayıp döndürebilirsiniz; dolayısıyla şu an pek işe yaramıyorlar. Düzgün desteklenirse kriptografi kütüphanelerindeki
generic_array,typenumgibi yardımcı crate’ler ortadan kalkabilir. Yine de Rust ekibinin özellik eklerken temkinli olması gerektiğine katılıyorumBağımlılık durumu oldukça ciddi, ama bunu kabul etmeye pek istekli olan yok gibi görünüyor. Yakın zamanda gördüğüm örnek cargo-watch crate’i
Özünde dosya değişikliklerini izleyip derleyiciyi yeniden çalıştıran basit bir uygulama ve implementasyonu 1.000 satır bile değil. Ama bağımlılıkları vendoring yaparsanız, 8.000’den fazla dosyaya yayılmış Rust kodu neredeyse 4 milyon satıra çıkıyor. Basit bir dosya izleyici için fazla
https://crates.io/crates/cargo-watch
C/C++, yaygın kullanılan diller arasında npm tarzı bir paket yöneticisinin popüler olmadığı neredeyse tek örnek; bu yüzden çoğu kütüphane kendi kendine yeterli ya da az ve çoğunlukla isteğe bağlı bağımlılığa sahip.
efsw, bağımlılığı olmayan 7.000 satırlık bir C++ dosya sistemi izleyicisi. Oyun programlama tarafındaki tek header’lı kütüphaneler olanstb_*,cgltfve Dear ImGui, kullandıklarım arasında en rahat olanlardı. Yeni bir paket yöneticisinde geçişli bağımlılık yasağının genel olarak faydalı olabileceğini düşünüyorum. Büyük kütüphane bağımlılıkları kullanıcıya doğrudan kurdurulabilir, callback sağlanabilir ya da standart özellik hâline getirilebilirhttps://github.com/SpartanJ/efsw
https://github.com/nothings/stb
https://github.com/jkuhlmann/cgltf
https://github.com/ocornut/imgui
Dosya izleyicilerin, özellikle birden fazla platform destekliyorsa, hiç de basit olmadığını düşünüyorum
cargo watch’ın bir kısmı Win32 API wrapper kütüphanesini getiriyor; bu, Win32 çağrıları için otomatik üretilmiş binding’ler olduğundan devasa olmak zorunda. Çoğu dilin standart kütüphanesi de milyonlarca satırdır ve uygulama bunun yalnızca bir kısmını kullanır. C++’taki Boost da canavar gibi büyük, ama geliştiriciler yalnızca bazı uzantılarını alıp kullanıyor. HattaisOddya dais evengibi tek bir paketin ekosistemi bozabildiği npm tarzı cehennem yerine, birçok kişinin bakımını yaptığı ve bağımlı olduğu daha az sayıda büyük bağımlılık daha iyi; Rust da genel olarak buna daha yakıncargo-watch’ın bağımlılıklarının çoğuclap,cargo_metadata,watchexecadlı üç doğrudan gereksinimden geliyor gibi.clapplatforma özgü birçok CLI öğesini içeri çekiyor,cargo_metadataise kaçınılmaz olarakserdeailesinden çok şey getiriyor.watchexectarafında iyileştirme alanı var: aynı organizasyonun yönettiğicommand-group’a bağımlı ve bu da koşulsuz olarak Tokio gerektiriyor. Daha büyük sorun, başka crate’lerin aşırı bağımlılıklarını kolayca düzeltememek. Eski birwatchexec’e bağlı bir crate varsa bunuCargo.lockayarıyla uydurabildiğiniz durumlar olabilir, ama genelde zor ve[patch]ile etrafından dolaşmak gerekir. Belirli bir crate sürümünün yerine geçecek bir “stand-in”i kolayca tanımlamanın bir yolu olsa iyi olurdu; ancak mevcut paket yöneticileri için büyük bir araştırma problemi gibi duruyorRust artık ilginç ve yeni bir dil değil; geniş çaplı benimsenmeye doğru ilerleyen bir aşamada. Özellik geliştirmesinin yavaşlaması doğal ve sağlıklı
Şu anda tasarım hataları düşük hızdan çok daha zararlı. Rust’ı ilginç kılan şey havalı özellikleri değil; bellek güvenli, garbage collection’sız ve production’a hazır yeni bir dil sınıfı olması. Önemli yerlerde fiilen benimsenmesi, dili daha iyi yapmaktan daha ilginç; bunun kolaylaşması için de dikkatli yönetildiğine dair güven gerekiyor
Spread operatörü, generator fonksiyonları,
async, arrow function’lar,leftpad, yeniDatevb. önemli özelliklerin listesi bitmiyor. JS, Rust’tan çok daha eski ve çok daha yaygın kullanılıyor; ayrıca birden fazla production implementasyonu var, dolayısıyla yeni özelliklerin hepsini uyumlu biçimde uygulamaları gerekiyor. ES5 civarında bir duraklama dönemi vardı, ama fark ECMAScript standart komitesinin aklını başına toplamasında gibi görünüyorRustacean’ların her şeyi Rust ile yeniden yazma konusunda takıntılı olması yüzünden, Rust’ı yeniden yazmakla ilgili bir yazının meta hiciv şakası olacağını gerçekten düşünmüştüm
Önce yavaş karar alma süreçlerinden şikâyet edip, sonra da kararlı hale gelmeme nedenleri karar alma ile pek ilgisi olmayan özellikleri sıralaması biraz tuhaf
Örneğin coroutine'ler, düzgün çözülmesi zor uç durumlar olduğu için takılmış durumda. Derleyicinin içinde “sadece açınca çalışan” tamamlanmış bir uygulama yok; birçok durumda çalışan ama kararlı sürümde etkinleştirilemeyecek tamamlanmamış bir uygulama var. Fonksiyon trait’leri de çeşitli teknik nedenler ve gelecekteki özelliklerle etkileşimleri yüzünden mevcut halleriyle kararlı hale getirilmemesine açıkça karar verilmiş durumda. Geçmişe dönülse farklı tasarlanacak kısımlar olabilir, ama çoğu, Rust’ın ilk dönemlerinde ekip ve kaynakların çok daha küçük olduğu zamanlarda alınan kararlarla ilgili. Bugün daha iyi seçimler yapılabilir diye Rust 2.0 tarzı bir kopuş yaratma fikri de düşünülebilir; ancak Python 2’den 3’e geçişteki felaket çok büyük olduğu için birçok kişi pürüzlü kenarlara katlanmanın daha iyi olduğunu düşünüyor. Rust haftalık bültenine bakarsanız RFC onayları ve kararlı hale getirme kararları her hafta işleniyor. Çok uzun süren durumlar elbette var, ama insan, koordinasyon ve zaman eksikliği sorunlarını çözmek çoğu zaman teknik sorunları çözmekten daha zor
Bu yazı, Josh Triplett’in Reddit yanıtıyla birlikte okunmalı. Yazıdaki temel örneklerden biri olan Mutex basbayağı yanlış
https://old.reddit.com/r/rust/comments/1fpomvp/rewriting_rus...
Düzeltme: Aynı yorum burada da var
https://news.ycombinator.com/item?id=41655268
Rust’ı öğrenirken ilk hissettiğim şey, hayal edilebilecek neredeyse her özelliğin zaten içinde varmış gibi görünmesiydi
Bu, Rust ekibinin hiçbir şeyi reddetmediği anlamına gelmiyor; ama yine de insanlar daha fazla özellik istiyor. Bazıları haklı olabilir, ama bazıları geliştiricilerin %2’sinin kullanacağı bir özelliğin, geliştiricilerin yalnızca %1’inin anladığı bir dile mutlaka eklenmesi gerektiği gibi görünüyor. Karmaşık bir dilin daha da karmaşık hale gelmesine gerek yok. Zig daha basit ve muhtemelen daha hızlı; topluluk dramı da çok daha az. Zig’e daha fazla fon gitmesini isterim
Rust mümkün olan her özelliği eklemeye çalışmıyor. Ancak GAT veya TAIT gibi şeylerin hangi sorunu çözdüğünü net bilmiyorsanız böyle hissedilebilir. Zig iyi ve modern bir dil olabilir, ama hedefiniz bellek güvenliği ise bir seçenek değil
Örneğin
Pinile future’ların etkileşimi dile akıl almaz bir karmaşıklık ekliyor ve bunun bir kısmının gereksiz olduğunu düşünüyorum.Pin’in hiç olmadığı Rust benzeri bir dil olmasını isterdim. Ödünç alma denetleyicisini de hem sözdizimi hem uygulama tarafında basitleştirmenin yolları olabilir gibi geliyor, ama henüz somut olarak düşünmedim. Şimdilik dili fork’lamadıkça bunu değiştirmek zor olur; ancak ödünç alma denetleyicisi kullanan son dil Rust olmayacak. Bir sonraki nesilde daha büyük bir dil yaratmadan da iyileştirme için çok yer olacağını umuyorumRust ile ilgili dram görüyorum, ama genelde Rust’ın kullanımına veya benimsenmesine direnen taraftan çıkıyor. Yakın zamandaki Rust for Linux gürültüsü gibi. Topluluk içinde yaygın bir şey gibi görünmüyor; belki kaçırdığım bir şey vardır. Zig harika, ama henüz prodüksiyona hazır değil
Bağlantısı verilen yorumun yazarı, çeşitli dillerdeki senkronizasyon temel öğelerini kapsamlı biçimde analiz ettikten sonra Rust’ın
MutexveRwLockgibi senkronizasyon temel öğelerini, her büyük işletim sisteminde alttaki OS primitive’lerini doğrudan kullanacak şekilde yeniden yazmışLinux’taki
futexgibi şeyleri kullanarak bunları daha hızlı, daha küçük ve genel olarak daha iyi hale getirmiş; bu süreçte fiilen Rust paralel programlama kitabını da yazmış. Rust dışındaki paralel programlama için de faydalıhttps://www.oreilly.com/library/view/rust-atomics-and/978109...
7 yıl boyunca coroutine tarafında sadece oyalanmış da değiller. Async fonksiyonlar, async fonksiyonlar içerebilen trait’ler,
AsyncWriteveAsyncReadstandartlaştırması için gereken çeşitli özellikler eklediler; nightly’de generator uygulaması da var. Tam anlamıyla genel coroutine’lerin karmaşıklığını üstlenip üstlenmemek ya da generator’larda durmak da tartışılıyor.AsyncIteratorgibi bazı özellikler yavaş ilerliyor ama aktif çalışma da çok. Bir tarafta dilin fazla yavaş olduğunu, diğer tarafta fazla hızlı olduğunu söyleyip şikâyet edilmesi her zaman ilginçFunction trait’leri ve effect system konusunda da yakın zamanda büyük tasarım keşifleri yapıldı;
async,try,constkombinasyonlarının her biri için fonksiyonları tekrar tekrar yazdırmayacak bir çözüm üretmek istiyorlar. Kötü niyetli crate’leri sandbox’a almak dil düzeyinde bir mesele değil; doğrulayıcı ile runtime sandbox kombinasyonu gerektiriyor ve WebAssembly component’leri daha olası görünüyor. Buna karşın allocator veya async runtime seçimi, 64-bit platform varsayımı gibi derleme zamanı capability’lerine çok ilgi var; proc macro sandboxing’i ise kötü niyeti önlemek için değil, doğru caching için istiyorlarKendine referans veren struct’lar bir sözdizimi sorunu değil, borrow checker’ın işlemesi çok zor olan bir sorun. Kısmi ödünç alma closure capture’da zaten destekleniyor; ancak bunu public API’ye açarken kararlı semantik sürümlemeyi nasıl koruyacağımız kilit nokta. İsimli “borrow group” gibi yaklaşımlar güçlü aday.
comptimetarafında da çeşitli yönlerde çalışmalar sürüyor vemacro_rules’u güçlendiren bir RFC de yakın zamanda yazıldı.Rangeiçinimpl, edition üzerinden uyumsuz değişiklikle birlikte zaten ilerliyor.if letile mantıksal AND birleşimi için unstable bir özellik var ve stabilize edilmeye yakın. Pointer field erişim sözdizimini iyileştirmeye yönelik birkaç öneri de vardı; ancak dil yüzeyini daha da büyütmenin kazanç mı kayıp mı olduğu açık bir soru. Rust edition’ları sayesinde, yeterince ikna edici bir tasarım varsa değiştirilebilecek çok şey var. 700 unstable özellik gerçek bir sorun; stabilize edilme olasılığı düşük olanları temizlemek için büyük bir çalışma gerekiyorDaha deklaratif macro’lar,
-syscrate mantığının paylaşımlı kütüphanelere devredilmesi,cfg(version)/cfg(accessible)kullanıcı tarafında implementasyon ihtiyacını epey azaltacaktır; ancak runtime yine de kalır. Üzerinde düşündükçe cackle’ın ACL’i, proc macro, build script ve runtime kodunun tamamında işlemleri izlemek ve dependency tree kullanımını denetlemek için ölçeklenebilir bir yöntem olarak iyi görünüyor.cargo-redpen’in de çağrı denetim aracı olarak gelişmekte olduğunu duydum ama cackle gibi daha yüksek bir seviyeyi hayal ediyorumhttps://github.com/cackle-rs/cackle
İnsanların Rust’ın büyük bir dil olduğundan ve daha da büyümesini istemediklerinden şikâyet etmesini anlıyorum; ama mevcut yarı pişmiş async implementasyonunu korumak dili daha küçük ya da daha basit yapmıyor. Sadece dili daha kötü yapıyor. Kısmi ödünç alma public API’de değilse bile en azından aynı crate içinde çalışsa iyi olurdu. Gerçek programlama sırasında sürekli karşılaşılan bir sorun. Kötü niyetli crate sandboxing’inin neden dil düzeyinde imkânsız olduğu da benim için soru işareti. Çağrı ağacında
unsafeüçüncü taraf kodu olmayan ve sistem çağrısı da yapmayan bir fonksiyon, zaten yalnızca kendisine iletilmiş argümanlarla, yerel değişkenlerle ve scope içindeki global’lerle uğraşabilir. Bu duvar güçlendirilip bir güvenlik sınırı olarak kullanılabilirse, dependency supply chain riskini ciddi ölçüde azaltabilir gibi görünüyorRust’ın görevi en başından beri performans, güvenlik ve ifade gücünü birleştiren zor bir işti; Mozilla’nın çekilmesiyle kurucu modunu kaybetti ve ilk çekirdek ekibin de çoğu ayrıldı, bu yüzden ilerlemenin yavaşlaması şaşırtıcı değil
Kişisel olarak bunun yanlış yola sapmaktan daha iyi olduğunu düşünüyorum
Rust’ı yeniden yazsaydım, daha fazla özellik eklemekten çok azaltma yönüne giderdim
QBE’nin LLVM’e karşı yaptığı gibi, kodun %10’uyla Rust’ın %70’ini sunmak gibi. Macro’lar ve nadiren kullanılan bazı özellikler çıkarılırsa belki mümkün olabilir
https://c9x.me/compile/
Rust ya da başka bir şey için, gerçekten denemeden bunun ne kadar mümkün olduğunu bilmek zor