1 คะแนน โดย GN⁺ 2024-09-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ส่วนขยายภาษาที่สาบสูญของ 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 ความคิดเห็น

 
GN⁺ 2024-09-27
ความคิดเห็นบน Hacker News
  • ในปี 2011 มีคนเขียน iterator-driven for และตอนนั้นก็จินตนาการว่ามันอาจถูกบรรจุเข้าไปในมาตรฐาน C++

  • มีคนครอบครองหนังสืออ้างอิง High C/C++ Language Reference

  • ความสามารถที่มีในภาษา D (หรือ Das BetterC):

    • ใช้ขีดล่างในลิเทอรัลได้
    • ระบุช่วงของ case ได้
    • ใช้อาร์กิวเมนต์แบบมีชื่อได้
    • ใช้ nested function ได้
    • ใช้ static nested function ได้
    • มีความสามารถคล้าย generator
  • คอมไพเลอร์ 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++ ยุคใหม่