คำว่า "orthogonality" เป็นคำของคนธรรมดาสำหรับความคิดทางคณิตศาสตร์ที่แม่นยำ: เงื่อนไขภาษาเป็นพีชคณิตเริ่มต้น (ดูใน Wikipedia)
มันมีความหมายว่า "มีความสอดคล้อง 1-1 ระหว่างไวยากรณ์และความหมาย" ซึ่งหมายความว่า: มีวิธีหนึ่งที่จะถ่ายทอดสิ่งต่าง ๆ ได้อย่างแน่นอนและหากคุณสามารถแสดงออกบางอย่างในสถานที่หนึ่ง ๆ ได้คุณสามารถใส่การแสดงออกอื่น ๆ ได้เช่นกัน
อีกวิธีที่จะคิดเกี่ยวกับ "orthogonal" คือไวยากรณ์ปฏิบัติตามหลักการทดแทน ตัวอย่างเช่นถ้าคุณมีคำสั่งที่มีช่องสำหรับการแสดงออกแล้วการแสดงออกใด ๆ ที่สามารถวางที่นั่นและผลที่ได้ยังคงเป็นโปรแกรมที่ถูกต้อง syntactically นอกจากนี้หากคุณเปลี่ยน
ฉันต้องการเน้นว่า "ความหมาย" ไม่ได้หมายความถึงผลการคำนวณ เห็นได้ชัดว่า 1 + 2 และ 2 + 1 ทั้งสองเท่ากัน 3 อย่างไรก็ตามข้อกำหนดมีความแตกต่างกันและบ่งบอกถึงการคำนวณที่แตกต่างกันแม้ว่าจะมีผลลัพธ์เหมือนกัน ความหมายแตกต่างกันเนื่องจากอัลกอริทึมการเรียงลำดับสองแบบนั้นแตกต่างกัน
คุณอาจเคยได้ยิน "ต้นไม้ไวยากรณ์นามธรรม" (AST) คำว่า "นามธรรม" ที่นี่หมายถึง "orthogonal" อย่างแม่นยำ ในทางเทคนิคแล้ว AST ส่วนใหญ่นั้นไม่ได้เป็นนามธรรมจริง ๆ !
บางทีคุณเคยได้ยินภาษาการเขียนโปรแกรม "C" หรือไม่ สัญกรณ์ประเภท C ไม่เป็นนามธรรม พิจารณา:
int f(int);
int
ดังนั้นนี่คือประกาศประเภทฟังก์ชั่นกลับมา ประเภทของตัวชี้ไปยังฟังก์ชั่นนี้ได้รับจาก:
int (*)(int)
หมายเหตุคุณไม่สามารถเขียนประเภทของฟังก์ชั่นได้! สัญกรณ์ประเภท C ดูดครั้งใหญ่! มันไม่เป็นนามธรรม มันไม่ใช่มุมฉาก ทีนี้สมมติว่าเราต้องการสร้างฟังก์ชั่นที่ยอมรับประเภทข้างต้นแทนที่จะเป็น int:
int (*) ( int (*)(int) )
ตกลงทั้งหมด .. แต่ .. ถ้าเราต้องการส่งคืนแทน:
int (*)(int) (*) (int)
woops! โมฆะ ให้เพิ่ม parens:
(int (*)(int)) (*) (int)
woops! ไม่ได้ผลเช่นกัน เราต้องทำสิ่งนี้ (เป็นวิธีเดียว!):
typedef int (intintfunc*) (int);
intintfunc (*)(int)
ตอนนี้ก็โอเค แต่การใช้ typedef ที่นี่ไม่ดี C ดูด มันไม่เป็นนามธรรม มันไม่ใช่มุมฉาก นี่คือวิธีที่คุณทำใน ML ซึ่งคือ:
int -> (int -> int)
เราประณาม C ที่ระดับไวยากรณ์
ตกลงตอนนี้ให้ flog C ++ เราสามารถแก้ไขความโง่เขลาข้างต้นด้วยเทมเพลตและรับ ML เช่นสัญลักษณ์ (มากหรือน้อย):
fun<int, int>
fun< fun<int,int>, int>
แต่ระบบการพิมพ์จริงมีข้อบกพร่องพื้นฐานโดยอ้างอิง: ถ้าT
เป็นประเภทแล้วเป็นT&
ประเภท? คำตอบคือ waffly: ที่ระดับไวยากรณ์ถ้าคุณมีประเภท U = T & อนุญาต U & ได้รับอนุญาต แต่มันก็หมายถึง T &: การอ้างอิงถึงการอ้างอิงคือการอ้างอิงเดิม มันแย่มาก! มันแบ่งข้อกำหนดที่เป็นเอกลักษณ์ทางความหมาย แย่ลง: T & & ไม่ได้รับอนุญาต syntactically: นี้ทำลายหลักการทดแทน ดังนั้นการอ้างอิงภาษา C ++ จะแบ่งความเป็นเอกเทศในสองวิธีที่แตกต่างกันขึ้นอยู่กับเวลาในการรวม (การวิเคราะห์คำหรือการวิเคราะห์ประเภท) หากคุณต้องการที่จะเข้าใจวิธีการทำสิ่งนี้ให้ถูกต้อง .. ไม่มีปัญหากับพอยน์เตอร์!
เกือบจะไม่มีภาษาจริงเป็นฉาก แม้แต่ Scheme ซึ่งอ้างว่าชัดเจนในการแสดงออก อย่างไรก็ตามภาษาที่ดีจำนวนมากสามารถตัดสินได้ว่ามี "อยู่ใกล้กับคุณสมบัติพื้นฐานฉาก" และนั่นคือคำแนะนำที่ดีสำหรับภาษาใช้ทั้งกับไวยากรณ์และความหมายพื้นฐาน