不使用“源文件”的C ++系统

时间:2015-06-18 07:40:48

标签: c++

C ++编程语言(第4版),§15.1中,Stroustrup指出:

  

文件是传统单位   存储(在文件系统中)和传统的编译单元。有些系统没有   将C ++程序作为文件集存储,编译和呈现给程序员。

可悲的是,他没有提供进一步的信息。您是否知道此类系统的任何示例

修改

我的意思是,如果您知道任何实际 免费,商业,开源或任何 C ++实现,它们不会像我们习惯的那样处理文件。

我想知道:为什么这个系统存在?重点是什么?这种设计理念有哪些优势?有什么缺点?

2 个答案:

答案 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 ++源代码可以以各种方式存储在数据库中。