Nguồn gốc của Bộ tiền xử lý C là gì?


30

Bộ tiền xử lý C được gắn vào C, nhưng nó có cú pháp hoàn toàn khác với ngôn ngữ chính:

  • khoảng trắng có ý nghĩa cú pháp (cuối dòng kết thúc một câu lệnh, khoảng trống sau khi macro xác định bắt đầu danh sách thay thế)

  • khối dựa trên từ khóa thay vì khối giằng, elifthay vì khốielse if

  • định nghĩa dựa trên từ khóa thay vì khai báo-phản ánh-sử dụng, không =cho định nghĩa giá trị

  • gợi ý về cú pháp chuỗi thay thế ( #include <>vs #include "")

  • đánh giá lười biếng (của C, rõ ràng; nhưng 6.10.3.1 có thể được đọc là ngụ ý một thứ tự cụ thể của việc mở rộng vĩ mô, ở một vài nơi quan trọng)

Nó thực sự không giống C chút nào! Về mặt kỹ thuật, đây ngôn ngữ riêng của nó, nhưng nó luôn được sử dụng như một phần gần như không thể tách rời của C và có vẻ rất lạ là nó sẽ không tích hợp với nó về mặt cú pháp.

Wikipedia không nói về lịch sử của nó; Kho lưu trữ mẫu Portland cung cấp cho nó một đề cập vượt qua , nhưng không đi sâu vào chi tiết ngoài thực tế là nó được thiết kế bởi những người khác so với phần còn lại của trang web C. Dennis Ritchie với lịch sử của C có thể đã có câu trả lời, nhưng rất tiếc là không còn tồn tại

Như một công cụ vĩ mô, nó rõ ràng là có ngữ nghĩa rất khác với ngôn ngữ thời gian chạy, mà có thể giải thích một số khác biệt, nhưng không phải là khía cạnh thiết kế trực quan (nó cũng không rõ ràng để mắt hiện đại cho dù đó ban đầu được dự định như là khả năng của các loại của niềm vui mà nó hệ thống thay thế cho phép, hoặc liệu đó có phải là "chỉ" một cách nhanh chóng cho các chức năng nội tuyến trong một thời gian trước khi tối ưu hóa mạnh mẽ). Cảm giác giống như một cái gì đó gần với những gì cuối cùng đã trở thành các mẫu C ++ sẽ là một sự tiến hóa hợp lý hơn đối với các macro, nếu ngữ nghĩa giống như C thực sự là điểm khởi đầu, nhưng có ít bằng chứng cụ thể hơn về cú pháp.

Chúng ta có bất kỳ ghi chép về lý do tại sao nó được thiết kế theo cách này, hoặc những ảnh hưởng của người sáng tạo là gì?



@Mike omg cảm ơn bạn Tôi thực sự nghĩ rằng nội dung trang web đã bị mất mãi mãi vì nó không có mục có thể duyệt trong kho lưu trữ.
Leushenko

Câu trả lời:


17

Từ http://www.jslint.com/chistory.html ("Sự phát triển của ngôn ngữ C" của Dennis M. Ritchie):

Nhiều thay đổi khác xảy ra vào khoảng năm 1972-3, nhưng quan trọng nhất là sự ra đời của bộ tiền xử lý, một phần do sự thúc giục của Alan Snyder [Snyder 74], nhưng cũng công nhận tiện ích của các cơ chế bao gồm tệp có sẵn trong BCPL và PL / I. Phiên bản gốc của nó cực kỳ đơn giản và chỉ được cung cấp các tệp và thay thế chuỗi đơn giản: #include và #define của các macro không tham số. Ngay sau đó, nó đã được mở rộng, chủ yếu bởi Mike Lesk và sau đó là John Reiser, để kết hợp các macro với các đối số và biên dịch có điều kiện. Bộ tiền xử lý ban đầu được coi là một công cụ bổ trợ tùy chọn cho chính ngôn ngữ. Thật vậy, trong một số năm, nó thậm chí không được gọi trừ khi chương trình nguồn chứa tín hiệu đặc biệt ngay từ đầu. Thái độ này vẫn tồn tại và giải thích cả sự tích hợp không hoàn chỉnh của cú pháp của bộ tiền xử lý với phần còn lại của ngôn ngữ và sự thiếu chính xác của mô tả của nó trong hướng dẫn tham khảo sớm.

Nó xuất hiện từ tài khoản trong phần 4 của tài liệu tham khảo [Snyder 74] được liên kết trong đoạn trích dẫn ở trên rằng Alan Snyder đã làm việc trên một trình biên dịch C (ngày nay có thể nói là "retargetable"). Có lẽ đây là động lực để yêu cầu một bộ tiền xử lý.

Tuy nhiên, tôi không thể tìm thấy bất kỳ chi tiết bổ sung nào trên thiết kế của bộ tiền xử lý C, như một ngôn ngữ.


1
Lưu ý rằng Snyder đã đến Bell Labs từ MIT, nơi trình biên dịch MIDAS có các câu lệnh DEFINE, IFDEF và IFNDEF. Sự trùng hợp?
Lars Brinkhoff

0

Tôi chỉ có thể nói thêm rằng các ngôn ngữ lắp ráp có bộ xử lý tiền biên dịch mã macro trông rất giống với CPP.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.