8

为什么具有动态类型语言的程序通常会被解释而不是编译?口译员和动态类型语言

+0

你想要什么语言? – TomaszK 2010-12-08 21:29:19

+0

@TomasxK:怎么样:Erlang,Lisp,Lua,Prolog,Ruby和其他有翻译的人。 – 2010-12-08 21:32:47

+0

他们不一定;许多Common Lisp系统编译为本地代码。另外,你对“解释”与“编译”的定义是什么? Python和Java在哪里呢? – 2010-12-08 21:33:38

回答

5

简而言之:他们像豌豆和胡萝卜一起去。

编译与解释和语言输入基本上是分开的担忧,因为你可以有所有可能的排列。另一方面,选择编译和不为语言设计选择动态类型的“原因”通常是相同的:性能。选择动态输入和解释的“原因”也有些相关。

这不是一条硬性规定。你总是可以混合起来。例如,您可以编译Perl和Lisp,并解释C.

0

每动态类型语言的定义...

一种编程语言是说当其大部分类型检查在运行时执行如在编译时不是被动态类型。在动态类型中,值有类型,但变量不是;也就是说,一个变量可以指任何类型的值。

这就是说,它变得很难知道什么编译程序下来,因为它可以在运行时更改。从这里维基百科的另一个摘录...

动态类型允许构造是 一些静态类型检查会拒绝 为非法。例如,可以执行任意 数据作为代码的函数。 此外,动态类型更好 容纳过渡代码和 原型设计,诸如允许 占位符数据结构(模拟 对象),以在 地方一个完整的数据结构 (通常为 实验的目的透明地使用和测试)。

我觉得这个答案仍然不完整,但我希望它指出你在正确的方向。也许这里的其他人可以扩展这一点。

-8

检查类型一次实际上是什么使“编译器”(〜型检查器)。

当类型是“动态”时,不能“编译”(检查一次类型)。

2

正如其他人所指出的,语言不会被编译或解释。它们只是需要翻译的规则,大部分都是解释和编译的实现。即便如此,当许多“解释器”在各地都是jitting时,很难谈论解释与编译,并且如果源文件更改,某些“编译器”很乐意按需编译。

也许最好将实现分类为完全预编译按需编译。如果我们使用这些类别,则打破完整预编译的一件事是eval function。这可能比动态类型对实现有更多的影响。如果你有一个eval函数,你需要支持按需编译。

1

通常编译的Lisp代码。 Common Lisp编程语言已经在支持编译的ANSI标准中进行了描述。 ANSI标准描述了编译代码的功能,描述了优化的各个方面,描述了编译过程的各个方面等等。

Common Lisp的解释器存在,但不太常用。

常见的Lisp实现通常可以自由地混合不同的执行模式。几乎所有的都有一个编译器。一些只有一个编译器。

编译几乎所有的实现都具有增量模式,因此可以交互使用。所有可以编译的文件。有些具有“块编译”模式来编译文件组。

3

你正在观察一个非因果关系:

  • 动态类型和解释相关,因为两者很容易实现。
  • 静态打字和编辑相关,因为两者都有利于可预测的良好性能。

编译器通常改进到动态类型的语言,试图提高性能(因为性能往往很差)。例如,下面是在编写第一个编译器之前解释了一些主要的动态类型语言的时间:Lisp(1958-1962),Mathematica(1988-2004),Lua(1993-2004),Python(1991-2002)和Javascript(1995-2009)。相比之下,OCaml(1996)和F#(2001)等语言首先作为编译器发布。