7

Is Dart considered to be a compiled or an interpreted language? The same question holds for JavaScript.

The reason for the question:

I've been watching an interview with the founders of dart, and in 7:10 Lars Bak said that:

"When you [...] in a JavaScript program, you actually execute JavaScript before you start running the real program. In Dart, you don't execute anything before the first instruction in main is being executed".

It sounded to me that he's saying that JavaScript is a compiled language while Dart is an interpreted language. Is it true?

Isn't the Dart VM a compiler?

4

3 回答 3

14

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

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(换句话说:为了看到你有一个类,你需要执行代码。

于 2013-07-12T05:37:21.970 回答
6

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

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

这意味着该程序not interpreted但是compiled. 但是这个编译过程(翻译source codemachine instructions)是stretched in time一个未知的时期。

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

假设你有一个非常big and complex program用于lot of classes当前may be never be程序short lifetime session执行的。

JIT 编译允许不编译所有未使用的类,而只是将其解析为 special tokens。这些标记稍后将用于 ( on demand) 将它们转换intermadiate language为构造machine code

这个过程是transparent for user of program。仅编译(机器代码)程序正确运行所需的源代码。

有些源代码永远编译不出来什么save a lot of time

结论:

如果 Dart 语言在其主要状态下用作虚拟机,那么它compiled to machine code

于 2013-07-12T07:44:42.620 回答
-1

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

于 2013-07-11T19:44:44.930 回答