ส่วนขยายภาษาที่สาบสูญของ High C ของ MetaWare
คอมไพเลอร์ C ในยุค 1980
- ในยุค 1980 มีบริษัทขนาดเล็กจำนวนมากแข่งขันกันและนำเสนอส่วนขยายภาษาที่หลากหลาย
- Phar Lap ได้พัฒนา DOS extender ที่สามารถใช้ประโยชน์จากโปรเซสเซอร์ 32 บิต 80386 ได้ และ MetaWare ก็พอร์ตคอมไพเลอร์ High C เพื่อรองรับสิ่งนี้
- Fujitsu ได้นำ DOS extender ของ Phar Lap ไปผนวกรวมเข้ากับแพลตฟอร์ม FM TOWNS และ High C ก็กลายเป็นคอมไพเลอร์ C หลักของแพลตฟอร์มนี้
ส่วนขยายภาษาที่โดดเด่นของ High C
- High C ไม่ได้มีแค่ส่วนขยายเฉพาะสำหรับ DOS เท่านั้น แต่ยังมีส่วนขยายภาษาที่หลากหลายซึ่งเน้นผู้ใช้เป็นศูนย์กลาง
- บางความสามารถเพิ่งถูกรวมเข้าเป็นมาตรฐานอย่างเป็นทางการหลังจากนั้นอีกหลายสิบปี ขณะที่บางอย่างก็ยังไม่มีอยู่ใน C หรือ C++ จนถึงทุกวันนี้
การใช้ขีดล่างในลิเทอรัลตัวเลข
- สามารถใช้ขีดล่างเพื่อแบ่งลิเทอรัลตัวเลขที่ยาวให้อ่านง่ายขึ้นได้
- C++ นำความสามารถนี้มาใช้ใน C++14 และ C นำมาใช้ใน C23
อาร์กิวเมนต์แบบมีป้ายกำกับ
- สามารถใส่ป้ายกำกับให้อาร์กิวเมนต์เมื่อเรียกฟังก์ชันที่มีอาร์กิวเมนต์จำนวนมากได้
- คล้ายกับความสามารถยอดนิยมของ Python และเมื่อมีป้ายกำกับอาร์กิวเมนต์แล้ว ก็สามารถระบุอาร์กิวเมนต์โดยไม่ต้องเรียงตามลำดับได้
- C หรือ C++ มาตรฐานยังไม่มีความสามารถนี้
เคสแบบช่วงค่า
- มีความสามารถในการจับคู่ช่วงของค่าได้แบบเดียวกับ Pascal
- C หรือ C++ มาตรฐานไม่มีความสามารถนี้
ฟังก์ชันซ้อนกัน
- สามารถประกาศฟังก์ชันหนึ่งซ้อนอยู่ภายในอีกฟังก์ชันได้
- ฟังก์ชันซ้อนกันสามารถประกาศด้วยชนิด "entire function value" ซึ่งทำงานเป็น non-escaping closure ได้
- ให้การติดตั้งใช้งานที่สมบูรณ์กว่าส่วนขยาย nested function ของ GCC
- C มาตรฐานยังไม่มีความสามารถเรื่องฟังก์ชันซ้อนกันอย่างเป็นทางการ
เจเนอเรเตอร์
- รองรับ generator coroutine สไตล์ Python
- ฟังก์ชันเจเนอเรเตอร์สามารถสร้างค่าได้หลายครั้ง และสามารถประมวลผลแต่ละค่าแบบลำดับด้วยไวยากรณ์
for loop แบบใหม่
- อนุญาตให้มีปฏิสัมพันธ์ที่ซับซ้อนกับความสามารถฟังก์ชันซ้อนกัน
- ไม่น่าเป็นไปได้ที่ C มาตรฐานจะรวมความสามารถนี้เข้าไป
สรุปโดย GN⁺
- คอมไพเลอร์ High C ของ MetaWare มอบส่วนขยายภาษาที่หลากหลายในยุค 1980 ซึ่งช่วยเพิ่มพลังการแสดงออกของภาษา C อย่างมาก
- บางความสามารถเพิ่งถูกรวมเข้าเป็นมาตรฐานอย่างเป็นทางการหลังจากนั้นอีกหลายสิบปี ขณะที่บางอย่างก็ยังไม่มีอยู่ใน C หรือ C++ จนถึงปัจจุบัน
- ความสามารถขั้นสูงอย่างเจเนอเรเตอร์และฟังก์ชันซ้อนกันนั้นหาได้ยากแม้แต่ในภาษาโปรแกรมจำนวนมากในปัจจุบัน
- บทความนี้ช่วยให้เข้าใจประวัติและพัฒนาการของภาษา C ได้ดียิ่งขึ้น และมอบมุมมองที่น่าสนใจเกี่ยวกับการออกแบบภาษาโปรแกรม
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ในปี 2011 มีคนเขียน
iterator-driven forและตอนนั้นก็จินตนาการว่ามันอาจถูกบรรจุเข้าไปในมาตรฐาน C++มีคนครอบครองหนังสืออ้างอิง High C/C++ Language Reference
ความสามารถที่มีในภาษา D (หรือ Das BetterC):
caseได้คอมไพเลอร์ C ชื่อ
lcc-winได้เพิ่ม operator overloading, default function argument และ function overloadingคอมไพเลอร์ Plan 9 C ได้นำ language extension หลายอย่างเข้ามา และบางส่วนก็ถูกรวมเข้าไปในมาตรฐาน C
ปัจจุบัน GCC รองรับแฟลก
-fplan9-extensionsซึ่งมีความสามารถอย่างการแปลง struct pointer ไปเป็น anonymous field โดยอัตโนมัติคนที่นำความสามารถเหล่านี้เข้ามาถือว่าล้ำหน้ามาก แต่ก็น่าเสียดายที่ไม่ได้ส่งอิทธิพลต่อมาตรฐาน
มีคนบอกว่าประเด็นที่เกี่ยวข้องเคยถูกพูดถึงบน Hacker News มาก่อนแล้ว
มีคนสงสัยว่ามีสำเนา PDF หรือไม่
ที่ string literal ในโค้ดตัวอย่างลงท้ายด้วย ¥n แทน
\nเป็นเพราะ code page ของ Shift-JISเรื่อง generator ทำให้นึกถึงคำถามเรื่อง internal/external iteration ของ Rust และ
try_fold()มีความเห็นว่าตัวพิมพ์ของหนังสือทั้งสวยและชวนสยองในเวลาเดียวกัน
แม้จะไม่ค่อยรู้เรื่องหลักการเขียนภาษาญี่ปุ่นหรือกฎ kerning แต่ดูเหมือนว่าเป็นการบังคับให้ฟอนต์แบบความกว้างแปรผันไปอยู่ในช่องแบบ fixed-width
มีคนชอบที่ตัวอย่างโค้ดไม่ได้ใช้ฟอนต์ขนาด 8pt
มีคนสงสัยว่าหนังสือเล่มนี้เขียนเป็นภาษาญี่ปุ่นตั้งแต่แรก หรือเขียนเป็นภาษาอังกฤษแล้วค่อยแปลเป็นภาษาญี่ปุ่น
ถ้าเป็นของ Fujitsu ก็น่าจะเขียนเป็นภาษาญี่ปุ่นตั้งแต่ต้น และคุณภาพภาษาอังกฤษใน
printfกับคอมเมนต์โค้ดของผู้ที่ไม่ใช่เจ้าของภาษาก็น่าประทับใจโดยเฉพาะความสามารถที่เกี่ยวกับ generator นั้นถือว่าล้ำยุคมากสำหรับสมัยนั้น
อาจเป็นเพราะ Fujitsu ไม่ได้ต้องผ่านกระบวนการทำให้เป็นมาตรฐานจึงทำสิ่งเหล่านี้ได้ แต่ก็เป็นเหตุผลด้วยว่าทำไม extension เหล่านี้จึงถูกค้นพบและประดิษฐ์ขึ้นใหม่อีกครั้งใน C/C++ ยุคใหม่