Questions tagged «compiler»

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

8
为什么Itanium处理器很难为其编写编译器?
通常说英特尔的Itanium 64位处理器体系结构失败是因为革命性的EPIC指令集很难为其编写好的编译器,这意味着缺乏IA64的良好开发人员工具,这意味着缺乏开发人员为该体系结构创建程序,因此没有人愿意使用没有太多软件的硬件,因此该平台出现了故障,并且全都需要马蹄钉 好的编译器。 但是,为什么编译器之类的东西这么难解决技术问题?在我看来,如果编译器供应商难以实现EPIC中的显式并行性,为什么首先要把负担加在它们身上?似乎还没有解决该问题的好方法,它不是一个很好的解决方案:而是将负担加在Intel上,并为编译器-编写器提供一个更简单的目标。 Itanium于1997年问世。到那时,UCSD P-Code字节码系统已有近20年的历史,Z机才更年轻,而JVM是编程语言世界中新出现的炙手可热的新星。英特尔为什么没有指定“简单的Itanium字节码”语言,而是提供一种工具,将这些字节码转换为经过优化的EPIC代码,从而利用他们最初设计系统的人员的专业知识呢?
50 history  compiler 


4
如何精确创建抽象语法树?
我想我了解AST的目标,并且之前我已经构建了几个树结构,但从未构建过AST。由于节点是文本而不是数字,所以我很困惑,因此在解析某些代码时,我想不出一种输入令牌/字符串的好方法。 例如,当我查看AST的图表时,变量及其值是等号的叶节点。这对我来说很有意义,但是我将如何实施呢?我想我可以视情况而定,以便当我偶然遇到“ =”时,我将其用作节点,并将在“ =”之前解析的值添加为叶子。这似乎是错误的,因为根据语法的不同,我可能不得不为成千上万的东西辩护。 然后我遇到了另一个问题,那棵树是如何横穿的?我会一直下降到最低点吗,当我到达最低点时又返回一个节点,并对它的邻居也这样做吗? 我已经看到了大量关于AST的图表,但是我找不到一个简单的代码示例,这可能会有所帮助。

9
“语法”和“语法糖”有什么区别
背景 语法糖上的Wikipedia页面指出: 在计算机科学中,语法糖是编程语言中的语法,旨在使事物更易于阅读或表达。它使人类可以使用这种语言“变甜”:可以更清楚,更简洁地表达事物,或者以某些人可能喜欢的替代方式表达事物。 我不太了解语法糖和语法之间的区别。 我赞赏含糖版本可以更清晰,更简洁,甚至可以简化一些观点。但是我觉得在某种程度上,所有语法实际上都是这样做的,以形成对代码进行编译的抽象。 在同一Wikipedia页面上: 语言处理器(包括编译器,静态分析器等)通常在处理之前将加糖的结构扩展为更基本的结构,此过程有时称为“反加糖”。 作为思想练习,如果我在此语句中将“经常”表示为“始终”:如果区别仅在于编译器在进入下一阶段之前是否“降低语法”,那么不了解内部条件的编码器又将如何?的编译器知道(或关心)什么是Sugar'd语法? 该网站上一个非常相关的问题“语法糖的严格定义?” 有一个开始的答案: 恕我直言,我认为您无法对语法糖进行定义,因为该短语是BS,很可能被那些在“真实操作系统”上使用“真实工具”谈论“真实程序员”的人使用。 哪个可能向我表明,使用该语言的编码人员也许并没有太大的区别?也许差异仅是编译器编写者可以感知的?尽管在某些情况下使用该语言来了解语法糖背后的含义对编码人员有帮助。(但实际上,有关该主题的任何论述都倾向于使用“火焰诱饵”这个词?) 问题的核心 所以...问题的简短版本: 语法和语法糖之间有真正的区别吗? 对谁重要? 思考的额外食物 关于主题矛盾的奖励: 在Wikipedia页面上给出了一个示例: 例如,在C语言中,a[i]表示法是*(a + i) 而上述链接问题的另一个答案是关于同一示例的: 现在考虑a[i] == *(a + i)。考虑任何以任何实质性方式使用数组的C程序。 并总结为: 该[]符号有助于这种抽象。这不是语法糖。 同一示例的相反结论!

6
解释器会产生机器代码吗?
我深入研究了编译器和解释器的主题。我想检查一下我的基本理解是否正确,所以让我们假设以下内容: 我有一种叫做“ Foobish”的语言,其关键字是 <OUTPUT> 'TEXT', <Number_of_Repeats>; 因此,如果我想在控制台上打印10次,我会写 OUTPUT 'Hello World', 10; Hello World.foobish文件。 现在,我用自己选择的语言(在这种情况下为C#)编写解释器: using System; namespace FoobishInterpreter { internal class Program { private static void Main(string[] args) { analyseAndTokenize(Hello World.foobish-file)//Pseudocode int repeats = Token[1]; string outputString = Token[0]; for (var i = 0; i < repeats; i++) { Console.WriteLine(outputString); …

6
Facebook为什么将PHP代码转换为C ++?[关闭]
我读到Facebook是从PHP开始的,然后为了提​​高速度,他们现在将PHP编译为C ++代码。如果是这样,他们为什么不这样做: 只是用C ++编程?按下将PHP移植到c ++代码的魔术编译器按钮时,肯定会出现一些错误/错误,对吗? 如果这个令人印象深刻的转换器运行得很好,为什么还要坚持使用PHP?为什么不使用Ruby或Python之类的东西呢?注意-我随机选择了这两个,但是主要是因为几乎每个人都说用这些语言进行编码是一种“乐趣”。那么,为什么不开发一种超级出色的语言,然后点击神奇的c ++编译按钮呢?
42 c++  php  compiler  facebook 

13
编译一个随机陌生人的源代码有多安全?[关闭]
假设我正在审查求职者发送的证明其技能的代码。显然,我不想运行它们发送的可执行文件。不太清楚,我宁愿不运行其代码的编译结果(例如,Java允许在注释中隐藏可运行的代码)。 编译他们的代码呢?我需要编译器警告,但是如果它们的代码包含一些巧妙的字符序列,这些序列会利用我的编译器并且我的编译器危害了我的机器,该怎么办? 当我用Google搜索“编译器漏洞”时,得到的所有信息都与编译器优化和代码发布有关,以及所发出的代码是否与原始源代码一样安全。 编译器是否通常经过验证,以确保它们在编译一些巧妙的代码时不会危害用户计算机?从陌生人那里编译一段代码有多安全?


4
适用于C,C ++等的JIT编译器
是否有针对C和C ++等已编译语言的即时编译器?(想到的第一个名字是Clang和LLVM!但是我不认为它们目前支持它。) 说明: 我认为该软件可以受益于运行时性能分析反馈以及在运行时对热点进行积极优化的重新编译,即使对于C和C ++等编译为机器的语言也是如此。 概要文件引导的优化可以完成类似的工作,但是不同的是,JIT在不同的环境中会更加灵活。在PGO中,您在运行二进制文件之前先运行它。发行后,它将不会在运行时收集任何环境/输入反馈。因此,如果更改输入模式,则可能会降低性能。但是,即使在这种情况下,JIT也能很好地工作。 但是,我认为JIT编译性能的好处是否超过其自身的开销是有争议的。

6
如果可以内联嵌套函数调用,为什么程序要使用调用堆栈?
为什么不让编译器采用这样的程序: function a(b) { return b^2 }; function c(b) { return a(b) + 5 }; 并将其转换为这样的程序: function c(b) { return b^2 + 5 }; 从而消除了计算机记住c(b)的回信地址的需要? 我认为存储程序并支持其编译所需的硬盘空间和RAM分别增加,这就是我们使用调用堆栈的原因。那是对的吗?



2
为什么制作一个64位版本的程序会很困难?
在我的短时间编程中,只要我有程序的完整源代码,就可以为32位或64位计算机编译我的任何C ++,Java等都是很简单的。 但是很多软件没有发布64bit。最令人讨厌的是,还没有64位版本的Unity引擎。 是什么使得很难为64位计算机编译某些程序?

5
解释还是编译:有用的区别?
在这里,有关解释型和编译型语言工具的问题很多。我想知道区别实际上是否有意义。(实际上,问题通常是关于语言的,但是他们实际上是在考虑那些语言的最流行实现)。 今天,几乎没有任何实现被严格解释。即几乎没有人解析并一次运行一行代码。另外,编译成机器代码的实现也越来越不常见。编译器越来越多地将目标对准某种虚拟机。 实际上,大多数实施都集中在相同的基本策略上。编译器生成字节码,该字节码通过JIT解释或编译为本地代码。它实际上是传统的编译和解释思想的结合。 因此,我问:如今,解释的实现和编译的实现之间是否有有用的区别?


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.