你能用V8编译JS代码并直接将它提供给Chrome吗?

时间:2018-02-18 17:49:07

标签: javascript google-chrome compilation v8

我正在寻找一种方法来保护某些javascript代码免于阅读/修改。我知道很多人认为这是不可能的,但仍然......

据我所知,Chrome的V8引擎在看到JS代码时会进行一些优化,可能会编译它(?)然后运行它。

所以我想知道是否可以使用V8的C ++ api将JS代码编译成机器代码/ chromecode,然后直接将其提供给Chrome(我不关心其他浏览器) ? 据说它不仅会更快,而且非人类可读,就像ASM一样。

这可能吗?

WebAssembly正在做这件事,所以我不明白为什么我们不能用JS代码来做这件事。 还有EncloseJS和pkg正在做类似的事情。

3 个答案:

答案 0 :(得分:1)

V8开发者在这里。不,不可能提前编译JavaScript并仅将编译后的代码发送到浏览器。 V8(以及其他类似虚拟机)包含编译器,但它们不能用作独立编译器来生成独立的二进制文件。

理论上,您可以将JavaScript编译为WebAssembly - 理论上可以将任何两种图灵完备的编程语言相互编译。据我所知,今天没有这样的编译器。其中一个重要原因是最终结果的表现会很糟糕(详见Andreas Rossberg的讨论);因此,考虑到浏览器可以直接执行JavaScript,人们几乎没有理由开发这样的东西。 (这也是一项艰巨而艰巨的任务。)

至于你声明的目标:尽量使JavaScript代码不可读是为了缩小它。实际上,这实际上与生成汇编的想法一样好,因为存在将汇编转换为缩小的高级语言代码的反汇编程序;他们无法重建变量名称或注释(因为这些信息在编译过程中会丢失),但它们可以重建程序逻辑。

答案 1 :(得分:0)

WebAssembly没有这样做。不,它也不可能。 Web应该是独立于浏览器和硬件的。

此外,像JS这样的语言如果离线编译会更快 - 它只是接近快速的东西,因为它是动态编译和优化的,考虑到动态的配置文件信息。

答案 2 :(得分:0)

我最终要做的是将一些逻辑从JavaScript转移到C ++,然后将其编译到NodeJS本机模块中(Electron应用程序可能实现这一点)。

它运行良好,速度非常快,源代码已得到尽可能的保护,但是您可能需要担心跨平台问题,而且编译/链接可能会有些麻烦,但是除此之外,这很棒。