2015-06-18 30 views
4

C++编程语言(第4版),第15.1节,Stroustrup的规定:C++系统没有正在使用“源文件”

文件是传统的单元存储的 (在文件系统中)和传统的编译单元。有些系统不会存储,编译和向程序员提供C++程序作为一组文件。

不幸的是,他没有提供进一步的信息。你知道这样的系统的任何例子

编辑:

我的意思是,如果你知道任何实际免费,商业,开源或因为我们习惯了不与文件打交道任何 C++实现。

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

+1

'$ generator args |编译器' –

+0

@MohitJain特赦? –

+3

我们假设'generator'是一个应用程序,它可以生成一些随机程序并直接将它们流式传输到编译器,或者可以从其他库调用编译函数。程序由编译器即时生成并使用,并且不会创建可呈现给用户的真正的**源**文件。 –

回答

5

IIRC,在20世纪80年代IBM Visual Age C++在某些专有数据库中存储了程序源代码(或者其忠实代表AST)。 (据传当时头文件也位于某个数据库中)。

而当前的C++编译器通常能够从生成的文件甚至某个管道获取源代码。举例来说,在我的Linux,我可以有一个程序mygenerator标准输出产生一些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)

将源代码存储在比文件更好的东西上的可能原因 - 例如,某些数据库可能会创建一个增量式编译器,如果它是以前编译的唯一修改,那么它将仅重新编译一个函数。实际上,这在现有的编译器中很难实现(它已经在GCC社区中进行了讨论和原型分类,但没有任何稳定性出现)。但是对于这种方法来说,C++或C并不是最好的语言(Common Lisp更好,SBCL能够在内存中进行编译和优化),特别是因为它的预处理器。

BTW,tinycc能够编译C代码坐在里面的一些内存const char*字符串,但生成的机器代码的性能差(因为tcc没有做任何严重的优化,是当前处理器需要这么多) 。

还要注意,与(例如编译和链路g++ -flto -O2)编译器保持某种形式的目标文件中的AST(实际上的GCCGimple表示)的。

+1

哇,你的MELT项目真酷! –

+1

真的很棒的答案 –

1

C++源代码可以以各种方式存储在数据库中。