您的位置:首頁>科技>正文

10種能夠編譯成 JavaScript 的指令碼語言

相比於簡單的網站, 現代應用具有不同的需求。 但是流覽器是一個具有(幾乎)固定可用技術集合的平臺, 而JavaScript依然是 web 應用的核心語言;需要運行在流覽器中的任何應用必須使用該語言來實現。

我們知道 JavaScript 並不是適用於所用任務的最佳語言, 而且當遇到複雜的應用時, JavaScript 很可能會功虧一簣。 為了避免這種問題, 現在已經創建了一些新語言或是現有語言的轉換編譯器, 他們能夠生成可在流覽器中運行的代碼, 而無需編寫一行代碼, 也無需考慮語言的局限性。

這篇文章包含了十種有趣語言的清單, 這些語言可以轉換編譯為可在流覽器中或是類似Node.js平臺上運行的JavaScript代碼。

Dart

Dart 是一種典型的物件導向語言, 其中的一切都是物件, 而每一個物件都是類的一個實例(物件也可以作為函數)。 它為構建流覽器, 伺服器與移動設備應用而特意設計的。 它由 Google 維護,

並且是驅動下一代 AdWords UI — Google 收入中的最重要產品– 的語言, 也在一定程度上證明了其自身的強大。

Dart 可以轉換為在流覽器中可用的 JavaScript , 或是直接由 Dart VM 解釋, 從而也允許你構建伺服器應用。 使用 Flutter SDK 可以構建移動應用。

複雜應用同時需要成熟的庫與特意為任務而設計的語言特性, 而 Dart 包含有所有這些要素。 一個流行庫的例子就是 AngularDart, Angular 的 Dart 版本。

它允許你編譯類型安全的代碼而無需過於侵入;你可以編寫類型, 但是你並不會要求如此, 因為他們可以推導類型。 這使得快速原型成為可能, 而無需深入思考細節, 但是一旦你使得某些內容工作起來, 你就可以添加類型使其更為穩健。

對於 VM 中的並行編譯, 不同於共用記憶體執行緒(Dart 是單執行緒), Dart使用所謂的分離(Isolates),

具有其自己的記憶體堆, 在其中使用消息實現通信。 在流覽器中, 故事有些不同:你創建新 Worker, 而不是創建新 isolate。

// Example extracted from dartlang.orgimport 'dart:async';import 'dart:math' show Random;main() async {

Dart 入門

TypeScript

TypeScript 是 JavaScript 的是一個超集合;一個正確的 JavaScript 程式同時也是一個正確的 TypeScript程式, 但是添加了靜態類型。 編譯器同時可以作為 ES2015+ 到當前實現的轉換編譯器, 從而你總是可以最新的特性。

不同於許多其他的語言, TypeScript保留了 JavaScript 的靈魂, 僅添加了改進代碼穩定性的特徵。 他們是類型注釋以及類型相關的功能, 多虧了靜態分析器以及輔助重構過程的其他工具等特殊工具的使用, 編寫JavaScript代碼變得更為愉悅。 同時, 類型的添加改進了我們應用的不同元件之間的介面。

類型推導也是支持的, 所以你不必從頭編寫所有的類型。 你可以編寫快速的解決方案,

然後添加所有的類型使得你的類型更為可信。

TypeScript 同時支持高級類型, 例如交集類型, 聯合類型, 類型別名, 獨立聯合類型以及類型警衛。 你可以在TypeScript 文檔 網站中的高級類型 頁面查看到這些內容。

如果你使用 React, 通過添加 React 類型也可以支持JSX。

class Person {

TypeScript 入門

Elm

Elm 是一個可以編譯為 JS, HTML 與 CSS 的純函數式語言。 你可以僅使用 Elm 構建一個完整的網站, 將其作為 JavaScript框架, 例如 React, 的替代。 你用其構建的應用會自動使用虛擬 DOM 庫, 從而使其非常快速。 另一個優點就是內建的體系結構, 從而使你忘記資料來源, 而專注於資料聲明與邏輯。

在 Elm 中, 所有的函數都是純粹的, 這意味著對於給定的輸入他們總是返回相同的輸出。 他們不會做其他的任何事情,

除非你顯式指定。 例如, 要訪問遠端 API, 你會創建 command函數來與外部世界通信, 以及 subscriptions 函數來監聽回應。 純粹的另一個優點在於值是不可修改的;當你需要時, 你創建新的值, 而不是修改他們。

Elm 的採用是漸進的;可以使用 ports 與JavaScript和其他庫進行通信。 儘管 Elm 還沒有發佈版本1, 他正被逐漸用於複雜與大型的應用, 使其成為複雜應用的靈活解決方案。

Elm 最吸引人的一個特性就是初學者友好的編譯器, 其生成的代碼有助於修正你的代碼, 而不是生成難於閱讀的資訊。 如果你正在學習該語言, 編譯器自身將會提供很大的幫助。

module Main exposing (..)import Html exposing (..)-- MAIN-- SUBSCRIPTIONS

subscriptions : Model -> Sub Msg

subscriptions model =

Sub.none

Elm 入門

PureScript

PureScript 是一種純函數式與強類型的程式設計語言, 由 Phil Freeman 創建。 它致力於提供與現有的 JavaScript 庫的強相容性, 在內在靈魂上類似於 Haskell , 但是保持 JavaScript 作為其核心。

PureScript 的優點就在於其極簡主義。它並不包含任何功能性庫,而在其他語言中被通常被認為是其核心。例如,在其編譯器自身中並不包含生成器與 promises ,對於該任務你可以使用特定的庫。你可以選擇你需要的特性的實現,使用 PureScript 允許高效與個性化體驗,同時使得生成的代碼盡可能小。

其編譯器的另一個獨特特性就是生成簡潔與可讀代碼的能力,同時保持與 JavaScript 的相容,兩者都專注於庫與工具。

類似其他語言,PureScript具有其自己的構建工具,名為 Pulp, 相比於 Gulp,後者是使用該語言編寫的工程。

對於類型系統—不同於 Elm, 另一個 ML-類語言—PureScript 可以支援高級類型特性,例如 higher-kinded 類型 與類型類,後者來自 Haskell 允許創建高級抽象。

module Main whereimport Preludeimport Data.Foldable (fold)import TryPureScript

PureScript 入門

CoffeeScript

CoffeeScript 是一門致力於展示 JavaScript 好的部分,同時提供簡潔的語法並保持語義的程式設計語言。儘管該語言的流行度在最近幾年有所減弱,它正在變換方向,並且出現支援 ES2015+ 特徵的新版本。

你使用 CoffeScript 編寫的代碼直接被轉換為可讀的 JavaScript 代碼,並且與現有的庫保持相容。由版本2開始,編譯器將會生成與 ECMAScript 的最新版本相容的代碼,每次你使用 class,你就會在 JavaScript 中得到一個 class 。同時,如果你使用 React,還有一個好消息:JSX 是與 CoffeeScript 相容的。

編譯器的一個非常顯著的特徵是能夠處理以文字風格編寫的代碼,而不是強調代碼並將注釋作為額外的內容,你可以先寫注釋, 代碼只是偶爾出現.這種程式設計風格,Donald Knuth推出了一個代碼檔非常類似于一個技術文章。

與其他語言不同,CoffeeScript代碼可以使用庫直接在流覽器中解釋。所以如果你想創建一個快速測試, 你可以在text/ CoffeeScript的腳本標籤內編寫代碼,並包含編譯器,將代碼轉換成JavaScript。

# 賦值:number = 42opposite = true# 條件:number = -42 if opposite

開始使用CoffeeScript2

讀 Modern JavaScript

跟上不斷變化的JavaScript世界

現在開始閱讀

ClojureScript

ClojureScript 是一個將Clojure程式設計語言轉換為JavaScript的編譯器。它是一種通用的功能語言,具有動態類型和支援不可變資料結構的函數式語言。

它是這個清單中唯一屬於Lisp系列的程式設計語言,而且它們共用了很多特性。例如,代碼可以作為資料處理,並且可以使用巨集系統,使元程式設計技術成為可能。與其他Lisps不同,Clojure支援不可變的資料結構,簡化了管理副作用。

由於使用括弧,其語言對於初學者是令人生畏的,但是這樣設計是有其深刻的原因的,一段時間之後你一定會喜歡這種形式的。語法中的極簡主義及其語法抽象能力使得 Lisp 成為解決需要高級問題的有力工具。

儘管 Clojure 主要是一種函數式語言,但是並不 PureScript 或 Elm 純粹,依然會出現副作用,但是依然有其他的函數式特性。

ClojureScript 使用 Google Closure 進行代碼優化同時與現有的 JavaScript 保持相容。

; Extracted from https://github.com/clojure/clojurescript/blob/master/samples/dom/src/dom/test.cljs(ns dom.test (:require [clojure.browser.event :as event]

ClojureScript 入門

Scala.js

Scala.js 是一個將 Scala 程式語言轉換為 JavaScript 的編譯器。Scala 是將物件導向與函數式程式設計思想融合為一門語言來創建易於使用的強大工具的程式設計語言。

作為一門強類型語言,我們獲得具有半類型推導的靈活類型系統的好處。大部分值可以進行推導,但是函數參數依然需要顯示式的類型注釋。

儘管支援許多常見的物件導向模式(例如,所有的值都是物件而操作是方法調用),你也可以獲得函數特性,例如第一類函數與不可修改的資料結構。

Scala.js 的一個特別優點在於你可以由一個較為熟悉的,物件導向方法開始,然後以你自己的速度在你需要時轉向更為函數式的方式,而無需做大量的工作。同時,現有的 JavaScript 代碼與庫相容你的 Scala 代碼。

Scala 初學者將會發現該語言與 JavaScript 並不是完全不同,比較下列兩段等效的代碼:

// JavaScriptvar xhr = new XMLHttpRequest();xhr.open("GET",// Scala.jsval xhr = new XMLHttpRequest()xhr.open("GET",

Scala.js 入門

Reason

Reason 是一門 Facebook 創建與維護的語言,為 OCaml 編譯器提供了一種新語法,同時代碼可以被同時轉換為 JavaScript 與原生代碼。

作為 ML 家庭的一員,同時自身是一門函數式語言,它提供了強大而靈活的帶有推導的類型系統,代數資料類型以及模式匹配。它同時支持不可修改資料類型與參數化多態(在其他語言中被稱為範型),但是在 OCaml 中,同時支持物件導向程式設計。

通過 bucklescript 綁定可以使用現有的 JavaScript 庫。你可以混用 JavaScript與 Reason 代碼。所插入的 JavaScript 代碼並不會被嚴格檢測,但是可用於快速修正與原型。

如果你是一個 React 開發者, 存在相應的綁定 而且該語言同時支援 JSX。

/* A type variant being pattern matched */let possiblyNullValue1 = None;let possiblyNullValue2 = Some "Hello@";switch possiblyNullValue2 {| None => print_endline "Nothing to see here."| Some message => print_endline message};/* Parametrized types */type universityStudent = {gpa: float};type response 'studentType = {status: int, student: 'studentType};let result: response universityStudent = fetchDataFromServer ();/* A simple typed object */type payload = Js.t {.

Reason 入門

Haxe

Haxe 是一門多範型程式設計語言,而且其編譯器可以同時生成二進位以及其他語言的原始程式碼。

儘管 Haxe 提供具有類型推導支援的嚴格靜態系統,如果目的語言支援,它也可以作為一門動態語言。以同樣的方式,它支援多種程式設計風格,例如物件導向,範型與函數式。

當你編寫 Haxe 代碼時,你可以編譯為多種平臺與語言,而無需進行顯著的修改。平臺特定的代碼塊也是可以的。

你可以使用相同的代碼編寫後端與前端 ,同時使用 Haxe Remoting 同時為同步與非同步連接實現通信。

正如所期待的,Haxe 代碼相容現有的庫,同時提供了成熟的標準庫。

// Example extracted from http://code.haxe.orgextern class Database {

Haxe 入門

Nim

Nim 是一門具有極簡主義與空格敏感語法的靜態類型,多範型程式設計語言,可以編譯為 C, C++, 與 JavaScript。

語言本身很小巧,但是其元程式設計能力使得其對於你自己實現其他語言中的內建特性很有吸引力。實現該目的的構建塊是巨集,範本與範型,使用這些構建塊你可以實現簡單的特性到不同的範型。這使得 Nim 成為一門可以滿足你需求的極其靈活的語言,具有 Lisp 的靈魂。

Nim 的句法抽象特徵允許你為你的問題修改語言,使得 DSL 成為可能。如果你有特定的任務要解決,你可以得到更高級別的運算式。

# Reverse a string

Nim 入門

結論

如果JavaScript不是你最喜歡的語言,你仍然可以創建web應用程式而不必忍受技術的缺點。用於創建這些應用程式的語言 可以有更多的嘗試, 從純函數語言,如PureScript,到物件導向的語言,如Dart。如果你想要的不僅僅是一對一的語言翻譯, 你可以選擇像Elm一樣的語言,為你提供工具,像一個虛擬的DOM和一個內置的架構。

你有沒有試過這篇文章的任何語言,或者你有推薦的嗎?可以在評論中告訴我們吧!

稿源:程式師

但是保持 JavaScript 作為其核心。

PureScript 的優點就在於其極簡主義。它並不包含任何功能性庫,而在其他語言中被通常被認為是其核心。例如,在其編譯器自身中並不包含生成器與 promises ,對於該任務你可以使用特定的庫。你可以選擇你需要的特性的實現,使用 PureScript 允許高效與個性化體驗,同時使得生成的代碼盡可能小。

其編譯器的另一個獨特特性就是生成簡潔與可讀代碼的能力,同時保持與 JavaScript 的相容,兩者都專注於庫與工具。

類似其他語言,PureScript具有其自己的構建工具,名為 Pulp, 相比於 Gulp,後者是使用該語言編寫的工程。

對於類型系統—不同於 Elm, 另一個 ML-類語言—PureScript 可以支援高級類型特性,例如 higher-kinded 類型 與類型類,後者來自 Haskell 允許創建高級抽象。

module Main whereimport Preludeimport Data.Foldable (fold)import TryPureScript

PureScript 入門

CoffeeScript

CoffeeScript 是一門致力於展示 JavaScript 好的部分,同時提供簡潔的語法並保持語義的程式設計語言。儘管該語言的流行度在最近幾年有所減弱,它正在變換方向,並且出現支援 ES2015+ 特徵的新版本。

你使用 CoffeScript 編寫的代碼直接被轉換為可讀的 JavaScript 代碼,並且與現有的庫保持相容。由版本2開始,編譯器將會生成與 ECMAScript 的最新版本相容的代碼,每次你使用 class,你就會在 JavaScript 中得到一個 class 。同時,如果你使用 React,還有一個好消息:JSX 是與 CoffeeScript 相容的。

編譯器的一個非常顯著的特徵是能夠處理以文字風格編寫的代碼,而不是強調代碼並將注釋作為額外的內容,你可以先寫注釋, 代碼只是偶爾出現.這種程式設計風格,Donald Knuth推出了一個代碼檔非常類似于一個技術文章。

與其他語言不同,CoffeeScript代碼可以使用庫直接在流覽器中解釋。所以如果你想創建一個快速測試, 你可以在text/ CoffeeScript的腳本標籤內編寫代碼,並包含編譯器,將代碼轉換成JavaScript。

# 賦值:number = 42opposite = true# 條件:number = -42 if opposite

開始使用CoffeeScript2

讀 Modern JavaScript

跟上不斷變化的JavaScript世界

現在開始閱讀

ClojureScript

ClojureScript 是一個將Clojure程式設計語言轉換為JavaScript的編譯器。它是一種通用的功能語言,具有動態類型和支援不可變資料結構的函數式語言。

它是這個清單中唯一屬於Lisp系列的程式設計語言,而且它們共用了很多特性。例如,代碼可以作為資料處理,並且可以使用巨集系統,使元程式設計技術成為可能。與其他Lisps不同,Clojure支援不可變的資料結構,簡化了管理副作用。

由於使用括弧,其語言對於初學者是令人生畏的,但是這樣設計是有其深刻的原因的,一段時間之後你一定會喜歡這種形式的。語法中的極簡主義及其語法抽象能力使得 Lisp 成為解決需要高級問題的有力工具。

儘管 Clojure 主要是一種函數式語言,但是並不 PureScript 或 Elm 純粹,依然會出現副作用,但是依然有其他的函數式特性。

ClojureScript 使用 Google Closure 進行代碼優化同時與現有的 JavaScript 保持相容。

; Extracted from https://github.com/clojure/clojurescript/blob/master/samples/dom/src/dom/test.cljs(ns dom.test (:require [clojure.browser.event :as event]

ClojureScript 入門

Scala.js

Scala.js 是一個將 Scala 程式語言轉換為 JavaScript 的編譯器。Scala 是將物件導向與函數式程式設計思想融合為一門語言來創建易於使用的強大工具的程式設計語言。

作為一門強類型語言,我們獲得具有半類型推導的靈活類型系統的好處。大部分值可以進行推導,但是函數參數依然需要顯示式的類型注釋。

儘管支援許多常見的物件導向模式(例如,所有的值都是物件而操作是方法調用),你也可以獲得函數特性,例如第一類函數與不可修改的資料結構。

Scala.js 的一個特別優點在於你可以由一個較為熟悉的,物件導向方法開始,然後以你自己的速度在你需要時轉向更為函數式的方式,而無需做大量的工作。同時,現有的 JavaScript 代碼與庫相容你的 Scala 代碼。

Scala 初學者將會發現該語言與 JavaScript 並不是完全不同,比較下列兩段等效的代碼:

// JavaScriptvar xhr = new XMLHttpRequest();xhr.open("GET",// Scala.jsval xhr = new XMLHttpRequest()xhr.open("GET",

Scala.js 入門

Reason

Reason 是一門 Facebook 創建與維護的語言,為 OCaml 編譯器提供了一種新語法,同時代碼可以被同時轉換為 JavaScript 與原生代碼。

作為 ML 家庭的一員,同時自身是一門函數式語言,它提供了強大而靈活的帶有推導的類型系統,代數資料類型以及模式匹配。它同時支持不可修改資料類型與參數化多態(在其他語言中被稱為範型),但是在 OCaml 中,同時支持物件導向程式設計。

通過 bucklescript 綁定可以使用現有的 JavaScript 庫。你可以混用 JavaScript與 Reason 代碼。所插入的 JavaScript 代碼並不會被嚴格檢測,但是可用於快速修正與原型。

如果你是一個 React 開發者, 存在相應的綁定 而且該語言同時支援 JSX。

/* A type variant being pattern matched */let possiblyNullValue1 = None;let possiblyNullValue2 = Some "Hello@";switch possiblyNullValue2 {| None => print_endline "Nothing to see here."| Some message => print_endline message};/* Parametrized types */type universityStudent = {gpa: float};type response 'studentType = {status: int, student: 'studentType};let result: response universityStudent = fetchDataFromServer ();/* A simple typed object */type payload = Js.t {.

Reason 入門

Haxe

Haxe 是一門多範型程式設計語言,而且其編譯器可以同時生成二進位以及其他語言的原始程式碼。

儘管 Haxe 提供具有類型推導支援的嚴格靜態系統,如果目的語言支援,它也可以作為一門動態語言。以同樣的方式,它支援多種程式設計風格,例如物件導向,範型與函數式。

當你編寫 Haxe 代碼時,你可以編譯為多種平臺與語言,而無需進行顯著的修改。平臺特定的代碼塊也是可以的。

你可以使用相同的代碼編寫後端與前端 ,同時使用 Haxe Remoting 同時為同步與非同步連接實現通信。

正如所期待的,Haxe 代碼相容現有的庫,同時提供了成熟的標準庫。

// Example extracted from http://code.haxe.orgextern class Database {

Haxe 入門

Nim

Nim 是一門具有極簡主義與空格敏感語法的靜態類型,多範型程式設計語言,可以編譯為 C, C++, 與 JavaScript。

語言本身很小巧,但是其元程式設計能力使得其對於你自己實現其他語言中的內建特性很有吸引力。實現該目的的構建塊是巨集,範本與範型,使用這些構建塊你可以實現簡單的特性到不同的範型。這使得 Nim 成為一門可以滿足你需求的極其靈活的語言,具有 Lisp 的靈魂。

Nim 的句法抽象特徵允許你為你的問題修改語言,使得 DSL 成為可能。如果你有特定的任務要解決,你可以得到更高級別的運算式。

# Reverse a string

Nim 入門

結論

如果JavaScript不是你最喜歡的語言,你仍然可以創建web應用程式而不必忍受技術的缺點。用於創建這些應用程式的語言 可以有更多的嘗試, 從純函數語言,如PureScript,到物件導向的語言,如Dart。如果你想要的不僅僅是一對一的語言翻譯, 你可以選擇像Elm一樣的語言,為你提供工具,像一個虛擬的DOM和一個內置的架構。

你有沒有試過這篇文章的任何語言,或者你有推薦的嗎?可以在評論中告訴我們吧!

稿源:程式師

Next Article
喜欢就按个赞吧!!!
点击关闭提示