实际上如何实现javascript" s"在飞行中"编译?

时间:2017-01-14 18:19:06

标签: javascript google-chrome compiler-errors compilation interpreted-language

我只是在读凯尔"你不认识JS"书系列/观看他的讲座,他说,以下代码:

var a = 2;
2();

关于Javascript语言,第二行是错误的。它实际上在语法上是无效的。它不是运行时问题;这是一个真正的authortime问题。

所以在解释性语言中,如果我们纯粹是逐行运行而且我们没有多次通过 - 我们首先运行第一行,然后我们会发现第二行有问题,我们& #39; d抛出错误。

但是编译后的语言会说第二行的问题,它会在尝试运行第一行之前标记出该错误。

"因此,在这方面,JavaScript更像是一种编译语言,而不是解释语言,因为JavaScript在尝试运行第一行之前肯定会先看第二行。它查看第一行以了解第一行是什么,但它没有运行它。因此,当您放置这样的程序时,如果它在文件中并且您将其加载到浏览器中,第一行将永远不会运行。您立即收到错误消息,指出第二行无效。"

所以我在Chrome控制台中尝试了这个代码,令人惊讶的是它运行正常,我的意思是 变量将被分配,如果我们稍后再尝试console.log(a)它打印" 2"。

它是某种控制台的特定行为还是什么?

1 个答案:

答案 0 :(得分:1)

提交人错了。

首先:他的例子无效。

2() - 或许有点令人惊讶 - 不是Javascript中的语法错误!这是完全有效的语法;它只是你不能做的事情,所以它在运行时会产生一个类型错误:

> console.log("test"); 2()
test
TypeError: 2 is not a function

此类错误不会阻止编译和运行程序。正如您在转录本中所看到的,只有在达到无效调用时才会抛出错误;其他代码在正常运行之前。

比较当我们引入真正的语法错误时会发生什么:

> console.log("test"); 1x
SyntaxError: Unexpected identifier

这实际上是一个语法错误 - 以1开头的“单词”被认为是一个数字,而数字中不能包含x - 因此它会阻止整个表达式从被运行。 console.log()永远不会被执行。

第二:作者正在错误的地方绘制“解释”和“编译”语言之间的界限。

解析程序以弄清楚它的含义,并捕获任何语法错误,与“编译”它不同。这是编译中必不可少的第一步,但并不是全部。实际上,“编译”语言通常被定义为输入程序在运行之前转换为本机可执行文件的语言。在这方面,Javascript显然是一种解释性语言。

如果我们采用作者对“解释语言”的定义作为程序在一次通过中运行的定义,甚至不解析文件的其余部分,那么该类别中几乎没有语言。 (唯一想到的是一些shell脚本语言。)