Solidity derleyici v0.8.22'nin en son sürümü yayınlandı. 0.8.22 derleyicisi, dosya düzeyinde olay tanımları, denetlenmeyen döngülerin artımlı optimizasyonu, EVM derleme JSON'unu içe aktarma desteği ve daha fazlası gibi bir dizi dil ve derleyici iyileştirmesi içerir.
ÖNEMLİ
Bu sürüm, bakımı giderek zorlaşan Konstantinopolis'in (Konstantinopolis) altındaki EVM'ler için desteği kullanımdan kaldırıyor. Bu arkaik sürümler Ethereum ana ağında ve test ağında uzun süredir kullanılmıyor ve artık diğer ağlarla da alakalı olmadıklarından şüpheleniyoruz. Karmaşık kod yolları ve çözümleri, yeni sürümler için özellik geliştirmeyi ve test etmeyi yavaşlatır, bu nedenle gelecekteki derleyici sürümlerinde bunları desteklemeyi durdurmayı umuyoruz. Bu EVM sürümleri için desteğe güveniyorsanız, lütfen bizimle iletişime geçin[6] 。
Yeni özelliklerin öne çıkması
denetlenmemiş döngü artışı
Döngü sayacını artırırken kontrolsüz aritmetik kullanımı gaz optimizasyonu içindir[7] yaygın uygulama. Aşağıdaki bir döngü ve sayaç i örneğiyle açıklayalım:
for (uint i = 0; i < array.length; ++i) {
acc += dizi[i] ; i, döngü gövdesi tarafından değiştirilmez
}
Çoğu durumda (aşağıdaki tam koşullara bakın), karşılaştırma işlemi, türünün maksimum değerine asla ulaşmamamı sağlayacaktır, bu nedenle döngünün maksimum değere ulaşılmadan önce duracağını varsaymak güvenlidir. Bu durumda, sayacın güvenlik kontrolü gereksiz ve gaz israfı olacaktır. Bu, kullanıcıyı, sayacı döngü içindeki kontrolsüz bir aritmetik bloğa artımlı olarak saran ve kontrolü atlayan uzun işaretsiz deseni kullanmaya teşvik eder:
for (uint i = 0; i < array.length;) {
acc += dizi[i] ;
unchecked { i++; } // i taşma kontrolleri olmadan artırılır -- daha az gaz kullanılır
}
Solidity 0.8.22, döngü sayacı için otomatik olarak kontrol edilmemiş bir aritmetik artış oluşturan bir taşma denetimi optimizasyonu sunar. Bu yeni iyileştirme, önceki örnekte olduğu gibi döngü gövdelerinde uzun, denetlenmeyen bir delta deseni kullanma gereksinimini ortadan kaldırır.
Buna karşılık, yeni optimizasyonlar, kullanıcıların gaz verimliliğinden ödün vermeden ham, daha okunabilir koda dönmelerini sağlar.
Yeni optimize edilmiş dökülme önleme kontrolü için kesin koşullar aşağıdaki gibidir:
Çevrim koşulları i < şeklindedir ... Burada i yerel bir değişkendir (bundan böyle "döngü sayacı" olarak anılacaktır).
Bu karşılaştırma, döngü sayacı ile aynı tipte yapılmalıdır, yani sağdaki tür, döngü sayacının karşılaştırmadan önce örtük olarak genişletilmemesi için örtük olarak döngü sayacının türüne dönüştürülmelidir.
Döngü sayacı, yerleşik tamsayı türünde yerel bir değişken olmalıdır.
Döngü ifadesi, döngü sayacı için bir önek veya sonek artışı, i++ veya ++i olmalıdır.
Döngü sayacı, bir döngü durumunda veya bir döngü gövdesinde değiştirilemez.
İkinci koşulu açıklığa kavuşturmak için aşağıdaki kod parçacığını göz önünde bulundurun:
for (uint8 i = 0; < UINT16(1000); ++I) {
döngü gövdesi
}
Bu durumda, i karşılaştırmadan önce uint16'ya dönüştürülür ve koşul hiçbir zaman aslında yanlış değildir, bu nedenle artımlı taşma denetimi kaldırılamaz.
Ayrıca, <'in optimizasyonu tetikleyen tek karşılaştırma operatörü olduğunu unutmayın. <= operatörü ve diğer operatörler kasıtlı olarak hariç tutulmuştur. Ek olarak, operatör yerleşik olmalıdır - kullanıcı tanımlı < uygun değildir.
Optimizasyon basittir ve her zaman faydalıdır, bu nedenle optimize edicinin geri kalanı ortak ayar settings.optimizer.enabled kullanılarak devre dışı bırakılsa bile etkinleştirilecektir. Standart JSON girişinde settings.optimizer.details.simpleCounterForLoopUncheckedIncrement değerini false olarak ayarlayarak bunu açıkça kapatabilirsiniz. Komut satırı arayüzü kullanılarak devre dışı bırakılamaz.
Sıfır değişmez değerleri yeniden oluşturmak için Yul iyileştiricisini ayarlayın
Yeni sürüm, 0.8.20 sürümünde tanıtılan PUSH0 işlem kodu desteğini yeniden geliştirerek, Yeniden Materyalleştirici eklenerek oluşturulur[8] [9] İyileştirme adımı, sıfır değişmez değerini değişken bir referans olarak depolamak yerine her zaman yeniden oluşturacak şekilde genişletilir ve gaz maliyetlerini azaltmak için DUP yerine PUSH0'ın kullanılmasına izin verilir. Bunun etkili bir şekilde yapılmasını sağlamak için, Rematerializer ve UnusedPruner eklenir Adımlar, Yul iyileştiricinin varsayılan temizleme sırasına eklenir.
EVM derlemesi JSON'u içe aktarma desteği ekleyin (deneysel)
Bu yeni sürüm, EVM derlemelerini içe aktarmak için deneysel destek ekleyerek, harici araçların bayt kodu oluşturmadan önce süper optimizasyonlar gerçekleştirme olasılığını açar. Bu özelliğin temel amacı, derleyici tarafından oluşturulan derlemelerin dışa aktarılabilmesi, değiştirilebilmesi ve yeniden içe aktarılabilmesi ve böylece normal derleme işlemine devam edilebilmesi için düşük seviyeli EVM derlemeleri için bir serileştirme biçimi tanımlamaktır.
Önemli: Bu deneysel bir özelliktir ve şu anda üretimde mevcut değildir. Deneyebilmeniz ve geri bildirim sağlayabilmeniz için bu özelliği bu sürümde sunuyoruz.
Olayların dosya düzeyinde tanımlanmasına izin verir
Solidity 0.8.22, olayları dosya düzeyinde tanımlamanıza izin verir. Olay tanımları artık sözleşme kapsamı dışına yerleştirilebilir. Bu, bir kitaplıktaki olayları yapay olarak kaydırmak zorunda kalmadan kod organizasyonu için başka bir seçenek sunar.
Ayrıca bu sürüm, kod için harici bir sözleşmede veya arabirimde tanımlanan bir olayı yayarken NatSpec oluşturulurken hataya neden olan bir hatayı düzeltir. Önceki sürümde (0.8.21), Solidity derleyicisi, mevcut sözleşmeden devralınmayan sözleşmelerde ve arayüzlerde tanımlanan olaylara kısıtlı erişim için destek ekledi, ancak hata özelliğin tam olarak kullanılmasını engelledi.
Bu hata düzeltmesi ve dosya seviyesinde olay tanımlarına izin vermesiyle, Solidity'nin en son sürümü, kullanıcıların aşağıdaki örnekleri hatasız bir şekilde derlemesini sağlar:
arayüz I {
olay ForeignEvent();
}
sözleşme C {
olay ForeignEvent();
}
olay E();
sözleşme D {
fonksiyon f() public {
Yabancı bir olay yaymak, 0.8.21'de bir iç hatayı tetikler
I.ForeignEvent();
C.ForeignEvent() yayar;
Dosya düzeyinde bir olay yayma. Yeni özellik.
E() yayar;
}
}
Tam değişiklik günlüğü
Dil özellikleri
Olayların dosya düzeyinde tanımlanmasına izin verir.
Derleyici özellikleri
Kod oluşturucu: count değişkeni taşmadığında bazı for döngüleri için gereksiz taşma kontrollerini kaldırın.
Komut Satırı Arayüzü: Derleyicinin CLI veya standart JSON girişinde açıkça verilmeyen kaynak dosyaları yüklemesini önlemek için --no-import-callback seçeneği eklendi.
Komut Satırı Arayüzü: EVM derlemelerini --asm-json tarafından kullanılan biçimde içe aktarmak için deneysel bir --import-asm-json seçeneği eklendi.
Komut Satırı Arabirimi: Derlenmiş işlem hattının dışında oluşturulan hata iletileri için uygun önem derecesini ve renklendirmeyi kullanın.
EVM: "Homestead", "tangerineWhistle", "spuriousDragon" ve "byzantium" EVM sürümleri için kullanımdan kaldırıldı.
Ayrıştırıcı: Deneysel hata kurtarma modunu kaldırın (--error-recovery/settings.parserErrorRecovery).
Yul Optimizer: PUSH0 destekleniyorsa, değişkenlerde sıfır değerleri depolamak yerine sıfır değişmez değer kullanmayı tercih eder.
Yul Optimizer: Varsayılan temizleme dizisinin sonunda Rematerializer ve UnusedPruner adımlarını çalıştırır.
Hata düzeltmeleri
Kod Oluşturucu: IR kod oluşturucu aracılığıyla çıktının, içe aktarma geri aramalarında bulunan dosyalara bağlı olması sorunu düzeltildi. Bazı durumlarda, farklı AST ID atamaları, dahili zamanlamadaki işlevlerin sırasını değiştirebilir ve bu da görünüşte farklı ancak anlamsal olarak eşdeğer bayt kodlarına neden olabilir.
NatSpec: Harici bir sözleşmede veya arayüzde tanımlanan bir olayı yayan bir sözleşme için kullanıcı belgeleri veya geliştirme belgeleri istenirken dahili bir hata düzeltildi.
SMTChecker: Tamamlandıktan sonra döngünün genişlemesine neden olan bir kodlama hatası düzeltildi.
SMTChecker: Bir durum kontrolünden önce bir süre veya for döngüsü çözüldüğünde sabit durum kontrollerindeki tutarsızlıklar düzeltildi.
Yul Optimizer: ÖAM sırasında derleyici tarafından oluşturulan Yul değişken adlarının değiştirme kararlarını etkilemesi ve bazı durumlarda farklı (ancak eşdeğer) bayt koduyla sonuçlanması sorunu düzeltildi.
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Ethereum'un en popüler akıllı sözleşme geliştirme dili olan Solidity'nin yeni bir sürümü yayınlandı
Derleme: Çeviri planı; Kaynak: soliditylang.org
Solidity derleyici v0.8.22'nin en son sürümü yayınlandı. 0.8.22 derleyicisi, dosya düzeyinde olay tanımları, denetlenmeyen döngülerin artımlı optimizasyonu, EVM derleme JSON'unu içe aktarma desteği ve daha fazlası gibi bir dizi dil ve derleyici iyileştirmesi içerir.
ÖNEMLİ
Bu sürüm, bakımı giderek zorlaşan Konstantinopolis'in (Konstantinopolis) altındaki EVM'ler için desteği kullanımdan kaldırıyor. Bu arkaik sürümler Ethereum ana ağında ve test ağında uzun süredir kullanılmıyor ve artık diğer ağlarla da alakalı olmadıklarından şüpheleniyoruz. Karmaşık kod yolları ve çözümleri, yeni sürümler için özellik geliştirmeyi ve test etmeyi yavaşlatır, bu nedenle gelecekteki derleyici sürümlerinde bunları desteklemeyi durdurmayı umuyoruz. Bu EVM sürümleri için desteğe güveniyorsanız, lütfen bizimle iletişime geçin[6] 。
Yeni özelliklerin öne çıkması
denetlenmemiş döngü artışı
Döngü sayacını artırırken kontrolsüz aritmetik kullanımı gaz optimizasyonu içindir[7] yaygın uygulama. Aşağıdaki bir döngü ve sayaç i örneğiyle açıklayalım:
for (uint i = 0; i < array.length; ++i) {
acc += dizi[i] ; i, döngü gövdesi tarafından değiştirilmez
}
Çoğu durumda (aşağıdaki tam koşullara bakın), karşılaştırma işlemi, türünün maksimum değerine asla ulaşmamamı sağlayacaktır, bu nedenle döngünün maksimum değere ulaşılmadan önce duracağını varsaymak güvenlidir. Bu durumda, sayacın güvenlik kontrolü gereksiz ve gaz israfı olacaktır. Bu, kullanıcıyı, sayacı döngü içindeki kontrolsüz bir aritmetik bloğa artımlı olarak saran ve kontrolü atlayan uzun işaretsiz deseni kullanmaya teşvik eder:
for (uint i = 0; i < array.length;) {
acc += dizi[i] ;
unchecked { i++; } // i taşma kontrolleri olmadan artırılır -- daha az gaz kullanılır
}
Solidity 0.8.22, döngü sayacı için otomatik olarak kontrol edilmemiş bir aritmetik artış oluşturan bir taşma denetimi optimizasyonu sunar. Bu yeni iyileştirme, önceki örnekte olduğu gibi döngü gövdelerinde uzun, denetlenmeyen bir delta deseni kullanma gereksinimini ortadan kaldırır.
Buna karşılık, yeni optimizasyonlar, kullanıcıların gaz verimliliğinden ödün vermeden ham, daha okunabilir koda dönmelerini sağlar.
Yeni optimize edilmiş dökülme önleme kontrolü için kesin koşullar aşağıdaki gibidir:
İkinci koşulu açıklığa kavuşturmak için aşağıdaki kod parçacığını göz önünde bulundurun:
for (uint8 i = 0; < UINT16(1000); ++I) {
döngü gövdesi
}
Bu durumda, i karşılaştırmadan önce uint16'ya dönüştürülür ve koşul hiçbir zaman aslında yanlış değildir, bu nedenle artımlı taşma denetimi kaldırılamaz.
Ayrıca, <'in optimizasyonu tetikleyen tek karşılaştırma operatörü olduğunu unutmayın. <= operatörü ve diğer operatörler kasıtlı olarak hariç tutulmuştur. Ek olarak, operatör yerleşik olmalıdır - kullanıcı tanımlı < uygun değildir.
Optimizasyon basittir ve her zaman faydalıdır, bu nedenle optimize edicinin geri kalanı ortak ayar settings.optimizer.enabled kullanılarak devre dışı bırakılsa bile etkinleştirilecektir. Standart JSON girişinde settings.optimizer.details.simpleCounterForLoopUncheckedIncrement değerini false olarak ayarlayarak bunu açıkça kapatabilirsiniz. Komut satırı arayüzü kullanılarak devre dışı bırakılamaz.
Sıfır değişmez değerleri yeniden oluşturmak için Yul iyileştiricisini ayarlayın
Yeni sürüm, 0.8.20 sürümünde tanıtılan PUSH0 işlem kodu desteğini yeniden geliştirerek, Yeniden Materyalleştirici eklenerek oluşturulur[8] [9] İyileştirme adımı, sıfır değişmez değerini değişken bir referans olarak depolamak yerine her zaman yeniden oluşturacak şekilde genişletilir ve gaz maliyetlerini azaltmak için DUP yerine PUSH0'ın kullanılmasına izin verilir. Bunun etkili bir şekilde yapılmasını sağlamak için, Rematerializer ve UnusedPruner eklenir Adımlar, Yul iyileştiricinin varsayılan temizleme sırasına eklenir.
EVM derlemesi JSON'u içe aktarma desteği ekleyin (deneysel)
Bu yeni sürüm, EVM derlemelerini içe aktarmak için deneysel destek ekleyerek, harici araçların bayt kodu oluşturmadan önce süper optimizasyonlar gerçekleştirme olasılığını açar. Bu özelliğin temel amacı, derleyici tarafından oluşturulan derlemelerin dışa aktarılabilmesi, değiştirilebilmesi ve yeniden içe aktarılabilmesi ve böylece normal derleme işlemine devam edilebilmesi için düşük seviyeli EVM derlemeleri için bir serileştirme biçimi tanımlamaktır.
Önemli: Bu deneysel bir özelliktir ve şu anda üretimde mevcut değildir. Deneyebilmeniz ve geri bildirim sağlayabilmeniz için bu özelliği bu sürümde sunuyoruz.
Olayların dosya düzeyinde tanımlanmasına izin verir
Solidity 0.8.22, olayları dosya düzeyinde tanımlamanıza izin verir. Olay tanımları artık sözleşme kapsamı dışına yerleştirilebilir. Bu, bir kitaplıktaki olayları yapay olarak kaydırmak zorunda kalmadan kod organizasyonu için başka bir seçenek sunar.
Ayrıca bu sürüm, kod için harici bir sözleşmede veya arabirimde tanımlanan bir olayı yayarken NatSpec oluşturulurken hataya neden olan bir hatayı düzeltir. Önceki sürümde (0.8.21), Solidity derleyicisi, mevcut sözleşmeden devralınmayan sözleşmelerde ve arayüzlerde tanımlanan olaylara kısıtlı erişim için destek ekledi, ancak hata özelliğin tam olarak kullanılmasını engelledi.
Bu hata düzeltmesi ve dosya seviyesinde olay tanımlarına izin vermesiyle, Solidity'nin en son sürümü, kullanıcıların aşağıdaki örnekleri hatasız bir şekilde derlemesini sağlar:
arayüz I {
olay ForeignEvent();
}
sözleşme C {
olay ForeignEvent();
}
olay E();
sözleşme D {
fonksiyon f() public {
Yabancı bir olay yaymak, 0.8.21'de bir iç hatayı tetikler
I.ForeignEvent();
C.ForeignEvent() yayar;
Dosya düzeyinde bir olay yayma. Yeni özellik.
E() yayar;
}
}
Tam değişiklik günlüğü
Dil özellikleri
Derleyici özellikleri
Hata düzeltmeleri