Ne konuşuyorsun yaklaşık azdır sözdizimi daha yapısına . when
Sonlu miktarda mantık yürüten when
, sonra ifadeleri yürüten , sonra döngülere girip sonsuz döngüye devam ederek mantığı yeniden yürüten bir sistemde böyle bir ifadeye gerçekten sahip olabilirsiniz .
Örneğin, Windows programlama genellikle "olay tabanlıdır". Bir düğmenin Click
etkinliğine abone olmak, temelde "tıklandığında bunu yapın" anlamına gelir. Ancak, başlık altında olup bitenler bir mesaj işleme döngüsüdür. Kullanıcı düğmeyi tıklattığında Windows uygulamaya bir ileti gönderir ve uygulamadaki ileti işleme döngüsü uygun olay işleyiciyi çalıştırır.
Örneğin, C # 'daki olayları kullanırsanız, bunu bir ileti döngüsü olmadan yapabilirsiniz, ancak sınırlama, olayı önceden bildirmeniz gerektiğinden, when
herhangi bir türü izleyen bir artibrary deyimi yazamazsınız . durum. Belirli bir etkinliği beklemeniz gerekir.
Bir Von Neumann Mimarisinde bu davranışı elde etmek için, uygunsa, uygun kodu çalıştıran döngü boyunca her zaman tüm koşulları kontrol eden bir tür sonsuz döngü çalıştırmanız gerekir. Dahili olarak if
/ then
veya switch
ifadelerin büyük bir listesini alırsınız . Çoğu masaüstü uygulaması ve web programcısı böyle bir yapı gördüklerinde kusarlar, bu yüzden Windows olay modeli gibi bir tür sözdizimsel şekere sarırsanız gerçekten lezzetli olur (kaputun altında olan şey bu olsa da).
Öte yandan, gömülü ürün yazılımı geliştirme, gerçek zamanlı yöneticiler veya endüstriyel denetleyiciler alanına bakarsanız, bu programlama modeli çok yaygındır. Örneğin, gerçek zamanlı bir programınız varsa, şunu ifade etmek isteyebilirsiniz:
outputA = input1 && input2
Kodun anlaşılması kolaydır (çünkü bildirimseldir). Ancak, çalışmasını sağlamak için sıkı bir döngüde yürütmeniz gerekir. outputA
Döngü boyunca her seferinde yeniden değerlendirirsiniz . Birçok masaüstü veya web programcısı bunu istemez çünkü verimsizdir. Onlara göre, yeniden değerlendirmeniz gereken tek zaman ne outputA
zaman input1
veya input2
değişir. Sizin tarif ettiğiniz gibi bir şey görmeyi tercih ederler:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Şimdi bu istediğiniz şeyse (ve kişisel olarak bu fikri tercih etmiyorum) ve hedefiniz verimlilikse, o zaman hala işlemcinin kaputun altında ne yaptığını kendinize sormanız gerekir. Açıkçası, her seferinde giriş durumlarını önceki giriş durumlarıyla karşılaştıran ve her değiştiğinde uygun kodu yürüten bir tür döngü çalışıyor. Bu yüzden gerçekten daha az verimli ve okunması daha zor ve bakımı daha zor.
Öte yandan, input1
değişiklikler sırasında yapmanız gereken iş when
önemliyse , yan tümceniz mantıklı olabilir. PLC'lerde bu tür talimatlara "yükselen kenar algılama" denir. Durumunu input1
son döngüde kaydeder, bu sefer değerle karşılaştırır ve son durum yanlışsa ve bu durum doğruysa mantığı yürütür.
Von Neumann Mimarisi yoksa oyun değişir. Örneğin, VHDL'de bir FPGA programlıyorsanız , şunları yazarken:
outputA = input1 && input2
(... veya uygun VHDL sözdizimi olacaktır ne olursa olsun) daha sonra FPGA aslında yukarı öyle ki kablolu alır input1
ve input2
bir VE kapısının girişine bağlanmış ve Kapının çıkışı için kablolu outputA
. Yani, sadece kodun anlaşılması kolay değil, aynı zamanda diğer tüm mantığa paralel olarak yürütülür ve etkilidir.
Beş IEC-61131-3 dilinden birinde programlanmış PLC veya PAC gibi endüstriyel bir denetleyiciden bahsederken, tipik durum bu tür bir düzenlemedir:
- Girişleri okuyun ve bellekte saklayın
- Ana programı yürüt
- Çıkışları bellekten gerçek çıkışlara yazma
- 1. adıma gidin
Bu, sistemin mimarisinde yerleşiktir, bu yüzden sadece şunları yazmanız beklenir:
outputA = input1 && input2
... ve sürekli bir döngüde yürütülür.
Bu makinelerde ayrıca kesme rutinleri vardır. Bunlar daha when
çok bahsettiğiniz operatör için donanım seviyesi desteğine benzer . Donanım kesme harici olay hakkında, kod uygulanması için bir yöntemdir. Örneğin, bir ağ kartı veri beklettiğini söylediğinde, işlemci normalde bu verileri derhal okumalıdır, yoksa arabellek alanınız tükenir. Ancak, gerçek bir donanım kesintisi takmanız gereken miktar için, bir dil anahtar kelimesi eklemeye değer olduğundan şüphe duyuyorum. CPU giriş pinleri ile sınırlı olacaksınız ve dahili program durumunu test etmek istediğiniz anlaşılıyor.
Yani, geleneksel bir dilde (sonsuz çalışan sıkı bir döngü olmadan), "değerlendirme kodu ne zaman çalışır" sorusunu sormanız gerekir?
Eğer yazarsanız:
when A do
launchNukes()
... ve A
keyfi bir boole ifadesi olduğunu varsayarsak , bu ifadeyi ne zaman yeniden değerlendireceğinizi nereden biliyorsunuz? Saf bir uygulama, her bellek yazıldıktan sonra yeniden değerlendirmeniz gerektiği anlamına gelir. Onu daraltabileceğinizi düşünebilirsiniz, ancak şunu düşünün:
when systemTime > actionTime do
launchNukes()
systemTime
Her zaman değiştiğine dikkat edin (her okuduğunuzda farklı bir sayı alırsınız). Bu, tüm when
maddelerinizin koşullu kısmının sürekli olarak yeniden değerlendirilmesi gerektiği anlamına gelir . Bu neredeyse imkansız (ve koşullu ifadenizin yan etkileri varsa ne olacağını bir saniye düşünün!)
Sonuç
when
Bir mimaride yalnızca ana programı çalıştıran sonsuz bir döngüye dayalı bir deyim (tanımladığınız gibi) olabilir, ardından when
koşullar bu döngüde false'dan true'ya giderse ifadeleri çalıştırırsınız . Bu mimari gömülü ve endüstriyel cihazlarda yaygın olsa da, genel amaçlı programlama dillerinde yaygın değildir.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
. Ayrıca: msdn.microsoft.com/en-us/library/dd233249.aspx Temelde Google kod aramasını kullanarak "ne zaman" araması yaparım.