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.
programming-languages
computer-science
lambda-calculus
Ronald Munodawafa
źródło
źródło
Odpowiedzi:
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. ”
źródło
x = fn (a, b, c) => a + b + c
(typint * int * int -> int
, wywołaniefn (1, 2, 3)
) można przekształcić wx = fn a => fn b => fn c => a + b + c
(typint -> 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 2
który ma typint -> int
. Jest to częściowe nakładanie / curry.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 .
źródło