Dart vs JavaScript - 它们是编译语言还是解释语言?

时间:2013-07-11 19:39:55

标签: javascript compiler-construction dart interpreter

Dart被认为是编译语言还是解释语言? JavaScript也存在同样的问题。

问题的原因:

我和dart的创始人一直watching an interview,并且在7:10 Lars Bak说:

  

“当您在JavaScript程序中时,实际上在开始运行实际程序之前执行JavaScript。在Dart中,在执行main中的第一条指令之前,您不执行任何操作”。

对我来说,他说JavaScript是一种编译语言,而Dart是一种解释语言。这是真的吗?

Dart VM不是编译器吗?

3 个答案:

答案 0 :(得分:10)

取决于“解释”和“编译”语言的定义。即便如此,它总是取决于实施。

Lars的意思是JavaScript通过执行代码来构建其类结构(以及其他全局状态)。在Dart中,全局状态由语言语法描述,因此只需要解析(即使这样,大多数都可以先跳过)。因此,Dart程序可以比JavaScript程序更快地开始执行“真实”代码。

这显然仅适用于Dart VM,因为已编译为JavaScript的程序必须使用JavaScript机制来构建其类。

编辑(更多细节):

例如,以下非常简单的课程A

在达特:

class A {
  final x;
  A(this.x);
  foo(y) => y + x;
}

在JavaScript中:

function A(x) { this.x = x; }
A.prototype.foo = function(y) { return y + this.x; }

当Dart VM启动时,它将通过程序启动。它看到class关键字,读取类名(A),然后可以简单地跳到类的末尾(通过计算开始和结束括号,确保它们不在字符串中)。在实际实例化A之前,它不关心A的内容。现在,实际上,它实际上是通过类查找并找到所有成员,但它确实读取方法的内容,直到需要它们为止。在任何情况下:它都是在一个非常快速的处理步骤中完成的。

在JavaScript中,事情变得更复杂:快速VM可以跳过函数A的实际主体(类似于Dart所做的那样),但是当它看到A.prototype.foo = ...时,它需要执行代码来创建原型对象。也就是说,它需要分配一个函数对象(A),查找其原型属性,使用新的函数对象更改此对象(添加新属性)。换句话说:为了甚至看到你有一个类,你需要执行代码。

答案 1 :(得分:3)

作为主要实现中的编程语言的Dart可以表示为virtual machine(VM),它是用该语言编写的程序的运行时。

当前virtual machine已实现为"just-in-time"(JIT)运行时环境引擎。

这意味着该计划not interpreted,但compiled。但是这个编译过程(将source code翻译成machine instructions)是stretched in time一段未知的时期。

这允许虚拟机defer performing certain operations indefinitelynever performing them

假设您的big and complex program lot of classes非常may be never beshort lifetime session在当前tokens程序执行中使用。

JIT编译不允许编译所有未使用的类,只是将其解析为特殊的on demand。 稍后将使用这些令牌(intermadiate language)将其转换为machine code以构建transparent for user of program

此过程为save a lot of time。仅编译(到机器代码)正确运行程序所需的源代码。

某些源代码永远不会被编译为compiled to machine code

结论:

如果Dart语言在其主要状态下用作虚拟机,则为{{1}}。

答案 2 :(得分:-1)

Dart编译成JavaScript,JavaScript是一种解释语言。通常,通过“编译”语言,人们可以理解编译成特定于平台的机器代码的语言,在CPU上运行并且不需要运行解释器,JS和Dart都不是这种情况。所以我会说JS和Dart都被解释了。