ก่อนอื่นฉันจะทราบว่าถึงแม้ว่าฉันจะพูดถึง "C" เท่านั้นที่นี่สิ่งเดียวกันก็ใช้ได้กับ C ++ เช่นกัน
ความคิดเห็นที่กล่าวถึง Godel เป็นเพียงส่วนหนึ่ง (แต่เพียงบางส่วนเท่านั้น) ตรงประเด็น
เมื่อคุณก้าวไปข้างหน้าพฤติกรรมที่ไม่ได้กำหนดในมาตรฐาน C นั้นส่วนใหญ่จะเป็นการชี้ให้เห็นขอบเขตระหว่างสิ่งที่มาตรฐานพยายามกำหนดและสิ่งที่มันไม่ได้ทำ
ทฤษฎีบทของ Godel (มีอยู่สองข้อ) โดยทั่วไปบอกว่ามันเป็นไปไม่ได้ที่จะกำหนดระบบคณิตศาสตร์ที่สามารถพิสูจน์ได้ (ตามกฎของตัวเอง) ให้สมบูรณ์และสอดคล้องกัน คุณสามารถสร้างกฎของคุณเพื่อให้เสร็จสมบูรณ์ (กรณีที่เขาจัดการคือกฎ "ปกติ" สำหรับตัวเลขธรรมชาติ) หรือคุณสามารถทำให้เป็นไปได้ที่จะพิสูจน์ความมั่นคง แต่คุณไม่สามารถมีได้ทั้งคู่
ในกรณีของบางสิ่งบางอย่างเช่น C ซึ่งไม่สามารถใช้งานได้โดยตรงส่วนใหญ่ "การพิสูจน์ได้" ของความสมบูรณ์หรือความสอดคล้องของระบบนั้นไม่ได้มีความสำคัญสูงนักสำหรับนักออกแบบภาษาส่วนใหญ่ ในเวลาเดียวกันใช่พวกเขาอาจได้รับอิทธิพล (อย่างน้อยก็ระดับหนึ่ง) โดยรู้ว่ามันเป็นไปไม่ได้ที่จะกำหนดระบบ "สมบูรณ์แบบ" ซึ่งเป็นระบบที่สมบูรณ์และสอดคล้องกัน การรู้ว่าสิ่งดังกล่าวเป็นไปไม่ได้อาจทำให้ง่ายขึ้นเล็กน้อยในการถอยออกมาหายใจเล็กน้อยและตัดสินใจเกี่ยวกับขอบเขตของสิ่งที่พวกเขาจะพยายามกำหนด
ด้วยความเสี่ยงที่จะถูกกล่าวหาว่ามีความเย่อหยิ่ง (อีกครั้ง) ฉันจะอธิบายถึงมาตรฐาน C ว่าอยู่ภายใต้การควบคุม (บางส่วน) โดยแนวคิดพื้นฐานสองประการ:
- ภาษาควรรองรับฮาร์ดแวร์ที่หลากหลายเท่าที่จะเป็นไปได้ (โดยหลักแล้วฮาร์ดแวร์ทั้งหมด "มีเหตุผล" จนถึงขีด จำกัด ล่างที่สมเหตุสมผล)
- ภาษาควรรองรับการเขียนซอฟต์แวร์ที่หลากหลายที่สุดเท่าที่จะเป็นไปได้สำหรับสภาพแวดล้อมที่กำหนด
สิ่งแรกหมายความว่าถ้ามีคนกำหนดซีพียูใหม่มันควรจะเป็นไปได้ที่จะให้การใช้งาน C ที่ดีมั่นคงและใช้งานได้ตราบใดที่การออกแบบตกอยู่อย่างน้อยก็ใกล้เคียงกับแนวทางง่ายๆสองสามประการ ติดตามบางสิ่งตามคำสั่งทั่วไปของแบบจำลอง Von Neumann และให้หน่วยความจำขั้นต่ำที่เหมาะสมอย่างน้อยก็พอที่จะอนุญาตให้มีการติดตั้ง C สำหรับการนำไปใช้งาน "ที่โฮสต์" (ที่ทำงานบนระบบปฏิบัติการ) คุณต้องสนับสนุนความคิดบางอย่างที่สอดคล้องกับไฟล์อย่างใกล้ชิดและมีชุดอักขระที่มีชุดอักขระขั้นต่ำ (91 รายการ)
อย่างที่สองหมายความว่าควรจะเขียนโค้ดที่จัดการกับฮาร์ดแวร์โดยตรงดังนั้นคุณสามารถเขียนสิ่งต่าง ๆ เช่น boot loader, ระบบปฏิบัติการ, ซอฟต์แวร์ฝังตัวที่ทำงานโดยไม่มีระบบปฏิบัติการใด ๆ ฯลฯ ในที่สุดก็มีข้อ จำกัดบางประการในเรื่องนี้เกือบทั้งหมด ระบบปฏิบัติการ, บูตโหลดเดอร์และอื่น ๆ มีแนวโน้มที่จะมีโค้ดอย่างน้อยเขียนในภาษาแอสเซมบลี ในทำนองเดียวกันแม้แต่ระบบสมองกลฝังตัวที่มีขนาดเล็กก็น่าจะรวมรูทีนไลบรารีที่เขียนไว้ล่วงหน้าอย่างน้อยบางประเภทเพื่อให้สามารถเข้าถึงอุปกรณ์ในระบบโฮสต์ แม้ว่าขอบเขตที่แม่นยำนั้นยากที่จะกำหนด แต่ความตั้งใจก็คือการพึ่งพารหัสดังกล่าวควรถูกเก็บไว้ให้น้อยที่สุด
พฤติกรรมที่ไม่ได้กำหนดไว้ในภาษานั้นเกิดจากความตั้งใจของภาษาเพื่อสนับสนุนความสามารถเหล่านี้ ตัวอย่างเช่นภาษาช่วยให้คุณแปลงจำนวนเต็มตามอำเภอใจเป็นตัวชี้และเข้าถึงสิ่งที่เกิดขึ้นตามที่อยู่นั้น มาตรฐานไม่ได้พยายามบอกว่าจะเกิดอะไรขึ้นเมื่อคุณทำ (เช่นการอ่านจากที่อยู่บางแห่งอาจมีผลต่อการมองเห็นจากภายนอก) ในเวลาเดียวกันมันก็ไม่ได้พยายามที่จะป้องกันไม่ให้คุณทำสิ่งนี้เพราะคุณจำเป็นต้องมีซอฟต์แวร์บางประเภทที่คุณควรจะเขียนเป็น C
มีพฤติกรรมบางอย่างที่ไม่ได้กำหนดซึ่งขับเคลื่อนโดยองค์ประกอบการออกแบบอื่นเช่นกัน ตัวอย่างเช่นจุดประสงค์อื่นของ C คือเพื่อสนับสนุนการรวบรวมที่แยกจากกัน นี่หมายถึง (ตัวอย่าง) ว่ามันมีไว้เพื่อให้คุณสามารถ "เชื่อมโยง" ชิ้นส่วนเข้าด้วยกันโดยใช้ตัวเชื่อมโยงที่ติดตามสิ่งที่พวกเราส่วนใหญ่มองว่าเป็นแบบจำลองปกติของตัวเชื่อมโยง โดยเฉพาะอย่างยิ่งมันเป็นไปได้ที่จะรวมโมดูลที่คอมไพล์แล้วแยกเป็นโปรแกรมที่สมบูรณ์โดยปราศจากความรู้ด้านความหมายของภาษา
มีพฤติกรรมที่ไม่ได้กำหนดอีกประเภทหนึ่ง (ซึ่งพบได้ทั่วไปใน C ++ มากกว่า C) ซึ่งมีอยู่เพียงเพราะข้อ จำกัด ของเทคโนโลยีคอมไพเลอร์ - สิ่งที่เรารู้โดยทั่วไปคือข้อผิดพลาดและอาจต้องการให้คอมไพเลอร์วินิจฉัยว่าเป็นข้อผิดพลาด แต่ด้วยข้อ จำกัด ในปัจจุบันของเทคโนโลยีคอมไพเลอร์จึงสงสัยว่าจะสามารถวินิจฉัยได้ในทุกสถานการณ์ หลายสิ่งเหล่านี้ถูกขับเคลื่อนด้วยข้อกำหนดอื่น ๆ เช่นการรวบรวมแยกต่างหากดังนั้นจึงเป็นเรื่องของการสร้างสมดุลระหว่างข้อกำหนดที่ขัดแย้งกันซึ่งในกรณีนี้คณะกรรมการได้เลือกที่จะสนับสนุนความสามารถที่มากขึ้นแม้ว่าจะหมายถึงการขาดการวินิจฉัยปัญหาที่เป็นไปได้ แทนที่จะจำกัดความสามารถเพื่อให้แน่ใจว่าปัญหาที่เป็นไปได้ทั้งหมดจะได้รับการวินิจฉัย
ความแตกต่างในเจตนาจะผลักดันความแตกต่างระหว่าง C และบางอย่างเช่น Java หรือระบบที่ใช้ CLI ของ Microsoft หลังค่อนข้าง จำกัด อย่างชัดเจนในการทำงานกับชุดฮาร์ดแวร์ที่ จำกัด มากขึ้นหรือต้องการซอฟต์แวร์เพื่อจำลองฮาร์ดแวร์เฉพาะที่พวกเขากำหนดเป้าหมาย พวกเขาตั้งใจที่จะป้องกันการจัดการฮาร์ดแวร์โดยตรงโดยเฉพาะแทนที่จะต้องการให้คุณใช้บางอย่างเช่น JNI หรือ P / Invoke (และรหัสที่เขียนในรูปแบบ C) เพื่อให้พยายามทำเช่นนั้น
กลับไปที่ทฤษฎีบทของ Godel สักครู่เราสามารถวาดบางสิ่งที่ขนานกัน: Java และ CLI เลือกใช้ทางเลือก "ที่สอดคล้องกันภายใน" ในขณะที่ C เลือกใช้ทางเลือก "สมบูรณ์" ของหลักสูตรนี้คือการเปรียบเทียบหยาบมาก - ฉันสงสัยของทุกคนพยายามพิสูจน์อย่างเป็นทางการของทั้งสอดคล้องภายในหรือความครบถ้วนสมบูรณ์ในทั้งสองกรณี อย่างไรก็ตามความคิดทั่วไปไม่พอดีกับที่ค่อนข้างใกล้ชิดกับตัวเลือกที่พวกเขาได้นำ