อ่าน 4 นาที
ซี--
C-- (โดยทั่วไปเขียนโดยใช้ เครื่องหมายยัติภังค์และลบ แต่ออกเสียงว่า ซี ลบ ลบ ) เป็น ภาษาโปรแกรม ที่คล้ายกับภาษา C ซึ่งออกแบบมาเพื่อให้ คอมไพเลอร์ สำหรับ ภาษาโปรแกรมระดับสูง...
ซี--
| ซี-- | |
|---|---|
โลโก้ที่ไม่เป็นทางการของภาษา C ซึ่งมีลักษณะคล้ายกับโลโก้ของภาษา C++ มาก | |
| กระบวนทัศน์ | คำสั่ง |
| ออกแบบโดย | ไซมอน เพย์ตัน โจนส์และนอร์แมน แรมซีย์ |
| ปรากฏครั้งแรก | 1998 |
| วินัยในการพิมพ์ | คงที่อ่อนแอ |
| เว็บไซต์ | www.cs.tufts.edu/~nr/c--/ |
| ได้รับอิทธิพลจาก | |
| ซี | |
C-- (โดยทั่วไปเขียนโดยใช้เครื่องหมายยัติภังค์และลบแต่ออกเสียงว่าซี ลบ ลบ ) เป็นภาษาโปรแกรมที่คล้ายกับภาษา C ซึ่งออกแบบมาเพื่อให้ คอมไพเลอร์สำหรับภาษาโปรแกรมระดับสูงสร้างขึ้นเป็นหลักแทนที่จะเขียนโดยโปรแกรมเมอร์ที่เป็นมนุษย์ ภาษานี้ถูกสร้างขึ้นโดยนักวิจัยด้านการเขียนโปรแกรมเชิงฟังก์ชันSimon Peyton Jonesและ Norman Ramsey แตกต่างจากภาษาตัวกลางอื่นๆ หลายภาษาตรงที่มันถูกแสดงใน รูปแบบข้อความ ASCII ธรรมดา ไม่ใช่ไบต์โค้ดหรือรูปแบบไบนารี อื่นๆ [ 1 ] [ 2 ]
มีสองสาขาหลัก:
- C-- ซึ่งเป็นสาขาดั้งเดิม โดยมีเวอร์ชันสุดท้าย 2.0 ออกวางจำหน่ายในเดือนพฤษภาคม พ.ศ. 2548 [ 3 ]
- Cmm ซึ่งเป็นฟอร์กที่ใช้อย่างแข็งขันเป็นตัวแทนระดับกลาง (IR) ในคอมไพเลอร์ Glasgow Haskell (GHC) [ 4 ] [ 5 ]
ออกแบบ
C-- เป็น " ภาษาแอสเซมบลี แบบพกพา " [ 6 ]ซึ่งออกแบบมาเพื่ออำนวยความสะดวกในการใช้งานคอมไพเลอร์ที่สร้างรหัสเครื่องคุณภาพ สูง [ 7 ] โดยมอบหมาย การสร้างรหัสระดับต่ำและการเพิ่มประสิทธิภาพโปรแกรม ให้กับคอมไพเลอร์ C-- ไวยากรณ์ของภาษายืมมาจาก C อย่างมาก ในขณะที่ละเว้นหรือเปลี่ยนแปลงคุณสมบัติมาตรฐานของ C เช่นฟังก์ชัน variadicไวยากรณ์ตัวชี้และแง่มุมของระบบประเภทของ C เนื่องจากถือว่าขัดขวางคุณสมบัติที่สำคัญของ C-- และความง่ายในการสร้างรหัส
ชื่อของภาษานี้เป็นมุกตลกภายในที่บ่งชี้ว่า C-- ตั้งใจให้เป็นรูปแบบย่อของ C ในทำนองเดียวกับที่ " C++ " ถูกเลือกเพื่อสื่อถึงเวอร์ชันที่ได้รับการปรับปรุงของ C (ใน C --และ++หมายถึง "ลด" และ "เพิ่ม" ตามลำดับ) [ 8 ]
การพัฒนาภาษา C-- เริ่มขึ้นในช่วงปลายทศวรรษ 1990 เนื่องจาก1การเขียนตัวสร้างโค้ด แบบกำหนด เองนั้นเป็นเรื่องท้าทาย และแบ็กเอนด์ คอมไพเลอร์ ที่มีให้สำหรับนักวิจัยในเวลานั้นมีความซับซ้อนและมีเอกสารประกอบที่ไม่ดี โครงการหลายโครงการจึงได้เขียนคอมไพเลอร์ที่สร้างโค้ด C (ตัวอย่างเช่น คอมไพเลอร์ Modula-3 ดั้งเดิม ) อย่างไรก็ตาม ภาษา C มีข้อเสียหลายประการสำหรับภาษาเชิงฟังก์ชัน: มันไม่รับประกันการเพิ่มประสิทธิภาพการเรียกแบบ tail-callหรือไม่รองรับการเก็บขยะ ที่แม่นยำ หรือการจัดการข้อยกเว้น ที่มีประสิทธิภาพ ภาษา C-- ถูกออกแบบมาให้เป็นทางเลือกที่เรียบง่ายกว่าและมีความชัดเจนกว่าภาษา C ซึ่งรองรับคุณสมบัติเหล่านี้ทั้งหมด คุณสมบัติที่ล้ำสมัยที่สุดคืออินเทอร์เฟซรันไทม์ที่อนุญาตให้เขียนตัวเก็บขยะแบบพกพา ระบบการจัดการข้อยกเว้น และคุณสมบัติรันไทม์อื่นๆ ที่ทำงานร่วมกับคอมไพเลอร์ C-- ใดๆ ก็ได้
C-- เวอร์ชันแรกได้รับการเผยแพร่ในเดือนเมษายน พ.ศ. 2541 ในรูปแบบเอกสาร MSRA [ 1 ]พร้อมกับเอกสารในเดือนมกราคม พ.ศ. 2542 เกี่ยวกับการเก็บขยะ[ 2 ]คู่มือฉบับปรับปรุงได้รับการเผยแพร่ในรูปแบบ HTML ในเดือนพฤษภาคม พ.ศ. 2542 [ 9 ]การเปลี่ยนแปลงครั้งใหญ่สองชุดที่เสนอในปี พ.ศ. 2543 โดย Norman Ramsey ("การเปลี่ยนแปลงที่เสนอ") และ Christian Lindig ("ไวยากรณ์ใหม่") นำไปสู่ C-- เวอร์ชัน 2 ซึ่งได้รับการสรุปในราวปี พ.ศ. 2547 และเผยแพร่อย่างเป็นทางการในปี พ.ศ. 2548 [ 3 ]
ระบบประเภท
ระบบประเภท C-- ได้รับการออกแบบมาเพื่อสะท้อนข้อจำกัดที่กำหนดโดยฮาร์ดแวร์มากกว่าข้อกำหนดที่กำหนดโดยภาษาโปรแกรมระดับสูงกว่า ค่าที่จัดเก็บในรีจิสเตอร์หรือหน่วยความจำอาจมีประเภทเดียวเท่านั้น คือบิตเวกเตอร์อย่างไรก็ตาม บิตเวกเตอร์เป็น ประเภท โพลีมอร์ฟิกที่มีความกว้างหลายขนาด เช่นบิต 8บิต32 บิตหรือ64 บิตรองรับตระกูลประเภทจุดลอยตัว 32 หรือ 64 บิตแยกต่างหาก นอกจากประเภทบิตเวกเตอร์แล้ว C-- ยังมีประเภทบูลีนboolซึ่งสามารถคำนวณได้ด้วยนิพจน์และใช้สำหรับการควบคุมการไหลของโปรแกรม แต่ไม่สามารถจัดเก็บในรีจิสเตอร์หรือหน่วยความจำได้ เช่นเดียวกับในภาษาแอสเซมบลี วินัยประเภทที่สูงกว่า เช่น ความแตกต่างระหว่างจำนวนที่มีเครื่องหมาย จำนวนที่ไม่มีเครื่องหมาย จำนวนลอยตัว และตัวชี้ จะถูกกำหนดโดยตัวดำเนินการ C-- หรือโครงสร้างทางไวยากรณ์อื่นๆ C-- ไม่มีการตรวจสอบประเภท และไม่บังคับใช้หรือตรวจสอบข้อกำหนดการเรียกใช้[ 3 ] : 28
C-- เวอร์ชัน 2 ขจัดความแตกต่างระหว่างประเภทบิตเวกเตอร์และประเภทจุดลอยตัว ประเภทเหล่านี้สามารถระบุด้วยแท็กสตริง "kind" เพื่อแยกแยะความแตกต่างระหว่างประเภทจำนวนเต็มกับทศนิยมของตัวแปร และพฤติกรรมการจัดเก็บ (ส่วนกลางหรือส่วนท้องถิ่น) ประเภทจำนวนเต็มมีประโยชน์สำหรับเป้าหมายที่มีรีจิสเตอร์แยกต่างหากสำหรับค่าจำนวนเต็มและค่าจุดลอยตัว มีการแนะนำประเภทพิเศษสำหรับพอยเตอร์และคำดั้งเดิม แม้ว่าจะถูกแมปกับบิตเวกเตอร์ที่มีความยาวขึ้นอยู่กับเป้าหมายก็ตาม[ 3 ] : 10
ตัวอย่างโค้ด
โค้ด C-- ต่อไปนี้คำนวณผลรวมและผลคูณของจำนวนเต็ม 1 ถึงn [ 10 ] ( โดยรับ nเป็นอาร์กิวเมนต์) โค้ดนี้แสดงให้เห็นคุณลักษณะของภาษา 2 ประการ:
- ขั้นตอนการทำงานอาจให้ผลลัพธ์ได้หลายรายการ
- การเรียกซ้ำแบบหาง (Tail recursion) จะถูกร้องขออย่างชัดเจนด้วยคีย์เวิร์ด "jump"
/* การเรียกซ้ำแบบหาง */ ส่งออกsp ; sp ( bits32 n ) { กระโดดsp_help ( n , 1 , 1 ); }sp_help ( bits32 n , bits32 s , bits32 p ) { if n == 1 { return ( s , p ); } else { jump sp_help ( n - 1 , s + n , p * n ); } }การนำไปใช้
หน้าข้อมูลจำเพาะของ C-- แสดงรายการการใช้งาน C-- เพียงไม่กี่รายการ คอมไพเลอร์ที่ "ได้รับการพัฒนาอย่างต่อเนื่องมากที่สุด" คือ Quick C-- ซึ่งถูกยกเลิกในปี 2013 [ 11 ]
ฮัสเคลล์
นักพัฒนา C-- บางคน รวมถึง Simon Peyton Jones, João Dias และ Norman Ramsey ทำงานหรือเคยทำงานเกี่ยวกับ GHC ซึ่งการพัฒนาของ GHC นำไปสู่ส่วนขยายในภาษา C-- ก่อให้เกิด ภาษาถิ่น Cmmซึ่งใช้พรีโปรเซสเซอร์ Cเพื่อความสะดวกในการใช้งาน[ 4 ] [ 12 ]
แบ็กเอนด์ของ GHC มีหน้าที่ในการแปลง C-- ให้เป็นโค้ดที่สามารถเรียกใช้งานได้ต่อไป โดยใช้LLVM IR, C ที่ทำงานช้า หรือโดยตรงผ่านแบ็กเอนด์เนทีฟในตัว[ 13 ] [ 14 ] [ 15 ]แม้ว่าเจตนาเดิมจะเป็นไปในทางตรงกันข้าม แต่ GHC ก็ดำเนินการเพิ่มประสิทธิภาพทั่วไปหลายอย่างกับ C-- เช่นเดียวกับ IR ของคอมไพเลอร์อื่นๆ การแสดงผล C-- สามารถดัมพ์เพื่อการดีบักได้[ 16 ]การเพิ่มประสิทธิภาพเฉพาะเป้าหมายจะดำเนินการในภายหลังโดยแบ็กเอนด์
ระบบประมวลผล
ณ ปี 2018 ระบบประมวลผลส่วนใหญ่ไม่ได้มีการบำรุงรักษา และไม่มีการเผยแพร่ซอร์สโค้ด
- Quick C--คือคอมไพเลอร์ที่พัฒนาโดยทีม Quick C-- มันคอมไพล์โค้ด C-- เวอร์ชัน 2 ไปเป็นรหัสเครื่องสำหรับ Intel x86 Linux การคอมไพล์เป็นรหัสเครื่องสำหรับแพลตฟอร์มอื่นๆ นั้นมีให้ใช้งานในฐานะฟีเจอร์ทดลอง ก่อนหน้านี้ Quick C-- ถูกพัฒนาควบคู่ไปกับการวิวัฒนาการของข้อกำหนดภาษา C-- แต่โครงการถูกเก็บถาวรในปี 2019 บน GitHub และการพัฒนาได้หยุดลงแล้ว อย่างไรก็ตาม ซอร์สโค้ดยังคงมีให้ใช้งานได้ที่นั่น
- cmcเป็นคอมไพเลอร์ C-- ที่เขียนด้วยภาษาโปรแกรม ML โดย Fermin Reig โดยจะสร้างรหัสเครื่องสำหรับสถาปัตยกรรม Alpha, Sparc และ x86 [ 17 ]
- Trampoline C-- Compilerเป็นตัวแปลงโค้ด C-- เป็นโค้ด C ที่พัฒนาโดย Sergei Egorov ในเดือนพฤษภาคม 1999 มันแปลงโค้ด C-- ให้เป็นโค้ด C เพื่อให้สามารถคอมไพล์ได้โดยใช้คอมไพเลอร์ C มาตรฐาน
- คอมไพเลอร์ C-- ของสถาบันบัณฑิตศึกษาแห่งรัฐโอเรกอน (OGI C-- Compiler) เป็นคอมไพเลอร์ C-- ต้นแบบรุ่นแรกสุด พัฒนาขึ้นในปี 1997 โดยใช้ภาษาโปรแกรม ML การบำรุงรักษา OGI C-- Compiler ได้ยุติลงเมื่อเริ่มการพัฒนา Quick C--
ดูเพิ่มเติม
ลิงก์ภายนอก
- คลังเก็บข้อมูลเว็บไซต์ทางการเก่า (cminusminus.org)
- คลังโค้ด Quick C (ตัวอย่างการใช้งาน)
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ซี--
C-- (โดยทั่วไปเขียนโดยใช้ เครื่องหมายยัติภังค์และลบ แต่ออกเสียงว่า ซี ลบ ลบ ) เป็น ภาษาโปรแกรม ที่คล้ายกับภาษา C ซึ่งออกแบบมาเพื่อให้ คอมไพเลอร์ สำหรับ ภาษาโปรแกรมระดับสูง...
ออกแบบ
C-- เป็น " ภาษาแอสเซมบลี แบบพกพา " [ 6 ] ซึ่งออกแบบมาเพื่ออำนวยความสะดวกในการใช้งานคอมไพเลอร์ที่สร้าง รหัสเครื่อง คุณภาพ สูง [ 7 ] โดยมอบหมาย การสร้างรหัส ระดับต่ำและ การเพิ่มประสิทธิภาพโปรแกรม ให้กับคอมไพเลอร์ C-- ไวยากรณ์ ของภาษายืมมาจาก C อย่างมาก...
ระบบประเภท
ระบบประเภท C-- ได้รับการออกแบบมาเพื่อสะท้อนข้อจำกัดที่กำหนดโดยฮาร์ดแวร์มากกว่าข้อกำหนดที่กำหนดโดยภาษาโปรแกรมระดับสูงกว่า ค่าที่จัดเก็บในรีจิสเตอร์หรือหน่วยความจำอาจมีประเภทเดียวเท่านั้น คือ บิตเวกเตอร์ อย่างไรก็ตาม บิตเวกเตอร์เป็น ประเภท โพลีมอร์ฟิก...
ตัวอย่างโค้ด
โค้ด C-- ต่อไปนี้คำนวณผลรวมและผลคูณของจำนวนเต็ม 1 ถึง n [ 10 ] ( โดยรับ n เป็นอาร์กิวเมนต์) โค้ดนี้แสดงให้เห็นคุณลักษณะของภาษา 2 ประการ: