Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果没有eval(),JavaScript可以编译成二进制文件吗?_Javascript_Compiler Construction_Performance - Fatal编程技术网

如果没有eval(),JavaScript可以编译成二进制文件吗?

如果没有eval(),JavaScript可以编译成二进制文件吗?,javascript,compiler-construction,performance,Javascript,Compiler Construction,Performance,从我读到的所有内容来看,似乎唯一提到的阻止JavaScript编译一次、到处运行(或者至少每个浏览器都运行)的是愚蠢的eval()语句。JavaScript还有什么让这成为不可能的壮举吗 与其浪费所有这些时间,在每台计算机和每台浏览器上,JIT和下载多个源代码文件,我更希望看到一个浏览器使用更少的字节、更少的连接和快速优化的代码运行JavaScript 如何做到这一点 这个问题在几个层面上都有缺陷 如果你指的是任何二进制格式(比如字节码),那么你就需要所有的JS实现来组合起来,共同制定一个标准。

从我读到的所有内容来看,似乎唯一提到的阻止JavaScript编译一次、到处运行(或者至少每个浏览器都运行)的是愚蠢的
eval()
语句。JavaScript还有什么让这成为不可能的壮举吗

与其浪费所有这些时间,在每台计算机和每台浏览器上,JIT和下载多个源代码文件,我更希望看到一个浏览器使用更少的字节、更少的连接和快速优化的代码运行JavaScript


如何做到这一点

这个问题在几个层面上都有缺陷

  • 如果你指的是任何二进制格式(比如字节码),那么你就需要所有的JS实现来组合起来,共同制定一个标准。不会发生的。即使如此,也不能保证您在缩小的JS上获得任何文件大小的改进,更不用说显著的改进了。将一些.py源文件的大小与我手头上缓存的.pyc字节码文件的大小进行比较,结果表明,至少CPython的字节码通常比源文件大。而且源文件甚至没有缩小
  • 如果你是指本机可执行文件。。。很难将JS编译成本机代码AOT,尤其是在编译过程中不构建整个实现,但从理论上讲这是可能的。不过,它不会带来太多性能提升,因为您无法消除动态性(至少不是静态的——JIT编译器可以做得更好),所以您必须为此付费。它还有许多缺点,使它一文不值:
  • 生成的二进制文件是特定于平台的。因此,要么你必须发送所有可能的二进制文件组合(这是浪费,需要浏览器进行额外的特殊处理),要么你必须进行嗅探,然后发送你认为合适的任何二进制文件——这会让任何不愿意免费提供大量私人信息的人发疯(通过发送错误的/完全没有价值的可执行文件)
  • 您可能会丢失沙盒。本机代码在很大程度上是一个巨大的黑盒。在浏览器中运行它还意味着浏览器将运行从不可信源获取的可执行代码-这是对恶意软件的邀请。当然,除非您将整个顶级反恶意软件套件集成到每个浏览器中。我真的需要吗进一步评论
  • 除非您为所有实现创建一个标准,允许编译的JS访问实现的所有内置项等,或者以其他方式创建一些共享代码的方式,否则最终会产生大量冗余(将整个JS实现静态链接到二进制文件中)。其结果可能比压缩的JS要大得多
  • 对于DOM集成,您仍然需要一些标准接口(当然,除非您想从
    architecture*OSs
    转换为
    architecture*OSs*浏览器
    可执行文件)
  • 甚至没有提到所有浏览器都必须支持这一点。要么以标准方式,要么各自独立。要说服所有浏览器以源代码形式支持大多数HTML、CSS和JS已经很难(而且很长时间了)。或者,你需要引入一些标准方法来检测对这一点的支持
  • 另外(如前所述),对于动态语言,JIT的性能可以和静态编译器一样好或更好。因此,很有可能(考虑到前面的一些观点,这是非常不可能的)您可以在下载(使用缩小、gzip、缓存等可以使下载变得非常小)和解析上节省一些时间(这并不是性能的大杀手),但实际运行时间也不会有显著的提高

  • 不过,这并不是真的浪费那么多时间。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:嗯,我认为这仍然需要大量的工作,几乎没有什么好处。至于字节码