阅读更多

28顶
2踩

Web前端

原创新闻 一切皆为JavaScript

2013-11-05 11:26 by 副主编 wangguo 评论(19) 有25022人浏览
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,为浏览器和服务器两者提供了强大的异步控制功能。
  • LiveScriptCoco的一个分支,是CoffeeScript的间接子集,并在面向对象和命令式编程方面进行了诸多改进,代码可以编译成JavaScript。
  • Kaffeine:JavaScript语法的扩展,与JavaScript非常类似,代码可以直接编译成JavaScript。

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

最后

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

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

  • 大小: 50.1 KB
28
2
评论 共 19 条 请登录后发表评论
19 楼 向左走向右走 2013-12-24 18:14
牛逼的语言啊,赞一下
18 楼 为它一生奉献 2013-12-15 14:28
mark一下
17 楼 doccent 2013-12-12 22:27
收藏一下。
16 楼 java6ean 2013-12-10 13:28
真丰富啊
15 楼 alafighting 2013-12-07 20:14
这、这、这、简直强大的一塌糊涂!!!
14 楼 baukh789 2013-11-16 11:42
JS用起来还是蛮方便的,我是从JAVA转的前端。JAVA和JS都会用到,我比较喜欢JS,至于维护,写的好了一样好维护。
13 楼 hardPass 2013-11-11 00:13
人类社会前进的脚步,被javaScript阻碍了10年
12 楼 LinApex 2013-11-08 17:43
game over
11 楼 rmzdb 2013-11-08 09:53
以后js的动态编译  讲非常方便了。。。。。。
10 楼 chptcleo 2013-11-07 11:25
JavaScript, 让人蛋疼的语言
9 楼 focusjust 2013-11-06 17:36
不明觉厉
8 楼 witcheryne 2013-11-06 11:09
dsjt 写道
求:Java编译成 JS 的教程

看GWT

yixiandave 写道
js的语法真心蛋疼,现在也只能得过且过了。。CoffeeScript能直接在页面运行吗?

哎...
7 楼 dsjt 2013-11-06 09:32
求:Java编译成 JS 的教程
6 楼 yixiandave 2013-11-06 09:05
yugouai 写道
JS从其他语言编译过来,后续维护的人不就要死了...

这才是重点
5 楼 white_crucifix 2013-11-05 16:01
求javascript编译到javascript的工具!
4 楼 yugouai 2013-11-05 14:58
JS从其他语言编译过来,后续维护的人不就要死了...
3 楼 yixiandave 2013-11-05 14:53
js的语法真心蛋疼,现在也只能得过且过了。。CoffeeScript能直接在页面运行吗?
2 楼 damoqiongqiu 2013-11-05 14:23
所有东西都可以编译成JS 但是真正能投入工程实践的不多。
1 楼 wchaowu 2013-11-05 13:15
呵呵,javascript是最有性价比的语言,本人的javascript开源项目 http://vbooking.github.io/

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • oracle 单机版静默安装

    使用静默方式安装oracle,无需安装Linux桌面环境,文档可用

  • 打包oracle客户端的两种方法

    最近在项目中遇到了这样一个问题,如何将Oracle客户端打包到安装程序里直接安装。这样就不必单独安装Oracle Client啦看了网上一些热心朋友的介绍,通过我们自己的实践总于用以下两种方法搞定了! 方法一:oracle9i客户端的打包 文件目录(假设放在c:\下) 文件夹bin中放置必须的dll文件和oracle.key文件(必须),可以从安装好的oracle的bin目录中copy,目录如下...

  • oracle客户端打包总结

    oracle9i客户端的打包 文件目录(假设放在c:/下) 文件夹bin中放置必须的dll文件和oracle.key文件(必须),可以从安装好的oracle的bin目录中copy,目录如下:     文件夹admin中放文件sqlnet.ora和tnsnames.ora,其中tnsnames.ora是设置要连接的服务器的,内容如下: FZGA.FZUBGIS.COM =   (

  • 如何用VS2008打包发布含Oracle数据库客户端的程序

    这些天来帮导师做一个用了oracle数据库的winform程序,快要竣工了,琢磨怎么打包发布,网上资料前篇一律,为此深刻鄙视那些复制粘贴的文章,简直浪费搜索页面,本文借鉴过部分网上资料,但是绝对是亲身试用过的。 进入正题: 一 建立安装程序项目:右键解决方案->添加->新建项目,在弹出的新建项目面板中选择 其他项目类型->安装和部署,在模板...

  • 如何把应用程序程序和ORACLE客户端一起打包

    google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//<script type="text/javascript"

  • oracle应用程序实现打包

     Oracle客户端精简后的文件,可以实现数据库的通信,直接和软件打包:第一步:拷贝文件:主要是四个目录:bin,nls,oracore,NETWORK。文件清单如下(bin下面dll部分是最精简的结果,除了nls的其他部分可以全部拷贝,因为本身文件不大):D:bin/orauts.dllD:bin/oraunls10.dllD:bin/orasrvmhas10.dllD:bin/

  • Oracle client 免安装打包及使用说明

    在winform程序发布中,最让人讨厌的莫过于进行client环境安装了,虽然oneclick发布解决了发布的问题,但是oracle client安装依然是经常要独立处理的项目,免安装打包提供了次便利

  • Oracle 11g 精简客户端打包 2012-06更新

    Oracle Instant Client 11.1.06.20 可以免费分发的Oracle精简客户端 By ZhaHost in 2010.06.18 2012.05.18 重新打包,采取原生的odac xcopy方式 可连接8.1.7以上的Oracle数据库 内容来源: 用于Windows 的Oracle 数据访问组件(ODAC) 本安装包仅供NSIS交流与学习使用。 版权所有 © 2008,Oracle。保留所有权利。 本安装包主要考虑到Oracle分布式事务Oramts而制作的,因为CSLA.NET要使用到分布式事务,本安装包包含以下内容: 1. Oracle精简客户端 2. Oracle Oledb组件 3. Oracle odp.net2.x组件 4. Oracle Oramts组件(需要启用MSDTC服务)

  • 如何把应用程序和Oracle客户端一起打包

    <br /><br />如何把应用程序和Oracle客户端一起打包 <br /> <br />作者:010032 时间:2007-06-20 16:08 出处:ccidnet.com 责编:月夜寒箫 <br /> <br />              摘要:如何把应用程序和Oracle客户端一起打包 <br /> <br /> <br /> <br /> <br />做程序的时候,经常会需要安装Oracle的客户端,如果客户终端非常多的时候,这就会是一项很麻烦的工作,一方面要安排我们的应用程序,另一方面要

  • go操作oracle详细

    这几天在用java写操作Oracel的程序,由于种种原因,Oracel未提供官方Go驱动。 在github上搜索了N多驱动,oci8,ora,等等,太多了,已经记不清下了多少个包了。 最终发觉能用的是jzaikovs\ora。 下面是遇到的问题及解决办法:      1。oracle库中Number(19)这种长度的数据,读取时会科学计数法,而且精度丢失3位,           可...

  • 用Oracle Instant client 打包Oracle客户端

    做了一个C#和Oracle 的系统,想到每个客户端还要装Oracle客户端确实很麻烦,于是上网搜索,是否有不装客户端的方法,还真不错,Oracle也早就想到了这个问题。在他的网站上已经提供了各种版本的简化客户端,只有几十兆的大小,简单配置就可以连接了。下面我就说说我实现的过程。 首先构建如下的目录结构 去Oracle的网站下载instantclient-basic-win32-10.2...

  • oracle不需要安装客户端通过vs链接数据库

    今天来谈下oracle的一个类库      相信很多朋友写程序多少都要链接数据库,oracle数据库在链接的时候需要用到oracle客户端的类库才能连接,这样写出来的程序使用起来非常的不方便,首先需要安装oracle的客户端,还要配置tnsname.ora文件,这样你写的程序才能连接oracle数据库。下面我就来介绍一种不需要安装oracle客户端,vs写出来的程序一样可以连接oracle数据库

  • Oracle 11G Client 客户端安装步骤(图文详解)

    oracle2010 http://www.cnblogs.com/jiguixin/archive/2011/09/09/2172672.html 下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 先将下载下来的ZIP文件解压,并运行setup.exe

Global site tag (gtag.js) - Google Analytics