Jaki jest związek między rachunkiem lambda a językami programowania? [Zamknięte]

13

Zaczynam swój pierwszy rok (na studiach) na kierunku informatyka w przyszłym roku i piszę głównie w języku C (jeśli to ma znaczenie). Próbowałem szukać, ale większość tego, co znalazłem, zakłada znajomość rachunku lambda. Dlaczego rachunek lambda jest uważany za o wiele bardziej przydatny niż rachunek pojedynczej zmiennej w programowaniu? Czy istnieje związek między wyrażeniami lambda a programami funkcjonalnymi? Czy praca Alonzo Church nad rachunkiem lambda wpłynęła na rozwój języków programowania?

Wszyscy poza szkołą wciąż o tym gadają i nie mam pojęcia, o czym będą rozmawiać, mimo że chętnie się tego nauczę i zobaczę, jak to bezpośrednio odnosi się do mojego programowania i rozumienia języków programowania.

Ronald Munodawafa
źródło
2
Odpowiedź na to pytanie będzie lepsza na stronie cs.stackexchange.com .
davidk01
@ChrisF. Być może to pytanie lepiej pasuje do jednej z witryn informatycznych. Jeśli nie, próbowałem go zawęzić i zastanawiam się, czy można go ponownie otworzyć w obecnej formie.
Tom Au
Mathematica ma rachunek lambda upieczony w zauważonym, że nikt o nim nie wspominał.
William

Odpowiedzi:

26

Lambda Calculus jest interesujący, elegancki i znacznie ułatwia zrozumienie funkcjonalnych języków programowania. Jednak nie spotkasz LC na typowym kursie licencjackim CS, więc nie musisz się go teraz uczyć - przed ponownym odwiedzeniem rachunku Lambda polecam najpierw eksperymentowanie z językami funkcjonalnymi. Wierzę, że OCaml jest dobrym punktem wyjścia do programowania funkcjonalnego dla programisty C, i że Schemat jest dobrym punktem wyjścia do zanurzenia się w rachunku Lambda.

Rachunek Lambda nie jest powiązany z Rachunkiem (który zamiast tego powinien być nazywany Analizą). Zasadniczo rachunek różniczkowy jest „systemem formalnym”, tj. Zestawem zasad, aby coś zrobić. Podczas gdy Rachunek różniczkowy zapewnia reguły dotyczące zmiany wartości, reguły Rachunku Lambda opisują same obliczenia. Na podstawie tego zestawu bardzo podstawowych reguł możemy budować dowolne obliczenia, reprezentacje danych, takie jak logiczne, liczby całkowite lub listy, a nawet konstruować konstrukcje przepływu, takie jak warunkowe lub pętle. LC jest równoważny z maszynami Turinga, ale każdy model ma inną siłę.

Lambda Calculus miał ogromny wpływ na języki programowania. Drugim językiem wysokiego poziomu do wdrożenia był Lisp, który można rozumieć jako bezpośrednie kodowanie LC na język programowania. To „programowanie funkcjonalne” ma ogromny wpływ na ewolucję języków programowania. Funkcje takie jak funkcje anonimowe, wskaźniki funkcji, zamknięcia (funkcje zagnieżdżone), wyrzucanie elementów bezużytecznych, zmienny zakres, metaprogramowanie, postępy w systemach typów, wnioskowanie typów, języki interpretowane, języki dynamicznie typowane, programowanie obiektowe są w dużej mierze zawdzięczane dużej części do funkcjonalnej gałęzi programowania języków programowania. Żartuje się, że każdy nowy (nieakademicki) język programowania dodaje tylko funkcje, które Lisp ma już od dziesięcioleci.

Poza tym, rachunek Lambda i inne pokrewne rachunki są niezbędnymi narzędziami w teorii języka programowania i niektórych technikach konstruowania kompilatora.

Każdy język, który ma anonimowe funkcje, które zachowują się jak zamknięcia i które można swobodnie przekazywać, natychmiast zawiera kodowanie rachunku lambda. Funkcje anonimowe odpowiadają wyrażeniom lambda, z tym wyjątkiem, że w funkcjach LC zawsze ma dokładnie jeden argument. Jednak każdy język Turing-zupełny jest równoważny LC, więc LC zawsze może być zaimplementowany na takich językach. Zdarza się to zwykle w systemach dopasowywania reguł lub zbyt inteligentnych formatach konfiguracji, co prowadzi do „dziesiątej reguły Greenspun” (żartobliwie - głównie): „ Każdy wystarczająco skomplikowany program C lub Fortran zawiera ad hoc, nieformalnie określony, z błędami , powolne wdrażanie połowy Common Lisp.

amon
źródło
To lepsza odpowiedź niż ta, którą wcześniej wybrałem. Twoja odpowiedź naprawdę trafia do domu. Właśnie tego szukałem!
RonaldMunodawafa
„... oprócz tego, że w funkcjach LC zawsze ma dokładnie jeden argument”: Czy ta funkcja nazywa się curry, czy jest z nią przynajmniej związana?
Giorgio
@Giorgio Currying jest inny, ale powiązany. LC nie ma funkcji wielu argumentów, ale można je po prostu zakodować jako funkcje zagnieżdżone, które przyjmują po jednym argumencie. Przykład z wykorzystaniem notacji ML: x = fn (a, b, c) => a + b + c(typ int * int * int -> int, wywołanie fn (1, 2, 3)) można przekształcić w x = fn a => fn b => fn c => a + b + c(typ int -> int -> int -> int, wywołanie ((x 1) 2) 3- opcje opcjonalne w ML). Teraz zamiast podawać wszystkie trzy argumenty, możemy również podać tylko dwa: plus3 = x 1 2który ma typ int -> int. Jest to częściowe nakładanie / curry.
amon
Myślałem, że curry oznacza, że ​​wszystkie funkcje wymagają tylko jednego argumentu (jak w LC).
Giorgio
8

Rachunek lambda nie ma nic wspólnego z rachunkiem różniczkowym / całkowym. Rachunek różniczkowy w najbardziej ogólnym znaczeniu tego słowa oznacza po prostu system obliczeń.

Na bardzo wysokim poziomie rachunek lambda jest modelem obliczeniowym w taki sam sposób, jak maszyna Turinga jest modelem obliczeniowym. Powodem, dla którego badacze języków programowania badają rachunek lambda, jest to, że jako model ma silne powiązania z metodami formalnymi w matematyce, takimi jak logika i teoria kategorii. Zatem metody z tych domen można zastosować do badania różnych aspektów i rozszerzeń rachunku lambda, co z kolei pomaga w projektowaniu lepszych języków programowania o określonych właściwościach.

Najbardziej bezpośredni wpływ rachunku lambda w językach programowania zwykle pojawia się w postaci funkcji i zamknięć pierwszej klasy. C nie obsługuje zamykania, więc musisz zbadać tę koncepcję w języku wyższego poziomu, takim jak Lisp, Python, Ruby, JavaScript itp. Historycznie Lisp jest uważany za pierwszą konkretną implementację rachunku lambda jako języka programowania .

davidk01
źródło
1
Możesz wspomnieć o konkretnych językach, które są bardzo zbliżone do rachunku lambda, np. Lisp.
Giorgio
1
Wciąż uczę się Schematu za pomocą SICP i mam nadzieję, że dowiem się więcej o tym obszarze. Dziękuję za twoją wyszukaną odpowiedź i sugestię.
RonaldMunodawafa