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的级别上显着添加语法和语义.
所以现在我有些疑问:
是否还有其他一些从C语言引导语言的方法?
Stroustrup原创作品的来源是否随处可见?
我在哪里可以了解更多关于利用这种技术的具体细节?
这种方法的长度/限制是多少?比方说,可以创建一组预处理器宏,让某人写一些显着的Lisp/Scheme之类的东西吗?
小智 12
请注意,Stroustrup并没有说他使用C预处理器(cpp)来创建C With Classes - 他没有.他使用C编写了自己的预处理器.Cfront是一个真正的编译器而不是预处理器.事实上,C预处理器非常不适合语言开发,因为它没有任何解析能力.
C 预处理器不是您要找的。它不能像 Cfront 那样添加语法和语义。
Cfront 是一个实际的编译器,它将 C 和类(后来的 C++)翻译成 C。它只是一个预处理器,因为它在 C 编译器之前运行。我曾经使用一个名为 f2c 的程序将 FORTRAN 77 代码转换为 C 代码。它的工作原理相同。
有像 Common Lisp 这样的语言具有足够的宏能力来添加新的语法和语义,还有像 Forth 这样的语言,其系统足够灵活以适应变化,但这不适用于大多数语言。
对于您可以使用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)
正如其他人提到的,C++ 不是使用 C 预处理器 (CPP) 创建的。
也就是说,你可以用 CPP 和递归做一些疯狂的事情;我很确定它是图灵完备的。我将要链接的库使用了很多丑陋的技巧来获得有趣的行为。尽管您可以在上面构建一种优雅,但许多人可能会认为它是Turing Tarpit。
对于这个东西的更温和的介绍,请尝试Cloak。
要深入了解,请查看
例如,使用 Order 或 Chaos,您可以用纯 CPP 编写递归斐波那契序列生成器。