Яке походження препроцесора С?


30

Препроцесор C приєднаний до C, але він має зовсім інший синтаксис від основної мови:

  • синтаксично значущий пробіл (кінець рядка завершує оператор, пробіл після макросу визначає початок списку заміни)

  • Блоки на основі ключових слів замість дужок, elifзамістьelse if

  • визначення на основі ключових слів, а не декларація-відображає використання, немає =для визначення значення

  • натяки на альтернативний синтаксис рядків ( #include <>vs #include "")

  • лінива оцінка (очевидно, що C; але 6.10.3.1 може сприйматися як такий, що передбачає певний порядок розширення макросу, в кількох важливих місцях)

Це насправді зовсім не схоже на C! Технічно це є його власна мова, але він завжди був використаний в якості майже-невід'ємна частина C , і здається дуже дивним , що він не буде інтегруватися з нею синтаксично.

Вікіпедія не розповідає про свою історію; сховище Портлендського зразка дає про це згадку , але не вникає в деталі поза тим, що його розробили інші люди, крім решти веб-сайту C. Денніс Річі з історією C, мабуть, мав відповідь, але, на жаль, немає більше доступні.

Як макродвіжка, це , очевидно , має дуже різну семантику від мови виконання, який би пояснити деякі відмінності, але не візуальні аспекти дизайну (це також неясно , сучасний погляд , чи була вона спочатку передбачалися як здатний на вигляд від задоволення , що його система заміни дозволяє чи це був "просто" доцільний спосіб вбудувати функції за час до потужних оптимізаторів). Схоже, щось ближче до того, що в кінцевому підсумку стали шаблонами C ++, було б більш логічною еволюцією до макросів, якби C-подібна семантика насправді була вихідною точкою, але для цього є менш конкретні докази, ніж для синтаксису.

Чи є у нас записи про те, чому це було розроблено таким чином, чи якими були впливи творців?



@Mike omg дякую, я дійсно думав, що вміст сайту назавжди загублений, оскільки в ньому немає запису, який можна переглянути в архіві.
Левшенко

@MikeSupportsMonica Я збирався запитати, чи є у когось посилання. Спасибі.
клотт

Відповіді:


17

З http://www.jslint.com/chistory.html ("Розвиток мови С" Денніса М. Річі):

Багато інших змін відбулося приблизно в 1972-3 рр., Але найбільш важливим було введення препроцесора, частково за позивом Алана Снайдера [Снайдер 74], але також як розпізнавання корисності механізмів включення файлів, наявних у BCPL та PL / I. Його оригінальна версія була надзвичайно простою і передбачала лише включені файли та прості замінники рядків: #include та #define макросів без параметрів. Незабаром після цього його розширили, головним чином Майк Леск, а потім Джон Рейзер, щоб включити макроси з аргументами та умовною компіляцією. Препроцесор спочатку вважався факультативним доповненням до самої мови. Дійсно, кілька років його навіть не викликали, якщо вихідна програма не містила спеціального сигналу на початку. Це ставлення зберігається і пояснює як неповну інтеграцію синтаксису препроцесора з рештою мови, так і неточність його опису в посібниках раннього посилання.

З облікового запису в розділі 4 посилання [Snyder 74], згаданого в цитаті, видно, що Алан Снайдер працював над портативним компілятором C (сьогодні, можна сказати, "ретакт"). Можливо, це і було мотивацією просити препроцесора.

Я не зміг знайти жодної додаткової деталі щодо дизайну самого препроцесора С як мови.


1
Зауважте, що Снайдер прийшов до Bell Labs з MIT, де в асемблері MIDAS є заяви DEFINE, IFDEF та IFNDEF. Збіг?
Ларс Брінхофф

0

Я можу просто додати, що в мовах складання дуже часто було встановлено попередні процесори макроскладачів, які дуже схожі на CPP.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.