一切皆为JavaScript_最新动态_新闻资讯_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 新闻资讯 > 最新动态 > 一切皆为JavaScript

一切皆为JavaScript

 2013/11/5 17:36:46    程序员俱乐部  我要评论(0)
  • 摘要:JavaScript起源于Netscape公司的LiveScript语言,这是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验HTML表单输入的正确性。早些年,JavaScript由于其复杂的文档对象模型(DOM)、糟糕的实现和调试工具、不一致的浏览器实现而不受开发者的待见。而随着技术的发展,JavaScript变得越来越的强大、完善,比如,Ajax技术可以创建更加迷人的Web应用,Node.js将JavaScript的应用范围扩展到了服务器端
  • 标签:Java javascript
class="topic_img" alt=""/>

  JavaScript 起源于 Netscape 公司的 LiveScript 语言,这是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验 HTML 表单输入的正确性。

  早些年,JavaScript 由于其复杂的文档对象模型(DOM)、糟糕的实现和调试工具、不一致的浏览器实现而不受开发者的待见。而随着技术的发展, JavaScript 变得越来越的强大、完善,比如, Ajax 技术可以创建更加迷人的 Web 应用,Node.js 将 JavaScript 的应用范围扩展到了服务器端,各种层出不穷的框架使得 JavaScript 的开发更加简捷,尤其是近几年 HTML5 的出现,将 JavaScript 提升到了前所未有的高度。

  如今 JavaScript 已经变成了 Web 开发必备的语言,甚至开始逐步向移动领域渗透,由于 JavaScript 的跨平台特性,使得它在移动互联网时代有更大的作为。

  凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写。——Atwood 定律(Jeff Atwood 在 2007 年提出)

  不会 JavaScript 怎么办?

  如今 JavaScript 已经成为了 Web 开发的“标配”语言,不管你喜不喜欢,在 Web 开发中,必定要涉及到 JavaScript。JavaScript 可以实现真正的“一次编写,到处运行”,并可以控制所有常用的浏览器,因此,JavaScript 还被称作“Web 的虚拟机”以及“Web 上的汇编语言”。

  尽管如此,但是如果你还没开始学习 JavaScript,这也不影响你编写 Web 应用。你完全可以用你喜欢的语言(Java、.NET、C/C++、Python、Ruby……)来编写应用程序,然后将它们编译为 JavaScript 语言,然后再运行于浏览器上。

  如果你对 JavaScript 的语法不满意,你也可以使用一些 JavaScript 的增强版语言。比如,如果你更喜欢经典的面向对象方式,并想要一些语法糖,那么你可以试试 CoffeeScript;如果你希望有一个更严格的类型系统,那么你可能会发现 Dart 或 TypeScript 更有趣一些;如果你更喜欢函数式编程,那么 ClojureScript 或 Roy 可以帮助你。

  将你擅长的语言编译为 JavaScript

  将 Java 代码编译为 JavaScript

  尽管 JavaScript 名字中包含“Java”,实际上 JavaScript 和 Java 没有任何关系,只是由于当时 Java 火得一塌糊涂,为了借助 Java 的名气来推广,就起名为 JavaScript 了。

  各种强大的工具的出现,使得 JavaScript 代码和 Java 代码之间有了一定的联系,就是可以将 Java 代码编译为 JavaScript 代码,以便在浏览器中运行。当然,除了 Java 外,其他基于 JVM 的语言都可以如此做。

  可以实现此类操作的工具如下。

  • BicaVM:一个使用 JavaScript 实现的 JVM,可以运行 60% 的 Java 字节码
  • Ceylon:一个可编译为 JavaScript 的、模块化的、静态类型 JVM 语言[*]Doppio:一个使用 Coffeescript 实现的 JVM,使得 Java 程序可以运行在任何 JavaScript 引擎上[*]GrooScript:一个可以将 Groovy 代码转为 JavaScript 代码的小框架
  • j2js:可以将 Java 字节码转换为 JavaScript 代码
  • Java2Script:Eclipse 中的 Java to JavaScript 编译插件,并实现了一个 JavaScript 版的 Eclipse SWT
  • Kotlin:可以编译为 JVM 字节码和 JavaScript 的静态类型编程语言
  • Processing:一个基于 Java 的可视化语言,可以编译为 JavaScript
  • STJS:Strongly-Typed JavaScript(强类型的 JavaScript),一个可以将 Java 源码转换为 JavaScript 代码的 Maven 插件

  将C/C++代码编译为 JavaScript

  C/C++如今也可以用来编写 Web 应用程序,同样可以将它们编译为 JavaScript。一些工具如下。

  • Emscripten:Mozilla 开发的 LLVM 后端,可以将任何通过 LLVM 前端(比如C/C++ Clang)生成的 LLVMIR 中间码编译成 JavaScript 代码。
  • mala:可以将 vala 代码(vala 代码在编译时,首先会编译为C代码)编译为 JavaScript
  • Mandreel:可以将 C++ 和 Objective-C 代码编译为高度优化的 JavaScript 源码
  • Clue:一个C语言编译器,可以将C语言代码编译为高质量的 Lua、Javascript 或 Perl 代码。

  由于 Emscripten 可以将 LLVM 二进制代码编译成 JavaScript,LLVM 是一种很流行的中间编译格式,几乎所有语言都有 LLVM 编译器,因此 Emscripten 也可以作为大部分语言转换为 JavaScript 的通用工具。

  将 Python 代码编译为 JavaScript

  可以使用如下工具将 Python 代码编译为 JavaScript 代码。

  • Brython:用于替换网页上的 JavaScript 代码,允许使用 Python 来编写脚本,并直接在网页上执行
  • PYXC-PJ:可以将 Python 转换为 JavaScript,并会产生一个行/列号映射文件
  • Pyjaco:可以将 Python 转换为 JavaScript
  • Pyjamas:Python to JS 转换器
  • Pyjs:Python to JS 转换器
  • PyCow:可以将 Python 代码转换为 MooToolsJS 代码
  • PyvaScript:一个类似于 Python 语法并拥有 JavaScript 特性的编程语言
  • RapydScript:增强版的 PyvaScript
  • Skulpt:客户端的 Python

  将 Ruby 代码编译为 JavaScript

  在 Ruby 领域,有一个使用 JavaScript 实现的 Ruby 标准库—— RubyJS,它实现了 Ruby 中的所有方法,如 Array、Numbers、Time 等。Ruby 之父松本行弘称“如果我必须编写 JavaScript 代码,我会使用 RubyJS”。

  另外,你也可以使用如下工具将 Ruby 代码编译为 JavaScript 代码。

  • 8ball:一个可以将 Ruby(或 Ruby 子集)的源码转换为 JavaScript 源码的编译器
  • ColdRuby:一个 Ruby 1.9 MRI 字节码编译器和 JS 运行时,包括一个 C++ 运行时以及用于本地执行的 V8 引擎
  • HotRuby:可以在浏览器内部或 Flash 平台上运行由 YARV 编译的 Ruby 操作码
  • Opal: 一个 Ruby to JavaScript 编译器,可用于任何 JS 环境
  • rb2js:一个 Ruby to JavaScript 编译器
  • Red:允许你以 Ruby 的方式编写代码,然后以 JavaScript 的方式运行代码

  将 .NET 代码编译为 JavaScript

  你可以使用如下工具将C#、F#以及其他 .NET 代码编译为 JavaScript 代码。

  • Apps in Motion:允许使用 C# 来构建可以运行在任何设备上的 Web 应用程序
  • Blade:一个 Visual Studio 扩展,可以将 C# 代码转换为 JavaScript
  • FunScript:可通过 TypeScript 的类型提供器将F#代码转换为 JavaScript 或 JQuery 代码
  • jsc:可将 .NET 程序重新编译为 JavaScript、ActionScript、PHP 或 Java 程序
  • JSIL:可将 MSIL(.NET 字节码)转换为 JavaScript
  • NemerleWeb:可将 Nemerle 语言(微软的多范型语言)编译为 JavaScript
  • Pit:可将F#代码编译为 Javascript
  • Prefix(开发中):可将 C# 代码编译为 Javascript
  • Saltarelle:可将 C# 代码编译为 Javascript
  • SharpKit(商业工具):可将 C# 代码编译为 Javascript
  • Script#: 可将 C# 代码编译为 Javascript
  • WebSharper:可将F#代码编译为 Javascript.

  将 Scala 代码编译为 JavaScript

  你可以使用如下工具将 Scala 代码编译为 JavaScript 代码。

  • Scala.js:一款将 Scala 编译为 JavaScript 的编译器,支持全部 Scala 语言特性,允许开发者用 Scala 开发从前端到后端的 Web 应用
  • js-scala:在 Scala 中将 JavaScript 作为嵌入式的 DSL 语言
  • Scala+GWT:通过 GWT 工具链将 Scala 代码编译为 JavaScript 语言

  将 Flash 转换为 JavaScript

  HTML5(HTML/JavaScript/CSS3 技术组合)的最大对手就是 Flash,尽管目前 Flash 的市场份额还高居 70%,但也不可否认,未来将是 HTML5 的天下。

  就连 Flash 的开发商 Adobe 也开始拥抱 HTML5,并发布了 Toolkit for CreateJS 工具,方便 Web 开发者将 Flash 转换为 HTML5 格式。

  去年,Google 曾发布了一套基于网页的的工具——Swiffy,在线即可将 SWF 格式的 Flash 文件转化为 HTML5 格式。

  除了转换外,Mozilla 还推出了一个新的解决方案——Shumway,这是一个“基于 JavaScript 的 Flash 虚拟机和运行时”,目的是在浏览器中构建一个可靠有效的 SWF(Flash 文件格式)渲染器,无需插件直接在浏览器中运行 Flash。

  由此可见,这些工具将进一步加速 HTML5 取代 Flash 的步伐。

  其他编译工具

  • Go2js:可以将 Go 代码行到行地编译为 JavaScript 代码
  • Perlito:可以将 Perl 5/6 代码编译为 JavaScript、Ruby、SBCL 和 Go 语言代码。

  编译为 JavaScript 后的问题

  调试问题

  由于是交叉编译,导致输出的代码很难被跟踪调试。

  一些工具在编译的过程中会生成映射文件(将编译后的 JavaScript 代码映射到源语言),可以通过这些文件来进行调试。

  性能问题

  由于 JavaScript 在浏览器中运行问题,本地代码编译为 JavaScript 后的执行速度可能会下降。

  对于此类问题,Mozilla 给出了一个解决方案—— asm.js(见《 asm.js:JavaScript 的“汇编语言”》)。asm.js 是一个 JavaScript 的一个严格的子集,提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等,可以被用来作为一个底层的、高效的编译器目标语言。

  此外,还可以使用 Mozilla 开发的 JavaScript 引擎 OdinMonkey 来获得更快的执行速度。开发者可以将编写的代码编译为 JavaScript,然后手动编写为 asm.js 代码,当浏览器执行该程序时,OdinMonkey 引擎会让程序的执行速度更接近于本地应用。Mozilla 未来可能会开发一些工具(类似于 LLJS)来自动生成 asm.js 代码。

  随着技术的发展,未来 JavaScript 也许会跑得和 native C 一样快。

  一些演示

  2012 年,Mozilla 曾推出一款 Web 版的第一人称射击游戏演示 BananaBread,今年 5 月份,Mozilla 宣布与 Epic Games 合作将虚幻引擎3(C/C++实现)移植到浏览器上,并发布了基于虚幻引擎 3 的 HTML5 演示游戏 Epic Citadel,这些游戏都是基于 WebGL、 Emscripten 和高性能的 JavaScript 子集 asm.js 实现,重新定义了 3D 游戏在浏览器中运行的性能,展示了高端游戏也可以很容易地移植到 JavaScript 和 WebGL 平台,同时不失性能和画面效果。

  Mozilla 的另一款支持多人在线的 HTML5 游戏—— BrowserQuest。

  随着 HTML5 新特性 Full Screen API、Gamepad API 和 Mouse Lock API 的完善,浏览器或将成为未来游戏的新战场。

  增强版的 JavaScript

  JavaScript 大量的扩展,在很大程度上弥补了 JavaScript 某些方面特性的不足。比如你可以使用如下这些工具或扩展来让 JavaScript 更强大。

  安全性增强

  • ADsafe:提供了客户端静态验证功能和相关的 API,增强第三方脚本的安全性
  • Caja:可以将传统的 HTML 和 JavaScript 转换为安全限制的 JavaScpit 格式
  • Dojo Secure:用于构建安全混搭应用的框架
  • FBJS:Facebook 的 JavaScript 工具,用于编写 Facebook 小插件
  • Jacaranda:支持对象的静态验证器
  • Gatekeeper:一个 JavaScript 密码保护脚本
  • Microsoft Web Sandbox:通过隔离来保证安全性

  静态类型特性

  • JSX:一个更快、更安全、更易用的 JavaScript 替代品
  • Elm:类型安全的函数式语言,可编译为 HTML、CSS 和 JavaScript.
  • Lambdascript:一个强类型的纯函数式原型语言
  • MileScript:一个类似于 C# 和 Java 的强类型语言,可编译为 JS
  • SafeJS:为 JavaScript 增加了语法糖
  • Mascara:为 JavaScript 增加了强大的功能,比如类、命名空间和类型检查等
  • Roy:函数式语言,与 JavaScript 语义保持接近,拥有类型推断、结构类型、sum 类型、模式匹配

  JavaScript 的衍生品

  JavaScript 如今在 Web 开发界的地位无法撼动,但是仍不断有一些新的语言出现,希望能够通过提供更强大、更完善、更优雅的特性来代替 JavaScript。

  • CoffeeScript: CoffeeScript 是一个使用纯 Ruby 编写的编程语言,只使用了 JavaScript 的“精髓”,抛弃了原来 JavaScript 晦涩、容易出问题的部分,如全局变量声明、with 等。并提供了很多语法糖,让代码更优雅可读。
  • Dart:Google 推出的一种基于类的可选类型化编程语言,可以在原生虚拟机中直接运行,也可以用编译器将 Dart 代码翻译成 JavaScript 代码。
  • TypeScript:JavaScript 的一个超集,添加了可选的静态类型和基于类的面向对象编程。
  • ClojureScript:由 Clojure 的创建者 Rich Hickey 推出,目标是“做 Javascript 所能做到的事情”,代码可编译为 Javascript。
  • IcedCoffeeScript: Coffeescript 语言的扩展集,添加了 2 个关键字 await 和 defer,为浏览器和服务器两者提供了强大的异步控制功能。
  • LiveScript: Coco 的一个分支,是 CoffeeScript 的间接子集,并在面向对象和命令式编程方面进行了诸多改进,代码可以编译成 JavaScript。
  • Kaffeine:JavaScript 语法的扩展,与 JavaScript 非常类似,代码可以直接编译成 JavaScript。

  更多工具可参见: http://altjs.org/

  最后

  几乎所有主流的语言都可以编译为 JavaScript,进而能够在所有平台上的浏览器中执行,这也体现了 JavaScript 的强大性和在 Web 开发中的重要性。此外,互联网中还存在大量的工具,使得这些语言可以与 JavaScript 进行互操作,我们将在以后的文章中详细介绍

  以上这些工具中,大部分都是开源项目,如果感兴趣,你也可以通过源码来了解这些语言之间进行转换的相关原理和技术。

发表评论
用户名: 匿名