首页 > IT知识 > 10 个最终编译成 JavaScript 的脚本语言

10 个最终编译成 JavaScript 的脚本语言

2017年09月29日10:38:30来源:海文国际         87
分享到:
IT知识文章: 

与简单的网站相比,现代应用程序有更多不同的需求。但是,浏览器是一个拥有(大部分)固定技术的平台,而且JavaScript仍然是web应用程序的核心语言;需要在浏览器中运行的任何应用程序都必须用该语言实现。

我们都知道JavaScript并不是实现所有任务的最佳语言,当遇到复杂的应用时,它可能就不太适合。为了避免这个问题,已经创建了几种新的语言和现有语言的变体,它们都生成可以在浏览器中运行的代码,而无需编写任何JavaScript代码,也不用考虑语言的局限性。

10 个最终编译成 JavaScript 的脚本语言

文中介绍了10个有趣的语言,这些语言都可以转换成JavaScript代码在浏览器中执行,也可以在Node.js这样的平台上执行。

Dart是一种经典的面向对象语言,其中所有事物都是对象,任何对象都是类的实例(对象也可以充当函数)。它专门用于构建浏览器、服务器和移动设备的应用程序。它由谷歌维护,并且是驱动下一代AdWords用户界面的语言,而AdWords是给谷歌创造收入的最重要的产品,这本身就是在证明其大规模的力量。

该语言可被翻译成JavaScript,以便在浏览器中使用,或者由DartVM直接解释执行,这也允许你构建服务器应用程序。可以使用FlutterSDK创建移动应用程序。

复杂的应用程序还需要一组成熟的库和专门为此任务而设计的语言特性,而Dart包含所有这些库和特性。一个流行的库的例子是AngularDart,Angular的Dart版本。

它允许你编写类型安全的代码,而不会太有侵入性;你可以编写类型,但你不需要这样做,因为它们可以被推断出来。这允许创建快速原型,而不必过度考虑细节,但一旦你的原型可以工作,你可以添加类型以使其更加健壮。

关于虚拟机中的并发编程,Dart使用所谓的Isolates连同它们自己的内存堆,来代替共享内存线程(Dart是单线程的),使用消息实现通信。在浏览器中,这个事件稍有不同:你并不是创建新的isolates,而是创建新的Workers。

//Exampleextractedfromdartlang.org

import'dart:async';

import'dart:math'showRandom;

main()async{

print('ComputeπusingtheMonteCarlomethod.');

awaitfor(varestimateincomputePi()){

print('π?$estimate');

}

}

///Generatesastreamofincreasinglyaccurateestimatesofπ.

Stream<double>computePi({intbatch:1000000})async*{

vartotal=0;

varcount=0;

while(true){

varpoints=generateRandom().take(batch);

varinside=points.where((p)=>p.isInsideUnitCircle);

total+=batch;

count+=inside.length;

varratio=count/total;

//AreaofacircleisA=π?r2,thereforeπ=A/r2.

//So,whengivenrandompointswithx∈<0,1>,

//y∈<0,1>,theratioofthoseinsideaunitcircle

//shouldapproachπ/4.Therefore,thevalueofπ

//shouldbe:

yieldratio*4;

}

}

Iterable<Point>generateRandom([intseed])sync*{

finalrandom=newRandom(seed);

while(true){

yieldnewPoint(random.nextDouble(),random.nextDouble());

}

}

classPoint{

finaldoublex,y;

constPoint(this.x,this.y);

boolgetisInsideUnitCircle=>x*x+y*y<=1;

}

开始使用Dart

TypeScript

TypeScript是JavaScript的超集;有效的JavaScript程序也是有效的TypeScript程序,但后者添加了静态类型。其编译器也可以充当从ES2015+到当前实现的转译器,所以你总能获得最新的功能。

不同于许多其他语言,TypeScript保持JavaScript的精神完好无缺,只增加了功能来提高代码的可靠性。这些是类型注释,以及其他类型相关的功能,使得编写JavaScript更加愉快,这得益于启用了静态分析器等专门的工具来帮助重构过程。另外,类型的添加改进了应用程序不同组件之间的接口。

类型推断受到支持,因此你不必从一开始就编写所有的类型。你可以编写快速解决方案,然后添加所有的类型以获取对代码的信心。

TypeScript也支持高级的类型,如intersection(交集)类型、union(并集、联合)类型、类型别名、可区分联合(discriminatedunion)和类型保护。你可以在TypeScript文档站点的高级类型页面中查看所有这些类型。

如果你使用React,则还可以通过添加React类型来支持JSX。

classPerson{

privatename:string;

privateage:number;

privatesalary:number;

constructor(name:string,age:number,salary:number){

this.name=name;

this.age=age;

this.salary=salary;

}

toString():string{

return`${this.name}(${this.age})(${this.salary})`;

}

}

Elm是一种纯粹的函数编程语言,它编译成JS、HTML和CSS。你可以只使用Elm构建一个完整的站点。这使之成为JavaScript框架如React的一个很好的替代方案。用它构建的应用程序会自动使用虚拟DOM库,使其速度非常快。其一大优点是内置的体系结构,它使你忘记了数据流,而将重点放在数据声明和逻辑上。

在Elm中,所有函数都是纯粹的,这意味着它们将总是对给定输入返回相同的输出。除非你指定,否则它们不能做任何其他事情。例如,为了访问远程API,你将创建command(命令)函数来与外界通信,以及创建subscription(订阅)以侦听响应。纯粹性的另一点是,值是不可变的;当你需要某样东西时,你创建新值,而不是修改旧值。

Elm的采用可以是渐进式的;可以使用ports(端口)与JavaScript和其他库进行通信。虽然Elm尚未达到版本1,但它正被用于复杂和大型的应用程序,使其成为复杂的应用程序的可行的解决方案。

Elm最具吸引力的功能之一是初学者友好的编译器,不是生成难以阅读的消息,而是生成代码,可以帮助你修复你的代码。如果你在学习该语言,编译器本身就可以大有助益。

moduleMainexposing(..)

importHtmlexposing(..)

--MAIN

main:ProgramNeverModelMsg

main=

Html.program

{init=init

,update=update

,view=view

,subscriptions=subscriptions

}

--INIT

typealiasModel=String

init:(Model,CmdMsg)

init=("HelloWorld!",Cmd.none)

--UPDATE

typeMsg

=DoNothing

update:Msg->Model->(Model,CmdMsg)

updatemsgmodel=

casemsgof

DoNothing->

(model,Cmd.none)

--VIEW

view:Model->HtmlMsg

viewmodel=

div[][textmodel]

--SUBSCRIPTIONS

subscriptions:Model->SubMsg

subscriptionsmodel=

Sub.none

开始使用Elm

PureScript

PureScript是由PhilFreeman创建的纯函数式强类型的编程语言。它旨在给可用的JavaScript库提供强大的兼容性,在精神上类似于Haskell,但保持JavaScript的核心。

PureScript的一个强项是它的极简主义。它不包括在其他语言中被认为是必需的功能的任何库。例如,不是编译器本身包含生成器和promises,而是你可以使用特定的库来完成任务。你可以为所需功能选择想要的实现,这样可以在使用PureScript时实现高效和个性化的体验,同时保持生成的代码尽可能小。

其编译器的另一个显著特征就是能够在保持与JavaScript的兼容性的同时,用库和工具生成整洁和可读的代码。

像其他语言一样,PureScript有自己的构建工具叫做Pulp,可以与Gulp进行比较,但是用于以这种语言编写的项目。

关于类型系统,与Elm不同,即另一种ML式的语言,PureScript支持高级类型的功能,如取自Haskell的higher-kindedtypes(高级类类型)以及typeclasses(类型类),从而允许创建复杂的抽象。

moduleMainwhere

importPrelude

importData.Foldable(fold)

importTryPureScript

main=

render$fold

[h1(text"TryPureScript!")

,p(text"Tryouttheexamplesbelow,orcreateyourown!")

,h2(text"Examples")

,list(mapfromExampleexamples)

]

where

fromExample{title,gist}=

link("?gist="<>gist)(texttitle)

examples=

[{title:"AlgebraicDataTypes"

,gist:"37c3c97f47a43f20c548"

}

,{title:"Loops"

,gist:"cfdabdcd085d4ac3dc46"

}

,{title:"Operators"

,gist:"3044550f29a7c5d3d0d0"

}

]

开始使用PureScript

CoffeeScript

CoffeeScript是一种语言,旨在公开JavaScript的良好部分,同时提供更整洁的语法并保留语义。虽然该语言的流行度近年来一直在减弱,但它正在改变方向,现在正在获得一个新的主要版本,为ES2015+的功能提供支持。

你用CoffeeScript编写的代码被直接翻译为可读的JavaScript代码,并保持与现有库的兼容性。从版本2开始,编译器将产生与最新版本的ECMAScript兼容的代码。例如,每次你使用一个类,你就获得一个JavaScript类。另外,如果你使用React,也有好消息:JSX与CoffeeScript兼容。

本文来源于开源中国,仅供个人研究、交流学习使用,不涉及商业盈利目的。如有版权问题,请联系本站管理员予以更改或删除。