溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

可編譯成javascript的語言有哪些

發(fā)布時(shí)間:2020-10-23 19:51:29 來源:億速云 閱讀:231 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了可編譯成javascript的語言有哪些,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

本文列出了十種有趣的語言,它們可以編譯成JavaScript,以便在瀏覽器或Node.js之類的平臺(tái)上執(zhí)行。

現(xiàn)代應(yīng)用程序與簡(jiǎn)單的網(wǎng)站有不同的要求。但是瀏覽器是一個(gè)擁有(大部分)固定可用技術(shù)的平臺(tái),JavaScript仍然是web應(yīng)用程序的核心語言。任何需要在瀏覽器中運(yùn)行的應(yīng)用程序都必須用這種語言實(shí)現(xiàn)。

我們都知道JavaScript并不是每個(gè)任務(wù)的最佳語言,當(dāng)涉及到復(fù)雜的應(yīng)用程序時(shí),它可能會(huì)有不足之處。

為了避免這個(gè)問題,已經(jīng)創(chuàng)建了幾種新語言和現(xiàn)有語言的轉(zhuǎn)置器,它們都生成了可以在瀏覽器中工作的代碼,而不需要編寫任何JavaScript行,也不需要考慮該語言的限制。

Dart

DART是一種經(jīng)典的面向?qū)ο笳Z言,其中所有內(nèi)容都是對(duì)象,任何對(duì)象都是類的實(shí)例(對(duì)象也可以充當(dāng)函數(shù))。它是專門為瀏覽器、服務(wù)器和移動(dòng)設(shè)備構(gòu)建應(yīng)用程序的。

它是由谷歌維護(hù)的,是下一代adwords用戶界面的驅(qū)動(dòng)語言,是谷歌最重要的收入產(chǎn)品,這本身就是它在規(guī)模上強(qiáng)大的證明。

該語言可以轉(zhuǎn)換為JavaScript以在瀏覽器中使用,也可以由Dart VM直接解釋,從而也可以構(gòu)建服務(wù)器應(yīng)用程序。 可以使用Flutter SDK制作移動(dòng)應(yīng)用程序。

復(fù)雜的應(yīng)用程序還需要為該任務(wù)專門設(shè)計(jì)的一組成熟的庫和語言特性,Dart包括所有這些。一個(gè)流行庫的例子是AngularDart,它是Dart的Angular版本。

它允許您編寫類型安全的代碼,而不會(huì)太麻煩。您可以編寫類型,但不需要這樣做,*因?yàn)榭梢酝茢嗨鼈?。這允許快速構(gòu)建原型,而不必過多考慮細(xì)節(jié),但是一旦您有了工作,您就可以添加類型,使其更加健壯。

關(guān)于VM中的并發(fā)編程,Dart不是使用共享內(nèi)存線程(Dart是單線程的),而是使用他們所謂的隔離內(nèi)存堆,在那里使用消息來實(shí)現(xiàn)通信。在瀏覽器中,情況有點(diǎn)不同:不是創(chuàng)建新的隔離,而是創(chuàng)建新的worker。

// 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 = π?r2, therefore π = A/r2.
    // 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;
}

TypeScript

TypeScript是JavaScript的超集。一個(gè)有效的JavaScript程序也是有效的TypeScript,但是添加了靜態(tài)類型。編譯器還可以作為從ES2015+到當(dāng)前實(shí)現(xiàn)的轉(zhuǎn)換程序,因此您總是可以獲得最新的特性。

與許多其他語言不同,TypeScript保留了JavaScript的精神,只是添加了一些特性來提高代碼的健壯性。這些是類型注釋和其他與類型相關(guān)的功能,它們使編寫JavaScript更加令人愉快,這要感謝支持靜態(tài)分析程序等專門工具和其他工具來幫助重構(gòu)過程。

此外,添加類型還可以改進(jìn)應(yīng)用程序不同組件之間的接口。

支持類型推斷,因此不必從頭編寫所有類型。您可以編寫快速的解決方案,然后添加所有類型,以便對(duì)您的代碼有信心。

TypeScript還支持高級(jí)類型,比如交集類型、聯(lián)合類型、類型別名、區(qū)分的聯(lián)合和類型保護(hù)。您可以在TypeScript文檔站點(diǎn)的高級(jí)類型頁面中查看所有這些。

如果使用react,還可以通過添加react類型來支持jsx:

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})`;
  }
}

Elm

Elm是一種純函數(shù)式編程語言,可以編譯為JavaScript、HTML和CSS。您可以使用Elm構(gòu)建一個(gè)完整的站點(diǎn),使其成為React等JavaScript框架的一個(gè)很好的替代品。

使用它構(gòu)建的應(yīng)用程序自動(dòng)使用一個(gè)虛擬DOM庫,使其運(yùn)行非???。一個(gè)很大的優(yōu)點(diǎn)是內(nèi)置的體系結(jié)構(gòu),它使您忘記了數(shù)據(jù)流,轉(zhuǎn)而專注于數(shù)據(jù)聲明和邏輯。

在Elm中,所有函數(shù)都是純函數(shù),這意味著對(duì)于給定的輸入,它們總是返回相同的輸出。他們不能做任何事情,除非你指定它。例如,要訪問遠(yuǎn)程API,您需要?jiǎng)?chuàng)建命令函數(shù)來與外部世界通信,并創(chuàng)建訂閱來偵聽響應(yīng)。

純度的另一點(diǎn)是,值是不可變的:當(dāng)您需要某些東西時(shí),您創(chuàng)建新的值,而不是修改它們。

Elm的采用可以是漸進(jìn)的??梢允褂枚丝谂cJavaScript和其他庫通信。雖然Elm還沒有達(dá)到版本1,但是它已經(jīng)被用于復(fù)雜和大型應(yīng)用程序,這使得它成為復(fù)雜應(yīng)用程序的可行解決方案。

Elm最吸引人的特性之一是初學(xué)者友好的編譯器,它不是生成難以閱讀的消息,而是生成幫助您修復(fù)代碼的代碼。如果你正在學(xué)習(xí)這門語言,編譯器本身會(huì)有很大的幫助。

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

PureScript

purescript是一種純功能的強(qiáng)類型編程語言,由phil freeman創(chuàng)建。它的目標(biāo)是提供與可用javascript庫的強(qiáng)兼容性,在精神上類似于haskell,但保持javascript的核心。

PureScript的一個(gè)優(yōu)點(diǎn)是它的極簡(jiǎn)主義。它不包含任何在其他語言中被認(rèn)為是必不可少的功能庫。例如,您可以為任務(wù)使用特定的庫,而不是在編譯器本身中包含生成器和承諾。

您可以為您需要的特性選擇您想要的實(shí)現(xiàn),這允許在使用PureScript時(shí)獲得高效和個(gè)性化的體驗(yàn),同時(shí)使生成的代碼盡可能小。

它的編譯器的另一個(gè)獨(dú)特的特性是,在保持與JavaScript兼容的同時(shí),能夠生成干凈且可讀的代碼,包括庫和工具。

與其他語言一樣,PureScript也有自己的構(gòu)建工具Pulp,它可以與Gulp進(jìn)行比較,但是對(duì)于用這種語言編寫的項(xiàng)目來說。

關(guān)于類型系統(tǒng)——不像Elm,它是另一種類似于ml的語言——PureScript支持高級(jí)類型特性,比如高級(jí)類型和類型類,它們來自Haskell,允許創(chuàng)建復(fù)雜的抽象:

module Main where

import Prelude
import Data.Foldable (fold)
import TryPureScript

main =
    render $ fold
      [ h2 (text "Try PureScript!")
      , p (text "Try out the examples below, or create your own!")
      , h3 (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"
        }
      ]

要使用purescript執(zhí)行下一步,請(qǐng)查看github上的purescript入門指南。

CoffeeScript

CoffeeScript是一種語言,旨在公開JavaScript的優(yōu)秀部分,同時(shí)提供更干凈的語法和保持語義。盡管近年來該語言的受歡迎程度有所下降,但它正在改變方向,最近又獲得了一個(gè)新的主要版本,支持ES2015+特性。

您在CoffeeScript中編寫的代碼將直接轉(zhuǎn)換為可讀的JavaScript代碼,并保持與現(xiàn)有庫的兼容性。 從版本2開始,編譯器將生成與最新版本的ECMAScript兼容的代碼。

例如,每次使用類時(shí),您都會(huì)在JavaScript中獲得一個(gè)類。 另外,如果您使用React,則有個(gè)好消息:JSX與CoffeeScript兼容。

編譯器的一個(gè)非常獨(dú)特的功能是能夠處理以素養(yǎng)風(fēng)格編寫的代碼,您無需在代碼中強(qiáng)調(diào)重點(diǎn)和添加注釋,而是首先編寫注釋,并且代碼僅偶爾出現(xiàn)。 Donald Knuth引入了這種編程風(fēng)格,使代碼文件與技術(shù)文章非常相似。

與其他語言不同,CoffeeScript代碼可以在瀏覽器中使用庫直接解釋。因此,如果你想創(chuàng)建一個(gè)快速測(cè)試,你可以用text/coffeescript腳本標(biāo)簽編寫代碼,并包含編譯器,編譯器會(huì)實(shí)時(shí)將代碼翻譯成JavaScript:

# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

# Arrays:
list = [1, 2, 3, 4, 5]

# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# Existence:
alert "I knew it!" if elvis?

# Array comprehensions:
cubes = (math.cube num for num in list)

coffeescript站點(diǎn)有一個(gè)方便的coffeescript 2資源入門。

ClojureScript

ClojureScript是一個(gè)編譯器,它將Clojure編程語言翻譯成JavaScript。它是一種通用的函數(shù)式語言,具有動(dòng)態(tài)類型和對(duì)不可變數(shù)據(jù)結(jié)構(gòu)的支持。

它是這個(gè)列表中唯一屬于Lisp編程語言家族的,并且自然地,它共享了許多特性。例如,可以將代碼視為數(shù)據(jù),并且可以使用宏系統(tǒng),從而使元編程技術(shù)成為可能。與其他lisp不同,Clojure支持不可變的數(shù)據(jù)結(jié)構(gòu),這使得副作用的管理更加容易。

由于使用了括號(hào),語法對(duì)新手來說可能有些嚇人,但這樣做有其深刻的原因,從長遠(yuǎn)來看,您肯定會(huì)喜歡它。語法中的這種極簡(jiǎn)主義及其語法抽象功能使Lisp成為解決需要高抽象級(jí)別的問題的強(qiáng)大工具。

雖然Clojure主要是一種函數(shù)式語言,但它不像PureScript或Elm那樣純粹。副作用仍然可能發(fā)生,但是其他功能特性仍然存在。

ClojureScript使用谷歌閉包進(jìn)行代碼優(yōu)化,并且與現(xiàn)有的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]
            [clojure.browser.dom   :as dom]))

(defn log [& args]
  (.log js/console (apply pr-str args)))

(defn log-obj [obj]
  (.log js/console obj))

(defn log-listener-count []
  (log "listener count: " (event/total-listener-count)))

(def source      (dom/get-element "source"))
(def destination (dom/get-element "destination"))

(dom/append source
            (dom/element "Testing me ")
            (dom/element "out!"))

(def success-count (atom 0))

(log-listener-count)

(event/listen source
              :click
              (fn [e]
                (let [i (swap! success-count inc)
                      e (dom/element :li
                                     {:id "testing"
                                      :class "test me out please"}
                                     "It worked!")]
                  (log-obj e)
                  (log i)
                  (dom/append destination
                              e))))

(log-obj (dom/element "Text node"))
(log-obj (dom/element :li))
(log-obj (dom/element :li {:class "foo"}))
(log-obj (dom/element :li {:class "bar"} "text node"))
(log-obj (dom/element [:ul [:li :li :li]]))
(log-obj (dom/element :ul [:li :li :li]))
(log-obj (dom/element :li {} [:ul {} [:li :li :li]]))
(log-obj (dom/element [:li {:class "baz"} [:li {:class "quux"}]]))

(log-obj source)
(log-listener-count)

要了解更多,請(qǐng)?jiān)L問ClojureScript站點(diǎn)的ClojureScript資源入門。

Scala.js

Scala.js是將Scala編程語言轉(zhuǎn)換為JavaScript的編譯器。 Scala是一種語言,旨在將來自面向?qū)ο蠛秃瘮?shù)式編程的思想融合為一種語言,以創(chuàng)建功能強(qiáng)大且易于采用的工具。

作為一種強(qiáng)類型語言,您可以從具有部分類型推斷的靈活類型系統(tǒng)中獲益。大多數(shù)值都可以推斷,但是函數(shù)參數(shù)仍然需要顯式的類型注釋。

雖然支持許多常見的面向?qū)ο竽J?例如,每個(gè)值都是一個(gè)對(duì)象,操作是方法調(diào)用),但是也可以獲得一些函數(shù)特性,比如支持一流函數(shù)和不可變數(shù)據(jù)結(jié)構(gòu)。

Scala.js的一個(gè)特殊優(yōu)勢(shì)是,您可以從熟悉的面向?qū)ο蟮姆椒ㄩ_始,然后根據(jù)需要以自己的速度遷移到功能更強(qiáng)的方法,而不需要做很多工作。另外,現(xiàn)有的JavaScript代碼和庫與Scala代碼兼容。

初學(xué)Scala的開發(fā)人員會(huì)發(fā)現(xiàn)這種語言與JavaScript并沒有太大的不同。比較以下等價(jià)代碼:

// JavaScript
var xhr = new XMLHttpRequest();

xhr.open("GET",
  "https://api.twitter.com/1.1/search/" +
  "tweets.json?q=%23scalajs"
);
xhr.onload = (e) => {
  if (xhr.status === 200) {
    var r = JSON.parse(xhr.responseText);
    $("#tweets").html(parseTweets(r));
  }
};
xhr.send();
// Scala.js
val xhr = new XMLHttpRequest()

xhr.open("GET",
  "https://api.twitter.com/1.1/search/" +
  "tweets.json?q=%23scalajs"
)
xhr.onload = { (e: Event) =>
  if (xhr.status == 200) {
    val r = JSON.parse(xhr.responseText)
    $("#tweets").html(parseTweets(r))
  }
}
xhr.send()

查看scala.js“scala.js入門”文檔了解更多信息。

Reason

Reason是Facebook創(chuàng)建和維護(hù)的一種語言,它為OCaml編譯器提供了一種新的語法,代碼可以翻譯成JavaScript和原生代碼。

作為ml家族和函數(shù)語言本身的一部分,它自然提供了一個(gè)強(qiáng)大而靈活的類型系統(tǒng),包括推理、代數(shù)數(shù)據(jù)類型和模式匹配。它還支持不可變的數(shù)據(jù)類型和參數(shù)多態(tài)性(在其他語言中也稱為泛型),但與ocaml一樣,也支持面向?qū)ο缶幊獭?/p>

使用現(xiàn)有的JavaScript庫可以使用bucklescript綁定。您還可以在理性代碼中混合使用JavaScript。插入的JavaScript代碼不會(huì)被嚴(yán)格檢查,但是對(duì)于快速修復(fù)或原型來說,它工作得很好。

如果您是react開發(fā)人員,則可以使用綁定,并且該語言還支持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 {.
  name: string,
  age: int
};
let obj1: payload = {"name": "John", "age": 30};

查看Reason站點(diǎn)的《Reason Guide入門》了解更多信息。

Haxe

Haxe是一種多范式編程語言,它的編譯器可以用其他語言生成二進(jìn)制文件和源代碼。

雖然Haxe提供了一個(gè)支持類型推斷的嚴(yán)格類型系統(tǒng),但是如果目標(biāo)語言支持它,它也可以作為動(dòng)態(tài)語言工作。同樣,它還支持各種編程風(fēng)格,如面向?qū)ο?、泛型和函?shù)式。

當(dāng)您編寫Haxe代碼時(shí),您可以針對(duì)幾個(gè)平臺(tái)和語言進(jìn)行編譯,而不需要進(jìn)行大量更改。還可以使用特定于目標(biāo)的代碼塊。

您可以使用相同的代碼在haxe中編寫后端和前端,并使用haxe remoting實(shí)現(xiàn)同步和異步連接的通信。

正如所料,Haxe代碼兼容現(xiàn)有庫,但它也提供了一個(gè)成熟的標(biāo)準(zhǔn)庫:

// Example extracted from http://code.haxe.org

extern class Database {
  function new();
  function getProperty<T>(property:Property<T>):T;
  function setProperty<T>(property:Property<T>, value:T):Void;
}

abstract Property<T>(String) {
  public inline function new(name) {
    this = name;
  }
}

class Main {
  static inline var PLAYER_NAME = new Property<String>("playerName");
  static inline var PLAYER_LEVEL = new Property<Int>("playerLevel");

  static function main() {
    var db = new Database();

    var playerName = db.getProperty(PLAYER_NAME);
    trace(playerName.toUpperCase());

    db.setProperty(PLAYER_LEVEL, 1);
  }
}

查看haxe站點(diǎn)的haxe頁面入門了解更多信息。

Nim

Nim是一種靜態(tài)類型的多范式編程語言,具有極簡(jiǎn)主義和對(duì)空格敏感的語法,可以編譯成JavaScript以及C、c++。

該語言本身非常小,但是它的元編程功能使得您可以自己實(shí)現(xiàn)其他語言內(nèi)置的特性。它的構(gòu)建塊是宏、模板和泛型,使用它們可以實(shí)現(xiàn)從簡(jiǎn)單功能到不同范例的各種功能。本著Lisp的精神,這使得Nim成為一種非常通用的語言,可以根據(jù)您的需要進(jìn)行調(diào)整。

Nim的語法抽象特性允許您根據(jù)問題調(diào)整語言,從而使真正的dsl成為可能。如果你有特殊的任務(wù)要解決,你可以得到更高的表達(dá)能力:

# Reverse a string
proc reverse(s: string): string =
  result = ""
  for i in countdown(high(s), 0):
    result.add s[i]

var str1 = "Reverse This!"
echo "Reversed: ", reverse(str1)

# Using templates
template genType(name, fieldname: expr, fieldtype: typedesc) =
  type
    name = object
      fieldname: fieldtype

genType(Test, foo, int)

var x = Test(foo: 4566)
echo(x.foo) # 4566

nim站點(diǎn)有一些有用的入門文檔,以獲取更多信息。

結(jié)論

如果JavaScript不是您最喜歡的語言,您仍然可以創(chuàng)建web應(yīng)用程序,而不必忍受該技術(shù)的缺點(diǎn)。用于創(chuàng)建這些應(yīng)用程序的選項(xiàng)可以滿足各種各樣的需求,從純函數(shù)語言(如PureScript)到面向?qū)ο笳Z言(如Dart)。

如果您想要比一對(duì)一語言翻譯更多的東西,您可以選擇Elm,它為您提供了虛擬DOM和內(nèi)置體系結(jié)構(gòu)等工具。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享可編譯成javascript的語言有哪些內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI