Lambda hesabı ile programlama dilleri arasındaki ilişki nedir? [kapalı]


13

İlk yılımı (üniversitede) önümüzdeki yıl Bilgisayar Bilimi'nde başlıyorum ve çoğunlukla C dilinde yazıyorum (eğer önemliyse). Aramaya çalıştım ama bulduğum şeylerin çoğu lambda hesabı hakkında bilgi sahibi oluyor. Lambda hesabı neden yeniden değişkenlemede tek değişkenli hesaplamadan daha yararlıdır? Lambda ifadeleri ile fonksiyonel programlar arasında bir ilişki var mı? Alonzo Kilisesi'nin programlama dillerinin gelişimini etkileyen lambda hesabı üzerindeki çalışması mıydı?

Okul dışındaki herkes bu konuda vızıldamaya devam ediyor ve öğrenmeye hevesli olduğum halde, programlama dilleri ile programlama dilleri ve anlayışımla nasıl doğrudan ilgilendiğini görmeme rağmen hiçbir fikrim yok.


2
Bu soru daha iyi cs.stackexchange.com adresinde cevaplandırılacaktır .
davidk01

@ChrisF. Belki de bu soru bilgisayar bilimi sitelerinden biri için daha uygundur. Değilse, daraltmaya çalıştım ve mevcut haliyle tekrar açılabileceğini merak ettim.
Tom Au

Mathematica'da hiç kimsenin bahsetmediği fark edilen pişmiş lambda taşı var.
William

Yanıtlar:


26

Lambda Matematik ilginç, zarif ve fonksiyonel programlama dillerini anlamayı çok daha kolay hale getiriyor. Bununla birlikte, tipik bir CS Lisans kursunda LC ile karşılaşmayacaksınız, bu yüzden şu anda öğrenmek zorunda değilsiniz - Lambda Calculus'u tekrar ziyaret etmeden önce fonksiyonel dillerle denemenizi tavsiye ederim. OCaml'ın bir C programcısı için fonksiyonel programlamaya iyi bir başlangıç ​​noktası olduğuna ve Şema'nın Lambda Analizine dalmak için iyi bir başlangıç ​​noktası olduğuna inanıyorum.

Lambda Hesabı, Kalkülüs ile ilişkili değildir (bunun yerine Analiz olarak adlandırılmalıdır). Genel olarak, bir hesaplama “biçimsel bir sistemdir”, yani bir şeyler yapmak için bir dizi kuraldır. Diferansiyel Analiz değerlerin değişmesi ile ilgili kurallar sağlarken, Lambda Matematik kuralları hesaplamanın kendisini tanımlar. Bu çok temel kurallar kümesinden, rasgele hesaplamalar, booleans, tamsayılar veya listeler gibi veri gösterimleri oluşturabilir ve hatta koşullu veya döngüler gibi akış yapılarını kontrol edebiliriz. LC, Turing Machines'e eşdeğerdir, ancak her iki modelin de farklı güçleri vardır.

Lambda Matematik programlama dilleri üzerinde çok büyük bir etkiye sahipti. Uygulanacak ikinci üst düzey dil, LC'nin bir programlama diline doğrudan kodlanması olarak anlaşılabilen Lisp'ti. Bu “işlevsel programlamanın” programlama dillerinin gelişimi üzerinde büyük etkisi vardır. Anonim işlevler, işlev işaretçileri, kapaklar (iç içe işlevler), çöp toplama, değişken kapsam, metaprogramlama, tür sistemlerindeki ilerlemeler, tür çıkarım, yorumlanmış diller, dinamik olarak yazılan diller, nesneye yönelik programlama gibi özelliklerin tümü büyük bir paya sahiptir. programlama dillerinin fonksiyonel programlama dalına. Herhangi bir yeni (akademik olmayan) programlama dilinin sadece Lisp'in onlarca yıldır sahip olduğu özellikleri eklediği bir şaka var.

Bunun ötesinde, Lambda Kalkülusu ve diğer ilgili kalkülüsler programlama dili teorisinde ve bazı derleyici yapım tekniklerinde vazgeçilmez araçlardır.

Anonim işlevlere sahip, kapanış gibi davranan ve hemen serbestçe geçirilebilen herhangi bir dil, lambda hesabının kodlamasını içerir. Anonim işlevler, lambda ifadelerine karşılık gelir, ancak LC işlevlerinde her zaman tam olarak bir bağımsız değişken vardır. Bununla birlikte, herhangi bir Turing-complete dili LC'ye eşdeğerdir, bu nedenle LC her zaman bu dillerin üzerine uygulanabilir. Bu kural eşleme sistemlerinde veya aşırı akıllı konfigürasyon biçimlerinde gerçekleşme eğilimindedir ve “Greenspun'un onuncu kuralına” neden olur (çoğunlukla jest olarak): “ Yeterince karmaşık olan herhangi bir C veya Fortran programı geçici, gayri resmi olarak belirtilen, hataya sahip , Common Lisp'in yarısının yavaş uygulanması.


Bu, daha önce seçtiğimden daha iyi bir cevap. Cevabınız gerçekten eve geliyor. Tam da aradığım şey buydu!
RonaldMunodawafa

“... LC fonksiyonlarında her zaman tam olarak bir argüman var”: Bu özelliğe currying deniyor mu yoksa en azından bununla mı ilgili?
Giorgio

@Giorgio Currying farklıdır, ancak ilişkilidir. LC'nin çoklu bağımsız değişken işlevleri yoktur, ancak bunlar her biri bir bağımsız değişken alan iç içe işlevler olarak kodlanabilir. ML gösterimi kullanan örnek: x = fn (a, b, c) => a + b + c(tür int * int * int -> int, çağırma fn (1, 2, 3)) x = fn a => fn b => fn c => a + b + c(tür int -> int -> int -> int, çağırma ((x 1) 2) 3- ML'de isteğe bağlı parenler) dönüştürülebilir. Şimdi her üç argümanı da vermek yerine, sadece iki tane sağlayabiliriz: plus3 = x 1 2hangisi tür int -> int. Bu kısmi uygulama / körelme.
amon

Körelemenin (LC'deki gibi) sadece bir argüman alması gerektiğini düşündüm.
Giorgio

8

Lambda hesabı diferansiyel / integral hesabı ile ilgisi yoktur. Matematik kelimesinin en genel anlamında sadece bir hesaplama sistemi anlamına gelir.

Çok yüksek bir seviyede lambda hesabı, bir turing makinesinin bir hesaplama modeli olduğu gibi bir hesaplama modelidir. Programlama dili araştırmacılarının lambda hesabını incelemesinin nedeni, model olarak matematikte mantık ve kategori teorisi gibi biçimsel yöntemlerle güçlü bağlantıları olmasıdır. Bu nedenle, bu alanlardan gelen yöntemler, lambda hesabının çeşitli yönlerini ve uzantılarını incelemek için uygulanabilir ve bu da belirli özelliklere sahip daha iyi programlama dilleri tasarlamaya yardımcı olur.

Programlama dillerinde lambda hesabının en doğrudan etkisi genellikle birinci sınıf fonksiyonlar ve kapanışlar şeklinde görülür. C'nin kapanışlar için desteği yoktur ve bu nedenle konsepti Lisp, Python, Ruby, JavaScript, vb. Gibi daha yüksek bir dilde keşfetmeniz gerekir. .


1
Lambda hesabına oldukça yakın olan belirli dillerden, örneğin Lisp'den bahsetmek isteyebilirsiniz.
Giorgio

1
Hala SICP kullanarak Şema öğreniyorum ve umarım bu alan hakkında daha fazla bilgi edineceğim. Ayrıntılı yanıtınız ve öneriniz için teşekkürler.
RonaldMunodawafa
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.