ต้นกำเนิดของ C Preprocessor คืออะไร


30

ตัวประมวลผลล่วงหน้า C เชื่อมต่อกับ C แต่มีไวยากรณ์ที่แตกต่างอย่างสิ้นเชิงจากภาษาหลัก:

  • ช่องว่างที่มีความสำคัญทางไวยากรณ์ (จุดสิ้นสุดของบรรทัดยกเลิกคำสั่งช่องว่างหลังจากแมโครกำหนดจุดเริ่มต้นของรายการการแทนที่)

  • บล็อกที่ใช้คำหลักแทนที่จะเป็นบล็อกที่มีเครื่องหมายค้ำยันelifแทนelse if

  • คำจำกัดความที่นำโดยคำหลักแทนการประกาศ - สะท้อน - ใช้ไม่มี=สำหรับการกำหนดค่า

  • คำแนะนำของไวยากรณ์สตริงทางเลือก ( #include <>vs #include "")

  • การประเมินผลที่ขี้เกียจ (จาก C, ชัด ๆ แต่6.10.3.1สามารถอ่านได้โดยอ้างถึงคำสั่งเฉพาะของการขยายตัวของแมโครเช่นกันในบางแห่งที่มีความสำคัญ)

มันดูไม่เหมือน C เลย! ในทางเทคนิคแล้วมันเป็นภาษาของตัวเอง แต่มันถูกใช้เป็นส่วนสำคัญเกือบทั้งหมดของ C และดูเหมือนว่าแปลกมากที่มันจะไม่รวมเข้ากับ syntactically

Wikipedia ไม่ได้พูดถึงประวัติของมัน Portland Pattern Repository ได้กล่าวถึงการผ่านแต่ไม่ได้มีรายละเอียดนอกเหนือจากข้อเท็จจริงที่ว่ามันถูกออกแบบโดยคนอื่นนอกเหนือจากส่วนที่เหลือของเว็บไซต์ C. Dennis Ritchie ที่มีประวัติของ C อาจมีคำตอบ แต่น่าเสียดายที่ไม่มี ใช้ได้อีกต่อไป

ในฐานะที่เป็นเครื่องมือมาโครก็เห็นได้ชัดว่ามีความหมายแตกต่างกันมากจากภาษารันไทม์ซึ่งจะอธิบายบางอย่างที่แตกต่างกัน แต่ไม่ได้ด้านการออกแบบภาพ (ก็ยังไม่มีความชัดเจนให้กับดวงตาที่ทันสมัยไม่ว่าจะเดิมทีตั้งใจว่าเป็นความสามารถของชนิดของความสนุกสนานว่า ระบบการเปลี่ยนช่วยให้หรือว่าเป็น "เพียงแค่" วิธีที่สะดวกในการฟังก์ชั่นแบบอินไลน์ในเวลาก่อนที่จะเพิ่มประสิทธิภาพที่มีประสิทธิภาพ) มันให้ความรู้สึกเหมือนกับว่าสิ่งที่ใกล้เคียงกับสิ่งที่ในที่สุดกลายเป็นเทมเพลต C ++ จะเป็นวิวัฒนาการเชิงตรรกะที่มีต่อมาโครในที่สุดถ้าซีแมนทิกส์เหมือน C เป็นจุดเริ่มต้นจริง ๆ แต่มีหลักฐานที่เป็นรูปธรรมน้อยกว่าเรื่องนี้

เรามีบันทึกใด ๆ หรือไม่ว่าทำไมมันถึงถูกออกแบบมาด้วยวิธีนี้หรืออิทธิพลของผู้สร้างคืออะไร?



@ ไมค์ขอบคุณมากฉันคิดว่าเนื้อหาเว็บไซต์หายไปตลอดกาลเนื่องจากไม่มีรายการที่สามารถเรียกดูได้ในที่เก็บถาวร
Leushenko

คำตอบ:


17

จากhttp://www.jslint.com/chistory.html ("การพัฒนาภาษา C" โดย Dennis M. Ritchie):

การเปลี่ยนแปลงอื่น ๆ อีกมากมายเกิดขึ้นในช่วงปี 1972-3 แต่สิ่งที่สำคัญที่สุดคือการนำตัวประมวลผลล่วงหน้ามาใช้ส่วนหนึ่งเป็นการกระตุ้นของอลันสไนเดอร์แต่ยังรับรู้ถึงประโยชน์ของกลไกการรวมไฟล์ที่มีอยู่ใน BCPL และ PL / I เวอร์ชันดั้งเดิมนั้นง่ายมากและมีเพียงไฟล์และการแทนที่สตริงอย่างง่าย: #include และ #define ของมาโครแบบไม่มีพารามิเตอร์ หลังจากนั้นไม่นานมันก็ขยายออกไปส่วนใหญ่โดย Mike Lesk แล้วโดย John Reiser เพื่อรวมมาโครกับอาร์กิวเมนต์และการคอมไพล์ตามเงื่อนไข ตัวประมวลผลล่วงหน้าได้รับการพิจารณาว่าเป็นตัวเลือกเสริมสำหรับภาษานั้น ๆ ที่จริงแล้วเป็นเวลาหลายปีมันไม่ได้ถูกเรียกใช้แม้แต่ในกรณีที่ซอร์สโปรแกรมมีสัญญาณพิเศษเมื่อเริ่มต้น ทัศนคตินี้ยังคงอยู่และอธิบายทั้งการรวมที่ไม่สมบูรณ์ของไวยากรณ์ของตัวประมวลผลล่วงหน้ากับส่วนที่เหลือของภาษาและความไม่ชัดเจนของคำอธิบายในคู่มืออ้างอิงก่อน

มันปรากฏขึ้นจากบัญชีในส่วนที่ 4 ของการอ้างอิง [Snyder 74] ที่เชื่อมโยงในการอ้างถึงข้างต้นว่า Alan Snyder ได้ทำงานกับอุปกรณ์พกพา (วันนี้เราอาจพูดว่า บางทีนี่อาจเป็นแรงจูงใจในการขอตัวประมวลผลล่วงหน้า

ฉันไม่สามารถหารายละเอียดเพิ่มเติมใด ๆ แต่ในการออกแบบของตัวประมวลผลล่วงหน้า C เองเป็นภาษา


1
โปรดทราบว่าสไนเดอร์มาที่ Bell Labs จาก MIT ที่แอสเซมเบลอร์ MIDAS มีข้อความ DEFINE, IFDEF และ IFNDEF บังเอิญ?
Lars Brinkhoff

0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.