‹

06 · ภาษาและคอมไพเลอร์

06 · ​ภาษา​และ​คอมไพเลอร์

​ชั้นนี้​คือ​จุด​ที่​คำสั่ง​เลิก​พูด​กับ​เครื่องจักร​และ​หันมา​พูด​กับ​คน — ​โปรแกรม​ถูก​เขียน​ขึ้น​เพื่อให้​คนอ่าน

​อะไร​ทำให้​ข้อความ​มีความหมาย​ต่อ​เครื่องจักร?

​งาน​ที่​ประเมิน​ไว้​หก​เดือน​ใช้เวลา​จริง​กว่า​สอง​ปี ​ทีม​ของ John Backus ​ที่ IBM ​เริ่ม​ทำ FORTRAN ​ด้วย​ตัวเลข​นั้น ​และ​ใน​บันทึก​ประวัติ​โครงการ​ของ​เขา​เอง Backus ​เล่า​ว่า​หก​เดือน "​ยังคง​เป็นระยะ​เวลา​ที่​คาด​ไว้​จนกว่า​งาน​จะ​เสร็จ​จริง ​ซึ่ง​เกิดขึ้น​อีก​กว่า​สอง​ปี​ให้หลัง ​ใน​เดือน​เมษายน 1957" (remained the interval-to-completion until it actually was completed over two years later, in April 1957) ​ความล่าช้า​ไม่​ใช่​ส่วน​ที่​น่าสนใจ ​ส่วน​ที่​น่าสนใจ​คือ​สิ่ง​ที่​ทุกคน​คาด​ว่า​ผลลัพธ์​จะ​เป็น Backus ​เล่า​ว่า "​ยาก​ที่จะ​สื่อ ... ​ถึง​ความแรง​ของ​ความคลางแคลงใจ​ต่อ 'automatic programming'" (it is difficult to convey ... the strength of the skepticism about 'automatic programming') ​และ​ต่อ "​ความสามารถ​ของ​มัน​ใน​การผลิต​โปรแกรม​ที่​มีประสิทธิภาพ" (its ability to produce efficient programs) ​เป้าหมาย​ที่​ทีม​ของ​เขา​ประกาศ​ไว้​มี​แค่ "​ผลิต​โปรแกรม​ที่​มีประสิทธิภาพ​เกือบ​เท่า​โค้ด​ที่​เขียน​ด้วยมือ" (produce programs almost as efficient as hand coded ones) (Backus, The History of FORTRAN I, II, and III) ​เกือบ. ​ข้อสมมติ​ของ​วงการ​ตอนนั้น​คือ​เครื่องจักร​อ่าน​สัญกรณ์​ของ​มนุษย์​แล้ว​ผลิต​โค้ด​ที่​ดี​ไม่​ได้ ​และ​ข้อสมมติ​นั้น​ไม่​โง่​เลย ​ไม่​มี​อะไร​ใน​เรื่อง​ความหมาย​ที่​ดู​เป็น​กลไก

​สิ่ง​ที่​ทำให้​เรื่อง​นี้​กลายเป็น​กลไก​ได้ ​คือ​การผ่า​ความหมาย​ออก​เป็น​สอง​ท่อน ​ไวยากรณ์ (syntax) ​ถาม​ว่า​ข้อความ​มี​รูป​ถูกต้อง​หรือไม่ ​ความหมาย (semantics) ​ถาม​ว่า​มัน​ทำ​อะไร ​สอง​คำถาม​นี้​ไม่​ใช่​คำถาม​คนละ​คำตอบ ​แต่​คนละ​ชนิด Backus ​บรรยาย syntax ​ของ​ภาษา​พีชคณิต​สากล​ที่​เสนอ​กัน​ใน​ปี 1959 ​ด้วย​สัญกรณ์​ของ​กฎ​และ​ทางเลือก Peter Naur ​ดัดแปลง​มัน​ไป​ใช้​ใน​รายงาน ALGOL 60 ​และ​จดหมาย​ของ Donald Knuth ​ถึง CACM ​ใน​ปี 1964 ​เสนอชื่อ​ที่​มัน​แบก​มา​จนถึง​วันนี้ ​คือ Backus–Naur Form (Knuth, 1964) ​พอ​มี​ไวยากรณ์​รูป​นัย ​คำถาม​ว่า "​โปรแกรม​นี้​ถูกต้อง​หรือไม่" ​ก็​พ้น​จาก​ดุลพินิจ ​กลายเป็น​ข้อ​ตัดสิน​ที่​โปรแกรม​ทำ​เอง​ได้ ALGOL 60 ​คือ​บทพิสูจน์ ​และ​คำตัดสิน​ของ Tony Hoare ​คือ​ประโยค​ที่​ถูก​อ้าง​มาก​ที่สุด​ใน​วงการ​ออกแบบ​ภาษา "​นี่​คือ​ภาษา​ที่​ล้ำยุค​ของ​มัน​มาก​จน​ไม่​ใช่​แค่​ก้าวหน้า​กว่า​รุ่น​ก่อนหน้า ​แต่​ยัง​ก้าวหน้า​กว่า​รุ่น​ต่อๆ ​มา​เกือบ​ทั้งหมด​ด้วย" (Here is a language so far ahead of its time, that it was not only an improvement on its predecessors, but also on nearly all its successors) — ​มาจาก​ปาฐกถา​ปี 1973 ​เรื่อง "Hints on Programming Language Design" ​ไม่​ใช่​ปาฐกถา Turing ​อย่าง​ที่​มัก​อ้าง​กัน​ผิด

​ความหมาย​ไม่​ยอมให้​จัดการ​แบบ​เดียวกัน ​คอมไพเลอร์​จึง​ไม่​ไขมัน ​แต่​พา​มัน​ลง​บันได​ทีละขั้น​เล็กๆ ​ที่​แม่นยำ ​คอมไพเลอร์​คือ​หอคอย​ซ้อน​อยู่​ใน​หอคอย ​การวิเคราะห์​คำศัพท์ (lexical analysis) ​แปลง​ตัวอักษร​เป็น​คำ parsing ​แปลง​คำเป็น​ต้นไม้​ที่​สะท้อน​ไวยากรณ์ ​การวิเคราะห์​ความหมาย (semantic analysis) ​เติม​ลง​บน​ต้นไม้​นั้น​ว่าแต่​ละ​ชื่อ​อ้าง​ถึง​อะไร ​และ​การดำเนินการ​ใด​ได้รับอนุญาต ​ต้นไม้​กลายเป็น​ตัวแทน​กลาง (intermediate representation) ​ที่​ไม่​ผูก​กับ​ภาษา​ใด​หรือ​เครื่อง​ใด ​การเพิ่มประสิทธิภาพ (optimization) ​เขียน​มัน​ใหม่​ให้​ถูก​ลง​โดย​ความหมาย​ไม่​เปลี่ยน ​และ​การสร้าง​โค้ด (code generation) ​ปล่อย​ชุดคำสั่ง​ของ​บท​ที่ 04 ​ออกมา ​ทุก​ขั้น​มี​อยู่​เพราะ​มัน​ยื่น​ตัวแทน​ที่​ทำให้​งาน​ของ​ขั้น​ถัดไป​ง่าย — ​นั่น​คือ​วิทยานิพนธ์​ทั้ง​เล่ม​ของ​หนังสือ​นี้ ​แสดง​ย่อส่วน​อยู่​ใน​โปรแกรม​เดียว ​ตัวแทน​กลาง​คุ้มค่า​ตัว​ด้วย​เลขคณิต​ล้วนๆ ​ไม่​มี​มัน ​การรองรับ n ​ภาษา​บน m ​เครื่อง​ต้อง​ใช้​คอมไพเลอร์ n × m ​ตัว ​มี​มัน ​ใช้ n + m

​ภาษา​ที่​สร้าง​บน​กลไก​นั้น​ให้​ชุด​วิธี​ตั้งชื่อ​แก่​สิ่ง​ต่างๆ — ​ฟังก์ชัน, ​ชนิด​ข้อมูล (type), ​มอดูล (module), ​อ็อบเจกต์ (object) — ​แต่ละ​อย่าง​มี​ไว้​ให้​ผู้อ่าน​เพิกเฉย​ต่อ​บางอย่าง​ได้ ​ตัวอย่าง​ที่​กระชับ​ที่สุด​คือ LISP ​เดือน​เมษายน 1960 John McCarthy ​ตีพิมพ์​เปเปอร์​ที่​นิยาม​การคำนวณ​บน​นิพจน์​เชิง​สัญลักษณ์ (symbolic expressions) ​รวมถึง​ฟังก์ชัน​ชื่อ eval ​ที่​อธิบาย​ว่าการ​ประเมิน​นิพจน์​ใดๆ ​ใน​ภาษา​นี้​หมายความว่า​อย่างไร (Recursive Functions of Symbolic Expressions, CACM 3, no. 4) ​มัน​คือ​คณิตศาสตร์ ​ตั้งใจ​ให้​อ่าน Steve Russell ​เอา eval ​ไป​คอมไพล์​ด้วยมือ​ลง​เป็น​โค้ด​เครื่อง IBM 704 (McCarthy, History of Lisp) ​และ​นิยาม​ของ​ภาษา​ก็​กลายเป็น​อิน​เทอร์พ​รี​เตอร์ (interpreter) ​ของ​ภาษา​นั้น​เอง ​นั่น​คือ​ไอเดีย​โปรแกรม​ที่เก็บ​ใน​หน่วยความจำ (stored program) ​จาก​บท​ที่ 04 ​ถึงกำหนด​จ่ายคืน ​เพราะ​โปรแกรม​คือ​ข้อมูล ​คำอธิบาย​ของ​ภาษา​จึง​เป็น​โปรแกรม​ที่​รัน​ภาษา​นั้น​ได้

Type ​คือ​กลไก​ตั้งชื่อ​ที่​คม​ที่สุด ​เพราะ type ​คือ​คำสัญญา​ที่​เครื่องจักร​ตรวจ​ได้ ​ประกาศ​ว่า​ฟังก์ชัน​หนึ่ง​รับ​จำนวนเต็ม​และ​คืน​สตริง ​คือ​ข้อกล่าวอ้าง​ครอบคลุม​การรัน​ทุกครั้งที่​เป็นไปได้ ​ตรวจสอบ​เสร็จ​ก่อน​การรัน​ครั้งแรก​จะ​เกิดขึ้น​ด้วยซ้ำ — ​เป็น​ส่วน​เดียว​ของ​การเขียน​โปรแกรม​ที่​คุณ​ได้การ​รับประกัน (guarantee) ​ไม่​ใช่​ผล​การเทสต์ ​การรับประกัน​นี้​แคบ​แต่​จริง Gao, Bird ​และ Barr ​หยิบ​บั๊ก JavaScript ​ที่​เปิดเผย​ต่อ​สาธารณะ ​เช็ค​เอาต์​โค้ด​ช่วง​ก่อน​แก้​บั๊ก​แต่ละ​ตัว ​ใส่ type annotation ​ด้วยมือ ​แล้ว​ถาม​ว่า​ตัว​ตรวจ​ชนิด (type checker) ​จะ​โวย​ไหม ​ทั้ง Flow ​และ TypeScript ​จับได้ 15 ​เปอร์เซ็นต์ (To Type or Not to Type, ICSE 2017) ​อ่าน​ให้​ละเอียด ​นี่​ไม่​ใช่ "15 ​เปอร์เซ็นต์​ของ​บั๊ก​เป็น​ข้อผิดพลาด​เรื่อง type" ​แต่​คือ 15 ​เปอร์เซ็นต์​ของ​บั๊ก​ที่​รอด​การเทสต์ ​การรีวิว ​และ​การปล่อย​ใช้งาน​จริง​มา​แล้ว ​ดัน​ไอเดีย​นี้​ไป​ไกล​พอ ​มัน​เลิก​เป็นเรื่อง​บั๊ก Curry–Howard correspondence ​ที่ Haskell Curry ​สังเกตเห็น​ใน​ทศวรรษ 1930 ​และ William Howard ​ระบุ​ไว้​ใน​ต้นฉบับ​ปี 1969 ​ชื่อ "The Formulae-as-Types Notion of Construction" ​บอก​ว่า type ​คือ ​ข้อเสนอ (proposition) ​และ​โปรแกรม ​คือ ​บทพิสูจน์​ของ​มัน type checker ​คือ​เครื่องพิสูจน์​ทฤษฎีบท​อัตโนมัติ​ตัว​จิ๋ว​ที่​โปรแกรมเมอร์​ส่วนใหญ่​ใช้​ทุกวัน​โดย​ไม่ทันสังเกต

​แล้ว​ทำไม​ถึง​มี​ภาษา​มากมาย​ขนาด​นี้ ​ฐานข้อมูล HOPL ​ที่​ดูแล​มา​ตั้งแต่​ปี 1995 ​นับ​ได้ 8,945 ​ภาษา ณ ​เดือน​สิงหาคม 2026 ​การแตกแขนง​นี้​ไม่​ใช่​ความสูญเปล่า ​ภาษา​หนึ่ง​คือ​การเดิมพัน​ว่าความ​ผิดพลาด​แบบ​ไหน​คุ้ม​ที่จะ​ป้องกัน ​และ​การทำซ้ำ​แบบ​ไหน​คุ้ม​ที่จะ​ตั้งชื่อ ​การเดิมพัน​นั้น​ต่างกัน​จริง​ระหว่าง​เคอร์เนล​ของ​ระบบปฏิบัติการ ​โมเดล​เชิง​สถิติ ​และ​หน้า​เว็บ Alan Perlis ​วาง​บท​ทดสอบ​ที่​ใช้ได้​จริง​ไว้​ใน Epigrams on Programming ​ปี 1982 "​ภาษา​ที่​ไม่​กระทบ​วิธี​คิด​ของ​คุณ​เกี่ยวกับ​การเขียน​โปรแกรม ​ก็​ไม่​คุ้ม​ที่จะ​รู้จัก" (A language that doesn't affect the way you think about programming, is not worth knowing) ​สิ่ง​ที่​ไม่​รอด​มา​คือ​ความกลัว​ของ​ปี 1957 ​คอมไพเลอร์​เอาชนะ​แอสเซมบลี​ฝีมือดี​ที่​เขียน​ด้วยมือ​เป็นเรื่อง​ปกติ​ไป​แล้ว ​และ​ตอนนี้ superoptimizer ​ก็​เอาชนะ​คอมไพเลอร์​อีกที: STOKE ​ค้น​แบบ​สุ่ม​จาก​โค้ด​ที่​ยัง​ไม่​ถูก​เพิ่มประสิทธิภาพ ​หา​รูปแบบ​เขียน​ใหม่​ที่​ความหมาย​เท่ากัน ​แล้ว​ให้ผล​เทียบเท่า​หรือ​ดีกว่า​ผลลัพธ์​ที่​ดี​ที่สุด​ของ​คอมไพเลอร์​ระดับ​โปร​ดัก​ชัน (Schkufza, Sharma & Aiken, ASPLOS 2013) ​ทีม​ของ Backus ​ขอ​แค่ ​เกือบ ​ดี​เท่า​โค้ด​มือ ​และ​แพ้​เดิมพัน​นั้น​ใน​ทิศทาง​ที่​น่ายินดี​ที่สุด

​คน​บน​ชั้นนี้​มี​นิสัย​หันกลับ​มา​โจมตี​งาน​ของ​ตัวเอง Backus ​รับ Turing Award ​ใน​ปี 1977 ​แล้ว​ใช้​ปาฐกถา​นั้น​ถล่ม​โมเดล​ที่ FORTRAN ​ปักหลัก​ไว้ ​ตั้งชื่อ​ว่า "Can Programming Be Liberated from the von Neumann Style?" — ​ลง​ใน CACM ​เดือน​สิงหาคม​ปี​ถัดมา ​ระบบ A-0 ​ของ Grace Hopper ​ปี 1951–52 ​มัก​ถูก​เรียก​ว่า​คอมไพเลอร์​ตัว​แรก ​จริงๆ ​มัน​ทำงาน​ใกล้เคียง​ตัว​โหลด (loader) ​มากกว่า ​งาน​ที่​ส่งผล​กว่า​คือ FLOW-MATIC ​คำกริยา​คล้าย​ภาษาอังกฤษ​ของ​มัน​ผ่าน​เข้าไป​ใน COBOL ​แทบ​ทั้งดุ้น ​และ​วางข้อ​ความที่​คนอ่าน​ออก​ไว้​ใน​การเขียน​โปรแกรม​เชิงพาณิชย์​อย่าง​ถาวร ​เธอ​เกษียณ​จาก​กองทัพเรือ​สหรัฐฯ ​ใน​ปี 1986 ​ด้วย​ยศ​พลเรือตรี ​ติดนิสัย​ยื่น​เส้น​ลวด​ยาว​เกือบ​หนึ่ง​ฟุต​ให้​แขก​ที่มา​เยี่ยม — ​ระยะทาง​ที่​แสง​เดินทาง​ได้​ใน​หนึ่ง​นาโน​วินาที — ​เพื่อให้​เลิก​คิด​ว่า​เวลา​ที่​เสีย​ไป​ไม่​มี​ต้นทุน

​เชื่อมโยง

​ชั้นล่าง​ของ​บท​นี้ ​บท​ที่ 04 ​มอบ​ชุดคำสั่ง​ที่ back end ​ปล่อย​โค้ด​ออก​ไปหา ​และ​บท​ที่ 05 ​มอบ abstraction ​ของ process ​ที่​โปรแกรม​คอมไพล์​แล้ว​ถูก​โหลด​เข้าไป​อยู่ ​บท​ที่ 01 ​กำหนด​เพดาน ​เพราะ​ปัญหา​การหยุด (halting problem) ​ตัดสิน​ไม่​ได้ ​คอมไพเลอร์​จึง​ตัดสิน​ใน​กรณี​ทั่วไป​ไม่​ได้​ว่าการ​เพิ่มประสิทธิภาพ​หนึ่งๆ ​ปลอดภัย​ทุก​กรณี​หรือไม่ optimizer ​ตัวจริง​จึง​ถูก​ออกแบบ​มา​ให้​ระมัดระวัง​ไว้​ก่อน ​ชั้นบน ​บท​ที่ 07 ​ถาม​ว่า​กลไก​ตั้งชื่อ​เหล่านี้​ตัว​ไหน​ทำให้​ระบบ​ใหญ่​เปลี่ยนแปลง​ได้​ตลอด​หลาย​ปี ​และ​บท​ที่ 12 ​เปิด​ความเป็นไปได้​ว่า​สัญกรณ์​ถัดไป​ที่​คนใช้​เขียน​อาจ​ไม่​ใช่​ภาษา​โปรแกรม​เลย

​คำถาม​ที่​ยัง​เปิด​อยู่

​ถ้า​โมเดล​ผลิต​โค้ด​ที่ทำงาน​ได้​จาก​คำอธิบาย​ภาษาอังกฤษ ​ภาษา​โปรแกรม​มี​ไว้​ทำ​อะไร — ​ทำ​สเปก (specification) ​พิสูจน์​ความถูกต้อง (verification) ​หรือ​แค่​รีวิว? Type ​จับ​ข้อบกพร่อง​จริง​ได้​อย่าง​พิสูจน์​แล้ว ​แล้ว​ทำไม​อุตสาหกรรม​ส่วนใหญ่​ยัง​ปฏิเสธ​มัน ​คำตอบ​ที่​ตรงไปตรงมา​คือ​เรื่อง​หลักฐาน​หรือ​เรื่อง​ต้นทุน? ​และ​ภาษา​ที่​ออกแบบ​มา​ให้​โปรแกรม​อ่าน​มากกว่า​ให้​คนเขียน ​จะ​หน้าตา​แบบ​ไหน?

​อ่าน​ต่อ

บทถัดไป · 8 / 1607 · วิศวกรรมซอฟต์แวร์
Size
Page
Font

The Tower of Abstractions — An Encyclopedia of the Computing Disciplines

❦
100 · แผนที่201 · ทฤษฎีการคำนวณ302 · อัลกอริทึมและโครงสร้างข้อมูล403 · สารสนเทศและการเข้ารหัส504 · สถาปัตยกรรมคอมพิวเตอร์605 · ระบบปฏิบัติการ706 · ภาษาและคอมไพเลอร์807 · วิศวกรรมซอฟต์แวร์908 · ฐานข้อมูล1009 · เครือข่าย1110 · ระบบกระจาย1211 · ความปลอดภัยและวิทยาการรหัสลับ1312 · ปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง1413 · ปฏิสัมพันธ์มนุษย์–คอมพิวเตอร์ และกราฟิกส์1514 · พรมแดน1699 · ปิดเล่ม — หอคอยเมื่อมองทั้งหลัง