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

MauGovernor 6年前
   <p>与简单的网站相比,现代应用程序有更多 <a href="/misc/goto?guid=4959754794164353864" rel="nofollow,noindex">不同的需求</a> 。但是,浏览器是一个拥有(大部分)固定技术的平台,而且JavaScript仍然是web应用程序的核心语言;需要在浏览器中运行的任何应用程序都必须用该语言实现。</p>    <p>我们都知道JavaScript并不是实现所有任务的最佳语言,当遇到复杂的应用时,它可能就不太适合。为了避免这个问题,已经创建了几种新的语言和现有语言的变体,它们都生成可以在浏览器中运行的代码,而无需编写任何JavaScript代码,也不用考虑语言的局限性。</p>    <p>文中介绍了10个有趣的语言,这些语言都可以转换成JavaScript代码在浏览器中执行,也可以在Node.js这样的平台上执行。</p>    <p>Dart 是一种经典的面向对象语言,其中所有事物都是对象,任何对象都是类的实例(对象也可以充当函数)。它专门用于构建浏览器、服务器和移动设备的应用程序。它由谷歌维护,并且是 <a href="/misc/goto?guid=4959754794258680116" rel="nofollow,noindex">驱动下一代 AdWords 用户界面的语言</a> , 而 AdWords 是给谷歌创造收入的最重要的产品,这本身就是在证明其大规模的力量。</p>    <p>该语言可被翻译成 JavaScript ,以便在浏览器中使用,或者由 Dart VM 直接解释执行,这也允许你构建服务器应用程序。可以使用 Flutter SDK 创建移动应用程序。</p>    <p>复杂的应用程序还需要一组成熟的库和专门为此任务而设计的语言特性,而 Dart 包含所有这些库和特性。一个流行的库的例子是 <a href="/misc/goto?guid=4959754794340086718" rel="nofollow,noindex">AngularDart</a> ,Angular 的 Dart 版本。</p>    <p>它允许你编写类型安全的代码,而不会太有侵入性;你可以编写类型,但你不需要这样做,因为它们可以被推断出来。这允许创建快速原型,而不必过度考虑细节,但一旦你的原型可以工作,你可以添加类型以使其更加健壮。</p>    <p>关于虚拟机中的并发编程,Dart 使用所谓的 <em>Isolates</em> 连同它们自己的内存堆,来代替共享内存线程(Dart 是单线程的),使用消息实现通信。 在浏览器中,这个事件稍有不同:你并不是创建新的 isolates, 而是创建新的 <em>Workers 。</em></p>    <pre>  <code class="language-javascript">// Example extracted from dartlang.org    import 'dart:async';  import 'dart:math' show Random;    main() async {    print('Compute π using the Monte Carlo method.');    await for (var estimate in computePi()) {      print('π ≅ $estimate');    }  }    /// Generates a stream of increasingly accurate estimates of π.  Stream<double> computePi({int batch: 1000000}) async* {    var total = 0;    var count = 0;    while (true) {      var points = generateRandom().take(batch);      var inside = points.where((p) => p.isInsideUnitCircle);      total += batch;      count += inside.length;      var ratio = count / total;      // Area of a circle is A = π⋅r², therefore π = A/r².      // So, when given random points with x ∈ <0,1>,      // y ∈ <0,1>, the ratio of those inside a unit circle      // should approach π / 4. Therefore, the value of π      // should be:      yield ratio * 4;    }  }    Iterable<Point> generateRandom([int seed]) sync* {    final random = new Random(seed);    while (true) {      yield new Point(random.nextDouble(), random.nextDouble());    }  }    class Point {    final double x, y;    const Point(this.x, this.y);    bool get isInsideUnitCircle => x * x + y * y <= 1;  }</code></pre>    <p><a href="/misc/goto?guid=4959754794414527416" rel="nofollow,noindex"> 开始使用Dart</a></p>    <h2>TypeScript</h2>    <p><a href="/misc/goto?guid=4959754794506054646" rel="nofollow,noindex">TypeScript</a> 是 JavaScript 的超集;有效的 JavaScript 程序也是有效的 TypeScript 程序,但后者添加了静态类型。其编译器也可以充当从 ES2015+ 到当前实现的转译器,所以你总能获得最新的功能。</p>    <p>不同于许多其他语言,TypeScript 保持 JavaScript 的精神完好无缺,只增加了功能来提高代码的可靠性。这些是类型注释,以及其他类型相关的功能,使得编写 JavaScript 更加愉快,这得益于启用了静态分析器等专门的工具来帮助重构过程。另外,类型的添加改进了应用程序不同组件之间的接口。</p>    <p>类型推断受到支持,因此你不必从一开始就编写所有的类型。你可以编写快速解决方案,然后添加所有的类型以获取对代码的信心。</p>    <p>TypeScript 也支持高级的类型,如 intersection(交集) 类型 、 union(并集、联合) 类型、 类型别名、 可区分联合(discriminated union)和类型保护。你可以在 <a href="/misc/goto?guid=4959754794593571342" rel="nofollow,noindex">TypeScript 文档</a> 站点的 <a href="/misc/goto?guid=4959754794677815304" rel="nofollow,noindex">高级类型</a> 页面中查看所有这些类型。</p>    <p>如果你使用 React,则还可以通过添加 React 类型来支持 JSX。</p>    <pre>  <code class="language-javascript">class Person {      private name: string;      private age: number;      private salary: 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})`;      }  }</code></pre>    <p>Elm 是一种纯粹的函数编程语言,它编译成 JS、 HTM L和 CSS。 你可以只使用 Elm 构建一个完整的站点。这使之成为 JavaScript 框架如 React 的一个很好的替代方案。用它构建的应用程序会自动使用虚拟 DOM 库,使其速度非常快。其一大优点是内置的体系结构,它使你忘记了数据流,而将重点放在数据声明和逻辑上。</p>    <p>在 Elm 中,所有函数都是纯粹的,这意味着它们将总是对给定输入返回相同的输出。除非你指定,否则它们不能做任何其他事情。例如,为了访问远程 API,你将创建 <em>command</em> (命令)函数来与外界通信,以及创建 <em>subscription</em> (订阅)以侦听响应。纯粹性的另一点是,值是不可变的;当你需要某样东西时,你创建新值,而不是修改旧值。</p>    <p>Elm 的采用可以是渐进式的;可以使用 <em>ports (端口)</em> 与 JavaScript 和其他库进行通信。虽然 Elm 尚未达到版本 1,但它正被用于复杂和大型的应用程序,使其成为复杂的应用程序的可行的解决方案。</p>    <p>Elm 最具吸引力的功能之一是初学者友好的编译器,不是生成难以阅读的消息,而是生成代码,可以帮助你修复你的代码。如果你在学习该语言,编译器本身就可以大有助益。</p>    <pre>  <code class="language-javascript">module Main exposing (..)    import Html exposing (..)      -- MAIN      main : Program Never Model Msg  main =      Html.program          { init = init          , update = update          , view = view          , subscriptions = subscriptions          }        -- INIT      type alias Model = String      init : ( Model, Cmd Msg )  init = ( "Hello World!", Cmd.none )      -- UPDATE      type Msg      = DoNothing      update : Msg -> Model -> ( Model, Cmd Msg )  update msg model =      case msg of          DoNothing ->              ( model, Cmd.none )      -- VIEW      view : Model -> Html Msg  view model =      div [] [text model]      -- SUBSCRIPTIONS      subscriptions : Model -> Sub Msg  subscriptions model =      Sub.none</code></pre>    <p><a href="/misc/goto?guid=4959754794762861488" rel="nofollow,noindex">开始使用 Elm</a></p>    <h2>PureScript</h2>    <p><a href="/misc/goto?guid=4958859555639359002" rel="nofollow,noindex">PureScript</a> 是由 Phil Freeman 创建的纯函数式强类型的编程语言。它旨在给可用的 JavaScript 库提供强大的兼容性,在精神上类似于 Haskell,但保持 JavaScript 的核心。</p>    <p>PureScript 的一个强项是它的极简主义。它不包括在其他语言中被认为是必需的功能的任何库。例如,不是编译器本身包含生成器和 promises,而是你可以使用特定的库来完成任务。你可以为所需功能选择想要的实现,这样可以在使用 PureScript 时实现高效和个性化的体验,同时保持生成的代码尽可能小。</p>    <p>其编译器的另一个显著特征就是能够在保持与 JavaScript 的兼容性的同时, 用库和工具生成整洁和可读的代码。</p>    <p>像其他语言一样,PureScript 有自己的构建工具叫做 Pulp,可以与 Gulp 进行比较, 但是用于以这种语言编写的项目。</p>    <p>关于类型系统,与 Elm不同,即另一种 ML 式的语言,PureScript 支持高级类型的功能,如取自 Haskell 的 <a href="/misc/goto?guid=4959754794881427298" rel="nofollow,noindex">higher-kinded types(高级类类型)</a> 以及 type classes(类型类), 从而允许创建复杂的抽象。</p>    <pre>  <code class="language-javascript">module Main where    import Prelude  import Data.Foldable (fold)  import TryPureScript    main =      render $ fold        [ h1 (text "Try PureScript!")        , p (text "Try out the examples below, or create your own!")        , h2 (text "Examples")        , list (map fromExample examples)        ]    where      fromExample { title, gist } =        link ("?gist=" <> gist) (text title)        examples =        [ { title: "Algebraic Data Types"          , gist: "37c3c97f47a43f20c548"          }        , { title: "Loops"          , gist: "cfdabdcd085d4ac3dc46"          }        , { title: "Operators"          , gist: "3044550f29a7c5d3d0d0"          }        ]</code></pre>    <p><a href="/misc/goto?guid=4959754794958749312" rel="nofollow,noindex">开始使用 PureScript</a></p>    <h2>CoffeeScript</h2>    <p>CoffeeScript 是一种语言,旨在公开 JavaScript 的良好部分,同时提供更整洁的语法并保留语义。虽然该语言的流行度近年来一直在减弱,但它正在改变方向,现在正在获得一个新的主要版本,为 ES2015+ 的功能提供支持。</p>    <p>你用 CoffeeScript 编写的代码被直接翻译为可读的 JavaScript 代码,并保持与现有库的兼容性。从版本 2 开始,编译器将产生与最新版本的 ECMAScript 兼容的代码。例如,每次你使用一个类,你就获得一个 JavaScript 类。另外,如果你使用 React,也有好消息: JSX 与 CoffeeScript 兼容。</p>    <p> </p>    <p>来自:https://www.oschina.net/translate/10-languages-compile-javascript</p>    <p> </p>