Questions tagged «compiler»

编译器是一种计算机程序,可以将以一种编程语言编写的源代码转换为另一种计算机语言。

5
如何编写一个非常基本的编译器
高级编译器喜欢gcc根据代码的编写语言(例如C,C ++等)将代码编译为机器可读文件。实际上,它们根据相应语言的库和功能来解释每个代码的含义。如果我错了纠正我。 我希望通过编写一个非常基本的编译器(可能使用C语言)来编译静态文件(例如,文本文件中的Hello World)来更好地理解编译器。我尝试了一些教程和书籍,但所有这些都是针对实际案例的。它们处理具有与相应语言相关的含义的动态代码的编译。 如何编写基本的编译器以将静态文本转换为机器可读文件? 下一步将变量引入编译器。想象一下,我们想编写一个只编译某种语言功能的编译器。 引入实用的教程和资源受到高度赞赏:-)
214 c  compiler  compilation  gcc 

10
Ken Thompson的编译器黑客仍然是威胁吗?
肯·汤普森·哈克(1984) 肯·汤普森(Ken Thompson)于1984年概述了一种破坏编译器二进制文件(和其他已编译软件,例如* nix系统上的登录脚本)的方法。我很想知道现代编译是否解决了此安全漏洞。 简短的介绍: 重新编写编译器代码以包含2个缺陷: 在编译自己的二进制文件时,编译器必须编译这些缺陷 在编译其他一些预选的代码(登录功能)时,它必须编译一些任意的后门 因此,编译器可以正常工作-编译登录脚本或类似文件时,可以创建安全后门,并且将来在编译自身的较新版本时,它仍保留以前的缺陷- 并且这些缺陷仅存在于编译器中二进制文件,因此很难检测。 问题: 我在网上找不到任何答案: 这与即时编译有什么关系? 运行诸如* nix系统上的登录名的程序之类的功能在运行时是否已编译? 这仍然是一个有效的威胁吗?或者自1984年以来在编译安全性方面的发展阻止了它成为一个重大问题? 这会影响所有语言吗? 我为什么想知道? 我在做作业时遇到了这个问题,这看起来很有趣,但是我缺乏具体了解这个问题是解决当前问题还是解决问题的背景。 参考资料 总览 一些代码
156 linux  unix  compiler  hacking 

5
为什么Java根本没有优化尾递归?
据我所读:原因是因为在继承时,要确定要实际调用的方法并不容易。 但是,为什么Java至少没有对静态方法进行尾递归优化并强制使用正确的方法来用编译器调用静态方法? 为什么Java根本不支持尾递归? 我不确定这里是否有任何困难。 关于建议的副本,如JörgW Mittag 1所述: 另一个问题是关于TCO的,这个是关于TRE的。TRE比TCO简单得多。 此外,另一个问题询问JVM对希望编译为JVM的语言实现施加哪些限制,该问题询问Java,这是不受JVM限制的一种语言,因为JVM规范可以通过以下方式更改:设计Java的人 最后,JVM中甚至没有关于TRE的限制,因为JVM确实具有方法内GOTO,这是TRE所需的全部 1 添加了格式以标注点。


6
垃圾回收如何以本地编译的语言工作?
浏览了堆栈溢出的几个答案之后,很明显,一些本机编译的语言具有垃圾回收功能。但是我不清楚这将如何工作。 我了解垃圾收集如何与解释语言一起工作。垃圾收集器将仅与解释器一起运行,并从程序的内存中删除未使用和无法访问的对象。他们俩一起跑。 但是,如何使用编译语言呢?我的理解是,一旦编译器将源代码编译为目标代码(特别是本机代码),就完成了。它的工作完成了。那么,编译后的程序又如何被垃圾回收呢? 在执行程序删除“垃圾”对象时,编译器是否以某种方式与CPU一起工作?还是编译器在编译程序的可执行文件中包括一些最小的垃圾回收器。 我相信我的后一种说法将比前一种更具有效性,这是由于从Stack Overflow的答案中摘录的: 一种这样的编程语言是埃菲尔。大多数Eiffel编译器出于可移植性原因而生成C代码。该C代码用于通过标准C编译器生成机器代码。埃菲尔实现为该已编译的代码提供GC(有时甚至是精确的GC),并且不需要VM。特别是,VisualEiffel编译器直接在完全GC支持下生成了本机x86机器代码。 最后一条语句似乎暗示编译器在最终的可执行文件中包含一些程序,该程序在运行时充当垃圾回收器。 在页面d语言的关于垃圾收集的网站这是本地编译并具有可选的垃圾收集器- -似乎也暗示了一些后台程序运行沿着原来的可执行程序来实现垃圾回收。 D是一种支持垃圾回收的系统编程语言。通常,没有必要显式释放内存。只需根据需要进行分配,垃圾收集器就会定期将所有未使用的内存返回到可用内存池。 如果方法上面提到的被使用,究竟会工作的呢?编译器是否存储一些垃圾回收程序的副本并将其粘贴到它生成的每个可执行文件中? 还是我的思维有缺陷?如果是这样,使用什么方法来实现编译语言的垃圾回收,它们将如何工作?

11
为什么软件OS是特定的?
我正在尝试确定为什么使用某些操作系统的编程语言生产的软件只能在它们上使用的技术细节。 我的理解是,二进制文件特定于某些处理器,这是因为它们了解特定于处理器的机器语言以及不同处理器之间的指令集不同。但是,操作系统的特异性来自何处?我曾经假设它是操作系统提供的API,但后来我在一本书中看到了以下图表: 操作系统-内部和设计原则第7版-W.Sallings(Pearson,2012年) 如您所见,API未表示为操作系统的一部分。 例如,如果我使用以下代码在C中构建一个简单程序: #include<stdio.h> main() { printf("Hello World"); } 编译此程序时,编译器是否在进行任何特定于OS的操作?

5
是Python解释还是编译?
这只是我在阅读有关解释和编译语言时的一个奇迹。 Ruby无疑是一种解释型语言,因为源代码在执行时由解释器处理。 相反,C是一种编译语言,因为必须先根据机器编译源代码,然后再执行。这样可以更快地执行。 现在开始使用Python: 导入时,Python代码(somefile.py)在同一目录中创建文件(somefile.pyc)。让我们说导入是在python shell或django模块中完成的。导入后,我稍稍更改了代码,然后再次执行导入的功能,以发现它仍在运行旧代码。这表明* .pyc文件是类似于编译C文件后创建的可执行文件的已编译python文件,尽管我无法直接执行* .pyc文件。 当直接执行python文件(somefile.py)(./somefile.py或python somefile.py)时,不会创建.pyc文件,并且按指示解释行为的方式执行代码。 这些建议每次在新过程中导入python代码时都会编译python代码,以创建.pyc,而直接执行时会对其进行解释。 那么我应该将其视为哪种类型的语言?解释还是编译?以及它的效率与解释和编译语言相比如何? 根据Wiki的“ 解释语言”页面,它被列为编译为虚拟机代码的语言,这是什么意思?

5
为什么C编译器这么少?
C是世界上使用最广泛的语言之一。它占现有代码的很大一部分,并继续用于大量的新代码。它受到用户的喜爱,它的广泛移植使能够运行C对许多平台的非正式定义而言,并因其是一种具有相对简洁功能的“小型”语言而受到其粉丝的称赞。 那么所有的编译器在哪里? 在桌面上,(实际上)有两个:GCC和Clang。考虑了几秒钟,您可能会记得英特尔也存在。还有很多其他的东西,对于普通人来说实在太晦涩难懂了,几乎没有普遍地去支持最新的语言版本(甚至常常是定义明确的语言子集,只是“子集”)。此列表的一半成员是历史脚注;其余大多数都是非常专业的,实际上还没有实现完整的语言。实际上很少有开源的。 Scheme和Forth-其他深受其迷们喜爱的小语言-可能比实际用户拥有更多的编译器。甚至像SML之类的东西,也要比C有更多“严肃”的实现方式可供选择。而针对验证的新的(未完成的)C编译器的发布实际上看到了一些相当负面的回应,而资深的实现则努力争取足够的贡献者甚至赶上C99。 为什么?实现C这么难吗?不是C ++。用户是否只是对其所属的复杂度组有一个非常歪斜的想法(即实际上它比Scheme更接近C ++)?


19
编译器为何如此可靠?
我们每天都在使用编译器,就像它们的正确性一样,但是编译器也是程序,并且可能包含错误。我一直想知道这种可靠的鲁棒性。您是否曾经在编译器中遇到错误?这是什么,您如何意识到问题出在编译器本身? ...怎么做他们让编译器非常可靠?

10
仅将C ++编译器用于函数重载是不好的做法吗?
因此,我正在针对某个处理器使用C进行软件设计。该工具包包括编译C和C ++的功能。对于我正在做的事情,在这种环境下没有可用的动态内存分配,并且该程序总体上非常简单。更不用说该设备几乎没有处理器能力或资源。实际上,根本不需要使用任何C ++。 话虽这么说,我在一些地方进行函数重载(C ++的功能)。我需要发送几种不同类型的数据,并且不想使用printf带有某种%s(或其他任何一种)参数的样式格式。我见过有些人无法使用C ++编译器执行此操作printf,但就我而言,可以使用C ++支持。 现在,我确定可能会遇到一个问题,即为什么我需要重载一个函数。因此,我将尝试立即回答。我需要从串行端口传输不同类型的数据,所以我有一些重载,可以传输以下数据类型: unsigned char* const char* unsigned char const char 我只希望没有一种方法可以处理所有这些事情。当我呼吁我只是希望它传递出串行端口的功能,我没有很多资源的,所以我不想做几乎没有任何事情,但我的传送。 有人看到了我的程序,问我:“为什么要使用CPP文件?” 所以,这是我唯一的原因。那是不好的做法吗? 更新资料 我想回答一些问题: 解决您的困境的客观答案取决于: 如果使用C ++,可执行文件的大小是否会显着增加。 截至目前,可执行文件的大小占用了4.0%的程序内存(5248字节)和8.3%的数据内存(342字节)。也就是说,为C ++编译...我不知道对于C会是什么样子,因为我没有使用过C编译器。我确实知道该程序不会再增长了,所以对于资源的有限程度,我会说我还可以... 如果使用C ++,是否会对性能产生明显的负面影响。 好吧,如果有的话,我什么都没注意到...但是那又可能是为什么我问这个问题的原因,因为我不太了解。 代码是否可以在只有C编译器可用的其他平台上重用。 我知道,对此的答案肯定不是。实际上,我们正在考虑使用其他处理器,但仅考虑使用功能更强大的基于ARM的处理器(事实上,我所知道的所有处理器都具有C ++编译器工具链)。

14
我们能否就解释代码和编译代码的性能做出一般性陈述?
我正在比较两种技术,以便提出建议,公司应该使用其中的一种。技术A的代码被解释,而技术B的代码被编译为机器代码。在我的比较中,我指出技术B一般而言会具有更好的性能,因为它没有解释过程的额外开销。我还指出,由于程序可以用多种方式编写,因此用技术A编写的程序仍然有可能胜过使用技术B编写的程序。 当我将此报告提交审核时,审核员表示我没有提供清楚的理由说明为什么解释流程的总费用通常会足够大,以至于我们可以得出结论,技术B的性能会更好。 所以我的问题是,我们能否谈谈编译/解释技术的性能?如果我们可以说编译的速度通常快于解释的速度,那么我该如何说服审阅者呢?


9
英特尔编译器真的比微软编译器好吗?[关闭]
多年前,当我发现英特尔销售与Visual Studio兼容的编译器时,我感到很惊讶。我特别针对C / C ++和出色的诊断工具进行了尝试。但是,代码根本就没有那么多计算量来注意到差异。唯一的印象是:英特尔真的为我真正做到了,哇,令人难以置信的纳秒分辨率的出色工具。但是审判结束了,团队从未认真考虑过购买。 根据您的经验,如果许可成本无关紧要,那么哪个供应商是获胜者? 引发一场圣战不是一个广泛或模糊的问题或动机。这种问题是关于两个非常明显的工具。没有人喜欢工具有任何神秘或惊奇之处。在最佳与最佳之间做出选择始终是痛苦。我也了解草总是绿色的说法。我想听听所有的“假设”故事。 如果Intel仅针对本月的芯片升级进行本地优化,而并非每个硬件目标都能像Microsoft编译的那样正常工作,该怎么办?如果目标是AMD硬件,而一切都会毫无原因地降低速度,该怎么办?或者,另一方面,如果英特尔的硬件拥有如此众多的机会,而微软的编译器编写者却太慢而无法采用,并且从未在编译器中实现它,该怎么办?如果两者完全相同,实际上是将单个代码库包装到两个不同的盒子中并由某个第三方商店授权给这两个供应商,该怎么办? 等等。但是有人知道一些答案。
56 compiler 

5
“无上下文语法”在术语“无上下文语法”中是什么意思?
鉴于试图解释什么是上下文无关文法(CFG)的材料数量众多,我发现令人惊讶的是,很少有人(在我的示例中,少于20个样本中有1份)对为何将这种语法称为“上下文文法”进行了解释。自由”。而且,在我看来,没有人能成功做到这一点。 我的问题是,为什么无上下文语法称为无上下文语法?什么是“上下文”?我有一种直觉,即上下文可以是围绕当前分析的构造的其他语言构造,但事实并非如此。谁能提供准确的解释?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.