我不知道有任何自我改进的编译器,但是我再也不是一个编译人员了。
那里有任何自我改进的编译器吗?
请注意,我说的是一个能够改进自身的编译器 - 而不是一个改进编译代码的编译器。
任何指示赞赏!
旁注:如果您想知道我要问的原因,请查看this post。即使我同意大多数论点,我也不太确定以下内容:
我们有可以改进的计划 他们的代码现在没有人工输入 - 他们被称为编译器。
...因此我的问题。
答案 0 :(得分:13)
虽然编译器确实可以在没有人为干扰的情况下改进代码,但是,“编译器自我改进”的说法相当可疑。编译器所做的这些“改进”仅仅基于人类编写的一套规则(任何人都可以使用机器人?)。所以你的问题的答案是:否。
在旁注中,如果有任何类似自我改进的编译器,我们就知道......首先,这将改善语言,然后是自己的代码,最后,它会修改其代码成为病毒,让所有的开发者都使用它...然后我们终于拥有了那些经典的计算机与人类之间最后希望为人类的东西......所以......不。
答案 1 :(得分:8)
MilepostGCC是一个MachineLearning编译器,它可以随着时间的推移自我改进,因为它能够随着时间的推移变得“更好”。更简单的iterative compilation方法几乎可以改进任何编译器。
答案 2 :(得分:4)
25年的编程,我从未听说过这样的事情(除非你在谈论自动下载软件更新的编译器!)。
答案 3 :(得分:4)
据我所知,尚未实际实施,但是,理论就在那里:
答案 4 :(得分:2)
根据定义,自我改进编译器必须具有自修改代码。如果你环顾四周,你可以找到人们这样做的例子(自我修改代码)。但是,这种情况非常罕见 - 特别是对于像编译器那样大而复杂的项目。并且,由于非常好的理由,保证正确的功能是非常困难的(即几乎不可能),这种情况并不常见。许多认为自己很聪明的程序员(特别是汇编程序员)在某种程度上可以解决这个问题。实际上 聪明的人大多离开了这个阶段。 ;)
答案 5 :(得分:1)
在某些情况下,C编译器会在没有任何人工输入的情况下运行多次,每次都会获得“更好”的编译器。 幸运的是(或者不幸的是,从另一个角度来看)这个过程在几个步骤后进入平台 - 进一步的迭代生成与最后一个完全相同的编译器可执行文件。
我们拥有所有GCC源代码,但此机器上唯一可用的C编译器不是GCC。 唉,GCC的一些部分使用只能用GCC构建的“扩展”。 幸运的是,这台机器确实有一个功能“make”可执行文件,以及一些随机的专有C编译器。 人类使用GCC源转到目录,并手动键入“make”。
make实用程序找到MAKEFILE,它指示它运行(专有)C编译器来编译GCC,并使用“-D”选项,以便使用“扩展”的GCC的所有部分都是# ifdef'ed out。 (这些代码可能是编译某些程序所必需的,但不是GCC的下一阶段。)。这产生了一个非常有限的截断二进制可执行文件,它几乎没有足够的功能来编译GCC(并且编写GCC代码的人小心地避免使用这个减少的二进制文件不支持的功能)。
make实用程序使用适当的选项运行该二进制可执行文件,以便编译GCC的所有部分,从而产生一个功能齐全(但相对较慢)的二进制可执行文件。
< / LI>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版本的推测性想法。虽然我不会说这没有任何人类输入,但趋势似乎是编译器每次按键都会“越来越”工作。
答案 6 :(得分:0)
我不确定它是否合格,但Java HotSpot编译器使用统计信息在运行时改进了代码。
但是在编译时?那个编译器将如何知道什么是缺陷而哪些不是?什么衡量善良?
有plenty of examples人使用遗传技术将算法相互对比,以提出“更好”的解决方案。但这些通常是众所周知的具有指标的问题。
那么我们可以在编译时应用哪些指标?编译代码的最小大小,周期复杂度或其他?哪些在运行时有意义?
答案 7 :(得分:0)
嗯,有JIT(及时)技术。有人可能会争辩说,带有一些JIT优化的编译器可能会重新调整自身,以便在编译它的程序时更有效率。