แคลคูลัสแลมบ์ดากับภาษาการเขียนโปรแกรมมีความสัมพันธ์กันอย่างไร? [ปิด]


13

ฉันเริ่มปีแรกของฉัน (ในวิทยาลัย) ในวิทยาการคอมพิวเตอร์ในปีหน้าและฉันเขียนส่วนใหญ่ใน C (ถ้าเป็นเรื่อง) ฉันได้ลองค้นหาแล้ว แต่สิ่งที่ฉันพบส่วนใหญ่ถือว่ามีความรู้เกี่ยวกับแลมบ์ดาแคลคูลัส ทำไมแคลคูลัสแลมบ์ดาจึงถูกพิจารณาว่ามีประโยชน์มากกว่าแคลคูลัสแบบแปรผันเพียงตัวเดียวในการเริ่มโปรแกรม มีความสัมพันธ์ระหว่างการแสดงออกแลมบ์ดากับโปรแกรมการทำงานหรือไม่? มันเป็นงานของ Alonzo Church ในแลมบ์ดาแคลคูลัสที่มีอิทธิพลต่อการพัฒนาภาษาการเขียนโปรแกรมหรือไม่?

ทุกคนที่อยู่นอกโรงเรียนยังคงคึกคักเกี่ยวกับเรื่องนี้และฉันก็ไม่รู้เลยว่าพวกเขาจะพูดถึงอะไรถึงแม้ว่าฉันกระตือรือร้นที่จะเรียนรู้และดูว่ามันเกี่ยวข้องโดยตรงกับการเขียนโปรแกรมและความเข้าใจภาษาโปรแกรมของฉันอย่างไร


2
คำถามนี้จะได้รับการตอบดีกว่าที่cs.stackexchange.com
davidk01

@ChrisF บางทีคำถามนี้เหมาะสำหรับเว็บไซต์วิทยาศาสตร์คอมพิวเตอร์แห่งใดแห่งหนึ่ง ถ้าไม่ฉันพยายาม จำกัด ให้แคบลงและสงสัยว่าจะสามารถเปิดใหม่ในรูปแบบปัจจุบันได้หรือไม่
Tom Au

Mathematica มีแคลคูลัสแลมบ์ดาในที่สังเกตเห็นไม่มีใครพูดถึงมัน
วิลเลียม

คำตอบ:


26

แลมบ์ดาแคลคูลัสนั้นน่าสนใจสง่างามและทำให้เข้าใจภาษาโปรแกรมการทำงานได้ง่ายขึ้น อย่างไรก็ตามคุณจะไม่พบ LC ในหลักสูตร CS ตรีทั่วไปดังนั้นคุณไม่จำเป็นต้องเรียนรู้ในตอนนี้ - ฉันอยากจะแนะนำให้ทดสอบกับภาษาที่ใช้งานได้ก่อนที่จะกลับไปที่แลมบ์ดาแคลคูลัส ฉันเชื่อว่า OCaml เป็นจุดเริ่มต้นที่ดีในการเขียนโปรแกรมใช้งานสำหรับโปรแกรมเมอร์ C และ Scheme นั้นเป็นจุดเริ่มต้นที่ดีในการดำน้ำในแลมบ์ดาของแลมบ์ดา

แลมบ์ดาแคลคูลัสไม่เกี่ยวข้องกับแคลคูลัส (ซึ่งควรเรียกว่าการวิเคราะห์แทน) โดยทั่วไปแคลคูลัสเป็น "ระบบที่เป็นทางการ" คือชุดของกฎที่จะทำบางสิ่งบางอย่าง ในขณะที่ Differential แคลคูลัสให้กฎเกี่ยวกับการเปลี่ยนแปลงค่ากฎของแลมบ์ดาแคลคูลัสอธิบายการคำนวณเอง จากกฎพื้นฐานชุดนี้เราสามารถสร้างการคำนวณโดยพลการการแทนข้อมูลเช่นบูลีนจำนวนเต็มหรือรายการและแม้แต่ควบคุมการสร้างโฟลว์เช่นเงื่อนไขหรือลูป LC นั้นเทียบเท่ากับเครื่องทัวริง แต่รุ่นใดรุ่นหนึ่งมีจุดแข็งต่างกัน

แลมบ์ดาแคลคูลัสมีผลกระทบอย่างมากต่อภาษาการเขียนโปรแกรม ภาษาระดับสูงที่สองที่จะนำมาใช้คือ LISP ซึ่งสามารถเข้าใจได้ว่าเป็นการเข้ารหัส LC โดยตรงในภาษาการเขียนโปรแกรม “ การโปรแกรมเชิงฟังก์ชัน” นี้มีผลอย่างมากต่อวิวัฒนาการของภาษาการเขียนโปรแกรม คุณสมบัติเช่นฟังก์ชั่นที่ไม่ระบุชื่อพอยน์เตอร์ของฟังก์ชั่นการปิด (ฟังก์ชั่นที่ซ้อนกัน), การเก็บขยะ, ขอบเขตตัวแปร, metaprogramming, ความก้าวหน้าในระบบประเภท, การอนุมานประเภท, ภาษาตีความ, ภาษาที่พิมพ์แบบไดนามิก ไปยังสาขาการเขียนโปรแกรมการทำงานของภาษาการเขียนโปรแกรม มีเรื่องตลกที่ภาษาการเขียนโปรแกรม (ไม่ใช่ทางวิชาการ) ใหม่ใด ๆ เพิ่มเฉพาะคุณสมบัติที่ LISP มีมานานหลายทศวรรษแล้ว

นอกจากนั้นแลมบ์ดาแคลคูลัสและแคลคูลัสอื่น ๆ ที่เกี่ยวข้องเป็นเครื่องมือที่ขาดไม่ได้ในทฤษฎีภาษาโปรแกรมและเทคนิคการสร้างคอมไพเลอร์

ภาษาใด ๆ ที่มีฟังก์ชั่นนิรนามซึ่งทำหน้าที่ปิดและสามารถส่งผ่านได้อย่างอิสระทันทีมีการเข้ารหัสแคลคูลัสแลมบ์ดา ฟังก์ชั่นที่ไม่ระบุชื่อสอดคล้องกับการแสดงออกแลมบ์ดายกเว้นว่าในฟังก์ชั่น LC มักจะมีอาร์กิวเมนต์เดียว อย่างไรก็ตามภาษาทัวริงที่สมบูรณ์จะเทียบเท่ากับ LC ดังนั้น LC จึงสามารถนำไปใช้กับภาษาดังกล่าวได้ สิ่งนี้มีแนวโน้มที่จะเกิดขึ้นในระบบจับคู่กฎหรือรูปแบบการตั้งค่าที่ชาญฉลาดจนก่อให้เกิด“ กฎข้อที่สิบของ Greenspun” (โดยส่วนใหญ่ - ส่วนใหญ่):“ โปรแกรม C หรือ Fortran ที่ซับซ้อนมากพอมีโปรแกรมเฉพาะกิจ การใช้งานช้าลงครึ่งหนึ่งของ Common LISP


นี่เป็นคำตอบที่ดีกว่าคำตอบที่ฉันเลือกไว้ก่อนหน้า คำตอบของคุณยอดฮิตที่บ้านจริงๆ นี่คือสิ่งที่ฉันกำลังมองหา!
RonaldMunodawafa

"... ยกเว้นว่าในการทำงาน LC เสมอได้ว่าหนึ่งอาร์กิวเมนต์": คือคุณลักษณะนี้เรียกว่าcurryingหรือจะเป็นอย่างน้อยที่เกี่ยวข้องกับมันได้หรือไม่
Giorgio

@Giorgio Currying แตกต่างกัน แต่มีความเกี่ยวข้อง LC ไม่ได้มีฟังก์ชั่นหลายอาร์กิวเมนต์ แต่สิ่งเหล่านั้นสามารถถูกเข้ารหัสเป็นฟังก์ชันซ้อนกันที่ใช้อาร์กิวเมนต์หนึ่งรายการ ตัวอย่างการใช้สัญลักษณ์ ML: x = fn (a, b, c) => a + b + c(ประเภทint * int * int -> int, การเรียกใช้fn (1, 2, 3)) สามารถแปลงเป็นx = fn a => fn b => fn c => a + b + c(ประเภทint -> int -> int -> int, การเรียกใช้((x 1) 2) 3- parens เป็นทางเลือกใน ML) ตอนนี้แทนการจัดหาทั้งสามข้อโต้แย้งเรายังสามารถเพียง แต่ให้ที่สอง: ซึ่งมีประเภทplus3 = x 1 2 int -> intนี่เป็นแอปพลิเคชั่น / การแกงบางส่วน
amon

ฉันคิดว่าการแกงหมายถึงการที่ทุกฟังก์ชั่นใช้อาร์กิวเมนต์เพียงตัวเดียว (เช่นเดียวกับ LC)
Giorgio

8

แลมบ์ดาแคลคูลัสไม่มีส่วนเกี่ยวข้องกับแคลคูลัสอนุพันธ์ / อินทิกรัล แคลคูลัสในความหมายทั่วไปที่สุดของคำว่าระบบการคำนวณ

ในระดับสูงมากแคลคูลัสแลมบ์ดาเป็นรูปแบบการคำนวณแบบเดียวกับที่เครื่องทัวริงเป็นแบบจำลองการคำนวณ เหตุผลที่นักวิจัยด้านภาษาเขียนโปรแกรมศึกษาแลมบ์แคลคูลัสนั้นเป็นเพราะแบบจำลองมีการเชื่อมต่อที่ดีกับวิธีการอย่างเป็นทางการในวิชาคณิตศาสตร์เช่นตรรกะและทฤษฎีหมวดหมู่ ดังนั้นวิธีการจากโดเมนเหล่านั้นสามารถนำไปใช้กับการศึกษาแง่มุมต่าง ๆ และส่วนขยายของแคลคูลัสแลมบ์ดาซึ่งจะช่วยออกแบบภาษาการเขียนโปรแกรมที่ดีขึ้นด้วยคุณสมบัติบางอย่าง

อิทธิพลโดยตรงที่สุดของแคลคูลัสแลมบ์ดาในภาษาการเขียนโปรแกรมมักจะปรากฏในรูปแบบของฟังก์ชั่นและการปิดชั้นหนึ่ง C ไม่รองรับการปิดดังนั้นคุณจะต้องสำรวจแนวคิดในภาษาระดับสูงเช่น Lisp, Python, Ruby, JavaScript และอื่น ๆ ในอดีต Lisp ถือว่าเป็นรูปธรรมครั้งแรกของแคลคูลัสแลมบ์ดาเป็นภาษาโปรแกรม .


1
คุณอาจต้องการพูดถึงภาษาเฉพาะที่ค่อนข้างใกล้กับแคลคูลัสแลมบ์ดาเช่น Lisp
Giorgio

1
ฉันยังคงเรียนรู้ Scheme โดยใช้ SICP และหวังว่าฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ ขอบคุณสำหรับคำตอบและข้อเสนอแนะที่ซับซ้อนของคุณ
RonaldMunodawafa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.