Global edit: Üzgünüm arkadaşlar, kovuldum ve saçmalık yazdım. Sadece eski bir moruk sırası.
C'nin kurtulduğuna inanmak istedim, ama ne yazık ki C11'den beri C ++ ile eşit hale getirildi. Görünüşe göre, derleyicinin ifadelerde yan etkilerle ne yapacağını bilmek, şimdi bir "senkronizasyon noktasının önünde yer alıyor" temelinde kod dizilerinin kısmi bir sırasını içeren küçük bir matematik bilmecesini çözmeyi gerektirir.
K&R günlerinde birkaç kritik gerçek zamanlı gömülü sistemi tasarladım ve uyguladım (motor kontrol altında tutulmazsa insanları en yakın duvara çökebilecek bir elektrikli otomobilin kontrolörü dahil), 10 tonluk bir endüstriyel düzgün bir şekilde komut verilmezse insanları bir hamur haline getirebilen robot ve zararsız olsa da birkaç düzine işlemcinin veri yolunu% 1'den daha az sistem yükü ile kurutan bir sistem katmanı).
Tanımlanmamış ve belirtilmemiş arasındaki farkı elde etmek için çok yaşlı veya aptal olabilirim, ancak aynı anda yürütmenin ve veri erişiminin ne anlama geldiğine dair hala iyi bir fikrim var. Tartışmalı olarak bilgilendirilmiş düşünceme göre, C ++ ve şimdi C adamlarının evcil hayvan dilleri ile senkronizasyon sorunlarını ele geçirmesinin bu saplantısı pahalı bir boru rüyası. Ya eşzamanlı yürütmenin ne olduğunu biliyorsunuz ve bu gizmoslardan herhangi birine ihtiyacınız yok ya da ihtiyacınız yok ve dünyayı onunla uğraşmaya çalışmayan bir iyilik yapardınız.
Tüm bu göz doldurmalı bellek bariyeri soyutlamalarının yükü, çoklu CPU önbellek sistemlerinin geçici bir dizi kısıtlamasından kaynaklanmaktadır, bunların hepsi, örneğin muteksler ve durum değişkenleri C ++ gibi ortak işletim sistemi senkronizasyon nesnelerinde güvenli bir şekilde kapsüllenebilir. teklifler.
Bu kapsüllemenin maliyeti, ince taneli özel CPU komutlarının kullanımının elde edebileceği şeylerle karşılaştırıldığında performanslarda bir dakika düşüştür. Anahtar kelime (ya da
volatile
#pragma dont-mess-with-that-variable
herkes için, bir sistem programcısı olarak, bakım) derleyiciye bellek erişimini yeniden düzenlemeyi durdurmasını söylemek için yeterli olurdu. Optimal kod, doğrudan CPU'ya özgü talimatlar ile düşük seviye sürücüyü ve işletim sistemi kodunu serpmek için doğrudan asm direktifleriyle kolayca üretilebilir. Altta yatan donanımın (önbellek sistemi veya veri yolu arabirimi) nasıl çalıştığına dair samimi bir bilgi olmadan, yine de işe yaramaz, verimsiz veya hatalı kod yazmanız gerekir.
volatile
Anahtar kelime ve Bob'un bir dakikalık ayarlaması , en katı düşük seviyeli programcıların amcası dışında herkes olurdu. Bunun yerine, C ++ matematik düşkünlerinin olağan çetesi, mevcut olmayan problemleri arayan ve bir programlama dilinin tanımını bir derleyicinin özellikleriyle yanlış yönlendiren tipik tasarım eğilimlerine yol açan, başka bir anlaşılmaz soyutlama tasarlayan bir saha gününe sahipti.
Sadece bu kez C'nin temel bir yönünü tanımlamak için gereken değişiklik, çünkü bu "engeller" düzgün çalışması için düşük seviyeli C kodunda bile oluşturulmak zorundaydı. Bu, diğer şeylerin yanı sıra, herhangi bir açıklama ya da gerekçe olmaksızın, ifadelerin tanımına zarar verdi.
Sonuç olarak, bir derleyicinin bu saçma C parçasından tutarlı bir makine kodu üretebilmesi, C ++ adamlarının 2000'li yılların sonlarındaki önbellek sistemlerindeki potansiyel tutarsızlıklarla baş etmesinin sadece uzak bir sonucudur.
C'nin (ifade tanımı) temel bir yönünün korkunç bir karmaşasını yarattı, böylece önbellek sistemleri hakkında bir lanet vermeyen ve haklı olarak - C programcılarının büyük çoğunluğu, şimdi açıklamak için gurulara güvenmeye zorlanıyor. a = b() + c()
ve arasındaki fark a = b + c
.
Bu talihsiz dizide ne olacağını tahmin etmeye çalışmak zaten net bir zaman ve çaba kaybıdır. Derleyicinin bundan ne yapacağına bakılmaksızın, bu kod patolojik olarak yanlıştır. Bununla ilgili tek sorumlu şey, çöp kutusuna göndermek.
Kavramsal olarak, yan etkiler, değişikliğin değerlendirmeden önce veya sonra açık bir şekilde ayrı bir ifadede yapılmasına izin verme önemsiz çabasıyla her zaman ifadelerden çıkarılabilir.
Bu tür boktan kod, bir derleyicinin hiçbir şeyi optimize etmesini bekleyemeyeceğiniz 80'lerde haklı olabilir. Ancak derleyiciler uzun zamandır çoğu programcıdan daha akıllı hale geldi, geriye kalan tek şey boktan bir kod.
Bu tanımlanmamış / tanımlanmamış tartışmanın önemini de anlayamıyorum. Ya tutarlı bir davranışla kod oluşturmak için derleyiciye güvenebilirsiniz ya da edemezsiniz. Bunu tanımsız ya da tanımlanmamış olarak adlandırmak, tartışmalı bir nokta gibi görünüyor.
Tartışmalı olarak bilgilendirilmiş düşünceme göre, C zaten K&R durumunda yeterince tehlikelidir. Yararlı bir evrim sağduyulu güvenlik önlemleri eklemek olacaktır. Örneğin, bu gelişmiş kod analiz aracını kullanarak, teknik özellikler derleyiciyi uç noktalara potansiyel olarak güvenilmez bir kod üretmek yerine en azından bonkers kodu hakkında uyarılar üretmeye zorlar.
Ancak bunun yerine çocuklar C ++ 17'de sabit bir değerlendirme sırası belirlemeye karar verdiler. Artık her yazılım embesili, yeni derleyicilerin şaşkınlığı belirleyici bir şekilde ele alacağından emin olarak, kodunda yan etkileri bilerek aktif olarak teşvik edilmektedir.
K&R bilgi işlem dünyasının gerçek mucizelerinden biriydi. Yirmi dolar için dilin kapsamlı bir belirtimini aldınız (tek tek kişilerin sadece bu kitabı kullanarak tam derleyiciler yazdığını gördüm), mükemmel bir referans el kitabı (içindekiler genellikle sizi yanıtınızın birkaç sayfası içinde gösterecektir) soru) ve dili mantıklı bir şekilde kullanmayı öğreten bir ders kitabı. Çok, çok aptalca şeyler yapmak için dili kötüye kullanabileceğiniz çeşitli yollar hakkında rasyonel, örnek ve akıllıca uyarı sözleriyle tamamlayın.
Bu mirası çok az kazanç için yok etmek benim için acımasız bir atık gibi görünüyor. Ama yine de bu noktayı tamamen göremeyebilirim. Belki bir tür ruh beni bu yan etkilerden önemli ölçüde yararlanan yeni C kodu örneği yönünde gösterebilir?