我不知道有任何自我改进的编译器,但我又不是一个编译器专家。
那里有任何自我改进的编译器吗?
请注意,我说的是改进自身的编译器,而不是改进其编译代码的编译器。
任何指针表示赞赏!
旁注:如果你想知道我为什么要问这个帖子。即使我同意大多数论点,我也不太确定以下几点:
我们现在有无需人工输入即可改进代码的程序——它们被称为编译器。
...因此我的问题。
我不知道有任何自我改进的编译器,但我又不是一个编译器专家。
那里有任何自我改进的编译器吗?
请注意,我说的是改进自身的编译器,而不是改进其编译代码的编译器。
任何指针表示赞赏!
旁注:如果你想知道我为什么要问这个帖子。即使我同意大多数论点,我也不太确定以下几点:
我们现在有无需人工输入即可改进代码的程序——它们被称为编译器。
...因此我的问题。
虽然编译器确实可以在没有人为干预的情况下改进代码,但是,“编译器是自我改进的”的说法是相当可疑的。编译器所做的这些“改进”仅仅是基于一组人类编写的规则(有人说是电子人吗?)。所以你的问题的答案是:不。
顺便说一句,如果有类似自我改进的编译器的东西,我们会知道……首先它会改进语言,然后是它自己的代码,最后,它会修改它的代码成为病毒并让所有开发人员使用它...然后最后我们将拥有那些经典的计算机与人类之间的最后希望-人类之类的东西...所以...不。
MilepostGCC是一个机器学习编译器,它随着时间的推移而自我改进,因为它能够改变自己,以便随着时间的推移变得“更好”。一种更简单的迭代编译方法几乎可以改进任何编译器。
25 年的编程,我从来没有听说过这样的事情(除非你在谈论自动下载软件更新的编译器!)。
据我所知,尚未实际实施,但是是的,理论就在那里:
根据定义,一个自我改进的编译器必须有自我修改的代码。如果你环顾四周,你会发现人们这样做的例子(自我修改代码)。但是,这种情况很少见——尤其是在像编译器这样大而复杂的项目上。这并不常见,因为它非常难以(即几乎不可能)保证正确的功能。许多自认为很聪明的编码员(尤其是汇编编码员)有时会玩弄这个。真正聪明的人大多会走出这个阶段。;)
在某些情况下,C 编译器会在没有任何人工输入的情况下运行多次,每次都会得到一个“更好”的编译器。幸运的是(或者不幸的是,从另一个角度来看)这个过程在几个步骤之后就会停滞不前——进一步的迭代会生成与上一个完全相同的编译器可执行文件。
我们拥有所有的 GCC 源代码,但是这台机器上唯一可用的 C 编译器不是 GCC。唉,GCC 的一部分使用只能用 GCC 构建的“扩展”。幸运的是,这台机器确实有一个功能性的“make”可执行文件,以及一些随机的专有 C 编译器。人类进入带有 GCC 源代码的目录,并手动键入“make”。
make 实用程序找到 MAKEFILE,它指示它运行(专有)C 编译器来编译 GCC,并使用“-D”选项,以便 GCC 的所有使用“扩展”的部分都被#ifdef 删除。(这些代码可能是编译某些程序所必需的,但不是 GCC 的下一阶段。)。这会产生一个非常有限的精简二进制可执行文件,它几乎没有足够的功能来编译 GCC(编写 GCC 代码的人会小心避免使用这个精简二进制不支持的功能)。
make 实用程序使用适当的选项运行该缩减的二进制可执行文件,以便编译 GCC 的所有部分,从而生成一个功能齐全(但相对较慢)的二进制可执行文件。
make 实用程序在 GCC 源代码上运行全功能二进制可执行文件,并打开所有优化选项,从而生成人们从现在开始使用的实际 GCC 可执行文件,并将其安装在适当的位置。
make 实用程序测试以确保一切正常:它从 GCC 源代码的标准位置运行 GCC 可执行文件,并打开所有优化选项。然后它将生成的二进制可执行文件与标准位置中的 GCC 可执行文件进行比较,并确认它们是相同的(可能除了不相关的时间戳)。
在人类输入“make”之后,整个过程会自动运行,每个阶段都会生成一个改进的编译器(直到它停滞不前并生成一个相同的编译器)。 http://gcc.gnu.org/wiki/Top-Level_Bootstrap和http://gcc.gnu.org/install/build.html和Compile GCC with Code Sourcery有更多细节。
我见过在这个过程中有更多阶段的其他编译器——但它们在每个或两个阶段之后都需要一些人工输入。示例:Edmund Grimley Evans 2001 的“从无到有引导一个简单的编译器” http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html 还有所有从事 GCC 的程序员所做的历史工作,他们使用以前版本的 GCC 来编译和测试他们对可能改进的 GCC 版本的推测性想法。虽然我不会说这没有任何人工输入,但趋势似乎是编译器在每次人工击键时会做越来越多的“工作”。
嗯,有JIT(及时)技术。有人可能会争辩说,具有一些 JIT 优化的编译器可能会重新调整自身以使其编译的程序更高效???
我不确定它是否符合条件,但 Java HotSpot 编译器使用统计信息在运行时改进了代码。
但是在编译时呢?该编译器如何知道有什么不足,什么没有?善良的衡量标准是什么?
有很多人使用遗传技术将算法相互竞争以提出“更好”的解决方案的例子。但这些通常是具有度量的易于理解的问题。
那么我们可以在编译时应用哪些指标呢?编译代码的最小大小、循环复杂度或其他什么?其中哪些在运行时有意义?