Apa hubungan antara kalkulus lambda dan bahasa pemrograman? [Tutup]

13

Saya memulai tahun pertama saya (di perguruan tinggi) dalam Ilmu Komputer tahun depan dan saya menulis sebagian besar dalam C (jika itu penting). Saya telah mencoba mencari tetapi sebagian besar dari apa yang saya temukan berasumsi pengetahuan tentang kalkulus lambda. Mengapa kalkulus lambda dianggap jauh lebih berguna daripada kalkulus variabel tunggal dalam prograrmming? Apakah ada hubungan antara ekspresi lambda dan program fungsional? Apakah karya Gereja Alonzo tentang kalkulus lambda yang memengaruhi perkembangan bahasa pemrograman?

Semua orang di luar sekolah terus berdebat tentang hal itu dan saya tidak tahu apa yang akan mereka bicarakan walaupun saya ingin mempelajarinya dan melihat bagaimana itu berhubungan langsung dengan pemrograman saya dan pemahaman bahasa pemrograman.

RonaldMunodawafa
sumber
2
Pertanyaan ini akan lebih baik dijawab di cs.stackexchange.com .
davidk01
@ ChrisF. Mungkin pertanyaan ini lebih cocok untuk salah satu situs ilmu komputer. Jika tidak, saya mencoba mempersempitnya, dan bertanya-tanya apakah itu dapat dibuka kembali dalam bentuk saat ini.
Tom Au
Mathematica telah membuat kalkulus lambda dan memperhatikan tidak ada yang menyebutkannya.
William

Jawaban:

26

Kalkulus Lambda menarik, elegan, dan membuatnya lebih mudah untuk memahami bahasa pemrograman fungsional. Namun, Anda tidak akan menjumpai LC dalam kursus Sarjana CS biasa, jadi Anda tidak harus mempelajarinya sekarang - saya akan merekomendasikan untuk bereksperimen dengan bahasa fungsional terlebih dahulu sebelum mengunjungi kembali Kalkulus Lambda. Saya percaya OCaml adalah titik awal yang baik ke pemrograman fungsional untuk seorang programmer C, dan Skema itu adalah titik awal yang baik untuk menyelam ke dalam Kalkulus Lambda.

Kalkulus Lambda tidak terkait dengan Kalkulus (yang seharusnya disebut Analisis). Secara umum, kalkulus adalah "sistem formal", yaitu seperangkat aturan untuk melakukan sesuatu. Sementara Kalkulus Diferensial memberikan aturan tentang perubahan nilai, aturan Kalkulus Lambda menjelaskan perhitungan itu sendiri. Dari sekumpulan aturan yang sangat mendasar ini, kita dapat membangun perhitungan sewenang-wenang, representasi data seperti boolean, bilangan bulat, atau daftar, dan bahkan kontrol konstruksi aliran seperti kondisional atau loop. LC setara dengan Mesin Turing, tetapi model mana pun memiliki kekuatan yang berbeda.

Lambda Calculus memiliki dampak besar pada bahasa pemrograman. Bahasa tingkat tinggi kedua yang diimplementasikan adalah Lisp, yang dapat dipahami sebagai penyandian langsung dari LC ke dalam bahasa pemrograman. "Pemrograman fungsional" ini memiliki efek besar pada evolusi bahasa pemrograman. Fitur-fitur seperti fungsi anonim, fungsi pointer, penutupan (fungsi bersarang), pengumpulan sampah, lingkup variabel, metaprogramming, kemajuan dalam sistem tipe, inferensi tipe, bahasa yang ditafsirkan, bahasa yang diketik secara dinamis, pemrograman berorientasi objek semuanya berutang sebagian besar ke cabang pemrograman fungsional bahasa pemrograman. Ada lelucon bahwa bahasa pemrograman baru (non-akademik) hanya menambahkan fitur yang sudah dimiliki Lisp selama beberapa dekade.

Selain itu, Kalkulus Lambda dan kalkuli terkait lainnya adalah alat yang sangat diperlukan dalam teori bahasa pemrograman dan teknik konstruksi penyusun tertentu.

Bahasa apa pun yang memiliki fungsi anonim yang berperilaku sebagai penutupan dan dapat diedarkan secara bebas segera mengandung penyandian kalkulus lambda. Fungsi anonim sesuai dengan ekspresi lambda, kecuali bahwa dalam fungsi LC selalu memiliki satu argumen. Namun, bahasa lengkap Turing apa pun setara dengan LC, sehingga LC selalu dapat diimplementasikan di atas bahasa tersebut. Hal ini cenderung terjadi dalam sistem pencocokan aturan atau format konfigurasi yang terlalu cerdas, sehingga menimbulkan "aturan kesepuluh Greenspun" (bercanda - kebanyakan): " Program C atau Fortran yang cukup rumit mengandung program ad hoc, khusus yang ditentukan, bug-ridden , lambatnya implementasi setengah dari Common Lisp.

amon
sumber
Ini adalah jawaban yang lebih baik daripada yang saya pilih sebelumnya. Jawaban Anda sangat menyentuh. Ini persis apa yang saya cari!
RonaldMunodawafa
"... kecuali bahwa dalam fungsi LC selalu ada satu argumen": Apakah fitur ini disebut currying atau setidaknya terkait dengan itu?
Giorgio
@Giorgio Currying berbeda, tetapi terkait. LC tidak memiliki fungsi multi-argumen, tetapi mereka hanya dapat dikodekan sebagai fungsi bersarang yang masing-masing mengambil satu argumen. Contoh menggunakan notasi ML: x = fn (a, b, c) => a + b + c(tipe int * int * int -> int, doa fn (1, 2, 3)) dapat diubah menjadi x = fn a => fn b => fn c => a + b + c(tipe int -> int -> int -> int, doa ((x 1) 2) 3- parens opsional dalam ML). Sekarang alih-alih memasok ketiga argumen, kami juga hanya dapat memberikan dua argumen: plus3 = x 1 2yang bertipe int -> int. Ini adalah aplikasi parsial / kari.
amon
Saya pikir currying berarti memiliki semua fungsi hanya membutuhkan satu argumen (seperti dalam LC).
Giorgio
8

Kalkulus Lambda tidak ada hubungannya dengan kalkulus diferensial / integral. Kalkulus dalam arti kata yang paling umum berarti sistem perhitungan.

Pada tingkat yang sangat tinggi kalkulus lambda adalah model perhitungan dengan cara yang sama dengan mesin turing adalah model perhitungan. Alasan peneliti bahasa pemrograman mempelajari kalkulus lambda adalah karena sebagai model ia memiliki koneksi yang kuat dengan metode formal dalam matematika seperti logika dan teori kategori. Jadi metode dari domain tersebut dapat diterapkan untuk mempelajari berbagai aspek dan ekstensi kalkulus lambda yang pada gilirannya membantu merancang bahasa pemrograman yang lebih baik dengan properti tertentu.

Pengaruh paling langsung kalkulus lambda dalam bahasa pemrograman biasanya muncul dalam bentuk fungsi dan penutupan kelas satu. C tidak memiliki dukungan untuk penutupan dan oleh karena itu Anda harus menjelajahi konsep dalam bahasa tingkat tinggi seperti Lisp, Python, Ruby, JavaScript, dll. Secara historis Lisp dianggap sebagai implementasi konkret pertama dari kalkulus lambda sebagai bahasa pemrograman .

davidk01
sumber
1
Anda mungkin ingin menyebutkan bahasa tertentu yang cukup dekat dengan kalkulus lambda, misalnya Lisp.
Giorgio
1
Saya masih belajar Skema menggunakan SICP dan berharap saya akan belajar lebih banyak tentang bidang ini. Terima kasih atas jawaban dan saran Anda yang terperinci.
RonaldMunodawafa