Каковы длины/пределы C препроцессор как инструмент создания языка? Где я могу узнать больше о них?

В его FAQ говорит Bjarne Stroustrup:

Для создания [Cfront, первый компилятор C++], я сначала использовал C для записи "C с Классами"-to-C препроцессор. "C с Классами" был диалект C, который стал непосредственным предком к C++... Я затем записал первую версию Cfront в "C с Классами".

Когда я считал это, это возбудило мой интерес в препроцессоре C. Я рассматривал его макро-возможности как подходящие для упрощения общих выражений, но не думал о его способности значительно добавить к синтаксису и семантике на уровне, что я предполагаю приносить классы к C, взял.

Таким образом, теперь у меня есть некоторые вопросы на моем уме:

  1. Есть ли другие примеры этого подхода к начальной загрузке языка прочь C?

  2. Источник к исходной работе Stroustrup, доступной где-нибудь?

  3. Где я мог узнать больше о специфических особенностях использования этой техники?

  4. Каковы длины/пределы того подхода? Можно было, скажем, создать ряд макросов препроцессора, как которые позволяют кому-то значительно записать в чем-то Lisp/схему?

6
задан Brian Tompsett - 汤莱恩 24 February 2016 в 12:01
поделиться

5 ответов

Для примера чудовищности «языка», который вы можете создать с помощью препроцессора C, посмотрите этот заголовочный файл:

http://minnie.tuhs.org/cgi-bin/utree .pl? file = V7 / usr / src / cmd / sh / mac.h

Он взят из исходного кода исходной оболочки Unix, написанной Стивом Борном, и его цель - превратить C в язык, подобный Алголу. Вот пример того, как выглядит фрагмент кода при его использовании:

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/args .c

Это выглядит странно, но это все же C. Он может выглядеть как другой язык, но поскольку он реализован в препроцессоре, для него нет синтаксической поддержки, например

WHILE foo
DO
    SWITCH
    ....
    ENDSW
OD

все очень хорошо и хорошо компилируется, но также и

WHILE foo
DO
    SWITCH
    ....
    OD
ENDSW
5
ответ дан 8 December 2019 в 03:52
поделиться

Препроцессор C - это не то, что вы ищете. Он не может добавить синтаксис и семантику, как это сделал Cfront.

Cfront был настоящим компилятором, который переводил C с классами, позже C++, в C. Он был препроцессором только в том смысле, что запускался перед компилятором C. Однажды я использовал программу под названием f2c для перевода кода FORTRAN 77 в код Си. Она работала по тому же принципу.

Есть языки вроде Common Lisp с достаточным количеством макросов для добавления нового синтаксиса и семантики, и языки вроде Forth, где система достаточно гибкая, чтобы приспособиться к изменениям, но для большинства языков это не подходит.

4
ответ дан 8 December 2019 в 03:52
поделиться

Я думаю, что Objective-C начинался таким же образом. Это был препроцессор, который построил некоторый код C, который затем был передан компилятору C. Но это не был препроцессор C в смысле #define FOO , он выполнялся как дополнительный шаг до или после стандартного препроцессора C. Результат любого количества шагов препроцессора может быть отправлен компилятору C.

2
ответ дан 8 December 2019 в 03:52
поделиться

Обратите внимание, что Струструп не говорит, что он использовал препроцессор C (cpp) для создания C With Classes - он этого не делал. Он написал свой собственный препроцессор, используя C. А Cfront был настоящим компилятором, а не препроцессором вообще. Препроцессор C на самом деле глубоко непригоден для разработки языка, поскольку он не обладает никакими способностями к разбору.

12
ответ дан 8 December 2019 в 03:52
поделиться

Похоже, что его препроцессор "C с классами" для C был не тем же самым, что и стандартный препроцессор C, поскольку он конкретно говорит о написании этого препроцессора сам.

Препроцессор C очень ограничен. Его можно использовать для сокращения общих выражений, но это все. Когда вы пытаетесь определить с его помощью новые языковые конструкции, он быстро становится более громоздким и хрупким.

1
ответ дан 8 December 2019 в 03:52
поделиться