Questions tagged «compiler»

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

5
Google Closure是真正的编译器吗?
这个问题的灵感来自对此Stack Overflow问题的评论中的辩论。在谷歌关闭编译文档指出以下(强调): Closure Compiler是使JavaScript下载和运行速度更快的工具。这是一个真正的JavaScript编译器。它不是从源语言编译为机器代码,而是从JavaScript编译为更好的JavaScript。 但是,维基百科给出了“编译器”的以下定义: 编译器是一种计算机程序(或一组程序),可以将以编程语言(源语言)编写的源代码转换为另一种计算机语言。语言。 基于此,我想说Google Closure不是编译器。但是Google明确声明它实际上是一个“真正的编译器”,这一事实使我想知道是否还有更多功能。Google Closure真的是JavaScript编译器吗?

6
是否有一种语言可以更好地转换为C语言?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 CoffeeScript是一种受Ruby启发的具有清晰语法的语言,可以转换为JavaScript。有没有类似的语言可以转换成C语言,从而在不影响性能的情况下提供更具可读性的代码?如果没有类似的东西存在,是否有充分的理由不创建它?
19 c  syntax  compiler 

4
Chrome V8如何运作?为什么JavaScript最初不是JIT编译的?
我一直在研究解释器/编译器,然后偶然发现了JIT-Compilation-特别是Google Chrome的V8 Javascript Engine。 我的问题是- 怎么会比标准口译更快呢? 为什么不首先使用JIT-Compilation? 我目前的理解 每个Javascript程序都从源代码开始,然后不管执行方法如何,最终都将其翻译为机器代码。 无论JIT编译和解释必须遵循这条道路,所以JIT编译怎么会有更快的(也因为JIT是有时间限制的,不像AOT编译)? 基于Wikipedia的JIT-Compilation Article,JIT-Compilation似乎是一个相对较旧的创新。 “最早发布的JIT编译器通常归功于McCarthy在1960年对LISP的研究。” “ Smalltalk(约1983年)开创了JIT编译的新方面。例如,按需转换为机器代码,并将结果缓存起来供以后使用。当内存不足时,系统将删除部分代码并重新生成再次需要它时。” 那么,为什么解释Javascript 开头呢? 我很困惑,对此我做了很多研究,但没有找到满意的答案。 如此简洁明了的答案将不胜感激。并且,如果需要引入有关解释器,JIT编译器等的更多解释,也将不胜感激。

4
了解C / C ++中的函数调用堆栈框架吗?
我试图了解如何构建堆栈框架以及哪些变量(参数)以什么顺序被压入堆栈?一些搜索结果表明,C / C ++编译器根据函数内执行的操作进行决策。例如,如果假定该函数只是将传入的int值加1(类似于++运算符)并返回它,则它将把该函数的所有参数和局部变量放入寄存器中。 我想知道哪些寄存器用于返回或按值传递参数。引用如何返回?编译器如何在eax,ebx,ecx和edx之间进行选择? 我需要了解什么才能了解​​函数调用期间如何使用,构建和销毁寄存器,堆栈和堆引用?
19 c++  c  compiler  stack 

8
在第一个错误之后,您是否阅读C或C ++编译错误?
我从来不明白为什么C和C ++编译器会尝试从错误中恢复并继续解析。几乎总是,第一个错误会生成一系列伪错误,这些错误会在第一个错误修复后立即消失。经过几年的经验,我只是停止查看除每个文件的第一个错误以外的任何错误。我重新运行编译器,然后再次执行该操作,直到没有更多错误为止。这是常见的做法吗?

2
Java AOT编译器如何工作?
有几种工具(Excelsior JET等)声称可以将Java应用程序转换为本地可执行文件(*.exe)。但是据我了解,这些工具实际上只是在创建java从外壳程序或命令行调用/执行的本机包装。 如果这种理解是不正确的,我不知道怎么可能。如果正在运行的JVM(java进程)本质上是一种高性能的解释器,则是从Java类文件中动态加载字节码,那么我看不出Java应用程序(用作JVM输入的字节码文件的集合)是怎么回事。真正转换为可执行文件。 这是因为JVM进程已经是本机可执行文件,它将字节码文件集作为输入。如果不完全重写JVM并脱离JVM规范,将这些字节码文件和JVM进程合并为一个统一的本机可执行文件似乎是不可能的。 因此,我问:这些工具实际上是如何将Java类文件“转换”为本地可执行文件的?
18 java  compiler  aot 

4
用C ++编写词法分析器
有哪些关于如何使用C ++编写词法分析器的好资源(书籍,教程,文档),有哪些好的技术和实践? 我在互联网上看过,每个人都说要使用像lex这样的词法生成器。我不想这样做,我想手动编写一个词法分析器。
18 c++  compiler  lexer 

3
为什么虚拟机上的更多CPU内核会降低编译时间?
[edit#2]如果来自VMWare的任何人都可以使用VMWare Fusion的副本来打我,我很乐意做与VirtualBox与VMWare比较的相同操作。我以某种方式怀疑VMWare虚拟机管理程序将针对超线程进行更好的调整(也请参见我的答案) 我看到一些奇怪的东西。随着我在Windows 7 x64虚拟机上增加内核数量,总体编译时间会增加而不是减少。编译通常非常适合并行处理,因为在中间部分(后依赖映射)中,您可以简单地在每个.c / .cpp / .cs /任何文件上调用一个编译器实例,以建立供链接器使用的部分对象过度。所以我以为编译实际上可以很好地扩展内核数。 但是我看到的是: 8核:1.89秒 4核心:1.33秒 2核心:1.24秒 1核心:1.15秒 这仅仅是由于特定供应商的虚拟机管理程序实现(在我的情况下为type2:virtualbox)导致的设计工件,还是在更多的VM上更普遍地使虚拟机管理程序实现更简单?有这么多因素,我似乎能够为这种行为辩护和反对-因此,如果有人比我更了解这一点,我很想读您的答案。 谢谢席德 [ 编辑:解决评论 ] @MartinBeckett:冷编译被丢弃了。 @MonsterTruck:找不到直接编译的开源项目。太棒了,但现在不能搞定我的开发环境。 @Mr Lister,@philosodad:使用VirtualBox时有8个硬件线程,因此应该以1:1映射而不进行仿真 @Thorbjorn:我有6.5GB的虚拟机和一个较小的VS2012项目-我换入/换出垃圾页面文件的可能性很小。 @All:如果有人可以指向一个开源VS2010 / VS2012项目,那么这可能比我(专有)VS2012项目更好的社区参考。Orchard和DNN似乎需要调整环境才能在VS2012中进行编译。我真的很想看看使用VMWare Fusion的人是否也看到了这一点(针对VMWare与VirtualBox划分) 测试细节: 硬件:Macbook Pro Retina CPU:Core i7 @ 2.3Ghz(四核,超线程= Windows任务管理器中的8核) 记忆体:16 GB 磁盘:256GB SSD 主机操作系统:Mac OS X 10.8 VM类型:VirtualBox 4.1.18(类型2虚拟机管理程序) 来宾操作系统:Windows 7 …


6
Fortran编译器是否真的比C编译器生成更快的代码?
当我在大学学习时,我经常听到这样的想法:对于同等程序,Fortran编译器生成的代码比C编译器更快。 关键原因是这样的:Fortran编译器每行代码平均发出1,1个处理器指令,而C编译器每行代码平均发出1,6处理器指令 -我不记得确切的数字了,但是想法是C编译器发出明显更多的机器代码,因此产生较慢的程序。 这样的比较有效吗?我们可以说Fortran编译器比C编译器生成更快的程序,反之亦然,为什么存在这种差异?

3
编译目标到底是什么?
我一直在听这个词,所有的google搜索都引导我找到有关编译器的文章。我只是想了解术语“编译目标”的含义:| 更新:提供一些背景信息:我听说它说Web程序集是其他语言(例如C,C ++,Rust等)的编译目标。
17 compiler 

2
编译器如何工作?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 注意:令我感到惊讶的是,以前从未有人问过它,如果有,我在搜索中找不到它。 我去过很多网站,读过很多文章,也听过很多解释。他们中的大多数都是好人,但是他们要么太宽泛,要么太过复杂,甚至简直就是坏。所以我的问题是,编译器如何工作? 如果这是一个困难而广泛的问题,请告诉我。但是,如果没有,请回答问题。
17 compiler 

4
为什么不能轻松地反编译本机代码?
使用基于字节码的虚拟机语言(例如Java,VB.NET,C#,ActionScript 3.0等),有时您会听到,只需从Internet下载一些反编译器,并在其中运行字节码一次,这是多么容易,并且通常,您会在几秒钟内想到与原始源代码相差不大的内容。据说这种语言特别容易受到攻击。 最近,我开始想知道,为什么您至少不了解本机二进制代码最初是用哪种语言编写的(以及尝试将其反编译成哪种语言),却为什么对本机二进制代码却听不懂呢。很长一段时间以来,我发现这仅仅是因为本地机器语言比典型的字节码疯狂得多,而且更加复杂。 但是字节码是什么样的?看起来像这样: 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 本地机器代码是什么样(十六进制)?当然,它看起来像这样: 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 指令来自类似的思维框架: 1000: mov EAX, 20 …

4
我们如何从汇编到机器代码(代码生成)
有没有一种简单的方法可以可视化将代码组装到机器代码之间的步骤? 例如,如果您在记事本中打开有关二进制文件的文件,则会看到机器代码的文本格式表示形式。我假设您看到的每个字节(符号)都是对应的ascii字符,因为它是二进制值? 但是我们如何从汇编程序转换为二进制程序,幕后发生了什么?

4
为什么招聘与编译器相关的工作如此困难?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 上周,我和一些同事在三所主要大学(两所在美国,一所在英国)参加了招聘会,我们试图(没有很大的成功)招聘几个编译器职位,从实习到入门级,对于我们的团队来说更高级。 令我们惊讶的是,当被问到他们感兴趣的学生时,与我们交谈的80%的学生回答“我想构建Ansroid应用程序”的行很长。(还有20%是“ iPhone应用程序”!)有些人甚至公开表示,他们并不“想要构建一个编译器,...,这很无聊”。他们说,我引用了。 那么,如今吸引(年轻吗?)“开发人员”的移动应用又是什么呢?同样,为什么编译器对他们来说是一个“无聊”的话题?(我不一定认为这两个是互斥的。一个人当然可以为手机构建编译器,但这并不重要。) 如果有的话,我们该怎么做才能吸引更多的人才,甚至只是感兴趣的候选人?

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.