一切皆为JavaScript

原标题:工程师亲述在 Google 从事 TypeScript 工作的独家体会!

Java虽然是很受欢迎的语言,但是并不适合所有人,那么有哪些替代方案呢?本文将分析5种Java替代方案。

AngularJS | Closure | Google Web Toolkit | Dart | Polymer

图片 1

图片 2

style=”font-size: 16px;”>【CSDN编者按】多年来,Google为了开发大型Java应用程序而构建了大量基础架构。

style=”font-size: 16px;”>今天,就来听听在Type上工作了两年多的Google软件工程师Evan
Martin,对此有什么心得体会吧!

图片 3

GWT

Google Web Toolkit (GWT) 是一种开源 Java 软件开发框架,可以使不会使用第二种浏览器语言的开发人员编写 Google 地图和 Gmail 等 AJAX 应用程序时更加轻松。GWT 可在使您避免这些麻烦的同时,还为您的用户提供同样的与标准兼容的动态体验。您只需使用 Java 编程语言编写您的前端,GWT 编译器会将您的 Java 类转换为与浏览器兼容的 JavaScript 和 HTML。

JavaScript起源于Netscape公司的LiveScript语言,这是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验HTML表单输入的正确性。早些年,JavaScript由于其复杂的文档对象模型、糟糕的实现和调试工具、不一致的浏览器实现而不受开发者的待见。而随着技术的发展,
JavaScript变得越来越的强大、完善,比如,
Ajax技术可以创建更加迷人的Web应用,Node.js将JavaScript的应用范围扩展到了服务器端,各种层出不穷的框架使得JavaScript的开发更加简捷,尤其是近几年HTML5的出现,将
JavaScript提升到了前所未有的高度。如今
JavaScript已经变成了Web开发必备的语言,甚至开始逐步向移动领域渗透,由于JavaScript的跨平台特性,使得它在移动互联网时代有更大的作为。凡是可以用
JavaScript 来写的应用,最终都会用 JavaScript
来写。——Atwood定律不会JavaScript怎么办?如今
JavaScript已经成为了Web开发的“标配”语言,不管你喜不喜欢,在Web开发中,必定要涉及到JavaScript。JavaScript可以实现真正的“一次编写,到处运行”,并可以控制所有常用的浏览器,因此,JavaScript
还被称作“Web的虚拟机”以及“Web上的汇编语言”。尽管如此,但是如果你还没开始学习JavaScript,这也不影响你编写Web应用。你完全可以用你喜欢的语言来编写应用程序,然后将它们编译为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
SWTKotlin:可以编译为JVM字节码和JavaScript的静态类型编程语言Processing:一个基于Java的可视化语言,可以编译为
JavaScriptSTJS:Strongly-Typed
JavaScript,一个可以将Java源码转换为JavaScript代码的Maven插件将C/C++代码编译为JavaScriptC/C++如今也可以用来编写Web应用程序,同样可以将它们编译为JavaScript。一些工具如下。Emscripten:Mozilla开发的LLVM后端,可以将任何通过LLVM前端生成的LLVMIR中间码编译成JavaScript代码。mala:可以将vala代码编译为JavaScriptMandreel:可以将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转换为JavaScriptPyjamas:Python
to JS转换器Pyjs:Python to JS转换器PyCow:可以将Python代码转换为
MooToolsJS代码PyvaScript:一个类似于Python语法并拥有JavaScript特性的编程语言RapydScript:增强版的PyvaScriptSkulpt:客户端的Python将Ruby代码编译为JavaScript在Ruby领域,有一个使用JavaScript实现的Ruby标准库——
RubyJS,它实现了Ruby中的所有方法,如Array、Numbers、Time等。Ruby之父松本行弘称“如果我必须编写JavaScript代码,我会使用RubyJS”。另外,你也可以使用如下工具将Ruby代码编译为JavaScript代码。8ball:一个可以将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#代码转换为JavaScriptFunScript:可通过TypeScript的类型提供器将F#代码转换为JavaScript或JQuery代码jsc:可将.NET程序重新编译为JavaScript、ActionScript、PHP或Java程序JSIL:可将MSIL转换为
JavaScriptNemerleWeb:可将Nemerle语言编译为JavaScriptPit:可将F#代码编译为JavascriptPrefix:可将C#代码编译为JavascriptSaltarelle:可将C#代码编译为JavascriptSharpKit:可将C#代码编译为JavascriptScript#:
可将C#代码编译为JavascriptWebSharper:可将F#代码编译为Javascript.将Scala代码编译为JavaScript你可以使用如下工具将Scala代码编译为JavaScript代码。Scala.js:一款将Scala编译为JavaScript的编译器,支持全部Scala语言特性,允许开发者用Scala开发从前端到后端的Web应用js-scala:在Scala中将JavaScript作为嵌入式的DSL语言Scala+GWT:通过GWT工具链将Scala代码编译为JavaScript语言将Flash转换为JavaScriptHTML5的最大对手就是Flash,尽管目前Flash的市场份额还高居70%,但也不可否认,未来将是HTML5的天下。就连Flash的开发商Adobe也开始拥抱HTML5,并发布了Toolkit
for
CreateJS工具,方便Web开发者将Flash转换为HTML5格式。去年,Google曾发布了一套基于网页的的工具——Swiffy,在线即可将SWF格式的Flash文件转化为HTML5格式。除了转换外,Mozilla还推出了一个新的解决方案——Shumway,这是一个“基于JavaScript的Flash虚拟机和运行时”,目的是在浏览器中构建一个可靠有效的SWF渲染器,无需插件直接在浏览器中运行Flash。由此可见,这些工具将进一步加速HTML5取代Flash的步伐。其他编译工具Go2js:可以将Go代码行到行地编译为JavaScript代码Perlito:可以将Perl
5/6代码编译为JavaScript、Ruby、SBCL和Go语言代码。编译为JavaScript后的问题调试问题由于是交叉编译,导致输出的代码很难被跟踪调试。一些工具在编译的过程中会生成映射文件,可以通过这些文件来进行调试。性能问题由于
JavaScript在浏览器中运行问题,本地代码编译为JavaScript后的执行速度可能会下降。对于此类问题,Mozilla给出了一个解决方案——
asm.js。asm.js是一个JavaScript的一个严格的子集,提供了一个类似于C/C++虚拟机的抽象实现,包括一个可有效负载和存储的大型二进制堆、整型和浮点运算、高阶函数定义、函数指针等,可以被用来作为一个底层的、高效的编译器目标语言。此外,还可以使用Mozilla开发的
JavaScript引擎OdinMonkey来获得更快的执行速度。开发者可以将编写的代码编译为JavaScript,然后手动编写为asm.js代码,当浏览器执行该程序时,OdinMonkey引擎会让程序的执行速度更接近于本地应用。Mozilla未来可能会开发一些工具来自动生成asm.js代码。随着技术的发展,未来JavaScript也许会跑得和native
C一样快。一些演示2012年,Mozilla曾推出一款Web版的第一人称射击游戏演示BananaBread,今年5月份,Mozilla宣布与Epic
Games合作将虚幻引擎3移植到浏览器上,并发布了基于虚幻引擎3的HTML5演示游戏Epic
Citadel
,这些游戏都是基于WebGL、
Emscripten和高性能的JavaScript子集asm.js实现,重新定义了3D游戏在浏览器中运行的性能,展示了高端游戏也可以很容易地移植到JavaScript
和 WebGL平台,同时不失性能和画面效果。Mozilla的另一款支持多人在线的HTML5
游戏—— BrowserQuest。随着HTML5新特性Full Screen API、Gamepad API和Mouse
Lock
API的完善,浏览器或将成为未来游戏的新战场。增强版的JavaScriptJavaScript大量的扩展,在很大程度上弥补了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的强类型语言,可编译为JSSafeJS:为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。更多工具可参见
最后几乎所有主流的语言都可以编译为JavaScript,进而能够在所有平台上的浏览器中执行,这也体现了JavaScript的强大性和在Web开发中的重要性。此外,互联网中还存在大量的工具,使得这些语言可以与
JavaScript进行互操作,我们将在以后的文章中详细介绍。以上这些工具中,大部分都是开源项目,如果感兴趣,你也可以通过源码来了解这些语言之间进行转换的相关原理和技术。

在全球,有数百万的用户在使用Google的JavaScript-intensive应用,如Gmail,Google
Docs,Google
Maps。相信每个开发者都希望创建Web应用程序能变的更easy。哈哈,有个相当好的消息告诉大家,Google今天开放了Closure
Tools,一套内部人员开发JavaScript的工具!上面提到了那几个Google应用都是使用此工具开发的。Closure
Tools中包含三套工具:1。Closure CompilerClosure
Compiler是用来编译JavaScript的编译器,除了像最常见的JavaScript的压缩机提供的功能,它还会对程序进行分析,把不需要的部份移除,减少的JavaScript程序的大小及提升效率。你可以将compiler与Closure
Inspector一起使用。由于JavaScript的开发是多样化的,所以建立了很多种运行的方式:提供了一个开源的命令行工具
;创建了一个Web应用程序,你可以使用text box或一个RESTful
API来编译;还提供了一个Firefox的扩展,可以与Page Speed
一起使用,方便查看网页的性能优势。 2。Closure LibraryClosure
Library是一个广泛,测试良好,模块化,跨浏览器的JavaScript库。它是Google的标准JavaScript类库.这套工具就像是许多一般的JavaScript框架,提供了许多简化的DOM操作的函数库,还有丰富的用户界面组件。
3。Closure Templates
这套工具就是提供一个在JavaScript中做模板的机制及函数库,你可以把HTML布局的部份写成一个*.soy,接着再利用封闭模板提供的工具把这个模板档案编译成的JavaScript代码,这样JavaScript开发者便省去了很多处理页面的负担。Closure
Templates既可以实现JavaScript,又可以实现Java,所以你可以在服务器端和客户端使用相同的模板。

图片 4

1995年,Netscape聘请Brendan Eich为当时最受欢迎的网络浏览器Netscape
Navigator添加一种新语言。Netscape希望增强网络的可编程性。

Closure 

如Closure Compiler(用于生成紧凑且高性能代码的工具)、Closure Templates(用于动态生成HTML)、Closure Linter(JavaScript风格检查器)及Closure Stylesheets(对CSS的一套扩展)

心动不如行动,赶紧去看看吧!

我已经在Type上工作了两年多了,所以我想写一两篇文章来回顾这两年的工作。首先,我应该写一个标准的免责声明:我只是一家公司的一个普通的工程师,公司拥有数万名工程师,肯定会有人对我在这里表达的观点持有不同的意见。

Live在1995年末发布了测试版的浏览器,并在最终发布前改名为Java,以利用Netscape与Sun
Microsystems的合作关系,后者是流行的Java语言背后的公司(尽管Java本质上与Java没有任何关系)。

Dart

Dart([KK] 英语发音:/dɑrt/, [DJ] 英语发音:/dɑ:t/)是一种基于类型的可选类型化编程语言,类似于Javascript。它是一种面向对象语言,由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎)团队的领导者拉尔斯·巴克(Lars Bak)所主持。

谷歌很早就开始做Web应用程序

Mozilla的创始人之一是Eich,他在10天内开发出了Java的原始版本。在接下来的25年里,Java从一种不受欢迎且受到严重限制的语言发展成为现代web应用程序构建的强大基础。如今,Java主导了浏览器,并通过Node.js占领了大部分服务器。

angularjs

 

 

 

 

使用AngularJS构建大型Web应用

 

AngularJS 自集成了模板,不能使用第三方的——不过你仍然可以 Jade 之类的模板进行预编译,以简化书写。
与一些 MDV Model Driven Views同类相比(Facebook 有 React;Google 另外还有 Dart、Polymer;Mozilla 有 X-Tag),我认为 AngularJS 胜在可用和易于测试这两方面。

 Are you doing heavy DOM manipulation? I would use jquery and backbone

 Very data driven app? Angular with it’s nice data binding

 Game programming? none, direct to canvas, maybe a game engine

 

  Top JavaScript MVC Frameworks 

Google很早就开始做Web应用程序了。我简直无法相信Gmail发布已经14年了。在当时使用Java是非常疯狂的做法。Gmail的工程师不得不担心IE糟糕的垃圾回收算法,他们需要手动将字符串文字从for循环中提取出来,以避免GC(Garbage
collection垃圾回收机制)停止工作。

然而,Java并不是所有开发人员都喜欢的语言。Eich在早期做出了一些古怪的决定,这些决定一直持续到2019年,其中包括典型的继承、“this”以及Java的侵略性和不一致的类型强制。

Polymer

http://www.polymer-project.org

代表了下一代Web框架的方向:一切皆组件,尽量减少代码量,尽量减少框架限制。

Polymer由加盟Google的原Palm webOS开发团队打造,是一套以“一切皆组件、最少化代码量、最少框架限制”为设计理念的Web UI框架。Web Components则提供了一种更彻底的解耦方式,更加方便了UI的开发和模块化,可以说是Polymer的基础之一。

 以前的dart webui库

 

 

以上可见google开发个的web应用库就很多了,从语言到界面等多个层面提供了解决的方式,我们根据具体的需求进行选择吧。

最近我发现了一个那个时代的设计文档,他们当时在考虑做我们现在称为Java“压缩”的东西,但一些备选工具只能在Windows上使用。在今天看来,这些都难以想象。

近年来,开发人员已经创建了Java的替代品。Java仍然是在浏览器中运行的唯一语言,因此这些新语言主要是编译或转换为Java。Coffee是第一个类似的脚本,但很快就被众多竞争对手所超越,每个竞争对手都对Java进行了改进。

这些年,Google为开发大型Java应用程序,构建了大量基础架构。例如,有一个模块系统可以让源文件表述它们的相互依赖性。有一个捆绑程序可以组合并压缩源文件,生成可以兼容浏览器的产品。

Dart

另一个程序可以通过可动态加载的入口点来分析应用的依赖关系图,并分解出公共的块供其他块使用。服务器端的渲染很常见。对于如今的Web开发人员来说,所有这些概念载熟悉不过了,但Google的技术栈很早就有了,而且一直在发展,因此在概念上类似,但具体方面完全不同,Google拥有不同的流程、工具,甚至不同的概念名称。

Dart是一种面向对象的c语言,由Google创建,作为Java的替代品。它抛弃了Java的原型继承系统,而采用了更传统的面向对象的方法,任何使用过Java或c++的人都熟悉这种方法。与Java不同,Dart是一种静态类型的语言,消除了Java代码中的常见错误源。Dart支持类型推断,因此没有必要在每次声明变量或函数时都包含类型样板。

还有个例子可以说明并行发展:Google、Facebook和Microsoft各自构建了类似但不兼容的编译器,这些编译器向Java添加了静态检查。

也许Dart最令人激动的功能是它在网络之外的可用性。Dart代码可以转换为Java以便在浏览器中运行,但它也可用于独立应用程序和服务器端开发。Google的Flutter
UI工具包是一个可移植的前端框架,可用于桌面、移动设备和Web,构建本机应用程序。

Google的编译器常被称为Closure。(请不要与Clojure语言混淆;为了避免混淆需要说明一下:Clojure使用的是Closure编译器。)

Type

Google的Java堆栈非常棒。有了它的帮助,Google才能编写并维护可以改变互联网的web应用程序。(还记得Google地图发布时,多么令人震惊吗?如今制作一个可以拖拽的地图小部件似乎非常简单。)

Type是微软向更好的Java进军的第一步。与Dart不同,Type不是一种全新的语言,而是Java的超集。Type编译器可以编译有效的Java,但是Type增加了几个新特性,改进和现代化了Java的限制,其中最重要的是一个可选的类型系统。

Google地图的一些技术甚至超越了当今最好的技术。例如,Closure编译器可能仍然是最复杂的Java优化程序,它能够执行很多操作,例如利用类型信息优化代码,跨越热加载的块的边界进行函数内联,以及在符号层次删除未使用的代码等。

许多Java问题都是由于缺少静态类型导致的,这导致了编译器在运行前进行检查时就被限制了。顾名思义,Type实现了一种类型表示法,开发人员可以使用这种表示法为web应用程序编程保证安全。与Dart一样,Type支持类型推断。

Google的Java技术栈也存在一些问题。linter的渐进式发展表明了Closure只不过是个拥有静态类型的Java,其中新功能是通过注释引入的。

值得一提的是,Type比它的竞争对手谷歌更受欢迎。比如,虽然Angular是谷歌的项目,但它的框架是用Type开发的。Type也可以与React和Vue一起使用。

Closure的语句难以捉摸,速度很慢,有很多Bug,而且如果你不会正确地使用的话,那么它往往会破坏你的代码。尽管它是开源的,但也许是正因为这些原因,除了熟悉它的Google员工之外,行业中并没有广泛使用到它。

Elm

Java在Google内部的反响并不好,我认为部分原因在于我们对工具很挑剔,大家既嫌静态语言过于繁琐,又嫌动态语言不可捉摸。

Dart和Type与Java和C.
Elm有明显的亲缘关系。它是一种静态类型的函数语言,与Haskell相比更类似于C,但没有Haskell那种令人挠头的复杂性。

Java出乎意料地流行了起来

Elm本质上是一种用于构建web前端的特定于领域的语言。

与此同时,在Google之外,Java也在不断发展,甚至出乎意料地流行起来了。我们构建了Chrome,部分原因是为了解决IE的那些垃圾回收Bug,但也因此催生了了v8,再由v8产生了Node.js。

Elm不像Java那样是一种通用语言,相反,创建者Evan
Czaplicki专注于构建最好的前端web应用程序开发体验。Elm的主要优点是,通过静态类型和不可变值消除了前端代码中的许多潜在bug。Elm宣称自己是一种“在实践中没有运行异常”的语言,这意味着如果一个Elm程序运行,它就不太可能在生产中遇到阻止性能的bug。

最后导致今天大多数的Web工具都是用Java编写的,尽管Google习惯用Java构建这种工具。模块系统(UMD、AMD、CommonJS)迅速发展。(随之出现了ES6,并发明了自己的模块系统,但是由于某种原因它与其他所有模块系统不兼容,唉!)

以下是Elm代码示例

NPM统一了工具和库的共享方式。Webpack可以在开发期间,将模块动态地切换到正在运行的应用程序中。

图片 5

Google一概没有用到这个技术。Google的那些经验丰富的Web开发人员像是生活在另一个时间线中。我们有像SASS这样的CSS预处理语言,但它不是SASS而且没有人喜欢它。精心设计的块分割程序并不能真正支持第三方Java库,部分原因是这些工具的出现早于Java的库生态系统。

Elm代码看起来和Java一点也不像,但是它有简单直观的语法,Elm对学习过Java的人来说应该不难。

这都只是历史。你可以说我们本不应该这么做,但这么说却无法改变现状。相反,有趣的问题是:接下来我们该何去何从?有几个选择。我的观点肯定是偏向我喜欢的技术。

Clojure

接下来我们该何去何从

Clojure是Clojure编程语言的一个版本,可以编译为Java。Clojure是运行在Java虚拟机上的Lisp。与Elm一样,Clojure也是一种函数性语言,具有不可变的数据类型。与Elm不同,它是一种通用编程语言,可以在后端与JVM一起使用,也可以通过Java在前端使用。

第一个诱人的选择就是放弃眼前的一切,并从头开始建造一个没有Java的新世界。如果我们投入更多精力到GWT(一个将Java编译成Java的Google项目)或Dart(一个将新语言编译成Java的Google项目)或WASM,或者你最喜欢的语言:Clojure?Haxe?还是Elm?那么我们根本不需要担心Java!

与所有Lisp一样,Clojure是用括号分隔的s表达式编写的。用Clojure的创建者Rich
Hickey的话来说,Clojure试图用Clojure(简洁且功能强大的编程语言)取代Java,从而解决客户机/嵌入式应用程序开发中的薄弱环节。Clojure可以与React和其他流行的Java框架一起使用。

作为PL爱好者,我非常喜欢这个想法。我想仔细分析一下这个想法,但是这篇文章已经够长了,而且我认为已经有很多关于这方面讨论的文章了。

当Netscape雇用Brendan
Eich时,他们计划将Scheme集成到Navigator中,而不是创建一种新的语言。Scheme是一种Lisp,因此,如果历史的发展稍微有些不同,Lisp可能已经成为世界上最流行的编程语言家族。Java通过一流的函数、闭包和lambdas保留了一些“Lispiness”。在Java开发过程中扮演关键角色并发明了JSON的道格拉斯•克罗克福德(Douglas
Crockford)将Java称为“披着C外衣的Lisp”。

作为反驳,我有一些常见的问题:如果采用一种不同的语言,那么第一个问题是,这对于我们现有的数百万行代码没有任何帮助——“用新语言从从头开始重写”等想法在某些情况下是正确的选择,但是如何充分利用Gmail工程师的时间是一个很难的问题;第二个问题是,对于我们想聘请的经验丰富的前端工程师来说,也几乎没什么用。

Phoenix LiveView

与重写一切相对的做法是不改变任何东西。您可能会说,公开的Java世界充满了业余和不成熟的代码。一个优秀的工程师总能适应我们特殊的前端方式,我们总能改进或构建更多自己的工具。

之前讲过的语言可以编译成Java,它们让开发人员无需编写Java就可以构建客户端应用程序。

我们构建的应用类型(Google搜索页面每天可以获得数十亿次点击)与其他人构建的web应用程序不同,我们的工具既优秀又很有必要性。我非常赞同这种观点。

Phoenix
LiveView与众不同。Phoenix是一个用相对较新的Elixir编程语言编写的web框架。Phoenix是一个服务器端框架。但我们为什么要在一篇专门讨论浏览器Java替代方案的文章中讨论它呢?因为LiveView可以在许多web开发场景中替代Java。

我认为在权衡利弊的时候,有一种看法认为建立我们自己的工具很有道理,而另一种看法则认为我们已经远离主流,我们的工具是一种负担。

Phoenix的创建者Chris
McCord称LiveView是“一个令人振奋的新库,它支持使用服务器呈现HTML,实现丰富的实时用户体验”。LiveView使用Phoenix
channel在浏览器和服务器之间创建双向连接。LiveView基于Websockets,可以在不编写Java的情况下创建交互体验。人们自然会担心这种方法太慢而无法使用,但是LiveView的设计目的是最小化数据传输,并且在实践中可以用于构建低延迟接口。

那么争论的焦点是我们究竟处在什么位置,我相信我们不属于后者。我们为LLVM
/
Clang做出的贡献获益良多,因为我们依赖于C++,但是我们构建自己的LLVM,并不能从中获得更多额外的价值。

但LiveView有局限性,我们不建议在LiveView中构建像Google
Docs这样的复杂应用程序。如果离线功能对应用程序很重要,那么LiveView也不是合适的解决方案。但是,对于表单、实时界面更新和数据验证等功能,Phoenix
LiveView是Java的可行替代方案。它比大多数Java应用程序小得多;,LiveView的浏览器代码大约是React的四分之一。

我们应该折中

图片 6

所以,我觉得我们应该折中,这也是我们的团队一直在追求的道路:逐步采用一些合理的外部工具,并弄清楚这些工具如何才能与我们现有的代码库相互合作。

总结

这项任务并不那么有趣,因为我们不会只是单纯地抛弃历史遗留的混乱或者“这次做正确的事情”,但我喜欢更谦虚地思考,不要固步自封。

我们已经研究了Java的五种替代方法,每种方法都提供了一种创建Web应用程序和交互式界面的不同方式。当然目前大部分人使用的依然是Java,因为它是Web浏览器支持的唯一语言。

为了Google的Java世外桃源重回大陆,我们要做的第一步是:采用了一个支持良好的静态检查器:(1)不是我们自己做的;
(2)很流行,同时与我们现有的代码相似;(3)旨在搭建通往Java的桥梁;(4)旨在支持大规模的开发,这才是我们定制工具的根本原因。而这个工具就是Type。

但随着WebAssembly被广泛采用,这种情况可能即将发生变化。所有主流浏览器都支持WebAssembly,将来它很可能成为面向Web的语言的默认编译目标。对于Web开发人员来说,探索WebAssembly的可能性是个很不错的方向。

Closure编译器的优势在于优化输出,而Type具有出色的用户界面且根本没有优化。因此这两个工具可以互补,并且(有些工作)可以结合在一起。

因为Type已经很好用了——毕竟只有这样我们才会采用它——所以我们获得了许多采用已有语言的好处,比如IDE风格的代码自动补齐,以及能够从StackOverflow获取答案。

留给我们的主要工作是集成:允许我们的应用程序逐步转移到Type,而无需从头开始重写。我们在与Google的构建系统集成时非常谨慎,我们采用了渐进式编译,这对大型应用程序至关重要;而且一个模块中的变更不会影响使用了该模块的API,也不会导致下游模块需要重新编译。

我们与Closure类型/模块系统的集成意味着ES6
Type模块可以导入Google模块系统中的模块,而且保留了(大部分)类型信息。一家公司成功地使用了我们发布的工具,自动将其整个代码库进行了转换,同时保留他们压缩后的输出。

现在Google内部,各个地方都或多或少地使用了Type;如果您使用Google的产品,那么意味着你已经与一些Type代码打过交道了。Type本身就是一系列有趣的折衷方案,它将静态类型的编程语言与自由转换的Java生态系统进行了平衡。

我们工程师也会这么做:我们也会做出有趣的妥协,试图平衡不同的问题。我希望将来可以写更多关于多年来发现的一些有趣的小事。正如刚开始使用Type时我写下的这篇文章一样(

style=”font-size: 16px;”>原文:

作者:Evan
Martin,Google的软件工程师。

译者:弯月,责编:胡巍巍 class=”backword”>返回搜狐,查看更多

责任编辑:

相关文章