ภาษาอธิบายคอมไพเลอร์
ภาษาคำอธิบายคอมไพเลอร์ (CDL)เป็นภาษาโปรแกรมที่ใช้ไวยากรณ์แบบแอฟฟิก (affix grammars ) มีความคล้ายคลึงกับ สัญกรณ์ รูปแบบแบ็กคัส-เนาร์ (BNF) มาก ได้รับการออกแบบมาเพื่อการพัฒนาคอมไพเลอร์มีข้อจำกัดในด้านความสามารถและการควบคุมการไหลของโปรแกรม ซึ่งเป็นไปโดยเจตนา ข้อดีของข้อจำกัดเหล่านี้มีสองประการ
ในด้านหนึ่ง พวกมันทำให้สามารถวิเคราะห์ข้อมูลและควบคุมการไหลของโปรแกรมอย่างละเอียด ซึ่งใช้โดยตัวเพิ่มประสิทธิภาพ CDL2 ส่งผลให้ได้โค้ดที่มีประสิทธิภาพสูงมาก ข้อดีอีกประการหนึ่งคือ พวกมันส่งเสริมธรรมเนียมการตั้งชื่อที่ละเอียดถี่ถ้วน ซึ่งในทางกลับกัน นำไปสู่โปรแกรมที่มีคำอธิบายในตัวเองได้อย่าง ดี
ภาษาดังกล่าวดูคล้ายกับProlog อยู่บ้าง (ซึ่งไม่น่าแปลกใจ เพราะทั้งสองภาษาเกิดขึ้นในช่วงเวลาเดียวกันจากการทำงานเกี่ยวกับไวยากรณ์ส่วนต่อท้าย ) อย่างไรก็ตาม ต่างจาก Prolog ตรงที่การควบคุมการไหลใน CDL นั้นขึ้นอยู่กับความสำเร็จ/ความล้มเหลวอย่างแน่นอน กล่าวคือ จะไม่มีการลองทางเลือกอื่นเมื่อทางเลือกปัจจุบันประสบความสำเร็จ แนวคิดนี้ยังใช้ในไวยากรณ์การแยกวิเคราะห์นิพจน์ด้วย
CDL3 เป็นภาษา CDL เวอร์ชันที่สาม ซึ่งแตกต่างจากสองเวอร์ชันก่อนหน้าอย่างมาก
ออกแบบ
เวอร์ชันดั้งเดิม ซึ่งออกแบบโดยCornelis HA Kosterที่มหาวิทยาลัย Nijmegenและปรากฏขึ้นในปี 1971 มีแนวคิดที่ค่อนข้างแปลกประหลาด นั่นคือ มันไม่มีแกนหลัก โดยทั่วไปแล้ว ภาษาโปรแกรมทั่วไปจะถูกแปลงเป็นคำสั่งเครื่องหรือลำดับคำสั่งสำเร็จรูป สิ่งเหล่านี้เป็นตัวแทนของแกนหลัก ซึ่งเป็นนามธรรม พื้นฐานที่สุด ที่ภาษานั้นรองรับ คำสั่งพื้นฐานเหล่านี้อาจเป็นการบวกเลข การคัดลอกตัวแปรเข้าหากัน และอื่นๆ แต่ CDL1 ขาดแกนหลักดังกล่าว เป็นหน้าที่ของโปรแกรมเมอร์ที่จะต้องจัดเตรียมการดำเนินการพื้นฐานในรูปแบบที่สามารถแปลงเป็นคำสั่งเครื่องได้โดยใช้แอสเซมเบลอร์หรือคอมไพเลอร์สำหรับภาษาดั้งเดิม ภาษา CDL1 เองไม่มีแนวคิดเกี่ยวกับคำสั่งพื้นฐาน ไม่มีแนวคิดเกี่ยวกับชนิดข้อมูล นอกเหนือจากคำเครื่อง (หน่วยจัดเก็บข้อมูลนามธรรม ซึ่งไม่จำเป็นต้องเป็นคำเครื่องจริง) กฎการประเมินค่อนข้างคล้ายกับ คำอธิบายไวยากรณ์ รูปแบบ Backus–Naurอันที่จริง การเขียนตัวแยกวิเคราะห์สำหรับภาษาที่อธิบายใน BNF นั้นค่อนข้างง่ายใน CDL1
โดยพื้นฐานแล้ว ภาษานี้ประกอบด้วยกฎ กฎแต่ละข้ออาจสำเร็จหรือล้มเหลว กฎแต่ละข้อประกอบด้วยทางเลือกต่างๆ ซึ่งเป็นลำดับของการเรียกใช้กฎอื่นๆ กฎจะสำเร็จหากทางเลือกใดๆ ของกฎนั้นสำเร็จ โดยจะลองตามลำดับ ทางเลือกจะสำเร็จหากการเรียกใช้กฎทั้งหมดของทางเลือกนั้นสำเร็จ ภาษานี้มีตัวดำเนินการสำหรับสร้างลูปการประเมินโดยไม่ต้องใช้การเรียกซ้ำ (แม้ว่าใน CDL2 จะไม่จำเป็นอย่างเคร่งครัด เนื่องจากตัวเพิ่มประสิทธิภาพจะให้ผลลัพธ์เดียวกัน) และมีทางลัดบางอย่างเพื่อเพิ่มประสิทธิภาพของการประเมินแบบเรียกซ้ำ แต่แนวคิดพื้นฐานก็เป็นไปตามข้างต้น นอกเหนือจากการประยุกต์ใช้ที่เห็นได้ชัดใน การวิเคราะห์ ไวยากรณ์แบบไร้บริบทแล้ว CDL ยังเหมาะอย่างยิ่งสำหรับแอปพลิเคชันควบคุม เนื่องจากแอปพลิเคชันควบคุมจำนวนมากนั้นโดยพื้นฐานแล้วเป็นกฎ if-then ที่ซ้อนกันหลายชั้น
แต่ละกฎของ CDL1 ในระหว่างการประเมิน สามารถทำงานกับข้อมูลที่มีประเภทไม่ระบุได้ โดยในอุดมคติแล้ว ข้อมูลไม่ควรเปลี่ยนแปลงเว้นแต่กฎจะสำเร็จ (ไม่มีผลข้างเคียงเมื่อล้มเหลว) ซึ่งทำให้เกิดปัญหา เพราะถึงแม้กฎนี้จะสำเร็จ แต่กฎที่เรียกใช้อาจล้มเหลว ซึ่งในกรณีนี้ การเปลี่ยนแปลงข้อมูลไม่ควรมีผล การรับประกันพฤติกรรมข้างต้นค่อนข้างง่าย (แม้ว่าจะใช้หน่วยความจำมาก) หากข้อมูลทั้งหมดถูกจัดสรรแบบไดนามิกบนสแต็ก อย่างไรก็ตาม มันค่อนข้างยากเมื่อมีข้อมูลแบบคงที่ ซึ่งมักจะเป็นเช่นนั้น คอมไพเลอร์ CDL2 สามารถระบุการละเมิดที่อาจเกิดขึ้นได้ด้วยข้อกำหนดที่ว่าทิศทางของพารามิเตอร์ (อินพุต เอาต์พุต อินพุต-เอาต์พุต) และประเภทของกฎ (สามารถล้มเหลวได้: test , predicate ; ไม่สามารถล้มเหลวได้: function , action ; สามารถมีผลข้างเคียงได้: predicate , action ; ไม่สามารถมีผลข้างเคียงได้: test , function ) ต้องระบุโดยโปรแกรมเมอร์
เนื่องจากการประเมินกฎนั้นขึ้นอยู่กับการเรียกใช้กฎที่ง่ายขึ้นเรื่อยๆ ดังนั้นในส่วนล่างสุดจึงควรมีกฎพื้นฐานบางอย่างที่ทำหน้าที่จริง นั่นคือจุดที่ CDL1 น่าประหลาดใจมาก: มันไม่มีกฎพื้นฐานเหล่านั้น คุณต้องสร้างกฎเหล่านั้นด้วยตัวเอง หากคุณต้องการการบวกในโปรแกรมของคุณ คุณต้องสร้างกฎที่มีพารามิเตอร์อินพุตสองตัวและพารามิเตอร์เอาต์พุตหนึ่งตัว และเอาต์พุตจะถูกกำหนดให้เป็นผลรวมของอินพุตทั้งสองโดยโค้ดของคุณ คอมไพเลอร์ CDL ใช้โค้ดของคุณเป็นสตริง (มีข้อกำหนดเกี่ยวกับวิธีการอ้างอิงตัวแปรอินพุตและเอาต์พุต) และสร้างผลลัพธ์ตามที่ต้องการ หากคุณอธิบายกฎการบวกของคุณโดยใช้ภาษาแอสเซมบลี คุณจะต้องมีแอสเซมเบลอร์เพื่อแปลงเอาต์พุตของคอมไพเลอร์ CDL เป็นรหัสเครื่องหากคุณอธิบายกฎพื้นฐานทั้งหมด (มาโครในศัพท์ของ CDL) ในภาษา Pascal หรือ C คุณจะต้องมีคอมไพเลอร์ Pascal หรือ C เพื่อทำงานหลังจากคอมไพเลอร์ CDL การขาดแคลนฟังก์ชันพื้นฐานเหล่านี้อาจสร้างความลำบากอย่างมากเมื่อคุณต้องเขียนโค้ด แม้แต่สำหรับการดำเนินการคำสั่งเครื่องที่ง่ายที่สุดก็ตาม อย่างไรก็ตาม ในทางกลับกัน มันก็ให้ความยืดหยุ่นอย่างมากในการใช้งานฟังก์ชันพื้นฐานที่ซับซ้อนและนามธรรมที่ทำงานกับวัตถุเชิงนามธรรม ที่แปลกใหม่ ('คำเครื่อง' ใน CDL นั้นคล้ายกับ 'หน่วยจัดเก็บข้อมูล' มากกว่า โดยไม่มีการอ้างอิงถึงชนิดของข้อมูลที่จัดเก็บไว้) นอกจากนี้ โครงการขนาดใหญ่ยังใช้ไลบรารีของฟังก์ชันพื้นฐานที่สร้างขึ้นอย่างพิถีพิถัน จากนั้นจึงทำการจำลองไลบรารีเหล่านี้สำหรับสถาปัตยกรรมและระบบปฏิบัติการเป้าหมายแต่ละแบบ ทำให้สามารถสร้างโค้ดที่มีประสิทธิภาพสูงสำหรับทุกระบบได้
เพื่อให้เข้าใจภาษามากขึ้น นี่คือตัวอย่างโค้ดเล็กๆ ที่ดัดแปลงมาจากคู่มือ CDL2:
การดำเนินการ quicksort + >จาก + >ถึง -p -q: น้อยกว่า+จาก+ถึง, แยก+จาก+ถึง+p+q, quicksort+from+q, quicksort+p+to; +. การแยก ACTION + >i + >j + p> + q> -m: make+p+i, make+q+j, add+i+j+m, halve+m, (อีกครั้ง: เลื่อนขึ้น+j+p+m, เลื่อนลง+i+q+m, (น้อยกว่า+p+q, สลับรายการ+p+q, เพิ่มขึ้น+p, ลดลง+q, *อีกครั้ง; น้อยกว่า +p +m, สลับรายการ +p +m, เพิ่ม +p; น้อยกว่า+m+q, สลับไอเทม+q+m, ลด+q; +)). ฟังก์ชัน move up + >j + >p> + >m: น้อยกว่า+เจ+พี; รายการที่เล็กกว่า+m+p; เพิ่ม + พี, *. ฟังก์ชัน move down + >i + >q> + >m: น้อยกว่า+q+j; รายการที่เล็กกว่า+q+m; decr+q, *. ทดสอบน้อยกว่า+>a+>b:=a"<"b. ฟังก์ชัน make+a>>b:=a"="b. FUNCTION add+>a+>b+sum>:=sum"="a"+"b. FUNCTION halve+>a>:=a"/=2". FUNCTION incr+>a>:=a"++". FUNCTION decr+>a>:=a"--". TEST smaller item+>i+>j:="items["i"]<items["j"]". ACTION swap items+>i+>jt:=t"=items["i"];items["i"]=items["j"];items["j"]="t. การดำเนินการพื้นฐานเหล่านี้ได้ถูกกำหนดไว้ในที่นี้โดยใช้ภาษา Java (หรือ C) นี่ไม่ใช่โปรแกรมที่สมบูรณ์ เราต้องกำหนดรายการ อาร์เรย์ Java ในส่วนอื่น ๆ ต่อไป
CDL2 ซึ่งปรากฏตัวในปี 1976 ยังคงรักษาหลักการของ CDL1 ไว้ แต่ทำให้ภาษานี้เหมาะสำหรับโครงการขนาดใหญ่มากขึ้น มันได้แนะนำโมดูล บังคับใช้การเปลี่ยนแปลงข้อมูลเฉพาะเมื่อสำเร็จ และขยายขีดความสามารถของภาษาออกไปบ้าง ตัวเพิ่มประสิทธิภาพในคอมไพเลอร์ CDL2 และโดยเฉพาะอย่างยิ่งใน CDL2 Laboratory (IDE สำหรับ CDL2) นั้นยอดเยี่ยมระดับโลก ไม่ใช่แค่เฉพาะในยุคนั้น คุณสมบัติหนึ่งของตัวเพิ่มประสิทธิภาพใน CDL2 Laboratory นั้นแทบจะไม่มีใครเหมือน คือสามารถทำการเพิ่มประสิทธิภาพข้ามหน่วยการคอมไพล์ได้ กล่าวคือ ถือว่าโปรแกรมทั้งหมดเป็นการคอมไพล์เพียงครั้งเดียว
CDL3 เป็นภาษาที่ใหม่กว่า มันได้ตัดคุณสมบัติแบบเปิดกว้างของเวอร์ชัน CDL ก่อนหน้าออกไป และมีฟังก์ชันพื้นฐานสำหรับการคำนวณทางคณิตศาสตร์และการเข้าถึงข้อมูล ไวยากรณ์ที่เคร่งครัดมากของเวอร์ชัน CDL ก่อนหน้า (จำนวนคำหลักและสัญลักษณ์มีเพียงหลักเดียว) ก็ได้รับการผ่อนปรนลง แนวคิดพื้นฐานบางอย่างถูกแสดงออกด้วยไวยากรณ์แทนที่จะเป็นความหมายโดยตรง นอกจากนี้ยังมีการนำชนิดข้อมูลมาใช้ในภาษาด้วย
ใช้
mbp Cobol เชิงพาณิชย์ (คอมไพเลอร์ Cobol สำหรับพีซี) รวมถึงระบบ MProlog (การใช้งาน Prolog ระดับอุตสาหกรรมที่ทำงานบนสถาปัตยกรรมและระบบปฏิบัติการต่างๆ มากมาย (เมนเฟรม IBM, VAX, PDP-11, Intel 8086เป็นต้น)) โดยเฉพาะอย่างยิ่งระบบหลังนี้เป็นเครื่องพิสูจน์ถึงความสามารถในการพกพาของ CDL2
แม้ว่าโปรแกรมส่วนใหญ่ที่เขียนด้วย CDL จะเป็นโปรแกรมคอมไพเลอร์ แต่ก็มีแอปพลิเคชัน GUI เชิงพาณิชย์อย่างน้อยหนึ่งตัวที่ได้รับการพัฒนาและดูแลรักษาด้วย CDL แอปพลิเคชันนั้นคือแอปพลิเคชันการเก็บภาพทางทันตกรรม ซึ่งปัจจุบันเป็นของบริษัท DEXIS นอกจากนี้ ระบบบริหารจัดการคลินิกทันตกรรมก็เคยได้รับการพัฒนาด้วย CDL เช่นกัน
ซอฟต์แวร์สำหรับคอมพิวเตอร์หมากรุก Mephisto IIIเขียนด้วย CDL2 [ 1 ]
อ่านเพิ่มเติม
- หนังสือเกี่ยวกับภาษา CDL1 / CDL2
- คำอธิบายของ CDL3
- เบดโอ Árpád: Programkészítési Módszerek; Közgazdasági és Jogi Könyvkiadó, 1979. ISBN 963-220-760-2