如果没有eval(),JavaScript可以编译成二进制文件吗?
从我读到的所有内容来看,似乎唯一提到的阻止JavaScript编译一次、到处运行(或者至少每个浏览器都运行)的是愚蠢的如果没有eval(),JavaScript可以编译成二进制文件吗?,javascript,compiler-construction,performance,Javascript,Compiler Construction,Performance,从我读到的所有内容来看,似乎唯一提到的阻止JavaScript编译一次、到处运行(或者至少每个浏览器都运行)的是愚蠢的eval()语句。JavaScript还有什么让这成为不可能的壮举吗 与其浪费所有这些时间,在每台计算机和每台浏览器上,JIT和下载多个源代码文件,我更希望看到一个浏览器使用更少的字节、更少的连接和快速优化的代码运行JavaScript 如何做到这一点 这个问题在几个层面上都有缺陷 如果你指的是任何二进制格式(比如字节码),那么你就需要所有的JS实现来组合起来,共同制定一个标准。
eval()
语句。JavaScript还有什么让这成为不可能的壮举吗
与其浪费所有这些时间,在每台计算机和每台浏览器上,JIT和下载多个源代码文件,我更希望看到一个浏览器使用更少的字节、更少的连接和快速优化的代码运行JavaScript
如何做到这一点 这个问题在几个层面上都有缺陷
architecture*OSs
转换为architecture*OSs*浏览器
可执行文件)不过,这并不是真的浪费那么多时间。JavaScript引擎运行JavaScript的时间要比解析JavaScript的时间多得多。理论上,您可以将JavaScript编译成机器代码,这有点像是将JavaScript引擎与脚本本身一起嵌入,比如自解压ZIP文件之类。我没有看到advantag标记你可以使用
eval
编译代码,你只需要访问eval
的实现。这不仅仅是理论。Cython编译Python(这是一个近乎完美的Python超集,带有与C接口的扩展).和几个Lisp实现静态编译,尽管我不知道它们是否对eval
的使用有任何限制。Javascript被解释为未编译,但许多开发人员使用压缩器来减少在线文件的大小。一些压缩器(如YUI)当代码包含eval
语句时,拒绝使用作用域变量名。但是,如果您确信eval
语句不会受到影响,您可以使用window.eval
来规避这种保护。@samshull有一些东西是即时编译器,所有主要的工程都使用它ines目前正在显著加快JavaScript的执行速度,因此您现在在浏览器上运行的JavaScript可能非常有用compiled@yi-jang,你的建议基于这样一个想法:编译后的代码可以被信任,不会造成任何数量的恶意副作用,包括(但不限于)内存泄漏和缓冲区溢出。但总是感谢Chromium的回答——但我绝对不是在暗示我们放弃浏览器作为平台的所有好处(沙箱、从操作系统/体系结构抽象、标准),但只是询问是否有更有效的方法将JS从服务器传递到客户机,再传递到计算机堆栈。(因此,我建议每个浏览器使用二进制文件)至于字节码比缩小的JS的大小增益很小-这很好,但我无法想象平均程序的字节码比其源代码大。@Jeff:嗯,我认为这仍然需要大量的工作,几乎没有什么好处。至于字节码