<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>altJS &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/altjs/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>モダンな言語でHTML5を開発しよう！ 俯瞰して理解するaltJSの比較 (前篇 &#8211; TypeScript, CoffeeScript, Haxe)</title>
		<link>https://html5experts.jp/clockmaker/2183/</link>
		<pubDate>Mon, 09 Sep 2013 22:00:06 +0000</pubDate>
		<dc:creator><![CDATA[池田 泰延]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Haxe]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[altJS]]></category>

		<guid isPermaLink="false">/?p=2183</guid>
		<description><![CDATA[ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代にな...]]></description>
				<content:encoded><![CDATA[<p>ここ数年のHTML5やCSS3の劇的な進化に比べて、JavaScriptの言語としての進化は緩やかだったのではないでしょうか。HTML5の登場により、リッチなウェブサイト・コンテンツ・アプリケーションが求められる時代になったのに、それを制御する言語が未だにレガシーなものであり、ニーズに追いついていないのが現状です。</p>

<p>2010年前後からこれらを解決する手段として、JavaScriptを生成する中間言語が登場してきました。これらは<strong>JavaScriptの代替ということで「altJS」</strong>と呼ばれています。altJSの言語の多くはクラス機構のサポートなどJavaScriptの抱える問題の多くを解決しており、スマートにコードを書くための仕組みが用意されており、<strong>開発効率を大幅に向上させることができます</strong>。本記事では前後編の2回でaltJSの5種類の言語を比較します。</p>

<p><img src="/wp-content/uploads/2013/09/altjs_image.png" alt="altjs_image" width="640" height="299" class="alignnone size-full wp-image-2239" srcset="/wp-content/uploads/2013/09/altjs_image.png 640w, /wp-content/uploads/2013/09/altjs_image-300x140.png 300w, /wp-content/uploads/2013/09/altjs_image-207x96.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><span id="more-2183"></span></p>

<h2>はじめに</h2>

<p>altJSとしてよく知られているのが次の5つの言語です。これらの複数の選択肢から、どの言語を選択するかは悩みどころです。例えば静的型情報やコンパイル時の型チェックの有無、パフォーマンス、既存JSとの相性、記述を要するコード量、開発環境の充実度など、言語を採用するには<strong>様々な観点からバランスよく選択することが重要</strong>になってきます。</p>

<p>本記事では各言語の基本的な文法や特徴、開発環境、筆者が考えるメリット・デメリットについて紹介します。</p>

<table>
<thead>
<tr>
  <th align="left">言語</th>
  <th>設計/開発</th>
  <th>登場時期</th>
  <th>影響を受けた言語</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">CoffeeScript</td>
  <td>Jeremy Ashkenas, et al.</td>
  <td>2009</td>
  <td>JavaScript, Python, Ruby, Haskell</td>
</tr>
<tr>
  <td align="left">TypeScript</td>
  <td>Microsoft</td>
  <td>2012</td>
  <td>JavaScript, Java, C#</td>
</tr>
<tr>
  <td align="left">Haxe</td>
  <td>Haxe Foundation,<br>Nicolas Cannasse</td>
  <td>2005</td>
  <td>ActionScript, OCaml</td>
</tr>
<tr>
  <td align="left">Dart</td>
  <td>Google</td>
  <td>2011</td>
  <td>Java, C++, JavaScript, CoffeeScript, Go</td>
</tr>
<tr>
  <td align="left">JSX</td>
  <td>DeNA</td>
  <td>2012</td>
  <td>JavaScript, ActionScript</td>
</tr>
</tbody>
</table>

<p>※いずれの言語もマルチプラットフォームであり、Windows, Mac OS Xともにどちらでも利用することができます。</p>

<h3>比較対象のサンプル</h3>

<p>サンプルとしてシンプルなスライドショーのWebコンテンツを用意しています。それぞれの言語でどのように記述して実装するのか、また生成されたJavaScriptがどのようなものであるか確認していきましょう。このサンプルでは言語の特性を紹介するために、実用的な要素として「クラス構造の利用」「既存JSライブラリの利用」「ユーザー操作」を含めています。</p>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモを開く</a></li>
</ul>

<p><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/09/sample.png" alt="" width="640" height="461" class="alignnone size-full wp-image-2189" srcset="/wp-content/uploads/2013/09/sample.png 640w, /wp-content/uploads/2013/09/sample-300x216.png 300w, /wp-content/uploads/2013/09/sample-207x149.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「Change Photo」ボタンをクリックすると写真が切り替わります。CSS3の3D TransformsをjQueryを用いて制御します（確認の際には、<a href="http://caniuse.com/#feat=transforms3d" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CSS3の3D Transformsが利用できるブラウザ</a>をご利用下さい）</p>

<h1>TypeScript</h1>

<p><img src="/wp-content/uploads/2013/09/typescript.png" alt="Welcome to TypeScript" /></p>

<h3>概要</h3>

<p><strong><a href="http://www.typescriptlang.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript</a>はマイクロソフトが開発するオープンソースの言語</strong>です。TypeScriptはJavaScript/ECMAScript 5を拡張した設計となっており、型情報やクラス、インターフェース、module、アロー関数式、列挙型、ジェネリクスといった言語機能が搭載されています。また既存のJavaScriptに僅かな修正を加えるだけでTypeScriptとして動作させることも可能です。<strong>いつくかの構文はECMAScript 6の案をベースとしたもの</strong>になっています。</p>

<p><strong>出力されたJavaScriptコードはとても読みやすく</strong>、TypeScriptのコードと基本的に1対1対応しています。またコメントも含めてJSに出力されるためデバッグが容易です（ソースマップを利用したデバッグも可能です）。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>TypeScriptでは定義ファイル（拡張子は.d.ts）と呼ばれるインターフェースを定義したファイルを用意します。TypeScriptではreferenceタグという記述で定義ファイルを参照します。有名なJSライブラリの定義ファイルは<a href="https://github.com/borisyankov/DefinitelyTyped" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">borisyankov/DefinitelyTyped</a>でまとまっているので、ここからダウンロードすると良いでしょう。</p>

<pre><code>:javascript:
/// 
</code></pre>

<h3>コード例</h3>

<h4>TypeScriptのコード(v0.9.1.1)</h4>

<p>基本的な文法は既存のJavaScriptと同じです。変数には「:」キーワードで任意に型情報を記述することができ、クラスではアクセス修飾子の「private」を利用することで外部から参照することのできないメンバー変数や関数を用意することができます（カプセル化が可能）。</p>

<pre><code>:javascript:
///     
window.onload = ()=&amp;gt; {
    var countManager:CountManager = new CountManager();

    $("#btn").click(()=&amp;gt; {
        // カウントを更新
        countManager.addCount();
        // CSSの角度を計算
        var rot:number = countManager.getCount() * 90;
        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
}

class CountManager {
    private _count:number = 0;
    constructor() {
    }
    addCount() {
        this._count++;
    }
    getCount() {
        return this._count;
    }
}
</code></pre>

<h4>TypeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>生成されたJavaScriptがオリジナルのTypeScriptの原型をとどめたまま出力されているのがわかります（日本語を含むコメントアウトまで出力されてます）。</p>

<pre><code>:javascript:

///     
window.onload = function () {
    var countManager = new CountManager();

    $("#btn").click(function () {
        // カウントを更新
        countManager.addCount();

        // CSSの角度を計算
        var rot = countManager.getCount() * 90;

        // エレメントに適用
        $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
};

var CountManager = (function () {
    function CountManager() {
        this._count = 0;
    }
    CountManager.prototype.addCount = function () {
        this._count++;
    };
    CountManager.prototype.getCount = function () {
        return this._count;
    };
    return CountManager;
})();
//# sourceMappingURL=main.js.map
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/TypeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TypeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しており、これらのソフトでコード補完やリファクタリング機能を利用することができます。既存のJavaScriptと比べて型指定や型推論も利用できるため、エディターによっては強力なコード補完の恩恵を受けることが可能です。</p>

<p><img src="/wp-content/uploads/2013/09/visualstudio_typescript.png" alt="" /></p>

<p class="wp-caption-text">Visual StudioでTypeScriptを開発している様子</p>

<h3>筆者が考えるTypeScriptのメリットとデメリット</h3>

<p>メリットとしてはJavaScriptを習熟した人であれば、<strong>差分を学習するだけで利用できる学習コストの低さ</strong>や、型情報や数多くの機能が言語に搭載されており、安全かつ効率的に開発できる点です。出力するファイルを分割することも一つにまとめることもでき、<strong>柔軟な開発スタイルが提供されています</strong>。またECMAScript 6の案を先行実装している点からも、将来標準になる言語を学習している安心感があります。</p>

<p>デメリットとしてはコンパイルが遅いことと、クラスのメンバー参照で必ずthisを記述しないといけない点、モジュールを利用した場合の名前空間の記述が煩雑になる点です（import修飾子が使えるものの根本的な解決になってはいない）。こういったメリット・デメリットから、<strong>JavaScriptエンジニアが中・大規模な開発プロジェクトに利用するのに向いている</strong>のではないかと考えています。</p>

<h2>CoffeeScript</h2>

<p><img src="/wp-content/uploads/2013/09/coffeescript.png" alt="CoffeeScript" /></p>

<h3>概要</h3>

<p><a href="http://coffeescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript</a>はJavaScriptに比べてシンプルに記述できるため、<strong>コード量が少なくなり可読性の高いコードを記述できる言語</strong>です。クラス機構をサポートしているほか、配列内包やパターンマッチを利用することができます。構文はRubyライクでもあり、Ruby on Rails 3.1でも正式にサポートされています。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>どのJSライブラリでも、基本的には設定を要せず利用することが可能です。TypeScriptやHaxeのような定義ファイルを用意する必要はありません。</p>

<h3>コード例</h3>

<h4>CoffeeScriptのコード （v1.6.3）</h4>

<p>インデントやシンタックスシュガーを利用する文法の恩恵もあり、<strong>他のaltJSのサンプルと比べて最も少ないコード量</strong>となっています。TypeScriptと同様にアロー関数式を使うことができたり、「@」キーワードを使えることでthisの指し示すスコープがわかりやすいのが特徴でしょう。またパターンマッチングが利用できるため、①の箇所のように、文字列の中に変数を埋め込むことが可能です。</p>

<pre><code>:javascript:
window.onload = -&amp;gt;
  countManager = new CountManager

  $("#btn").click -&amp;gt;
    # カウントを更新
    countManager.addCount()
    # CSSの角度を計算
    rot = countManager.getCount() * 90
    # エレメントに適用
    $("#effect").css("transform", "rotateX(#{rot}deg)") #①

class CountManager
  _count: 0

  addCount: -&amp;gt;
    @_count++

  getCount: -&amp;gt;
    return @_count
</code></pre>

<h4>CoffeeScriptをコンパイルして生成したJavaScriptのコード</h4>

<p>CofeeScriptもオリジナルのコードが素直にJavaScriptとして出力されています。回避策はありますが、関数の最後の行がreturnステートメントで返されているところは少し戸惑うかもしれません。</p>

<pre><code>:javascript:
// Generated by CoffeeScript 1.6.3
(function() {
  var CountManager;

  window.onload = function() {
    var countManager;
    countManager = new CountManager;
    return $("#btn").click(function() {
      var rot;
      countManager.addCount();
      rot = countManager.getCount() * 90;
      return $("#effect").css("transform", "rotateX(" + rot + "deg)");
    });
  };

  CountManager = (function() {
    function CountManager() {}

    CountManager.prototype._count = 0;

    CountManager.prototype.addCount = function() {
      return this._count++;
    };

    CountManager.prototype.getCount = function() {
      return this._count;
    };

    return CountManager;

  })();

}).call(this);
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/CoffeeScript/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CoffeeScript版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはVisual StudioやWebStorm/IntelliJ IDEAが対応しています。</p>

<p><img src="/wp-content/uploads/2013/09/webstorm_coffee.png" alt="WebStorm" /></p>

<p class="wp-caption-text">WebStormでCoffeeScriptを開発している様子</p>

<h3>筆者が考えるCoffeeScriptのメリットとデメリット</h3>

<p>メリットとしては、圧倒的なコード記述量の少なさです。JavaScriptのシンタックスシュガーと呼ばれるように、最小限のタイピングでどんどんコードがかけていく魅力があります。またインデントを利用する言語であることから、コードの可読性が必然的に高くなるのもメリットの一つです。</p>

<p>デメリットとしては型情報がないことによる、静的型チェックが無いことや開発環境でのコード補完利用の限界です(型情報がないとコード補完にノイズが入りがちになります)。こういったメリット・デメリットから少人数・小規模な体制でスピーディに開発する場合に向いているのではないかと考えています。</p>

<h2>Haxe</h2>

<p><img src="/wp-content/uploads/2013/09/haxe.png" alt="Haxe" /></p>

<h3>概要</h3>

<p><a href="http://haxe.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe（ヘックス）</a>は静的型付け（ただし動的型も使用可能）のオブジェクト指向言語です。汎用プログラム言語でありJavaScriptの他にも、ActionScript、C++、C#、Java、PHPへのソースコードの変換が可能です。</p>

<p>Haxeは文法としては標準化が中止されたECMAScript 4に類似しており、Flashの開発言語ActionScript 3.0に似ているのが特徴です。数多くの機能を言語レベルで備えており、クラス/パッケージ機構、型推論、ジェネリクス、インライン関数、パターンマッチング、配列内包表記、構造的サブタイピング、高機能な列挙型（詳しくは[<a href="http://haxe.org/ref/enums?lang=jp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公式サイトの説明</a>]を参照ください）等の機能を持ち合わせています。コンパイラがOCamlという言語で開発されており、コンパイルが高速です。言語としての硬さ（厳密な型のチェック）やコンパイル速度の面から、大規模開発においてメリットがあります。</p>

<h3>既存JSライブラリの使用方法</h3>

<p>Haxeでは、Externと呼ばれるインターフェースを定義したファイルを用意します。Externファイルは自分で作成することも可能ですが、Haxe専用のパッケージ管理ツール「haxelib」を使うことで著名なJSライブラリのExternファイルをインスントールすることができます。</p>

<p>例：CreateJSのインストール方法
<code>haxelib install createjs
</code></p>

<h3>コード例</h3>

<h4>Haxeのコード （Haxe 3.0）</h4>

<p>HaxeはJavaScriptだけがターゲットの言語ではないため、JSのwindowオブジェクトにアクセスするには、Browserクラスのwindowプロパティを参照します。JavaScriptのオブジェクトを呼び出す際にはこういったラッパークラスを経由して呼び出す必要があります。jQueryを利用する場合は「new JQuery()」という形でインスタンスを作成して利用します。使い方は大きく異ならないもののHaxeの言語文化にあった形にライブラリのAPIが整理されている場合があるので注意が必要です。</p>

<pre><code>:javascript:
package ;
import js.Browser;
import js.JQuery;

class Main {    
    static function main() {
        new Main();
    }

    function new () {
        Browser.window.onload = init;
    }

    function init(e:Dynamic){
        var countManager:CountManager = new CountManager();

        new JQuery("#btn").click(function():Void {
            // カウントを更新
            countManager.addCount();
            // CSSの角度を計算
            var rot:Int = countManager.getCount() * 90;
            // エレメントに適用
            new JQuery("#effect").css("transform", "rotateX(" + rot + "deg)");
        });
    }
}

class CountManager {
    private var _count:Int = 0;
    public function new () {
    }
    public function addCount():Void {
        _count ++;
    }
    public function getCount():Int {
        return _count;
    }
}
</code></pre>

<h4>Haxeをコンパイルして生成したJavaScriptのコード</h4>

<p>Haxeでは、ECMAScript 5相当のJavaScriptを出力します。比較的読みやすいコードが出力されますが、下記の例ではBrowserオブジェクトやJQueryオブジェクトなど、ラッパーオブジェクトがそのままJavaScriptとして出力されています。出力されたコードは手を加えるのはあまり向いていないと言えるでしょう。</p>

<pre><code>:javascript:
(function () { "use strict";
var Main = function() {
    js.Browser.window.onload = $bind(this,this.init);
};
Main.main = function() {
    new Main();
}
Main.prototype = {
    init: function(e) {
        var countManager = new CountManager();
        new js.JQuery("#btn").click(function() {
            countManager.addCount();
            var rot = countManager.getCount() * 90;
            new js.JQuery("#effect").css("transform","rotateX(" + rot + "deg)");
        });
    }
}
var CountManager = function() {
    this._count = 0;
};
CountManager.prototype = {
    getCount: function() {
        return this._count;
    }
    ,addCount: function() {
        this._count++;
    }
}
var js = {}
js.Browser = function() { }
var $_, $fid = 0;
function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $fid++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = function(){ return f.method.apply(f.scope, arguments); }; f.scope = o; f.method = m; o.hx__closures__[m.__id__] = f; } return f; };
var q = window.jQuery;
js.JQuery = q;
js.Browser.window = typeof window != "undefined" ? window : null;
Main.main();
})();
</code></pre>

<ul>
<li><a href="http://clockmaker.jp/project/html5expertsjp/Haxe/bin/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Haxe版デモを再生する</a></li>
</ul>

<h3>開発環境</h3>

<p>コンパイラを無償でダウンロードできるので、基本的にエディターは選びません。開発環境としてはFlashDevelopの対応が特に充実しており、非常に強力な「あいまい補完」と言われるコード補完や、コード生成機能を利用することができます。</p>

<p><img src="/wp-content/uploads/2013/09/flashdevelop_haxe.png" alt="FlashDevelop" /></p>

<p class="wp-caption-text">FlashDevelopでHaxeを編集している様子</p>

<h3>筆者が考えるHaxeのメリットとデメリット</h3>

<p>メリットとしては、<strong>数多くの機能を言語レベルで搭載している点</strong>や、<strong>コンパイルが高速である点</strong>です。<strong>JavaScriptの名前空間の煩雑さやthisのスコープの苦労がなくなる</strong>のも大きなメリットの一つです。</p>

<p>デメリットとしては、<strong>言語が厳密過ぎる点</strong>です。基本的に型指定は必須ですし、暗黙的な型変換が利用できないので、慣れないうちはコンパイルエラーに苦労するでしょう。また出力されるJSファイルが一つにまとまることから、モジュール開発(JSライブラリ開発)には向いていないでしょう。</p>

<p>こういったメリット・デメリットから、<strong>大規模もしくはゲームや全画面Canvasのコンテンツなど、複雑なコンテンツを安全に開発する場合に向いている</strong>でしょう。
　</p>

<h2>まとめ</h2>

<p>私がaltJSを選ぶ際に必要と考えるのは、<strong>プロジェクトへの適正と、エンジニア/クリエイターのバックグラウンド</strong>だと考えています。それぞれのaltJSに影響を受けた言語があるように、開発に従事するエンジニアのバックグラウンドによって、言語のとっつきやすさに差があると思います。具体的にはRubyユーザーにはCoffeeScriptが、FlashユーザーにはHaxeが向いている傾向があるでしょう。利用するユーザーが様々なので<strong>altJSがどれか一つの言語に収束することはなく</strong>、勢力分布の変化はあれど基本的にはaltJSのユーザー数は並行して進化していくと筆者は考えています。</p>

<p>次回の後編では、altJS言語としてDartとJSXを紹介します。</p>

<h2>参照</h2>

<ul>
<li><a href="http://www.slideshare.net/sipojp/haxe-24876418" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS勉強会「Haxeすごいからみんな使え！」
</a></li>
<li><a href="http://dev.hageee.net/29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">altJS 勉強会で CoffeeScript について喋ってきました</a></li>
<li><a href="http://ics-web.jp/lab/archives/132" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5デモ「日本全国花粉飛散マップ」を作って分かったCreateJSとTypeScriptでの効率的な開発手法 &#8211; ICS LAB</a></li>
</ul>
]]></content:encoded>
			</item>
	</channel>
</rss>
