ในโลกของภาษาโปรแกรมมิ่ง Algebraic Data Types ได้กลายเป็นเสาหลักของการพัฒนาซอฟต์แวร์สมัยใหม่ โดยเฉพาะในการเขียนโปรแกรมเชิงฟังก์ชัน แม้ผู้พัฒนาจำนวนมากจะใช้โครงสร้างอันทรงพลังนี้เป็นประจำ แต่มีเพียงไม่กี่คนที่รู้ถึงประวัติศาสตร์อันน่าตื่นเต้นและการถกเถียงทางวิชาการเกี่ยวกับที่มาของมัน การอภิปรายในชุมชนล่าสุดได้ฉายแสงใหม่ให้กับประวัติศาสตร์นี้ เผยให้เห็นความเชื่อมโยงและการแก้ไขที่ท้าทายความเข้าใจเดิม
การชี้แจงความเชื่อมโยงระหว่าง McCarthy และ Hoare
หนึ่งในการเปิดเผยที่สำคัญที่สุดจากการวิจัยของชุมชนเกี่ยวข้องกับความสัมพันธ์ระหว่างผลงานของ John McCarthy และ C.A.R. Hoare แม้งานวิจัยช่วงแรกจะชี้ให้เห็นว่า Hoare พัฒนา sum types และ product types ขึ้นเองอย่างอิสระ แต่การตรวจสอบอย่างลึกซึ้งยิ่งขึ้นกลับเผยประวัติศาสตร์ที่มีการทำงานร่วมกันมากกว่า เอกสาร Record Handling ของ Hoare ในปี 1965 นั้น อันที่จริงแล้วสร้างขึ้นจากงานของ McCarthy ในเดือนตุลาคม 1964 เรื่อง Definition of new data types in ALGOL x โดยตรง นักวิจัยทั้งสองคนนี้ต่างเป็นคณะกรรมการพัฒนาภาษาต่อเนื่องจาก ALGOL 60 ซึ่งมีการอภิปรายแนวคิดเหล่านี้อย่างจริงจัง Hoare นำแนวคิดหลักของ McCarthy มาใช้แต่ใช้ศัพท์เฉพาะที่แตกต่างกัน โดยดึงมาจาก record และ record class ของ COBOL 60 แทนที่คำสำคัญ Cartesian ของ McCarthy การวิวัฒนาการของศัพท์เฉพาะนี้ส่งผลต่อ SIMULA 67 ในที่สุด และหลอมรวมการเขียนโปรแกรมเชิงวัตถุมานานหลายทศวรรษ
Hoare ได้นำแนวคิดเกี่ยวกับ product types และ union types (sum types) มาจาก McCarthy อย่างชัดเจน
บทความสำคัญทางประวัติศาสตร์ในการพัฒนา Algebraic Data Type
- ตุลาคม 1964: John McCarthy - "Definition of new data types in ALGOL x" (แนะนำ Cartesian products และ direct unions)
- พฤศจิกายน 1965: C.A.R. Hoare - "Record Handling" (พัฒนาต่อยอดจากงานของ McCarthy โดยใช้คำศัพท์จาก COBOL)
- 1966: Rod Burstall - งานวิจัยเบื้องต้นเกี่ยวกับ recursive types และการพิสูจน์
- 1970: Frederick McBride - วิทยานิพนธ์ที่แนะนำ pattern matching สำหรับ algebraic types
- 1980: Burstall - "HOPE, an experimental applicative language" (tagged unions แรกในการเขียนโปรแกรมเชิงฟังก์ชัน)
การทบทวนมรดกของ Simula และ Pascal ใหม่
เรื่องเล่าเกี่ยวกับ sum types ในภาษาโปรแกรมมิ่งเชิงคำสั่งสมควรได้รับการพิจารณาใหม่ แม้ Pascal และ C มักจะได้รับเครดิตในการจำกัดการยอมรับ sum types แต่ Simula 67 กลับมีความสามารถในการแยกแยะประเภทที่ซับซ้อนผ่านคำสั่ง inspect when ของมัน โครงสร้างนี้ให้ฟังก์ชันการทำงานที่เหมือนกันทุกประการกับการจับคู่รูปแบบแบบครบถ้วน (exhaustive pattern matching) ในภาษาสมัยใหม่ Niklaus Wirth ตระหนักถึงพลังนี้และได้อ้างอิงแนวทางของ Simula ในการประเมิน Pascal ของเขาในปี 1975 ต่อมา Wirth ได้ปรับแต่งแนวคิดเหล่านี้ใน Oberon โดยนำ variant records ไปใช้กับการบังคับใช้แท็กและการตรวจสอบความครบถ้วนที่ได้รับการปรับปรุง สิ่งนี้แสดงให้เห็นว่าคุณลักษณะที่คล้ายคลึงกับ sum types มีอยู่ในภาษาเชิงคำสั่งมาตั้งแต่ยุคแรกๆ มากกว่าที่มักจะได้รับการยอมรับ แม้ว่าจะไม่มีหลักประกันความปลอดภัยของประเภทที่เข้มงวดเหมือนในภาษาเชิงฟังก์ชัน
การรองรับ Sum Types ในภาษาโปรแกรมสมัยใหม่
- ภาษาเชิงฟังก์ชัน: ML, Haskell, OCaml (รองรับแบบดั้งเดิม)
- การเขียนโปรแกรมระดับระบบ: Rust (enums แบบดั้งเดิมพร้อม pattern matching)
- แบบหลายกระบวนทัศน์: Swift (enums), TypeScript (discriminated unions)
- ภาษาบน JVM: Java, Scala, Kotlin (ผ่าน sealed classes + case/data classes)
- ภาษาเชิงคำสั่งในอดีต: Simula 67 (inspect when), Pascal (variant records), ALGOL-68 (ระบบไทป์ที่ครอบคลุม)
การค้นพบอิทธิพลของ ALGOL-68 ใหม่
บทบาทของ ALGOL-68 ในประวัติศาสตร์ภาษาโปรแกรมมิ่งถูกลดคุณค่าลงไปอย่างมาก ตรงกันข้ามกับการเป็นทางตันที่น่าสนใจ ภาษานี้ได้นำทั้ง sum types และ product types ไปใช้และมีคุณลักษณะการจับคู่รูปแบบแบบครบถ้วนก่อนภาษา ML ด้วยซ้ำ Dennis Ritchie เองก็ยอมรับอิทธิพลของ ALGOL-68 ต่อการพัฒนาภาษา C ระบบประเภทที่ครอบคลุมและคุณลักษณะนวัตกรรมอื่นๆ ของภาษานี้ได้พิสูจน์แล้วว่ามีอายุยืนยาวอย่างน่าทึ่ง ดังที่ผู้แสดงความคิดเห็นคนหนึ่งระบุไว้ ภาษาสมัยใหม่ส่วนใหญ่แสดงความสัมพันธ์แบบ homomorphic กับ ALGOL-68 โดยเฉพาะในระบบประเภทหลักและแนวทางโครงสร้างของพวกเขา การยอมรับนี้ทำให้ ALGOL-68 ไม่ใช่เพียงเชิงอรรถทางประวัติศาสตร์ แต่เป็นอิทธิพลพื้นฐานที่หล่อหลอมการออกแบบภาษาต่อมาในแบบที่เราเพิ่งจะตระหนักได้อย่างเต็มที่
การนำไปใช้สมัยใหม่และรากฐานทางคณิตศาสตร์
รากฐานทางคณิตศาสตร์ของ Algebraic Data Types เชื่อมโยงโดยตรงกับแนวคิด sums และ products ในทฤษฎีหมวดหมู่ (category theory) รากฐานทางทฤษฎีนี้อธิบายว่าทำไมโครงสร้างประเภทเหล่านี้จึงมีความแข็งแกร่ง across กระบวนทัศน์การโปรแกรมมิ่งที่แตกต่างกัน ภาษาสมัยใหม่ได้นำ sum types ไปใช้ผ่านกลไกต่างๆ กัน ได้แก่ ระบบ enum ของ Swift, discriminated unions ของ TypeScript และรูปแบบ sealed class ใน Java, Scala และ Kotlin การนำไปใช้เหล่านี้แสดงให้เห็นว่าแนวคิดหลักที่ McCarthy และ Hoare พัฒนาขึ้นเมื่อหลายทศวรรษก่อนยังคงมีความเกี่ยวข้องและทรงพลัง ความแตกต่างระหว่าง sum types ทางทฤษฎีและ tagged unions ในทางปฏิบัติสะท้อนให้เห็นถึงความตึงเครียดอย่างต่อเนื่องระหว่างความบริสุทธิ์ทางคณิตศาสตร์และข้อจำกัดในการนำไปใช้ ซึ่งเป็นลักษณะของการออกแบบภาษาโปรแกรมมิ่งมาตั้งแต่เริ่มต้น
การเดินทางของ Algebraic Data Types จากแนวคิดทางวิชาการไปสู่เครื่องมือการโปรแกรมกระแสหลักเผยให้เห็นมากมายเกี่ยวกับวิวัฒนาการของความคิดในวิทยาศาสตร์คอมพิวเตอร์ มันเป็นเรื่องของการค้นพบอย่างอิสระ การพัฒนาที่มีการทำงานร่วมกัน และเส้นทางบางครั้งก็น่าแปลกใจที่นวัตกรรมแพร่กระจายออกไป ขณะที่เราสร้างภาษาและระบบใหม่ๆ ต่อไป การเข้าใจประวัติศาสตร์นี้ช่วยให้เราซาบซึ้งถึงความเชื่อมโยงอันลึกซึ้งระหว่างทฤษฎีทางคณิตศาสตร์และการนำไปใช้ในทางปฏิบัติ ที่ทำให้ซอฟต์แวร์สมัยใหม่เกิดขึ้นได้
