อะไรคือ“ คำถาม” ที่ทฤษฎีภาษาโปรแกรมพยายามตอบ?


10

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

Wikipediaอธิบายว่าเป็น:

Programming language theory (PLT) เป็นสาขาหนึ่งของวิทยาการคอมพิวเตอร์ที่เกี่ยวข้องกับการออกแบบการใช้งานการวิเคราะห์การจำแนกลักษณะและการจำแนกประเภทของภาษาโปรแกรมและคุณลักษณะส่วนบุคคล

นี่ก็เหมือนกับการพูดว่า "ทุกอย่าง" ซึ่งไม่เจาะจงจริงๆ

ความก้าวหน้าทั่วไปของหัวข้อมักเป็นดังนี้:

Combinatory Logic> แลมบ์ดาแคลคูลัส> ทฤษฎีมาร์ตินลอฟประเภท> แคลคูลัสแลมบ์ดาที่พิมพ์> (มีบางอย่างเกิดขึ้นที่นี่)> ภาษาโปรแกรมที่พัฒนาขึ้น - ซึ่งมีการเชื่อมต่อน้อยมากกับ CL /λ

ฉันสามารถดู "คณิตศาสตร์" พื้นฐานที่เกี่ยวข้องกับ CL /λและบทพิสูจน์ที่น่าสนใจที่ออกมาเป็นผลรวมถึงทฤษฎีบท Church-Rosser และนั่นก็เรียบร้อย อย่างไรก็ตามฉันพยายามดิ้นรนเพื่อทำความเข้าใจกับ "เป้าหมายสุดท้าย" ของกิจการทั้งหมดนี้ใช่ไหม อะไรคือจอกศักดิ์สิทธิ์ของ PLT ถ้าคุณจะ? ตอนนี้ดูเหมือนจะเป็นรอยขีดข่วนทางปัญญา แต่ฉันไม่สามารถข้ามสะพานจากการวิจัย / ทฤษฎีไปเป็นจริงได้

หมายเหตุ: ฉันจะได้รับมันจนใช้ λ-Calc สำหรับการพิสูจน์ undecidability แต่นอกเหนือจากการบังคับใช้กับ "ความสามารถในการคำนวณ" ฉันไม่เข้าใจและกำลังลำบากแม้จะเข้าใจถึงความต้องการการวิจัยใน PLT จากมุมมองแคบ ๆ นี้ หนังสืออ้างอิงใด ๆ ที่มีอยู่ซึ่งสามารถฉายใน "ภาพใหญ่" ของ PLT ได้หรือไม่


1
คุณกำลังเพิกเฉยต่อ PLT ทั้งหมดใน "ความก้าวหน้าทั่วไป" ของคุณ ด้วยเหตุผลบางอย่างมุมมองของคุณดูเหมือนจะเบ้λ- แคลคูลัสและทฤษฎีประเภท ให้เราดูเอกสารที่ได้รับการยอมรับของPOPL 2019 : การเขียนโปรแกรมแบบสุ่มพร้อมกัน, โปรแกรมน่าจะเป็น, แอสเซมบลีที่ตรวจสอบได้, เอฟเฟกต์พีชคณิต, รับรองเครือข่ายประสาทเทียม, PL และฮาร์ดแวร์ ทฤษฎีประเภท "คุณจะไม่พูดเหรอ?
Andrej Bauer

คุณถูกต้อง 100% ดังนั้นฉันจึงเรียกว่า "POV แคบ" ของฉัน ฉันคุ้นเคยกับ "หัวข้ออื่น ๆ " โดยอ่านจากที่นี่และตรวจสอบการดำเนินการ SIGPLAN / POPL ฉันยังหา "การอ้างอิงแบบองค์รวม / หนังสือ" ที่ให้ภาพรวมแปรงกว้าง ๆ ของ PLT ที่มีหัวข้อที่คุณกล่าวถึง บิตประเภททฤษฎีมาจากภาษาการเขียนโปรแกรม "ของฉัน" ของ (สร้าง?) เท่านั้น คุณจะมีตัวชี้บางอย่างที่สามารถให้การแนะนำระดับสูงแก่พื้นที่ต่าง ๆ ของ PLT เพื่อรับภาพรวมภาพใหญ่ได้หรือไม่? ฉันอยากรู้ว่าพวกเขาใช้โมเดล "ต้นแบบ" อะไรและอย่างไรλ ทุกที่?
ปริญญาเอก

2
@PhD ไม่มีการแนะนำระดับสูงในด้านต่าง ๆ ของ PLT ที่คุณต้องการc'est la vie ! บางทีสักวันหนึ่งสิ่งนี้จะเปลี่ยน แต่อย่ากลั้นหายใจ เขตข้อมูลมีการพัฒนาอย่างรวดเร็วและแยกความแตกต่างเป็นฟิลด์ย่อย โมเดลที่เป็นที่นิยมอื่น ๆ ได้แก่π- แคลคูลัสความหมายของโครงสร้างการทำงานนิรนัยเชิงบังคับง่าย ๆ (เช่นภาษา WHILE) และอื่น ๆ อีกมากมาย บ่อยครั้งที่หนึ่งประดิษฐ์แคลคูลัสของเล่นเพื่อให้เหมาะกับโดเมนแอปพลิเคชันของตน
Martin Berger

คำตอบ:


13

วัตถุประสงค์โดยรวมของ PLT คือการทำให้วิศวกรรมซอฟต์แวร์อุตสาหกรรม (ในความหมายทั่วไป) ราคาถูกกว่า (ในแง่ทั่วไป) ด้วยการปรับแต่งเครื่องมือที่สำคัญที่สุด (ภาษาโปรแกรม) และระบบนิเวศเครื่องมือที่เกี่ยวข้อง

เหตุผลบางประการที่เกี่ยวข้องกับคณิตศาสตร์:

  • PLs เป็นเรื่องไม่สำคัญและไม่ชัดเจนว่าพวกเขาทำสิ่งที่ถูกต้องโดยไม่มีข้อพิสูจน์ คณิตศาสตร์ให้รูปแบบเรียบง่ายของภาษาโปรแกรมจริง รุ่นนี้ช่วยให้เราศึกษาภาษาการเขียนโปรแกรมจริงในการตั้งค่าที่ง่ายขึ้นมากการลบ (หวังว่า) ปัญหาส่วนใหญ่ที่มีอยู่แล้วในระดับแบบจำลอง ภาษาการเขียนโปรแกรมจริงในปัจจุบันมีความยากลำบากทางคณิตศาสตร์ กล่าวอีกนัยหนึ่ง: แลมบ์ดาแคลคูลัสคือแมลงวันผลไม้, E.Coli, วัวทรงกลมของ PLT

  • PLT ขาดวิธีการทดลองที่เหมาะสมซึ่งน่าจะดีกว่าหรือดีกว่าถ้ามีดังนั้นคณิตศาสตร์จึงถูกใช้แทน

  • คณิตศาสตร์นั้นสวยงามและล้ำลึก

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

PLT จำเป็นหรือไม่เป็นคำถามที่น่าสนใจ โปรแกรมเมอร์ที่ทำงานส่วนใหญ่ดูเหมือนจะคิดว่าไม่ใช่ พวกเขาผิด: ภาษาส่วนใหญ่ที่พัฒนาโดยโปรแกรมเมอร์ที่ทำงานโดยไม่มีพื้นหลัง PLT (เช่น Javascript, PHP) เริ่มต้นแย่มากและทำผิดพลาดทั้งหมดที่นักทฤษฎี PL เรียนรู้วิธีหลีกเลี่ยง ถ้า PL ที่พัฒนาโดยมือสมัครเล่นเข้าสู่กระแสหลักนักทฤษฎี PL ต้องการทศวรรษหรือมากกว่านั้นในการแก้ไขข้อบกพร่องที่เห็นได้ชัด (เช่นการดัดแปลงระบบการพิมพ์แบบสแตติกดูที่ typescript) ฉันขอสรุปสถานการณ์นี้:

 Every successful programming language ends up being ML! Either because 
 it was designed by a PL theorist as ML from the start, or because a 
 decade of painful evolution removes all the obvious flaws, leaving ML. ;-)

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


1
@MartinBerger: CompCertนับว่าเป็นตัวอย่างของความสามารถในการจัดการภาษาการเขียนโปรแกรมในโลกแห่งความจริง "ตามหลักวิชา" หรือไม่? ถ้าไม่คุณตั้งค่าแถบสูงเท่าไหร่เพราะ CompCert นั้นค่อนข้างน่าประทับใจ
Andrej Bauer

2
@MartinBerger: โปรดพิจารณาลดลง "นักทฤษฎี PL ส่วนใหญ่คิดว่าการเขียนโปรแกรมที่ใช้งานได้จริงในภาษาเช่น Agda เป็นวิธีแก้ปัญหาทั้งหมด" เพราะนั่นเป็นเพียงการพูดจาโผงผางและการระบาย สำหรับผู้เริ่มต้นแม้ว่าคุณจะดูหัวข้อที่ปัจจุบันอยู่ที่ ICFP และ POPL ส่วนใหญ่เกี่ยวกับภาษาโปรแกรมที่ไม่บริสุทธิ์
Andrej Bauer

5
@PhD: มี PLT มากกว่าทฤษฎีประเภทมาก เป็นเพียงทฤษฎีประเภทนั้นเป็นสิ่งแรกที่คุณสังเกตเห็นเพราะเป็นหนึ่งในเครื่องมือหลักของ PLT
Andrej Bauer

1
@AndrejBauer CompCert, CakeML ฯลฯ เป็นที่น่าประทับใจ แต่พวกเขาอยู่ห่างไกลจากคอมไพเลอร์ที่ใช้กันอย่างแพร่หลายเช่น LLVM, GCC เป็นต้นนอกจากนี้คอมไพเลอร์ซึ่งแตกต่างจากซอฟต์แวร์โลกแห่งความเป็นจริงจะมีข้อกำหนด (ชนิด / ชนิดเรียงลำดับ) ที่คุณเพิ่งไม่ได้ในวิศวกรรมซอฟต์แวร์อุตสาหกรรมปกติ ไม่ต้องพูดถึงว่าส่วนใหญ่ของงานแรกของซาเวียร์ใน CompCert ประกอบด้วยการทำให้สเปคเป็นไปอย่างแม่นยำ
Martin Berger

2
@PhD เกี่ยวกับ "" การผลิตที่รุนแรงกว่า "ไม่ใช่> PLT C / C ++, Java, C #" โปรดจำไว้ว่าถ้าคุณดูที่ภาษาเหล่านั้นโดยเฉพาะอย่างยิ่งการวิวัฒนาการของพวกเขาในช่วงเวลาเกือบทุกอย่างที่พวกเขาได้มา เวลาเช่น lambdas monads (LINQ) การจับคู่รูปแบบการอนุมานบางส่วนมาจาก PLT ทีม C # มี PLT PhDs แน่นอนพวกเขาพยายามที่จะจ้างฉันในบางจุด สัมภาษณ์งานคือฉันพยายามโน้มน้าว Anders Heijlsberg ว่า C # ต้องการยาสามัญประจำวันซึ่งเขาไม่ชอบในเวลานั้น ...
Martin Berger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.