为什么HTML/JavaScript/CSS不是编译型语言,它们会成为编译型语言吗?

43
为什么HTML/JavaScript/CSS没有成为编译语言(或者甚至融合成为一个单一的编译语言)?如果浏览器运行“浏览器虚拟机”,并且可以将HTML/JavaScript/CSS源代码编译成“浏览器字节码”,这会对开发人员和用户有帮助吗?
我能看到几个挑战:
  1. 如何处理无数现有页面?使编译变成可选,如果需要可以使用传统的HTML。如果您想将编译后的页面提供给浏览器,只需使用.chtml等扩展名。
  2. 搜索提供商如何索引页面?制作一个反编译器,将字节码反编译为原始源代码(例如Flash可以被反编译)。或者搜索提供者可以使用相同的虚拟机并从中获取所需数据。
  3. 如何让它与所有浏览器兼容?由一个集中的开发人员(比如说w3c)来开发这个虚拟机,然后每个浏览器都将其嵌入其中。
但是好处又如何呢:
  1. 速度更快。
  2. 体积更小。
  3. 不再有“松散”和“半正确”的HTML,它要么正确要么不能编译。
  4. 在每个(受支持的)浏览器中看起来都相同。
如果不是字节码,那至少应该有一些本地压缩功能,HTML可能不是数据存储的最有效方式。我知道有gzip,但为什么要在服务器上每次压缩页面并在浏览器中解压缩,如果我们可以对其进行一次压缩并将其提供给浏览器呢?
那么是什么阻止我们走这条路(除了需要巨大的努力来使所有事情发生)?

5
我修改了标题和正文,将“interpreted”一词更改为“compiled”:我认为您的意思是“compiled”。如果我错了,请原谅我(并撤销我的编辑)。 - ChrisW
你说得很对。我是一名网站开发者,最近遇到了许多问题,也许你的想法可以解决这些问题。 - Tony C
当我们在抱怨时...请也让CSS面向对象!它们应该是可嵌套的...这将大大加速查找表过程... - ansiart
1
“在每个(支持的)浏览器中看起来都一样”不是通过编译获得的。因为现在每个浏览器都会以不同的方式实现字节码的解释。 - B T
六年过去了,这个问题仍然很重要。如果大部分内容都被编译,加载速度可以得到如此之大的提升。这样就会减少黑客攻击的空间。同时,开发环境也会更加友好,运行、测试并在浏览器中作为独立的“构建”将其呈现出来也会更加容易。 - curls
@Theuserwithnohat 是正确的。Wasm,即WebAssembly,正在作为编译后的Web标准进行开发。http://webassembly.org/ - Jordan Stewart
9个回答

19

啊,但JavaScript正在成为一种编译语言。看看带有TraceMonkey的Firefox 3.5。与嗯你知道谁的浏览器相比,它非常快。JS永远不会成为C,但它是一种比C更动态的语言,在许多方面使它更具表现力和强大性。

就HTML而言,我认为HTML的无效并不会对速度造成巨大影响。我认为组合视觉表示并操作DOM的引擎需要得到极大改进(嗯,IE,我说的就是你……)。CSS的兼容性需要得到改善,CSS本身也需要变得更加强大。(使用CSS3吧!)

但我确实认为Firefox和Chrome的速度将会得到大幅提升,以至于人们真正开始将其用于主流应用开发。很有趣。Adobe似乎正在将Flash作为他们的动态Web内容平台进行销售,微软正在通过Silverlight来销售动态Web内容,而Google只想通过改进HTML和JavaScript来显示动态Web内容。到目前为止,Google在这方面做得非常好,我必须承认...


不要忘记提到JavaFX作为Sun公司选择的动态Web(无处不在)内容... - Xn0vv3r

4
你的想法在应用于JavaScript时是有效的。正如其他人已经注意到的,一些供应商正在尝试将这些原则应用于JS。谷歌宣布的Chrome OS也可能会在这方面迈出重要的一步。然而,就(X)HTML和CSS而言,我认为你的想法可能没有抓住重点。
全球网不是一个有问题和不一致的应用平台,而是一个庞大而前所未有的互联文件集合。网络的力量在于从常常呈现为僵硬(且易碎)的视觉布局和越来越复杂的页面功能中抽象出数据,这主要通过JavaScript实现。使用(X)HTML对这些页面进行编码是使它们能够被尽可能广泛的受众(无论是浏览器还是技术知识水平)访问的理想方式。
越来越多地,网络被用作应用程序平台,这是这项技术强大而令人兴奋的用途,但我们不能忘记这些基于Ajax的“Web 2.0”应用程序只是具有扩展功能的文档。对于文档来说,编译是没有意义的,压缩已经在发生(通过gzip等方式)。
更实际的是,W3C行动缓慢,浏览器供应商在支持未完成规范的实验性功能和支持已经存在多年且广泛使用的其他规范之间轮流等待。整个过程就像赶猫一样。我不会对他们很快进行你提出的重大改变抱有期望。

3

由于HTML和CSS不是代码,所以它们不能被编译。谷歌Chrome的V8引擎实际上会将JS转换为字节码,其他渲染引擎也会效仿!

http://code.google.com/apis/v8/design.html

我们最近改进了一个我帮助创建的php模板系统,使用minify压缩多个JS和CSS文件为每个文件一个,看到文件大小降至原始组合大小的约20%。 minify还执行gzip和缓存,因此对于加速网站真的非常棒。

http://code.google.com/p/minify/

简而言之,您无法编译非代码,HTML和CSS就是其中之一。JS可以被编译,并且开始被编译,但所有这些都取决于浏览器想要做什么。
浏览器只需要关注支持Web标准。浏览器越多这样做,我们Web开发人员的头痛就越少。我对YouTube公开放弃对IE6的支持感到非常满意。我们需要更多这样的行动来推动Web向前发展。

4
也许HTML和CSS无法编译,因为它们不是真正的计算机语言,但它们肯定可以被令牌化成紧凑形式或捆绑在一起。(不确定它们会比服务器压缩后提供的大小更小,但如果它们不是字符串,可能会更快地解析。) - Nosredna
2
HTML和CSS是描述语言,可以通过像JavaScript这样的编程语言表示。您可以像编译JSON一样轻松地编译HTML(即在JavaScript上下文中)。 - B T
2
是的,没有严格的定义说JavaScript是代码,而HTML和CSS是“非代码”。 HTML / CSS可以被视为DOM序列化格式,理论上你可以将你的HTML / CSS编译成中间字节码形式,以便浏览器更快地构建DOM。 - sjy
1
为什么你不能编译它呢?它基本上是XML,只是以特定的方式解释。事先进行解释工作,然后编译成某种字节码或本地代码,在运行时执行绘图和用户交互。但是在运行时进行修改将会非常麻烦。 - Erik Haliewicz
1
为了编译HTML和CSS,我们需要改变浏览器渲染引擎的工作方式。编译后的HTML和CSS字节码版本将直接与渲染引擎的API交互。是的,这些API必须标准化。我可以看到速度和灵活性方面的巨大改进。此外,我们可以看到一个不错的小革命。可能会诞生新的语言,允许编译成字节码。甚至您也可以使用C++进行前端开发!字节码也可以使搜索引擎友好。字节码的变体也可以用于闭源应用程序。 - Nahiyan

2
V8 javascript引擎(也嵌入在Google Chrome中,但它是开源和自由许可的,因此您可以在下一个编写的浏览器中使用它!)将JavaScript编译为本机机器代码-当然,它是“即时”编译(像大多数现代编译器-Java、C#等!),而不是“提前”编译(像Fortran在1954年那样,当时计算机处理执行期间的编译还太弱了)。如果最新的Firefox和Safari等其他优秀的JS引擎没有做同样的事情,我会感到惊讶。

看起来你并不提倡“将javascript作为编译语言”(因为如果你使用一个好的JS引擎,它显然已经被编译了),而是提倡对它进行“提前编译”(就像大多数现代语言基本上正在放弃提前编译一样)。把机器码而不是可编译代码传输到网络听起来像是一个非常可怕的想法——更大的体积,支持一个CPU而不是另一个CPU的困难,适当地隔离安全噩梦等等,并没有多少补偿性的好处。

话虽如此,如果你真的热衷于将机器码推送到客户端,请尝试使用nativeclient(只要客户端是x86机器-忘记了行星上的每个智能手机、许多笔记本电脑、老旧的Mac等等)——至少它承诺解决安全噩梦。如果您满意nativeclient,将即时编译器转换为提前编译器是一个更容易的技术挑战(如果您想继续使用JavaScript作为源代码而不是其他语言,当然)。


将机器码而非可编译代码传输到网络上听起来像是一个非常糟糕的想法。试想一下,如果我们不得不在机器码中进行“检查元素”,那将会是多么可怕的事情啊!实际上,如果HTML和CSS被预编译后发送到客户端浏览器,那么前端开发将成为最困难的编程工作之一。 - user31782

1

请在此处查看有关该问题的先前讨论

并非所有给出的理由都一定有效,但其中一个重要原因是,除非您是Google,否则服务器端CPU周期比客户端周期更有价值:因此,更容易让客户端编译/优化经常是动态生成的HTML / JavaScript,而不是服务器。

肯恩


1
速度。
你认为解析HTML需要很长时间,但实际上这可能与其他操作所需的时间相比微不足道,例如在最终用户窗口上布局文本所需的时间。
不再有“松散”和“半正确”的HTML。它要么正确,要么无法编译。
使用[X]HTML,您已经做到了这一点。
在每个(支持的)浏览器中看起来都一样。
您似乎在说应该只有一个浏览器,或者所有浏览器都应该平等支持它。
互联网标准并非通过单一机构(W3C)实施某项内容并将其声明为标准而形成。相反,互联网标准是由多个独立机构创建多个实现而形成的。其结果是:
- 有些人开发了尚未成为标准的东西(即他们领先于标准) - 有些人尚未开发出符合标准的东西(即他们落后于标准)

0

我认为你的想法很好,但是仍然没有办法强制执行标准。因此,如果存在不受支持的功能,整个页面很可能根本不会显示任何内容。在当前的设置中,关键信息仍然可以传递。


0

Google V8是众多新一代Javascript引擎之一,它将JavaScript“编译”成类似于.NET实时“编译”C#的伪代码。这里没有什么神奇的东西。随着Web应用程序变得越来越重、需求越来越大,预计会有更多的这种引擎出现。


0

HTML

HTML基本上就是XML。各种版本都有DTD,开发人员可以随时检查。

CSS

CSS不是一种编程语言,但我同意“编译”CSS可能会起作用,因为编译会压缩它。然而,由于CSS的支持以及任何CSS需要具备的必要hack数量,您永远无法在没有错误的情况下编译它。

JS

正如其他人所提到的,JS正在成为一种编译语言,只不过浏览器为您编译,而不是您自己编译。


1
"HTML基本上就是XML" -- 但如果你需要对它进行程序化操作,那么情况就不一样了。 - Sean McMillan
我认为JavaScript应该像Java一样在执行之前进行编译,以防止语法错误。 - 06needhamt
HTML与XML一样,也是文本。XHTML将是XML,但HTML不是。例如,考虑那些不需要闭合标签的标签。我认为应该指出JIT和AOT编译之间的区别(我认为OP正在谈论后者,而JS大多数情况下是JIT'd)。 - griffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接