คอมไพเลอร์ภาษาซีตัวแรกที่เขียนโดย 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"
- เทคนิคการจัดการหน่วยความจำที่ไม่ธรรมดา
- การออกแบบคอมไพเลอร์แบบสองเฟส
แหล่งข้อมูลที่เป็นประโยชน์
- อีมูเลเตอร์ PDP-11: http://pdp11.aiju.de/
- คลังข้อมูล Research Unix: https://www.tuhs.org/Archive/Distributions/Research/
- ซอร์สโค้ดต้นฉบับ: https://www.bell-labs.com/usr/dmr/www/primevalC.html
การจัดการหน่วยความจำอย่างสร้างสรรค์
บางทีแง่มุมที่น่าสนใจที่สุดของโค้ดเบสนี้คือฟังก์ชันที่เรียกว่า 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