C预处理器作为语言创建工具的长度/限制是多少?我在哪里可以了解更多相关信息?

Wes*_*n C 6 c c++ language-design c-preprocessor

在他的常见问题解答中,Bjarne Stroustrup说:

为了构建[Cfront,第一个C++编译器],我首先使用C来编写"C with Classes"-to-C预处理器."C with Classes"是C方言,成为C++的直接祖先......然后我在"C with Classes"中编写了Cfront的第一个版本.

当我读到这篇文章时,它引起了我对C预处理器的兴趣.我已经看到它的宏功能适合于简化常用表达式,但没有想到它能够在我想要将类带到C的级别上显着添加语法和语义.

所以现在我有些疑问:

  1. 是否还有其他一些从C语言引导语言的方法?

  2. Stroustrup原创作品的来源是否随处可见?

  3. 我在哪里可以了解更多关于利用这种技术的具体细节?

  4. 这种方法的长度/限制是多少?比方说,可以创建一组预处理器宏,让某人写一些显着的Lisp/Scheme之类的东西吗?

小智 12

请注意,Stroustrup并没有说他使用C预处理器(cpp)来创建C With Classes - 他没有.他使用C编写了自己的预处理器.Cfront是一个真正的编译器而不是预处理器.事实上,C预处理器非常不适合语言开发,因为它没有任何解析能力.

  • 解析能力很少.宏参数列表需要一些处理才能提升到解析级别.要处理`FOO((x,y,z),a,b,"我,我自己和我")`它必须做括号深度. (2认同)

Dav*_*ley 5

C 预处理器不是您要找的。它不能像 Cfront 那样添加语法和语义。

Cfront 是一个实际的编译器,它将 C 和类(后来的 C++)翻译成 C。它只是一个预处理器,因为它在 C 编译器之前运行。我曾经使用一个名为 f2c 的程序将 FORTRAN 77 代码转换为 C 代码。它的工作原理相同。

有像 Common Lisp 这样的语言具有足够的宏能力来添加新的语法和语义,还有像 Forth 这样的语言,其系统足够灵活以适应变化,但这不适用于大多数语言。


Jer*_*myP 5

对于您可以使用C预处理程序创建的“语言”这种怪异形式的示例,请查看以下头文件:

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

它来自史蒂夫·伯恩(Steve Bourne)编写的原始Unix shell的源代码,旨在将C变成类似于Algol的语言。这是使用一段代码时的示例:

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

看起来有点奇怪,但仍然是C。它看起来像是另一种语言,但是由于它是在预处理器中实现的,因此没有语法支持,例如

WHILE foo
DO
    SWITCH
    ....
    ENDSW
OD
Run Code Online (Sandbox Code Playgroud)

都很好并且可以很好地编译,但是也可以

WHILE foo
DO
    SWITCH
    ....
    OD
ENDSW
Run Code Online (Sandbox Code Playgroud)


Cla*_*ges 5

正如其他人提到的,C++ 不是使用 C 预处理器 (CPP) 创建的。

也就是说,你可以用 CPP 和递归做一些疯狂的事情;我很确定它是图灵完备的。我将要链接的库使用了很多丑陋的技巧来获得有趣的行为。尽管您可以在上面构建一种优雅,但许多人可能会认为它是Turing Tarpit

对于这个东西的更温和的介绍,请尝试Cloak

要深入了解,请查看

  • Boost—— “跨平台”,但更丑陋;流行的 C++ 库的一部分
  • Chaos —— Boost-pp 的后续版本,但仅支持 C99 兼容工具,因此更优雅
  • Order——据我所知,一种类似 Lisp 的语言,受到 Chaos 的启发,基于纯 CPP 构建

例如,使用 Order 或 Chaos,您可以用纯 CPP 编写递归斐波那契序列生成器。