|
|
1
417
编译语言是指程序一旦编译,就在目标机器的指令中表达出来的语言。例如,源代码中的加法“+”操作可以直接转换为机器代码中的“加法”指令。 解释语言是指指令不是由目标机器直接执行,而是由其他程序(通常是 是 用本机语言编写)。例如,解释器在运行时会识别相同的“+”操作,然后解释器用适当的参数调用自己的“add(a,b)”函数,然后执行机器代码“add”指令。 您可以在编译语言的解释语言中做任何事情,反之亦然—它们都是图灵完备的。然而,两者在实现和使用上都有优缺点。 我要完全概括(纯粹主义者原谅我!)但是,大致来说,编译语言的优点如下:
以下是解释语言的优点:
请注意,现代技术(如字节码编译)增加了一些额外的复杂性——这里所发生的是编译器针对的是一个“虚拟机”,它与底层硬件不同。然后,这些虚拟机指令可以在以后的阶段重新编译以获得本机代码(例如,Java JVM JIT编译器所做的)。 |
|
|
2
91
一种语言本身既不是编译的,也不是解释的,只有一种语言的特定实现。Java是一个很好的例子。有一个基于字节码的平台(JVM)、一个本地编译器(GCJ)和一个用于Java超集(BSH)的ItPiTe。那么Java是什么呢?字节码编译、本机编译或解释? 其他被编译和解释的语言是scala、haskell或ocaml。每种语言都有一个交互式解释器,以及一个编译到字节的代码或本机代码。 所以一般来说,用“编译的”和“解释的”对语言进行分类没有什么意义。 |
|
|
3
50
从以下方面开始思考: 从过去爆炸 很久以前,有一段时间,在计算机领域生活着 口译员和编辑。各种各样的纷争接踵而至 一个接一个。总体意见 那时 有点像:
运行时的一个或两个数量级差异 解释程序和编译程序之间存在性能。其他区别 例如,代码在运行时的可变性也引起了一些兴趣,但主要的 区别在于运行时性能问题。 今天,景观的发展到了这样一个程度,编译/解释的区别是 相当不相关。许多 编译语言调用的运行时服务不是 完全基于机器代码。而且,大多数解释语言都被“编译”成字节码。 执行前。字节码解释器非常有效,可以与某些编译器生成的解释器相媲美。 从执行速度的角度来看代码。 典型的区别是编译器生成本机代码,解释器读取源代码和 使用某种运行时系统动态生成机器代码。 如今,几乎所有的经典口译员都已不复存在。 编译成字节码(或其他半编译状态),然后在虚拟“机器”上运行。 |
|
|
4
23
极端和简单的情况:
有了这些障碍,让我来解释一下,生活不再那么简单了。例如,
最后,这些天,解释与编译是一种权衡,编译花费的时间(一次)通常会得到更好的运行时性能,但解释环境会给交互提供更多的机会。编译和解释主要是关于如何在不同的过程中“理解”程序的工作,而随着语言和产品试图提供最好的两个世界,这条线现在有点模糊。 |
|
|
5
19
从 http://www.quora.com/What-is-the-difference-between-compiled-and-interpreted-programming-languages
|
|
|
6
11
解释源代码相对于编译源代码的最大优势是 便携性 . 如果编译了源代码,则需要为要运行程序的每种类型的处理器和/或平台(例如,一种用于Windows x86,一种用于Windows x64,一种用于Linux x64,等等)编译不同的可执行文件。此外,除非您的代码完全符合标准,并且不使用任何平台特定的功能/库,否则您实际上需要编写和维护多个代码基! 如果您的源代码被解释了,您只需要编写一次,并且它可以被任何平台上合适的解释程序解释和执行!它是 便携式的 !请注意,解释器本身是一个可执行程序, 是 为特定平台编写和编译。 编译代码的一个优点是 隐藏源代码 来自最终用户(可能是 知识产权 )因为您没有部署原始的人类可读的源代码,而是部署了一个模糊的二进制可执行文件。 |
|
|
7
7
一个编译器和一个解释器做同样的工作:把一种编程语言翻译成另一种pgoraming语言,通常更接近硬件,通常是直接的可执行机器代码。 传统上,“编译”意味着这种转换一次完成,由开发人员完成,生成的可执行文件分发给用户。纯示例:C++。 编译通常需要相当长的时间,并尝试执行大量昂贵的optmation,以便生成的可执行文件运行得更快。最终用户没有自己编译东西的工具和知识,并且可执行文件通常必须在各种硬件上运行,因此不能进行许多特定于硬件的优化。在开发过程中,单独的编译步骤意味着更长的反馈周期。 传统上,“解释”意味着当用户想要运行程序时,翻译会“即时”进行。纯示例:香草PHP。一个幼稚的解释器每次运行时都必须解析和翻译每一段代码,这使得它非常慢。它不能进行复杂的、代价高昂的优化,因为它们所花费的时间比执行时节省的时间要长。但它可以充分利用它运行的硬件的功能。缺少单独的编译步骤可以减少开发期间的反馈时间。 但如今,“编译与解释”并不是一个黑白的问题,两者之间存在着阴影。天真、简单的口译员几乎灭绝了。许多语言都使用两步流程,将高级代码转换为独立于平台的字节码(这样更容易解释)。然后,您有“实时编译器”,每个程序运行最多编译一次代码,有时缓存结果,甚至智能地决定解释很少运行的代码,并对运行很多的代码进行强大的优化。在开发过程中,调试程序能够在运行的程序中切换代码,即使对于传统的编译语言也是如此。 |
|
|
8
4
首先,一个澄清,Java不是完全静态编译和链接的方式C++。它被编译成字节码,然后由JVM解释。JVM可以对本机语言进行及时编译,但不必这样做。 更重要的是:我认为互动性是主要的实际区别。由于所有内容都被解释了,所以您可以从代码中摘录一小部分,然后根据环境的当前状态进行分析和运行。因此,如果您已经执行了初始化变量的代码,那么您就可以访问该变量等。它确实为函数样式这样的事情提供了自己的途径。 然而,口译成本很高,尤其是当你有一个包含大量参考资料和上下文的大型系统时。根据定义,这是浪费的,因为相同的代码可能需要解释和优化两次(尽管大多数运行时对此都有一些缓存和优化)。不过,您需要支付运行时成本,并且经常需要运行时环境。您也不太可能看到复杂的过程间优化,因为目前它们的性能没有充分的交互作用。 因此,对于不会发生太大变化的大型系统,对于某些语言,预编译和预链接所有内容更有意义,可以执行所有可以执行的优化。最后是一个非常精简的运行时,它已经针对目标机器进行了优化。 至于生成可执行文件,这与它无关,imho。通常可以从编译语言创建可执行文件。但也可以从解释语言创建可执行文件,除非解释器和运行时已经打包在可执行文件中,并且对您隐藏。这意味着您通常仍然要支付运行时成本(尽管我确信对于某些语言,有一些方法可以将所有内容转换为树可执行文件)。 我不同意所有的语言都可以交互。某些语言,如C,与机器和整个链接结构联系在一起,我不确定您是否可以构建一个有意义的、完全成熟的交互版本。 |
|
|
9
2
很难给出一个实际的答案,因为不同之处在于语言定义本身。可以为每种编译语言构建解释程序,但不可能为每种解释语言构建编译器。这与语言的正式定义有关。所以,理论信息学的东西在大学里是不受欢迎的。 |
|
10
2
python book_©2015 Imagine Publishing Ltd,只是通过第10页中提到的以下提示来消除差异,如下所示:
|
|
|
11
1
编译是从用编译的编程语言编写的代码创建可执行程序的过程。编译允许计算机运行和理解程序,而不需要创建程序所用的编程软件。当一个程序被编译时,它通常是为一个特定的平台(如IBM平台)编译的,该平台与IBM兼容的计算机一起工作,而不是其他平台(如苹果平台)。 第一个编译器是由GraceHopper在哈佛MarkI计算机上开发的。今天,大多数高级语言都将包含自己的编译器,或者提供可用于编译程序的工具包。使用Java的编译器的一个很好的例子是Eclipse,一个用C和C++使用的编译器的例子是GCC命令。根据程序的大小,编译需要几秒钟或几分钟,如果编译时没有遇到错误,则会创建一个可执行文件。请检查此信息。 |