TokyoFacebookTwitterHatenaPocketフロントエンドからサーバーサイドまで、すっかりJavaScriptが幅を利かせている昨今。JavaScriptは苦手、気に入らない開発者のために、コンパイル言語(altJS)を紹介します。現代のアプリはかつての単純なWebサイトとは求められるものが違うのに、プラットフォームは相変わらずブラウザーのままで、Webアプリの核となる言語はJavaScriptです。JavaScriptはすべての場面で最適なわけではなく、複雑なアプリでは特に弱点があります。回避するために生まれたのが、新しい言語とそれに合わせたコンパイラーです。JavaScriptのコードを書かずにブラウザー上で動作するコードが書け、JavaScriptの制約に縛られることもありません。本記事では、JavaScriptへのコンパイルによってブラウザーやNode.jsなどのプラットフォーム上で動作する優れた言語を10種類紹介します。DartDartは古典的なオブジェクト指向言語です。すべてがオブジェクトで、オブジェクトはいずれかのクラスのインスタンスです(関数としても機能します)。この言語はブラウザー、サーバー、モバイルデバイス上で動くアプリに特化して作られました。UIで使われている言語でもあります。大規模アプリにも対応できる強力な言語であることが分かります。VM(バーチャルマシン)を使えば、そのまま実装することも可能です。複雑なアプリ開発では熟成したライブラリーやあるタスクに特化した機能を使いたいところです。Dartはすべてを持ち合わせています。代表的なライブラリーはDart用のAngular「AngularDart」です。型を明示して型安全性(type-safe)を持つコードが書けるうえ、推測できる型は指定しなくてもいいので煩わしくありません。詳細で悩まずに高速プロトタイピングして、一度うまくいったら型を追加することでコードを堅牢にできます。VM上での並行処理は、共有メモリースレッドの代わりに(Dartは単一スレッド)、DartではIsolatesと呼ばれる単位でメモリーヒープを分け、各Isolates間のやりとりにはメッセージを用います。ブラウザーの場合は少し異なり、isolatesではなくWorkersを新規作成します。1;}Dart入門TypeScriptTypeScriptはJavaScriptの上位互換(スーパーセット)です。static修飾子が必要ですが、JavaScriptのコードはTypeScript上でも有効です。TypeScriptのコンパイラーはES2015以降に相当する機能への変換コンパイルにも対応しているため、常に最新の機能が使えます。ほかの言語とは異なりTypeScriptはJavaScriptの思想を受け継ぎ、コードの健全性を改善する特徴だけ追加されています。型アノテーションをはじめ型に関する機能があり、静的コード解析やそのほかのリファクタリングに便利なツールが使えるため、「より快適に書けるJavaScript」に仕上がっています。型があることで、別々のコンポーネント間のデータの受け渡しも改善しています。型推論に対応していて、毎回すべての型を書かなくても大丈夫です。手早く動くものを作り、あとで型を追加してコードを強化することが可能です。guards)などの高度な型を持っています。詳しくはTypeScript公式ドキュメントの高度な型を見てください。Reactを使っている場合は、Reactの型を追加することでJSXも使えます。}}ElmElmは、JavaScript、HTML、CSSにコンパイルできる純粋な関数型言語です。Elmだけで完全なサイトが構築できるため、ReactなどのJavaScriptフレームワークの代わりにも使えます。Elmで作られたアプリは自動でバーチャルDOMライブラリーを利用するため非常に高速です。Elmの利点は、この設計でデータフローを気にせずにデータの宣言やロジックに集中できます。Elmのすべての関数は純粋(同じ入力に対しては同じ出力が返る)です。意図的に作り替えないかぎり関数はそれ以外のことをしません。外部APIを利用したいなら、外部と通信するcommand関数を作り、応答を得るためにsubscriptions関数を作ります。純粋性の特徴は、値は変更されない(immutable)点です。必要なら、既存の値を変更するのではなく、あらためて別の値を生成します。portsを使えばJavaScriptやほかのライブラリーとやりとりできるため、徐々に採用することも可能です。正式なバージョン1に達していませんが、すでに複雑で大型のアプリケーションでも採用されていることから、複雑なアプリでも選択できます。Elmの魅力は、中身の分からないメッセージではなく、コードの修正の助けになるコードを生成することで、言語を習得する際に、コンパイラー自体が大きな助けになります。初心者にもやさしいコンパイラーです。Freemanが作成した、純粋な関数型で強力な型付けを持つプログラミング言語です。思想的にはHaskellと同様に既存のJavaScriptライブラリーとの高い互換性を持つように設計されつつも、核は依然JavaScriptです。PureScriptの強みはコンパクトさです。ほかの言語では必須のライブラリーに依存しません。コンパイラーは、ジェネレーターやプロミスを読み込まず、タスクの処理に適したライブラリーを使えます。必要な機能に応じた実装が可能なので、生成されるコードを最小限に保ちつつ高効率で最適なアプリが作れます。1つの特徴は、ライブラリーとツールを含むJavaScriptとの互換性を保ちながらもクリーンで可読性のあるコードを生成するコンパイラーです。ほかの言語と同様、PureScriptには独自のビルドツール「Pulp」があります。Gulpに似ていますが、PureScriptで書かれたプロジェクト専用です。型に関しては、別のメタ言語風のElmとは異なり、高階型変数や型クラスなどの高度な型に対応しています。Haskellの機能を使っていて、洗練された抽象化を可能にします。]PureScript入門CoffeeScriptCoffeeScriptはJavaScriptの良いところを極力活かしながらも、よりスッキリした構文と最適なセマンティック(意味付け)を実現します。人気は近年陰りが見られるものの路線を変更し、ES2015以上の機能を実装するメジャーアップデートもありました。CoffeeScriptのコードは可読性のあるJavaScriptへ直接変換され、既存ライブラリーとの互換も保たれます。バージョン2からはコンパイラーは最新版のECMAScriptと互換のあるコードを生成するため、CoffeeScriptでclassを使うと、JavaScriptでもclassが生成されます。JSXがCoffeeScriptと互換性があるのは、Reactを使っている人には朗報でしょう。Programming)で書かれたコードを生成できる点です。コード内で強調を使ったりコメントを別途用意したりする代わりに、コメントありきで、コードは時折現れる程度です。Knuthが提唱したスタイルです。ほかの言語と異なり、CoffeeScriptのコードはライブラリーを使い直接ブラウザーで解釈します。クイックテストを作りたければtext/coffeescriptタグ内にコードを書いてコンパイラーをincludeすれば、コードは直接JavaScriptとして解釈されます。2入門ClojureScriptClojureScriptは、プログラミング言語のClojureからJavaScriptに変換するコンパイラーです。Clojureは動的型付けをもつ汎用の関数型言語で、変更不可な(immutable)データ構造に対応しています。ClojureScriptは本リスト中で唯一Lisp系のプログラミング言語なので、近い特徴があります。コードはデータとして扱われ、マクロが使えるのでメタプログラミングが可能です。ほかのLisp系言語とは違いClojureは変更不可の(immutable)データ構造に対応しており、副作用の管理がしやすくなっています。括弧の使い方をはじめ、はじめての人にとっては取っ付きにくく見える構文ですが、深い理由があり、長い目で見ると良さに気が付くでしょう。構文の簡潔さと抽象化能力により、高度な抽象化が必要な場面においてLispは強力なツールとなります。Clojureは基本的には関数型言語ですが、PureScriptやElmのように純粋ではありません。そのため副作用(side-effect)の可能性は残っていますが、そのほかの関数型言語の特徴は有しています。Closureを使用しているため、既存のJavaScriptライブラリーと互換性があります。source)(log-listener-count)ClojureScript入門Scala.jsScala.jsは、プログラミング言語ScalaをJavaScriptに変換するコンパイラーです。Scalaは、採用しやすくて強力なツールとしてオブジェクト指向言語と関数型言語の特徴を1つの言語に盛り込む言語です。厳密な型付けを持つ言語なので、部分的型推定による柔軟な型システムが使いやすいです。値は型推定できますが、関数パラメーターには明示的な型アノテーションが必須です。function)や変更不可(immutable)なデータ構造などの恩恵も受けられます。Scala.jsは、使い慣れたオブジェクト指向から始めつつも、自分のペースと必要性に合わせて苦労なく関数型への移行ができる利点があります。既存のJavaScriptコードやライブラリーと、Scalaコードとの互換性もあります。Scala初心者でも以下のコードを見比べれば、JavaScriptと極端な違いはないと分かるでしょう。}}xhr.send()Scala.js入門ReasonReasonはFacebookにより開発・維持されている言語で、OCaml(オーキャメル)コンパイラー用に新しい構文を追加したもので、JavaScriptもしくはネイティブコードの両方に変換可能です。関数型言語であるML言語の方言なので、強力かつ柔軟な型システムを持ち、型推論、代数的データ型、パターンマッチングなどを備えています。変更不可(immutable)なデータ型や多態ポリモーフィズム(言語によってはジェネリックとも呼ばれる)にも対応し、OCamlはさらにオブジェクト指向プログラミングも可能です。bucklescriptのバインディングを使えば、既存のJavaScriptライブラリーも使えます。Reasonのコードと一緒にJavaScriptのコードも使えるので、挿入されたJavaScriptのコードは厳密に検査されませんが、ちょっと手直ししたいときや試作で十分役に立ちます。Reactの開発者に、バインディングが使えてかつJSXにも対応していることも付け加えます。30};Reason入門HaxeHaxeはマルチパラダイム言語で、コンパイラーはバイナリコードのほか、さまざまな言語のソースコードが生成できます。Haxeは型推論ありの厳密な型付けを持ちながらも、ターゲット言語が対応していれば動的型付け言語としても使えます。同じようにプログラミング方式もオブジェクト指向、ジェネリック、関数型などさまざまな方式に対応します。Haxeでコードを書けば、大きな変更もなく複数のプラットフォームや言語を対象にコンパイルでき、特定ターゲット向けのコードブロックも書けます。Remotingで相互に通信することも可能です。Haxeのコードは既存ライブラリーと互換性がありますが、洗練された独自の標準ライブラリーも持っています。HaxeHaxe入門NimNimは静的型付けのマルチパラダイム言語です。簡潔で、空白も判別できる構文を持ち、C、C++、JavaScriptへコンパイルできます。この言語自体は非常に簡潔ですがメタプログラミングが可能なので、ほかの言語にあるような機能も自分で実装できる点は魅力です。そのためにはマクロ、テンプレート、ジェネリックを使用して、簡単な機能から大掛かりな仕様まで構築できます。したLisp的な思想によりNimは極めて万能な言語となっており、自分の用途に合わせて使えます。Nimの持つ抽象化機能により、タスクに合わせた言語の改変が可能なため、真のDSL(ドメイン固有言語)を作成できます。解決すべき特別なタスクがある場合、より高度な記述表現が使えます。最後にJavaScriptが気に入らなくても、欠点に苦しむことなくWebアプリは作れます。紹介した通り、アプリ作りの選択肢は個人の好みに広く対応していて、PureScriptのような純粋関数型言語からDartのようなオブジェクト指向言語まで揃っています。言語の1対1の変換以上のものを求めるならば、ElmのようなバーチャルDOMと独自構造を持った言語が選べます。Kolceメキシコ在住のフリーランスデザイナー兼Web開発者。CSSのリード・デベロッパーで、優れたデザインのWebサイトを素早く構築するために拡張性の高いフレームワークを使うミニマリストです。