Top Banner
TypeScript 言語処理系ことはじめ id:nobuoka (@nobuoka) 2012-11-15 Kyoto.js #1
29

TypeScript 言語処理系ことはじめ

May 26, 2015

Download

Technology

Yu Nobuoka

Kyoto.js #1 で発表した TypeScript 言語処理系を触る話です。

ブログ記事も合わせてご覧ください:
http://vividcode.hatenablog.com/entry/study-meeting/kyotojs-1-typescript-lp-startup
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: TypeScript 言語処理系ことはじめ

TypeScript 言語処理系ことはじめ

id:nobuoka(@nobuoka)

2012-11-15 Kyoto.js #1

Page 2: TypeScript 言語処理系ことはじめ

こんにちはid:nobuoka です

Page 3: TypeScript 言語処理系ことはじめ

最近は JavaScript でWindows ストアアプリを開発したり

JavaScript でブラウザ拡張を書いたりしてます

Page 4: TypeScript 言語処理系ことはじめ

みなさん、JavaScript 好きですか?

Page 5: TypeScript 言語処理系ことはじめ

JavaScript JavaScript 最高最高!!!!

Page 6: TypeScript 言語処理系ことはじめ

そんな感じで皆大好き JavaScript なわけですが

Page 7: TypeScript 言語処理系ことはじめ

クラスっぽいものの定義が面倒だとか// コンストラクタ定義function BaseClass(name) { this._name = name;}// インスタンスメソッドBaseClass.prototype.getName = function () { return this._name;}// 継承もややこしいfunction SubClass(name) { BaseClass.call(this, name); // 基底クラスのコンストラクタを呼ぶ}SubClass.prototype = (function () { var o = Object.create(BaseClass.prototype); var s = SubClass.prototype; Object.getOwnPropertyNames(s). forEach(function (name) { o[name] = s[name] }); return o;})();

Page 8: TypeScript 言語処理系ことはじめ

名前空間ぽいものの定義が面倒とか

Array.prototype.map などに渡す関数をもっと手軽に書きたいとか

// 例えば hatena.bookmark という名前空間を作る場合if (!this.hatena) this.hatena = {};if (!this.hatena.bookmark) this.hatena.bookmark = {};

// 下のような感じに書きたいよねvar squares = [ 1, 2, 3 ].map( (x) => x * x );

Page 9: TypeScript 言語処理系ことはじめ

そもそもクラスっぽいものの定義とか名前空間ぽいものの定義とかに

色々な流儀があるのもよくない、とか

大規模になってくるとやっぱり型付けできると嬉しい、とか

Page 10: TypeScript 言語処理系ことはじめ

最高な JavaScript に対して不満はある

Page 11: TypeScript 言語処理系ことはじめ

クラス定義とか名前空間定義とかECMAScript 6 で導入されそうだよ?

Page 12: TypeScript 言語処理系ことはじめ

ECMAScript 6 を待てない!!JavaScript に代わる言語を使おう!!

Page 13: TypeScript 言語処理系ことはじめ

● Haxe● 構文は ECMAScript 4 ぽい● JavaScript 以外の言語にもコンパイルできる● 長い歴史 (5 年以上)

● Dart● 1 ヶ月前に SDK の最初の安定板が出てた

● JSX● ECMAScript 4 の影響を受けてる?● 高速に実行される JavaScript を吐き出す

● CoffeeScript● 簡潔な記述?

● TypeScript● 構文は ECMAScript 6 ぽい

JavaScript の代替となる色々な言語

Page 14: TypeScript 言語処理系ことはじめ

JavaScript を愛する我々としてはJavaScript を置き換えるものではなく

better JavaScript が欲しい

Page 15: TypeScript 言語処理系ことはじめ

TypeScript 良さそう

“TypeScript syntax is a superset of Ecmascript 5 (ES5) syntax.” (TypeScript Language Specification Version 0.8)

とはいえ構文がスーパーセットだからといって ECMAScript 5 として実行できる JS をすべてコンパイルできるわけではない

var test = { };test.prop = 100; // コンパイルエラー

var test = { };test[“prop”] = 100; // これは OK

Page 16: TypeScript 言語処理系ことはじめ

というわけで TypeScript 言語処理系と触れ合ったりしたので

その話をします

Page 17: TypeScript 言語処理系ことはじめ

まずは普通に使ってみる● 試すだけなら公式サイトの play ground

● http://www.typescriptlang.org/Playground/● ローカルでコンパイルするなら node

● インストール : npm install -g typescript● コンパイル : tsc example.ts

● IDE なら Visual Studio が対応

Page 18: TypeScript 言語処理系ことはじめ

コンパイルが遅い!!

tsc コマンドからだけでなくもっと便利に使いたい!!

Page 19: TypeScript 言語処理系ことはじめ

typescript.js や typescriptService.js を直接使う

● TypeScript の言語処理系のソースコードは TypeScript で書かれている

● 実行できるプログラムとしては JS● typescript.js がコンパイラなど● typescriptServices.js はコード補完機能などのサービス類

● ソースコードとコンパイル後の JS はhttp://typescript.codeplex.com

Page 20: TypeScript 言語処理系ことはじめ

typescript.js を使ったコンパイル

// 出力用オブジェクトの定義var outfile = {

source: “”,Write: function (s) {

this.source += s;},WriteLine: function (s) {

this.source += s + “\n”;},Close: function () {}

}

// コンパイラ生成var compiler = new TypeScript.TypeScriptCompiler(outfile);compiler.parser.errorRecovery = true;compiler.setErrorCallback(function (start, len, message, block) {

console.log(“error : ” + message);});

Page 21: TypeScript 言語処理系ことはじめ

typescript.js を使ったコンパイル

// ソースコード追加var src1 = “class Test { aaa: string; };\n var ttt = 100;”;compiler.addUnit(src1, 'test1.ts');var src2 = “///<reference path='test1.ts' />\n” +

“var test = new Test(); test.”;compiler.addUnit(src2, 'test2.ts');

// 型チェックcompiler.typeCheck();

// 実行compiler.emit(false, function createFile(fileName) {

console.log(“create file : ” + fileName);return outfile;

});

console.log('compiled: ' + outfile.source);console.dir(compiler);

Page 22: TypeScript 言語処理系ことはじめ

ブラウザ上でコンパイルできる

Node でプロセス動かしておけばコンパイルするたびに typescript.js の

読み込みを待つ必要もない

Page 23: TypeScript 言語処理系ことはじめ

コード補完とかもしたい!

Page 24: TypeScript 言語処理系ことはじめ

typescriptServices.js を使えばできるよ!

Services.LanguageService

使い方は TypeScript 処理系のテストを見るのがわかりやすい

Page 25: TypeScript 言語処理系ことはじめ

Windows の JS 処理系やNode 以外の JS 処理系でも

動かしたい

Page 26: TypeScript 言語処理系ことはじめ

src/compiler/io.ts をいじればできるよ

JavaScript 処理系ごとの IO 周りの違いを IO クラスで吸収してる

Page 27: TypeScript 言語処理系ことはじめ

TypeScript しましょう!!

Page 28: TypeScript 言語処理系ことはじめ

TypeScript 使ってみて

●JavaScript らしくてよい●敷居が低い●JS → TS の書き換えがやりやすい●JS のライブラリを素直に使える

●既に JS で動いているアプリケーションを少しづつ書き換えていける

Page 29: TypeScript 言語処理系ことはじめ

JavaScript 最高!!