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

标签 javascript compiler-construction dart interpreter

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

问题原因:

我去过watching an interview与 dart 的创始人一起,在 7:10 Lars Bak 说:

"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".

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

Dart VM 不是编译器吗?

最佳答案

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

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

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

编辑(更多细节):

例如,以下极其简单的类 A:

在 Dart 中:

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 = ... 它需要执行代码来创建原型(prototype)对象。也就是说,它需要分配一个函数对象(A),查找它的原型(prototype)属性,用一个新的函数对象改变这个对象(添加一个新的属性)。换句话说:为了甚至看到您有一个类,您需要执行代码。

关于javascript - Dart vs JavaScript——它们是编译语言还是解释语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601984/

相关文章:

javascript - 如何在 Vue 中将此函数编写为计算属性

javascript - 无法在 Android 中获取 Phone Gap 来提供当前时间

javascript - Internet Explorer 11 在创建 Blob 期间出现 InvalidStateError

android - 在 Android Studio 中 Dart 。没有运行应用程序的设备

javascript - 通过 DefinePlugin 使用 Webpack 传递 NODE_ENV 值

gcc - 使用 Code Sourcery 编译 GCC

c# - 错误 "the exec task needs a command to execute"是什么意思?

c# - 为什么不允许重新分配的集合初始值设定项?

post - 是否可以将主体添加到使用dart:io:HttpClient类发出的HTTP POST请求中?

flutter - 如何在 flutter 中打开相机闪光灯?