Zorunlu diller işlevsel dillerden birbirinden ne kadar farklıdır?


17

Simon Peyton Jones'un Fonksiyonel Programlama Dillerinin Uygulanması'nı okuyorum ve beni biraz şaşırtan bir ifade var (sayfa 39):

Zorunlu diller için olandan çok daha büyük ölçüde, işlevsel diller nispeten az anlamsal farklılıklarla birbirlerinin büyük ölçüde sözdizimsel varyasyonlarıdır.

Şimdi, bu 1987'de yazıldı ve bu konudaki düşüncelerim o zamanlar etrafta olmayan veya popüler olmayan daha modern programlama dillerinden etkilenebilir. Ancak, buna inanmak biraz zor. Örneğin, tarif edilen Miranda programlama dilinin (Haskell'in erken bir öncülü), ML gibi katı bir dile kıyasla C'nin Pascal'a ya da belki de C'nin küçük konuşmalara sahip olması gerektiğinden çok daha farklı bir anlambilimine sahip olduğunu düşünüyorum ( C ++, noktasının doğrulanmasını sağlar :-).

Ama sonra tekrar, bunu sezgisel anlayışıma dayandırıyorum. Simon Peyton Jones bunu söylerken büyük ölçüde doğru mu, yoksa bu tartışmalı bir nokta mı?

Yanıtlar:


19

Simon, genişleme açısından temelde doğrudur. Modern işlevsel dillerin anlambiliminin ne olduğunu çok iyi biliyoruz ve bunlar birbirlerinin nispeten küçük varyasyonlarıdır - her biri monadik bir meta dilde biraz farklı çevirileri temsil eder. Şema gibi bir dilde bile (birinci sınıf kontrole sahip dinamik olarak yazılmış üst düzey bir zorunlu dil), ML ve Haskell'e oldukça yakın bir semantiğe sahiptir.

Sesli bir bakış açısından, Şemanın anlambilimi için oldukça basit bir etki alanı denklemi vererek başlayabilirsiniz - buna deyin . İnsanlar 70'lerin sonunda / 80'lerin başında böyle denklemleri çözebilir ve çözdüler, bu yüzden bu çok da kötü değil. Benzer şekilde, Şema için de nispeten basit işlemsel anlambilim vardır. ("Şema" dediğimde, tüm gerçek diller gibi birkaç siğilin olduğu gerçek Şema'nın aksine, türü olmayan lambda hesabı artı devamları artı durumu kastediyorum.)V

Ancak modern yazım işlevsel dillerini yorumlamak için uygun bir kategoriye ulaşmak için, işler oldukça korkutucu hale geliyor. Temel olarak, bu alan üzerinde ultrametrik olarak zenginleştirilmiş bir kısmi denklik ilişkileri kategorisi oluşturursunuz. (Örnek olarak, Birkedal, Stovring ve Thamsborg'un "Parametrik Polimorfizmin Gerçekleşebilirlik Semantiği, Genel Referanslar ve Özyinelemeli Türler" konusuna bakın.) Operasyonel semantiği tercih edenler bunu adım dizinli mantıksal ilişkiler olarak bilirler. (Örneğin, Ahmed, Dreyer ve Rossberg'in "Devlete Bağlı Temsil Bağımsızlığı" konusuna bakın.) Her iki şekilde de, kullanılan teknikler nispeten yenidir.

Bu matematiksel karmaşıklığın nedeni, parametrik polimorfizmi ve üst düzey durumu aynı anda yorumlayabilmemiz gerektiğidir. Ancak bunu yaptıktan sonra, temelde evde özgürsünüz, çünkü bu yapı tüm sert parçaları içerir. Artık ML ve Haskell türlerini normal monadik çevirilerle yorumlayabilirsiniz. ML sıkı, effectful işlev alanı a -> bçevirir ve Haskell'ın yavaş fonksiyon alanı çevirir bir b ile T ( A ) IO-Haskell tek hücreli yorumlama yan etkileri monadik tipi, vebirTbbirbT(bir) tipi ML veya Haskell Çeşidi yorumudurve Pers bu kategorideki üstel olduğunu.bira

Denklem teorisine gelince, bu diller her ikisi de aynı dilin biraz farklı alt kümelerine çevirilerle tanımlanabildiğinden, bunları birbirlerinin sözdizimsel varyasyonları olarak adlandırmak tamamen adildir.

ML ve Haskell arasındaki his farkı aslında iki dilin - yani yürütme zamanı ve bellek tüketiminin - içsel özelliklerinden kaynaklanmaktadır. ML, gerçek bir ad-çağrı dili gibi, bir bileşimsel performans modeline (yani bir programın zaman / alan maliyeti, alt dönemlerinin zaman / alan maliyetlerinden hesaplanabilir) sahiptir. Gerçek Haskell, ihtiyaca göre çağrı, bir tür notlama ile uygulanır ve bunun sonucu olarak performansı kompozisyon değildir - bir değişkene bağlı bir ifadenin ne kadar süre önce değerlendirilip değerlendirilmediğine bağlıdır. Bu, yukarıda bahsettiğim anlambilimde modellenmemiştir.

Boyutsal özellikleri daha ciddiye almak istiyorsanız, ML ve Haskell daha ciddi farklılıklar göstermeye başlar. Muhtemelen onlar için ortak bir meta dil tasarlamak mümkündür, ancak türlerin yorumlanması, kanıtlama teorik odaklanma fikri ile ilgili olarak çok daha sistematik bir şekilde değişecektir . Bunu öğrenmek için iyi bir yer Noam Zeilberger'in doktora tezidir.


10

Benim düşüncem, SPJ'nin tamamen işlevsel dillerden, yani referans olarak saydam olan dillerden bahsediyor olmasıydı . Bu, örneğin Haskell, Miranda, Clean'i içerir, ancak ML'yi içermez. Tamamen işlevsel bir dile sahip olduğunuzda, genel olarak, oldukça temiz ve iyi tanımlanmış bir anlamsal semantik verebilirsiniz. Bu anlambilim, genel olarak, burada ve orada bazı ince ayarlarla lambda hesabı için bire benzeyecektir. Genel olarak, Sistem F'nin bir varyantına benzeyen bir şeye benzeyen bir tür sisteminiz olacaktır - belki de bazı açılardan daha güçlü, diğerlerinde daha kısıtlı. Bu nedenle, Haskell, O'Caml, vb. İçin kod çıkarma / derleme, Agda gibi karmaşık, bağımlı tipte ispatlanmış asistanlardan nispeten basittir.

Bu çerçevede, oynamak için çok yer var. Elbette, katı ve katı bir dil arasında hala bir fark vardır. Bununla birlikte, yan etkilerin yokluğunda, tek fark, katı olmayan bir dilin alt kısmı belirtmeyen daha fazla ifade içermesidir - iki değerlendirme stratejisinin her ikisi de altını vermediği sürece, kabul ederler.

Simon'un ifadesi de çok önemli bir tarihsel bağlama uyar. Haskell'in (1987) doğduğu sırada, sadece Miranda değil, Lazy ML, Orwell, Clean ve diğerleri - katı olmayan fonksiyonel dillerden oluşan bir panoply vardı. Belirli sözdizimsel varyasyonların yanı sıra hepsi aynı dildeydi. Haskell Komitesinin oluşturulması için gereken motivasyon buydu. Bununla ilgili daha fazla bilgi için, bkz. "Haskell'in Tarihi: sınıfla tembel olmak": http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/ .


5

Bence SPJ bunu temel anlambilim için söylerken doğru.

Bahsettiğiniz gibi, katı veya tembel değerlendirmeyi varsayılan yapmak gibi işaret edebilecek birçok gelişmiş incelik olsa da, tip sistemlerinin detayları veya daha büyük kod birimlerinin nasıl organize edildiğini (modüller, yapılar), bir programın zihinsel modeli işlevsel diller arasında çok benzer.

Belirli bir belirli işlev seçin ve karşılaştırdığınız tüm dillerde yazın ve muhtemelen farklı uygulamaların yapısı ve semantiğinin, soyutlama düzeyi, seçilen veri yapıları da dahil olmak üzere hepsi için çok benzer olacağını göreceksiniz. tüm çöp toplama vb varsayalım.

Aksine, bir C uygulamasının vs aynı işlevin bir Smalltalk uygulamasının muhtemelen farklı bir yapıya (fonksiyonlar ve nesneler vs düşük seviyeli veri yapıları) sahip olacağını, farklı ayrıntı düzeylerine odaklanacağını (örneğin, manuel bellek yönetimi ve çöp toplama) ) ve farklı soyutlama düzeylerinde çalışır.

İşlevsel dil tasarım alanının dünya görüşü, montaj, C, Smalltalk, Forth ve diğer düzinelerce farklı dili radikal olarak farklı dilleri tek bir kategoride toplayan "zorunlu programlama" alanından daha spesifik ve uyumludur.


4

Bence Simon PJ'nin alıntısı aslında biraz elden çıkmış bir açıklama.

Diller arasındaki benzerlik, araştırmacı ve dil tasarımcısı topluluğunda hangi fikir birliğinin üretildiğine göre belirlenir. İşlevsel programlama topluluğunda, zorunlu programlama topluluğundan daha yüksek bir fikir birliği olduğu sorusu yoktur. Ancak fonksiyonel programlama dillerinin uygulayıcılar yerine çoğunlukla araştırmacılar tarafından tasarlandığı da söz konusudur. Bu nedenle, bu görüş birliğinin ortaya çıkması doğaldır.

Hemen hemen tüm işlevsel diller çöp toplama bellek yönetimi ve özyinelemeli veri yapıları (Lisp kaynaklı) kullanır, çoğu "cebirsel" veri türleri ve desen eşleme (Umut kaynaklı) kullanır, birçoğu daha üst düzey işlevler ve polimorfik işlevler kullanır ( ML kaynaklı). Bunun ötesinde fikir birliği ortadan kalkar. Kullanılan modül sistemlerinde, durum değişikliği işlemlerinin ve diğer hesaplama etkilerinin nasıl ele alınması gerektiğine ve değerlendirme sırasına (ada göre çağrı ile değere göre çağrı) vb.

Zorunlu programlama dilleri genellikle (Algol 60 kaynaklı) iç içe geçmiş kontrol yapıları ve (Algol 60 kaynaklı ancak Algol 68 tarafından konsolide edilen) tip sistemleri kullanır. Genellikle hantal yüzey sözdizimine sahiptirler (yine Algol 60'a geri dönerler), daha üst düzey işlevleri ve polimorfik türleri ele almak için yarı yürekli girişimler yaparlar ve blok yapısı ve modül sistemleri için desteklerinde farklılık gösterirler. Değerlendirme düzeninde muhtemelen daha fazla tekdüzelik vardır, çünkü 60'lı yıllardan sonra, isim-görüşme zorunlu olarak zorunlu dillerden kayboldu.

Dolayısıyla, iki dil sınıfı arasındaki tekdüzelik arasındaki farkın o kadar büyük olduğu bana açık değil.

İşlevsel programlamanın daha temiz ve tek biçimli gösterimlerini zorunlu programlama dillerine getirmek gerçekten değerli olacaktır. Scala'nın bu yönde bir başlangıç ​​yaptığını görüyorum. Trendin devam edip etmeyeceği hala görülüyor.


Acaba merak ediyorum neden "cebirsel" veri türlerinde scarey tırnak kullandınız?
Steven Shaw
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.