Dart被认为是编译语言还是解释语言? JavaScript也存在同样的问题。
问题的原因:
我和dart的创始人一直watching an interview,并且在7:10 Lars Bak说:
“当您在JavaScript程序中时,实际上在开始运行实际程序之前执行JavaScript。在Dart中,在执行main中的第一条指令之前,您不执行任何操作”。
对我来说,他说JavaScript是一种编译语言,而Dart是一种解释语言。这是真的吗?
Dart VM不是编译器吗?
答案 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 indefinitely
或never performing them
。
假设您的big and complex program
lot of classes
非常may be never be
,short 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都被解释了。