Questions tagged «interpreters»

1
了解差异:传统解释器,JIT编译器,JIT解释器和AOT编译器
我试图了解传统解释器,JIT编译器,JIT解释器和AOT编译器之间的区别。 解释器只是一台以某种计算机语言执行指令的机器(虚拟或物理)。从这个意义上讲,JVM是解释器,物理CPU是解释器。 提前编译只是意味着在执行(解释)代码之前将代码编译为某种语言。 但是我不确定JIT编译器和JIT解释器的确切定义。 根据我所读的定义,JIT编译只是在解释代码之前就对其进行编译。 因此,基本上,JIT编译是AOT编译,是在执行(解释)之前完成的吗? 还有一个JIT解释器,是一个既包含JIT编译器又包含解释器并在解释它之前对其进行编译(JIT)的程序? 请说明差异。

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的“ 解释语言”页面,它被列为编译为虚拟机代码的语言,这是什么意思?


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

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); …

5
为什么用Lisp学习Lisp口译员如此重要?
我已经看到了许多针对新程序员的CS课程和学习建议,呼吁有抱负的程序员学习专门用Lisp编写的Lisp解释器。所有这些站点都表示类似以下内容:“具有智力上的启示”,“这是每个认真的程序员应有的启发经验”或“它向您展示了硬件/软件的关系”以及其他含糊的陈述,尤其是本文摘自这个著名的方法。 我的问题的普遍看法是,lisp如何实现上述目标,为什么选择lisp?为什么不使用其他语言? 我之所以这样问是因为我刚刚完成了使用scheme编写的方案解释器(摘自SICP http://mitpress.mit.edu/sicp/),现在我正在使用scheme编写python解释器,而我正努力地拥有这个传奇的顿悟那应该专门来自前者。我正在寻找两种语言之间的具体技术细节,我可以在他们的方案解释器中利用它们来了解程序的工作方式。 进一步来说: 为什么对以其所解释的语言编写的解释器进行研究如此强调-是将原始语言和所构建的语言保持直觉仅仅是一项伟大的心理锻炼,还是存在只能根据其本质找到解决方案的特定问题?原始语言? Lisp口译员如何为未来的软件设计展示良好的体系结构概念? 如果我使用其他语言(如C ++或Java)进行此练习,会错过什么? 什么是最常用的,从这个练习外卖或“心理工具”?** **我选择我做,因为我的答案已经注意到,我已经从这个练习更多的技巧获得了在我的脑海设计解析工具,比其他任何一个工具,我想找到解析,可能对计划更好的工作,不同的方法解释器比python解释器。

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


2
Python(和其他动态语言)的哪些语义特征导致其缓慢?
我不太了解Python。我试图更精确地了解动态语言(如Python,Lua,Scheme,Perl,Ruby等)的确切功能正迫使他们的实现变慢。 作为一个例子,Lua 5.3的可继承机制会直观地使Lua变得很慢,但实际上有传言说Lua相当快(并且比Python快)。 另外,我有直觉(可能是错误的),由于目前的处理器内存大于原始计算慢得多(与高速缓存未命中的存储器访问需要的同时,数以百计的算术运算),动态类型检查(点菜if (value->type != INTEGER_TAG) return;的C语言)可以运行得很快。 当然,随着翻译程序的快速运行,整个程序分析(例如Stalin Scheme实现的工作)可以使动态语言实现成为可能,但是让我们假设我没有时间先设计整个程序分析器。 (我在MELT监视器中设计了一种动态语言,其中有些会翻译成C语言)

3
为什么没有针对本地机器代码的python编译器?
据我了解,造成编译语言与python之间速度差异的原因是,第一个方法将代码一直编译到本机计算机的代码,而python编译为python字节码,由PVM解释。我看到这种方式python代码可以在多个操作系统上使用(至少在大多数情况下),但是我不明白,为什么没有额外的(和可选的)python编译器,其编译方式与传统编译器相同。这将留给程序员选择,这对他们来说更重要。本机上的多平台可执行性或性能。一般来说; 为什么没有可以同时编译和解释的语言?

3
在哪个过程中发生语法错误?(标记或解析)
我正在尝试了解编译和解释,逐步找出总体图像。因此,在阅读http://www.cs.man.ac.uk/~pjj/farrell/comp3.html本文时,我遇到一个问题 它说 : 编译器的下一个阶段称为解析器。编译器的这一部分对语言的语法有所了解。它负责识别语法错误,并将无错误程序转换为可以用另一种语言解释或写出的内部数据结构。 但是我无法弄清楚令牌化器如何正确地令牌化具有语法错误的给定流。 它应该卡在此处或向解析器提供一些错误的信息。我的意思是标记化不是一种翻译器吗? 因此,它如何在标记化时克服了词汇中的错误代码行。 在Tokenizer标题上方的链接中有一个令牌示例。 据我了解,令牌的形式似乎是,如果代码中有错误,令牌也会被破坏。 您能澄清一下我的误会吗?

2
是否可以创建独立于原始解释程序的“自举”解释程序?
根据Wikipedia的说法,在编写编译器的上下文中,“引导”一词的含义是: 在计算机科学中,引导程序是使用要编译的源编程语言编写编译器(或汇编器)的过程。应用此技术将导致自托管编译器。 我可以理解这将如何工作。但是,对于口译员来说,故事似乎有些不同。现在,当然可以编写自托管解释器了。那不是我要的 我实际上要问的是:是否可以使自托管翻译器独立于原始的第一翻译器。为了解释我的意思,请考虑以下示例: 你写在你的语言翻译的第一版本X和解释是为正在创建一个新的语言,称为ÿ。首先,您使用X语言的编译器来创建可执行文件。现在,您可以使用以语言X编写的解释器来解释以您的新语言Y编写的文件。 现在,据我所知,要能够“引导”您使用语言X编写的解释器,您需要使用语言Y重写该解释器。但这很重要:即使您确实使用语言Y重写了整个解释器,仍然需要使用语言X编写的原始解释器。因为要使用语言Y运行解释器,所以您将不得不解释源文件。但是,究竟该如何解释源文件呢?好吧,当然不能没有什么,所以您被迫仍然使用第一个解释器。 不管您用语言Y编写了多少新的解释器,您始终将必须使用用X编写的第一个解释器来解释后续的解释器。仅仅由于口译员的性质,这似乎是一个问题。 但是,另一方面,这篇关于口译员的Wikipedia文章实际上讨论的是自托管口译员。这是一个相关的小摘录: 自解释器是用一种可以解释自身的编程语言编写的编程语言解释器;一个例子是用BASIC编写的BASIC解释器。自解释器与自托管编译器有关。 如果不存在用于要解释的语言的编译器,则创建自解释器需要使用宿主语言(可以是另一种编程语言或汇编程序)来实现该语言。通过拥有这样的第一个解释器,系统将被引导,并且可以使用语言本身开发新版本的解释器 不过,对于我来说仍然不清楚如何完成此操作。看来,无论如何,您总是被迫使用以宿主语言编写的解释器的第一个版本。 现在,上面提到的文章链接到另一篇文章,其中Wikipedia提供了一些假定的自我托管解释器的示例。经过仔细检查,似乎许多这些自托管解释器(尤其是一些较常见的解释器,例如PyPy或Rubinius)的主要“解释”部分实际上是用其他语言编写的,例如C ++或C。 那我上面描述的可能吗?自托管口译员可以独立于其原始主机吗?如果是这样,将如何精确地做到这一点?

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编译器等的更多解释,也将不胜感激。

3
如何实现if()的惰性求值
我目前正在根据以下条件实现表达式评估器(单行表达式,如公式): 输入的表达式被标记化以分隔文字布尔值,整数,小数,字符串,函数,标识符(变量) 我实现了Shunting-yard算法(经过微调以处理具有可变数量的参数的函数)以消除括号并以后缀顺序将运算符以适当的优先级排序 我的调车场只是产生了一个(模拟的)令牌队列(通过数组,我的Powerbuilder Classic语言可以定义对象,但只有动态数组作为本机存储-不是真实列表,没有字典),我使用简单堆垛机 我的评估人员工作得很好,但我仍然缺少if(),我想知道如何进行。 使用分流后缀和基于堆栈的评估,如果我添加if()具有真假部分的另一个函数,则单个if(true, msgbox("ok"), msgbox("not ok"))消息将显示两条消息,而我只希望显示一条消息。这是因为当我需要评估一个函数时,它的所有参数都已经被评估并放置在堆栈中。 您能给我一些if()偷懒实现的方法吗? 我虽然将它们作为一种宏进行处理,但是在早期我还没有条件评估。也许我需要使用队列以外的其他结构来分别保存条件和true / false表达式?目前,表达式在评估之前已被解析,但我还计划将中间表示形式存储为一种预编译的表达式,以供将来评估之用。 编辑:经过一些问题后,我认为我可以构建表达式的树表示形式(AST而不是线性令牌流),从中我可以轻松地忽略自己的一个或另一个分支if()。

8
是什么阻止了C的编译/解释/ JIT处理?
Java经常以其惊人的可移植性而受到赞誉,我认为这是因为JVM。我的问题是阻止C进行编译/解释/ JIT的原因是什么,如果是这样,C也可以编写一次并使其在您拥有的任何设备上工作。但这不是处理C程序的流行机制。 用这种方式处理C的缺点是什么,当然除了可移植性以外,用这种方式处理Java而不编译为机器代码的优点是什么?

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.