在 C ++编程语言(第4版),§15.1中,Stroustrup指出:
文件是传统单位 存储(在文件系统中)和传统的编译单元。有些系统没有 将C ++程序作为文件集存储,编译和呈现给程序员。
可悲的是,他没有提供进一步的信息。您是否知道此类系统的任何示例?
修改
我的意思是,如果您知道任何实际 免费,商业,开源或任何 C ++实现,它们不会像我们习惯的那样处理文件。
我想知道:为什么这个系统存在?重点是什么?这种设计理念有哪些优势?有什么缺点?
答案 0 :(得分:5)
IIRC,在20世纪80年代IBM Visual Age C ++将程序源代码(或者可能是其AST的忠实表示)存储在某个专有数据库中。 (据传,当时头文件也位于某个数据库中)。
目前的C ++编译器通常能够从生成的文件中获取源代码,甚至是某些管道。例如,在我的Linux上,我可以有一个程序mygenerator
在其 stdout 上生成一些C ++代码,并调用GCC编译器:
mygenerator | g++ -x c++ /dev/stdin -Wall -O -o myprogram
但是,今天,大多数编译器通常都是从某些文件系统编译源文件和头文件。请注意,optimizing compiler在编译中花费的时间比在磁盘IO中花费的时间多得多,并且您可以使用一些tmpfs文件系统,因此在编译C ++代码时,文件读取和写入时间可以忽略不计(甚至解析通常也是如此)比优化和代码生成更快。
所以我知道2015年没有使用C ++编译器编译和优化源文件之外的源代码
实际上,生成C ++代码通常是一个好主意(我在MELT中进行,这使您可以自定义GCC),但通常会调整构建过程(例如您的Makefile
)生成然后编译一些临时C ++文件。使用当前的计算机和操作系统以及编译器(例如Linux和GCC),您甚至可以生成一些临时C ++文件,将其编译成共享对象插件,然后dlopen(3)。
将源代码存储在比文件更好的内容中的可能原因-e.g.一些数据库 - 将是一个增量编译器,如果它是上一次编译的唯一修改,它将只重新编译一个函数。在实践中,这很难在现有的编译器中实现(在GCC社区中已经讨论过,并且已经进行了原型分类,但是没有任何稳定的结果)。但是C ++或C不是这种方法的最佳语言(Common Lisp更好,SBCL能够在内存中逐步编译和优化),特别是因为它的预处理器。
BTW,tinycc能够编译内存中某些const char*
字符串内的C代码,但生成的机器代码的性能很差(因为tcc
没有做任何形式严重优化,目前的处理器需要这么多)。
另请注意,使用link time optimizations(例如,编译并使用g++ -flto -O2
链接)编译器会保留某种形式的AST(实际上是Gimple表示{ {3}})在目标文件中。
答案 1 :(得分:1)
C ++源代码可以以各种方式存储在数据库中。