JavaScript是用什么语言编写的?

93

如果它是一种脚本语言,那么正如其名称所示,它必须是用一种较低级别的语言编写的,对吗?就像PHP是用C语言编写的一样,JavaScript是用什么语言编写的呢?


9
“必须使用较低级的语言编写”并不是绝对的要求,例如Narcissus是一个纯JavaScript编写的JavaScript解释器(它是一个元循环评估器):) - Christian C. Salvadó
我猜想有许多不同的JavaScript引擎,使用各种不同的编程语言编写。 - Galik
@CMS 是的,但这里的根本问题是,第一个JS解释器使用什么语言编写?如果没有工具来读取JavaScript代码(在这种情况下是解释器),则无法使用JavaScript编写JavaScript解释器。这个链接解释了这个鸡生蛋的问题:https://dev59.com/hGMl5IYBdhLWcg3woYPa - RegarBoy
7个回答

142

Javascript只是一个标准,更正式的称呼是ECMAScript。它可以在任何语言中实现,就像任何标准一样。

Chrome的Javascript引擎V8是用C++编写的。

从项目页面上来看:

V8是用C ++编写的,并且用于Google Chrome,这是Google开源的浏览器。

V8按照ECMA-262第5版规范实现ECMAScript,可以运行在使用IA-32、x64或ARM处理器的Windows(XP或更高版本)、Mac OS X (10.5或更高版本)和Linux系统上。

Firefox的Javascript引擎SpiderMonkey(现在是TraceMonkey)也是用C++编写的。正如下面的maerics所说,Rhino是用Java编写的。


8
确实,尽管我敢打赌它们中的大部分是用C++实现的(或者C及其衍生语言)。而Rhino显然是Java实现的。 - maerics
https://dev59.com/hGMl5IYBdhLWcg3woYPa - RegarBoy
Python也是一种标准吗?除了C和C++之外,每种语言都是标准吗?我找不到任何关于它们之间差异的信息。 - Nakul Tiruviluamala
JavaScript只是一个复杂的概念性想法吗?例如,我可以写下房子的规格说明(必须有1个门,每个房间2个窗户,有自来水、电等),然后其他人可以解释这些规格说明,建造一座房子并称之为房子。我假设答案是否定的,因为语言的创造者肯定实际上制作了一个功能性的“东西”。那么最初的“东西”是什么?它是什么样子的?它用什么语言编写的(还是“只是”机器码的抽象/缩写)? - user1063287
也许第一个被创建的东西是第一个JavaScript引擎SpiderMonkey,它是用C语言编写的:https://en.m.wikipedia.org/wiki/SpiderMonkey,另请参阅:https://brendaneich.com/2011/06/new-javascript-engine-module-owner/。 - user1063287

41

12
艾特伍德法则发挥到了极致! - Evaldas Buinauskas
很酷的回复,但是我内心的极客要纠正你。SpiderMonkey是一个引擎,所以有母鸡,但我没有看到蛋。 - clusterBuddy
1
我用石头来摧毁石头。 - jbuddy_13

12

大多数Javascript解释器是用C/C++编写的(如V8、Nitro等),但任何语言都可以编写符合规范的解释器(如Rhino→Java,Interpreter→Javascript等)。


8
无论客户端浏览器的JavaScript解释器使用哪种语言编写 :)

8
Javascript是ECMAScript标准的实现,但与PHP看到的单一规范解释器不同。
出现的大多数主要实现(作为独立的或作为Web浏览器的一部分)往往主要使用C或C ++编写以提高性能,但这并不总是如此。由Mozilla维护的Rhino引擎是用Java编写的。

6
可能会有多个PHP的实现方式,但是...没有人感兴趣。 - Ignacio Vazquez-Abrams
6
原文:@IgnacioVazquez-Abrams - turns out Facebook were interested :) 翻译:@IgnacioVazquez-Abrams - 结果Facebook对此很感兴趣 :) - Jon Hudson

0

大多数JavaScript的实现都表现出由指针和byref参数传递引起的行为,这通常指向C或C++的使用。

例如,在循环中拆分多维数组时,使用中间数组会表现得非常“奇怪”,如果您不熟悉指针和byref参数传递(每次都需要执行var hlp = new Array(),否则它将覆盖您已经存储在其他地方的先前值)

我对例如Java中的JavaScript实现非常好奇,因为我想象这种行为在那种情况下会有所不同?


3
不。JavaScript 执行的语义不取决于用来实现它们的编程语言。 - Bergi
你可以在底层编写函数来绕过这种行为(例如,在C++中使用new和garbage collect而不是设置指针)。事实上,JavaScript(技术上是EMCA)的行为方式与其实现语言几乎没有任何关系,因为它只是一个标准。 - Alec

-5

C++是现代和高端技术的基础语言。大多数现代高级语言都是低级语言C++的子集。今天你看到的所有现代语言都以某种方式是C++的子集。甚至Java也是C++的子集。


1
这是错误的。Java不是C++的子集。C++也不被认为是低级语言。你可能在想C,即使是这样,Java和其他语言也不是C的“子集”。它们可能是基于C的,但它们不是子集。接受的答案给出了一个更好的答案,即Javascript可以用任何语言编写,但最流行的实现是基于C++,即Google的V8。 - David Frick
2
我不明白你的意思。C++是作为C语言的超集而起源的另一种语言。如果任何语言都是C++的子集,那么这段Python代码应该可以在C++中运行: print("hello world")。将其粘贴到一个新文件中,并使用C++编译器进行编译。它能编译吗?如果不能,那么Python就不是C++的子集。 - ARI FISHER

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接