Web语言执行

时间:2014-04-19 10:35:35

标签: javascript browser compilation dart virtual-machine

TL; DR: 嵌入在网站中的JavaScript代码如何成为在真实硬件上执行的CPU指令。 Dart也是如此。

您好, 我正努力完全理解现代网络语言热门词汇djungle。 基本上我的地图是如何("更高级别")编程语言 执行包括C和Java翻译的概念。

C编译器将C文本作为输入并生成二进制机器代码 可以在内部被认为是前端和后端,前端 将C文本转换为某些IR,后端获取该IR并生成 平台相关的机器代码。 使用Java时,相同的拆分更加明显,因为Java编译器会进行转换 将Java文本转换为Java字节码(IR),然后由JITed /解释 从字节码到平台依赖的实际转换的JVM 机器说明。

到目前为止,在我看来,唯一真正的区别在于IR步骤有点像 在Java世界中暴露,因为可以用任何东西来瞄准JVM 前端(例如Scala),当使用gcc时,这个整个IR的东西 被隐藏起来。

然后有人把我指向Clang,它将C编译为LLVM 在我看来,只是暴露了前端和后端之间的分裂。

所以现在有JavaScript。就我能锻炼而言,有一些东西 称为JavaScript"引擎",就像Google V8一样。这件事做的是什么 它需要JS文本和"编译"它依赖于平台的机器代码 在运行时,全部在内存中。我认为这是最终的结果 (说明)一些在进程mem中然后跳转到它的地方。 这是正确的还是我弄错了?因为有时候人们可以阅读 关于浏览器中的JS VM ...

然后有Dart得到了两个:DartVM(独立和嵌入式) 在浏览器中)还可以选择直接生成机器代码 或者至少在Dart网站上有一篇解释原因的文章 他们决定使用字节码VM。 但如果没有IR,它仍然是(软件)虚拟机吗?或者如果有IR, 它是什么?

现在我无法映射这些"解释"来自项目网站 我目前对语言从文本到文章的理解 执行。

感谢您的任何澄清!

1 个答案:

答案 0 :(得分:0)

作为一个简短的回答,我会说JavaScript和Dart在这方面与Java非常相似,区别在于前者不区分源代码和字节代码。源代码实现了这两个功能。 我不是这方面的专家,但在我的理解中,这个上下文中的VM是一个程序,它将某种语言的源代码作为输入并生成可执行的CPU指令并让CPU执行指令。 无论是jitted还是解释,或者两者都是实现细节。

修改
我希望你想了解更多细节,但StackOverflow是错误的地方。这个问题只是广泛的。在更频繁的标签中,这个问题已经被关闭了。计算机科学研究会更合适。

无论如何 - 对你的评论:我不认为他们反其道而行之。他们采用程序员编写的源代码并生成CPU可以处理的内容。不同之处在于每个步骤的完成位置以及步骤的精细/粗糙程度。存储在磁盘或RAM中的差别不大(想想磁盘上的交换空间)。它只是交付给客户,然后编译"或编译然后交付给客户端或交付给客户端以允许它在执行前每次执行离线或需要下载,其优点是客户端总是获得最新版本而没有任何部署麻烦。

它在源代码中提供并在客户端上解释/编译的原因是它被认为是Web应用程序的成功因素之一,源代码可供所有人使用。缩小使源几乎与编译一样难以理解,但不知何故它启发了开源世界。设计新网络语言的公司/人员担心没有这个"功能"他们的孩子可能不会飞。

浏览器中的LLVM适用于那些认为编译代码更有利的人。

你不能指望事情就是这样,因为它是唯一合理的方式。 我们今天所拥有的是thousendfold调整现有技术以及许多悲伤和/或幸运事故。

希望这有点帮助。