Javascript Web语言执行

Javascript Web语言执行,javascript,browser,compilation,dart,virtual-machine,Javascript,Browser,Compilation,Dart,Virtual Machine,TL;博士: 嵌入在网站中的JavaScript代码如何成为在真实硬件上执行的CPU指令。 达特也是这样 嗨, 我正在努力完全理解现代网络语言流行语djungle。 基本上,我的“更高层次”编程语言是如何产生的 to执行由C和Java翻译的概念组成 C编译器将C文本作为输入并生成二进制机器代码,但 可以将内部视为前端和后端,其中前端 将C文本转换为某种IR,后端接受该IR并生成 与平台相关的机器代码。 使用Java时,由于Java编译器会转换 将Java文本转换为Java字节码(IR),然后由

TL;博士: 嵌入在网站中的JavaScript代码如何成为在真实硬件上执行的CPU指令。 达特也是这样

嗨, 我正在努力完全理解现代网络语言流行语djungle。 基本上,我的“更高层次”编程语言是如何产生的 to执行由C和Java翻译的概念组成

C编译器将C文本作为输入并生成二进制机器代码,但 可以将内部视为前端和后端,其中前端 将C文本转换为某种IR,后端接受该IR并生成 与平台相关的机器代码。 使用Java时,由于Java编译器会转换 将Java文本转换为Java字节码(IR),然后由 执行从字节码到平台依赖的实际转换的JVM 机器指令

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

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

现在有了JavaScript。就我所能做的来说,有些事情 称为JavaScript“引擎”,如谷歌V8。这东西的作用是 它接受JS文本并将其“编译”为依赖于平台的机器代码 在运行时,所有数据都存储在内存中。我把它想象成最终的结果 (说明)过程中的一些地方,然后跳转到它。 这是正确的还是我弄错了?因为有时候一个人可以阅读 关于浏览器中的JS VM

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

现在我无法从项目网站上映射这些“解释” 以我目前对语言如何从文本到 执行


谢谢你的澄清

简单地说,JavaScript和Dart在这方面与Java非常相似,区别在于前者不区分源代码和字节代码。源代码实现了这两个功能。 我不擅长这些东西,但在我的理解中,这种上下文中的VM是一个程序,它以某种语言的源代码作为输入,生成可执行的CPU指令,并让CPU执行这些指令。 这是jitted还是解释,或者两者兼而有之,这是一个实现细节

编辑
我以为你想知道更多的细节,但StackOverflow是个错误的地方。这个问题太广泛了。在更频繁出现的标签中,这个问题已经被解决了。计算机科学研究会是更合适的地方

不管怎样,你的评论是:我不认为他们做了相反的事情。它们获取程序员编写的源代码,并生成CPU可以处理的内容。不同之处在于每个步骤的完成位置以及步骤的细粒度/粗粒度。存储在磁盘或RAM中并没有太大区别(想想磁盘上的交换空间)。它只是关于交付给客户机,然后“编译”或编译,然后交付给客户机,或者关于交付给客户机,以允许它离线执行,或者每次执行前都需要下载,这样做的好处是,客户机总是获得最新的版本,而不会遇到任何部署问题

它以源代码形式交付并在客户机上解释/编译的原因是,源代码可供所有人使用被认为是web应用程序的成功因素之一。缩小使源代码几乎像编译一样不可读,但不知何故它还是启发了开源世界。设计新网络语言的公司/人们担心,如果没有这一“功能”,他们的孩子可能飞不起来

浏览器中的P>LLVM是那些认为编译代码更有利的人。

你不能期望事情是这样的,因为这是唯一合理的方法。 我们今天拥有的是千倍于现有技术的改进,再加上许多不幸和/或幸运的事故


希望这能有所帮助。

谢谢你的回答,但我必须诚实地说:这让我仍然像网上所有的抽象话题一样不满意。如果他们做了完全相反的事情,他们怎么会“非常相似”?Java可以将编译结果保存在磁盘上,甚至可以使用jar文件预编译。为什么我们发送嵌入在网站中的原始源代码,而不是只发送字节码/预编译代码?它真的发生在记忆中吗?如果它们直接映射到机器代码,为什么它们提供“虚拟机”而不是编译器。。。我扩展了我的答案。冈特是一个圣人,因为他如此广泛地回答了这个问题。正如他所说,它对于堆栈溢出来说实在太宽了。我建议你读一篇关于虚拟机这个术语的文章,如果你真的感兴趣的话,去上一门入门课程/读一本关于计算机科学的入门书。我的错。我认为“Stack Overflow是一个面向专业和热心程序员的问答网站”。下一次我会问构造器是做什么的,或者什么时候需要虚拟析构函数,因为这些东西不在网络上。。。无论如何,谢谢你,甘特!我找到了我要找的东西。以下文件的“JIT编译”部分: