Anlambilimde yan etkiler nasıl ele alınır?


19

Anthony Aaby'in Anlambilim üzerine "Programlama Dillerine Giriş" bölümünde aşağıdaki gözlemi yapar:

Programlama dillerinin anlambilimindeki çalışmaların çoğu, zorunlu programları --- atama komutları olan programları oluşturmaya ve anlamaya çalışırken karşılaşılan sorunlar tarafından motive edilir. Atama komutu değerleri değişkenlere yeniden atar, bu atamanın programın uzak bölümlerinde beklenmeyen etkileri olabilir.

Bu dikkat çekici bir giriş olarak dikkat çekiyor, yan etkilere izin vermenin anlambilimdeki çalışmanın büyük bir bölümünü motive edeceğini söyledi.

Bir programlama dilinde yan etkilerin varlığı, bir programı bir hesaplama modeliyle eşleme yeteneğini nasıl etkiler ? Hali yönetirken yan etkilere izin verirken bu süreci geliştirebilecek devlet yönetimi yaklaşımları var mı?


Bu yumuşak bir soru olarak mı etiketlenmeli? "Anlambilimdeki çalışmaların çoğu [...] [yan etkiler] tarafından motive edildiğinden", kesinlikle kısa ve titiz bir cevap bekleyemezsiniz.
Radu GRIGDaha fazla

1
@Radu: MO'da bu, büyük olasılıkla [yumuşak soru] veya CW olmayan [büyük resim] olarak etiketlenir.
Charles Stewart

Büyük resim etiketi daha da iyidir. Bunu unuttum.
Radu GRIGore

İyi öneri; Etiketi ekledim.
Shane

Yanıtlar:


18

Charles'ın cevabına dayanarak, programlama dilleri teorisindeki temel zorluk, programların doğal denklik kavramının, ya verebileceğiniz en basit matematiksel anlambilimde ya da altta yatan makine modelinde tipik olarak katı bir eşitlik olmamasıdır. Örneğin, aşağıdaki Java benzeri kod bitini göz önünde bulundurun:

Object x = new Object();
Object y = new Object();
... some more code ...

Böylece bu program bir nesne oluşturur ve x adını verir, ardından y adlı ikinci bir nesne oluşturur ve daha fazla kod yürütmeye devam eder. Şimdi, bir programcının bu iki nesnenin tahsis sırasını çevirmeye karar verdiğini varsayalım:

Object y = new Object();
Object x = new Object();
... some more code ...

Şimdi, şu soruyu sorun: bu yeniden düzenleme programın davranışını değiştiriyor mu? Bir yandan, alttaki makinede, x ve y, programın iki çalışmasında farklı konumlara tahsis edilecektir. Yani bu anlamda program farklı davranıyor.

Ancak Java benzeri bir dilde, referansları yalnızca eşitlik için test edebilirsiniz, sipariş için değil, bu nedenle "biraz daha kodun" gözlemleyemediği bir farktır . Sonuç olarak, çoğu programcı, siparişin tersine çevrilmesinin son yanıtta bir fark yaratmasını beklemez ve derleyici yazarlarının çoğu bu temelde yeniden sıralama ve optimizasyon yapmayı bekler. (Öte yandan, bir de C-benzeri dil, sen yapabilirsiniz ilk tamsayılar onları kopartarak, sipariş için işaretçileri karşılaştırmak ve bu yeniden düzenlenmesi, böylece yok değil mutlaka gözlemlenebilir davranışı korumak.)

Anlambilimin temel sorunlarından biri, iki programın ne zaman gözle görülür şekilde eşdeğer olduğu sorusunu cevaplamaktır. Gözlem anlayışımız programlama dilinin özelliklerine bağlı olduğundan, "hiçbir program bu programları girdi olarak almaya dayalı olarak farklı cevapları hesaplayamadığında iki program eşdeğerdir" gibi bir tanımla sonuçlanır. Tüm istemci programları üzerindeki miktar ölçümü, bu soruyu zorlaştıran şeydir - görünüşe göre, iki belirli kod parçası hakkında bir şeyler söylemek için olası tüm istemci programları hakkında bir şeyler söylemek zorundasınız.

Anlamsal semantik ile hile, bu evrensel nicelemeden kaçınmanıza izin veren matematiksel bir yorum vermektir - bir kod parçasının anlamının bazı matematiksel bir değer olduğunu ve bunları matematiksel olarak eşit olup olmadığını kontrol ederek karşılaştırırsınız. değil. Bu yereldir (yani, bileşimsel) ve olası tüm istemciler üzerinde nicelemeyi içermez. (Tabii ki anlamsal anlambilimin sağlam olması için bağlamsal eşdeğerliği ima ettiğini göstermeniz gerekir. Tabii ki tamamlandığında - anlamsal eşitlik bağlamsal eşdeğerlikle tamamen aynı olduğunda, anlambilimin "tamamen soyut" olduğunu söylüyoruz.)

Ancak, anlamsal anlambilimin bu denklikleri doğruladığından emin olmanız gerektiği anlamına gelir. Bu örnek için, bu Java benzeri dil için bir anlamsal semantik vermek istiyorsanız, sadece yeni çağrmanın bir yığın aldığından ve size yeni oluşturulan nesne ile yeni bir yığın verdiğinden emin olmanız gerekir. Program, giriş yığınının tüm permütasyonları altında değişmezdir. Bu oldukça karmaşık matematiksel yapıları içerebilir (örneğin, bu durumda, her şeyin modulo için uygun bir permütasyon grubu çalışmasını sağlayan bir kategoride çalışmak).


"hiçbir istemci programı bu programları girdi olarak almaya dayalı olarak farklı yanıtlar hesaplayamadığında iki program eşdeğerdir." Bununla kafam karıştı. Bir program X ve bir varsa istemci programı Y, sonra X Y 'içine çağrılar' Ama o zaman Y olarak X'in metnini okur söylemek görünüyor anlamına götürün girişi bu durumda neredeyse arayacağımı, X'in 'müşterisi'. Lütfen açıklığa kavuşturabilir misiniz?
Radu GRIGaha fazla

1
"X'in istemcisi" ile, "program bağlamı" ile aynı şeyi kastediyorum, bu sadece "bir alt dönem olarak X'i içeren daha büyük bir programdır".
Neel Krishnaswami

Yani 'X, Y'nin bir müşterisidir' ifadesini 'X, Y'yi girdi olarak okur' ile değiştirir, çünkü X'i Y'ye uygulanan bir lambda olarak mı düşünüyorsunuz? Mantıklı, ancak Java hakkında konuştuğunuzda biraz bükülmüş. :)
Radu GRIGDaha fazla

1
@RaduGRIGore: program içeriği başka bir şey ifade ediyor. Gönderiyi doğru okuyorsunuz, ancak X, Y'nin kaynak kodunu girdi olarak okursa (bu, postayı nasıl yorumladığım), her iki sözdizimsel olarak farklı programı ayırt edebilirsiniz; bunun yerine Y, X üzerinde bir lambda fonksiyonuysa, çok az programı ayırt edebilirsiniz. Neel'in "program bağlamı" hakkındaki yorumu doğru tanımdır: bir program bağlamı Y, AST'sinde bir delik bulunan ve iki farklı program parçasını X1 ve X2 yerleştirebileceğiniz bir programdır.
Blaisorblade

@NeelKrishnaswami: postada ne demek istediğini açıklığa kavuşturabilir misin? Sadece örneğinizi kullanmaya devam edebilir ve bir veya diğer parçayı ekleyebileceğiniz bir program hakkında konuşabilirsiniz.
Blaisorblade

12

Elbette (anlamsal) anlambilimdeki etkilerle başa çıkmanın yolları vardır. Örneğin, Eugenio Moggi'nin hesaplama etkilerinin monadlar olduğu fikrini kullanabiliriz (bu fikir Haskell tasarımında da kullanılmıştır). Bununla ilgili sorunlardan biri, monadların birleştirilmesinin zor olmasıdır. Gordon Plotkin ve John Güç önerdi Lawvere teorilerine MOGGI en monad'ların inceltildiğini onlar da denir olarak da tanımaktadır, ya cebirsel teorileri cebirsel (en yaygın etkileri, devlet olarak, G / Ç, deterministik olmayan, fakat devamları olan, cebirsel olan etkileri değil). Kapsamlı bir tedavi için Matija Pretnar'ın tezine bakınız .

Ayrıca , Frank Oles ve John Reynolds tarafından geliştirilen yerel devlet için olası dünya semantiğinden de bahsetmeliyim (üzgünüm, daha iyi bir bağlantı bulamıyorum, bu şeyler 1982'den), Moggi'nin monad'larından önce. Yerel devletin birçok yönünü doğru bir şekilde modelleyen algol benzeri bir dilin anlambilimini sağlamak için ön ayaklanma kategorileri kullandılar (ancak hepsinin değil, modelin geri dönmeye izin verdiğini düşünüyorum, ancak belki de hafızam bana yanlış hizmet ediyor).


1
Evet, işlev kategorisi semantiği tüm Meyer-Sieber denkliklerini doğrulamamıştır. Peter O'Hearn ve Robert Tennant, 90'ların ortalarında (IIRC) tüm Meyer-Sieber örneklerini alan functor kategorisi anlambiliminin parametrik bir versiyonunu geliştirdiler, ancak tamamen soyut olup olmadığını bilmiyorum.
Neel Krishnaswami

O'Hearn ve Tennent modeli tam olarak soyut değil. Bu makalenin kendisinde tartışılmıştır. Ancak O'Hearn ve Reynolds tarafından lineer lambda hesabı kullanılarak yapılan ayrıntılandırma, ikinci dereceye kadar tamamen soyuttur. Üçüncü dereceden kırılır, örnekler Ahmed, Dreyer, Birkedal ve ark.
Uday Reddy

12

Matthias Felleisen, semantikteki yan etkiler sorununa "Sözdizimsel Kontrol ve Devlet Teorileri" dizisinde etkileyici bir çözüm sundu.

Bu çalışma, fonksiyonel, nesne yönelimli, zorunlu ve hatta mantık dillerini kısaca modelleyebilen basit bir soyut makine çerçevesi olan CESK makinesiyle sonuçlandı. CESK çerçevesi sadece yan etkileri değil, istisnalar, devamlar, tembellik ve hatta iplikler gibi "karmaşık" kontrol yapılarını da ele alır.

CESK makinesi ve küçük adım operasyonel semantiği daha geniş olarak programlama dil teorisinde yaklaşık yirmi yıldır fiili standart olmuştur.

Kısacası, bir CESK makinesi, her makine durumunu tanımlamak için dört bileşene sahip küçük adımlı bir makinedir: kontrol dizesi (program sayacının genelleştirilmesi), çevre, bir mağaza (yığın olarak da adlandırılır) ve mevcut devam.

Ortam değişkenleri adreslerle eşleştirir; mağaza adresleri değerlerle eşler.

Bu, değiştirilebilir değişkenlerin modellenmesini kolaylaştırır: sadece adresindeki değeri değiştirin.

İşaretçileri ve dinamik ayırmayı modellemeyi de kolaylaştırır: sadece mağaza adreslerini birinci sınıf değerler yapın.

Benzer şekilde, birinci sınıf süreklilikler bunların adreslenebilir değerleri haline getirilmesinden kaynaklanır.


6

Bir programlama dilinde yan etkilerin varlığı, bir programı bir hesaplama modeliyle eşleme yeteneğini nasıl etkiler?

Mutlaka zorlaştırmaz, ancak daha büyük ifadelerin semantiğinin daha küçük ifadelerden nasıl oluşturulacağı konusunda kısıtlamalar getirir. Örneğin, küresel referanslara daha üst düzey işlevlerin atanmasına izin veren bir dil için Scott tarzı bir anlamsal semantik vermek istiyorsa, diğer bazı programlama yapılarıyla çok kötü etkileşime girebilir.

Soruna neden olan sadece devlet gibi yan etkiler değildir. Dijkstra'nın korumalı komut dili gibi basit zorunlu dillerin bu tür yan etkileri vardır ve güzel semantikleri vardır. Sorun, lambda hesabının uzantıları, yan etkiler olmasa bile programlama dillerinden beklenen operasyonel semantiklerle ortaya çıkar: en erken, Plotkin'in PCF'sine nispeten erken modeller verildi, ancak anlambilim tamamen soyut değildi, yani anlamsal anlambilim aşırı geneldi, operasyonel anlambilimine tam olarak karşılık gelmiyordu. PCF nihayet 1980'lerin sonunda oyun semantiği ile tamamen soyut bir anlamsal anlambilim aldı, ki bu Scott'ın düzen teorik anlambilimine benzemiyordu. Eşzamanlılık hala tam anlamıyla yeterli bir tedavi görmemiştir.

Birçoğu bu tür anlambilimin önemini sorguluyor. Bu "anlambilim" sadece program kaynağı ve programı derleyen ve çalıştıran bazı makinelerin adları olsa bile her zaman bir tür işletimsel anlambilim sağlayabiliriz: bu nedenle Strachey işlemsel anlambilimi kınadı. Ancak Plotkin'in yapısal işlem semantiği, işletim semantiğinin makine modellerinden nasıl ayrılabileceğini gösterdi ve Pitt'in çalışması, bu semantiğin programlar ve programlama dilleri ile anlamsal semantiğe benzer mantığı nasıl destekleyebildiğini gösterdi. Bu nedenle operasyonel semantik, anlamsal semantiğe uygun bir alternatiftir ve Standart ML gibi önemli sayıda programlama diline başarıyla uygulanmıştır.

Hali yönetirken yan etkilere izin verirken bu süreci geliştirebilecek devlet yönetimi yaklaşımları var mı?

Bir dereceye kadar, anlambilim sağlamadaki zorluklar, birinin beklediği gibi davranan güçlü programlama dilleri sağlama zorluğuna karşılık gelir. Pragmatik olarak motive edilmiş tasarım kararları - küresel durumun eşzamanlılık ile birlikte, tipik olarak mesaj geçen eşzamanlılıktan kaçınmak gibi - anlambilim sağlamayı kolaylaştırır.


Scott'ın PCF'sinde devlet yok ve Scott da öyle değil mi? Bkz. En.wikipedia.org/wiki/…
Andrej Bauer

@Andrej: Hata, Luke Ong'un D.Phil'imi denetlediği göz önüne alındığında, bu hatayı yapmamalıyım. Milner'ın PCF ve Scott'ın LCF'inin bir LtU hikayesi olarak WP'lerden daha özlü bir teaser özeti gönderdim: lambda-the-ultimate.org/node/2196 Kayıp Scott'a erişiminiz olabilir. (1969) el yazması ...
Charles Stewart

Bu Plotkin'in PCF'si olurdu, sanırım :-) Makaleyi ele geçirmeye çalışabilirim, ama aslında bende yok.
Andrej Bauer

Ancak mesele şu ki PCF'nin durumu yok. Strachey'in operasyonel anlambilimi kınaması için ne gibi bir neden söylüyorsunuz? Benim için belli değildi. Son paragraf, daha önce söylediklerinizle çelişiyor, yani, korunan komutların hoş bir anlambilimi var, ancak PCF yok!
Uday Reddy

@Andrej, Uday: Üç yıldan az bir süre sonra görevimi düzelttim.
Charles Stewart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.