คอมไพเลอร์ภาษาซีตัวแรก: มองย้อนรหัสมรดกของ Dennis Ritchie ที่จุดประกายอุตสาหกรรม

BigGo Editorial Team
คอมไพเลอร์ภาษาซีตัวแรก: มองย้อนรหัสมรดกของ Dennis Ritchie ที่จุดประกายอุตสาหกรรม

คอมไพเลอร์ภาษาซีตัวแรกที่เขียนโดย Dennis Ritchie (รู้จักกันในนาม dmr) ในช่วงต้นทศวรรษ 1970 ได้กลายเป็นวัตถุโบราณทางประวัติศาสตร์ที่น่าสนใจสำหรับนักเขียนโปรแกรมและนักวิทยาศาสตร์คอมพิวเตอร์ รหัสโบราณนี้ ซึ่งปัจจุบันถูกเก็บรักษาไว้ในที่เก็บ legacy-cc เปิดมุมมองให้เห็นถึงจุดเริ่มต้นอันต่ำต้อยของสิ่งที่ต่อมาจะเติบโตเป็นอุตสาหกรรมมูลค่าหลายล้านล้านดอลลาร์

คอมไพเลอร์ที่ไม่สามารถคอมไพล์ได้

ที่เก็บนี้มีเวอร์ชันแรกสุดของคอมไพเลอร์ภาษาซี ย้อนกลับไปประมาณปี 1972 ที่น่าสนใจคือ ไฟล์ซอร์สโค้ดเหล่านี้ไม่สามารถคอมไพล์ด้วยคอมไพเลอร์ภาษาซีสมัยใหม่อย่าง GCC ได้ รหัสประวัติศาสตร์นี้แสดงถึงช่วงเปลี่ยนผ่านในการพัฒนาภาษาโปรแกรมมิ่ง โดยมีผู้แสดงความคิดเห็นหลายคนระบุว่าคอมไพเลอร์ภาษาซีตัวแรกจริงๆ แล้วถูกเขียนด้วยภาษา B โดยที่โค้ดเบสค่อยๆ วิวัฒนาการผ่านการเปลี่ยนแปลงแบบค่อยเป็นค่อยไปจนกลายเป็นสิ่งที่เรารู้จักในปัจจุบันว่าเป็นภาษาซี

หนึ่งในซอฟต์แวร์ที่ผมชื่นชอบมากที่สุดตลอดกาล ได้เรียนรู้มากมายจากสิ่งนี้!

ไวยากรณ์จากยุคอื่น

โค้ดเผยให้เห็นความแตกต่างอย่างชัดเจนระหว่างภาษาซียุคแรกกับภาษาซีสมัยใหม่ ผู้แสดงความคิดเห็นคนหนึ่งเน้นย้ำถึงการใช้คีย์เวิร์ดที่ไม่ปกติเช่น extern และ auto - คำที่ยังคงมีอยู่ในภาษาซีสมัยใหม่แต่ทำงานแตกต่างกันในปัจจุบัน ในไฟล์ยุคแรกเหล่านี้ extern ถูกใช้เพื่อนำสัญลักษณ์ระดับโลกเข้ามาในขอบเขตของฟังก์ชัน และทุกอย่างเป็นประเภท int โดยค่าเริ่มต้นโดยไม่ต้องประกาศอย่างชัดเจน การประกาศอาร์เรย์บางครั้งระบุขนาดในขณะที่บางครั้งไม่ได้ระบุ โดยอาร์เรย์ที่ไม่มีขนาดทำหน้าที่เหมือนพอยน์เตอร์

ไวยากรณ์นี้เป็นตัวแทนของสิ่งที่หลายคนเรียกว่า K&R C (Kernighan and Ritchie C) ซึ่งมีมาก่อนมาตรฐาน ANSI C/C89 ที่นักเขียนโปรแกรมส่วนใหญ่จะคุ้นเคยในปัจจุบัน แม้จะถูกเลิกใช้ไปหลายทศวรรษแล้ว แต่สไตล์นี้ได้รับการสนับสนุนโดย GCC ด้วยแฟล็ก -traditional จนกระทั่งเมื่อไม่นานมานี้

ข้อมูลสำคัญเกี่ยวกับ legacy-cc

  • ผู้เขียนต้นฉบับ: Dennis Ritchie (dmr)
  • ช่วงเวลา: ประมาณปี 1972
  • ฮาร์ดแวร์: พัฒนาสำหรับ PDP-11
  • คุณสมบัติที่โดดเด่น:
    • การประกาศฟังก์ชันแบบ K&R
    • ค่าเริ่มต้นเป็นประเภท "int"
    • เทคนิคการจัดการหน่วยความจำที่ไม่ธรรมดา
    • การออกแบบคอมไพเลอร์แบบสองเฟส

แหล่งข้อมูลที่เป็นประโยชน์

การจัดการหน่วยความจำอย่างสร้างสรรค์

บางทีแง่มุมที่น่าสนใจที่สุดของโค้ดเบสนี้คือฟังก์ชันที่เรียกว่า waste() ซึ่งได้จุดประกายการอภิปรายอย่างมาก ฟังก์ชันนี้ดูเหมือนจะบริโภคพื้นที่อย่างตั้งใจผ่านการเรียกตัวเองซ้ำๆ:

waste()  /* waste space */
{
 waste(waste(waste),waste(waste),waste(waste));
 waste(waste(waste),waste(waste),waste(waste));
 ...
}

ในขณะที่ความเห็นที่เรียบง่ายระบุเพียงว่า waste space การวิเคราะห์ของชุมชนแนะนำว่านี่เป็นเทคนิคที่ชาญฉลาดสำหรับการสำรองหน่วยความจำ ผู้แสดงความคิดเห็นคนหนึ่งอธิบายว่าทั้งสองเฟสของคอมไพเลอร์ใช้วิธีการนี้เพื่อให้แน่ใจว่าพื้นที่หน่วยความจำที่สำรองไว้มีที่อยู่เดียวกันในทุกเฟส ซึ่งช่วยให้สามารถส่งต้นไม้นิพจน์ที่มีพอยน์เตอร์ระหว่างเฟสได้อย่างมีประสิทธิภาพ สิ่งนี้แสดงให้เห็นว่าข้อจำกัดของฮาร์ดแวร์ในยุคนั้นบังคับให้นักเขียนโปรแกรมต้องพัฒนาวิธีแก้ปัญหาอย่างสร้างสรรค์ซึ่งอาจดูแปลกประหลาดตามมาตรฐานในปัจจุบัน

ผลกระทบทางประวัติศาสตร์

ความสำคัญของรหัสนี้ขยายไกลเกินกว่าความแปลกประหลาดทางเทคนิค ตามที่ผู้แสดงความคิดเห็นคนหนึ่งระบุว่า เวอร์ชันแรกของ Oracle Database ที่มีให้บริการแก่สาธารณะ (v2 เปิดตัวในปี 1979) ถูกเขียนด้วยแอสเซมบลีสำหรับ PDP-11 เมื่อ Oracle เขียนเวอร์ชัน 3 ใหม่ในภาษาซี (1983) เพื่อความสามารถในการพกพาข้ามแพลตฟอร์ม พวกเขาพบว่าเมนเฟรมไม่มีคอมไพเลอร์ภาษาซี แทนที่จะเขียนฐานข้อมูลของพวกเขาใหม่ใน COBOL หรือภาษาเมนเฟรมอื่นๆ Oracle ได้สร้างคอมไพเลอร์ภาษาซีของตัวเองสำหรับเมนเฟรม

รูปแบบนี้เกิดซ้ำทั่วทั้งอุตสาหกรรม โดยภาษาซีกลายเป็นภาษากลางของการเขียนโปรแกรมระบบและช่วยให้ซอฟต์แวร์สามารถพกพาข้ามแพลตฟอร์มฮาร์ดแวร์ที่หลากหลายได้ ระบบปฏิบัติการ UNIX เอง ซึ่งพัฒนาขึ้นพร้อมกับภาษาซี ได้ถูกพอร์ตไปยังเมนเฟรม System/370 ของ IBM ภายในปี 1980

การสะท้อนเกี่ยวกับความเรียบง่ายและความซับซ้อน

ที่เก็บนี้ได้กระตุ้นให้เกิดการอภิปรายที่น่าคิดเกี่ยวกับธรรมชาติของภาษาซี ในขณะที่นักเขียนโปรแกรมหลายคนชื่นชมภาษาซีสำหรับความเรียบง่ายที่ปรากฏ ผู้แสดงความคิดเห็นหลายคนระบุว่าความเรียบง่ายนี้เป็นเพียงภาพลวงตา ภาษาอาจจะเล็กและใกล้ชิดกับฮาร์ดแวร์ แต่มันมีความซับซ้อนทางความหมายที่สำคัญผ่านการแปลงประเภทโดยนัย กฎการอ้างอิง และข้อกำหนดการจัดการหน่วยความจำ

ตามที่ผู้แสดงความคิดเห็นคนหนึ่งกล่าวไว้อย่างชัดเจนว่า ภาษาซีมีขนาดเล็ก แต่ไม่เรียบง่าย ความเรียบง่ายที่รับรู้มาจากการบังคับให้โปรแกรมยังคงเรียบง่ายโดยการจำกัดการนามธรรมที่ทรงพลัง ไม่ใช่จากตัวภาษาเองที่เข้าใจง่ายหรือเข้าใจได้อย่างสมบูรณ์

การมองดูรหัสประวัติศาสตร์นี้ให้มุมมองที่มีคุณค่าเกี่ยวกับวิวัฒนาการของการคำนวณว่าได้มาไกลแค่ไหน ในขณะเดียวกันก็เตือนเราว่าแม้แต่ระบบสมัยใหม่ที่ซับซ้อนที่สุดก็ยังสืบทอดเชื้อสายมาจากจุดเริ่มต้นอันต่ำต้อยเหล่านี้ ที่เก็บ legacy-cc ยืนเป็นพยานถึงวิธีที่ซอฟต์แวร์ชิ้นเล็กๆ ที่สร้างโดยจิตใจอันชาญฉลาดเพียงคนเดียว สามารถวางรากฐานสำหรับความก้าวหน้าทางเทคโนโลยีหลายทศวรรษ

อ้างอิง: legacy-cc