なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~linden script...
TRANSCRIPT
なでしこに学ぶプログラミング言語の作り方
日本語プログラミング言語
「なでしこ」友の会
クジラ飛行机なでしこ作者
2009/02/20 – OSC Tokyo
発表の内容
• プログラミング言語を作る楽しさ(10分)
• なでしこの仕組み(10分)
• 未来のプログラミング言語(10分)
プログラミング言語を作る楽しさ
プログラミング言語を作ろう!
はじめの質問
• 自分でプログラミング言語を作ってみたいですか?
– (A) 既に作ったことがある
– (B) ぜひとも作ってみたい!
– (C) 作りたいけど難しそう…
– (D) 余力があれば
次:言語の制作は難しいか?
言語を作ることは難しくない
• 作る物によるが、プログラミング言語
の製作は、難しくない• 思ったよりも難易度は高くない
• プログラミング中上級者なら可能
その理由は?
言語制作が難しくない理由
• プログラミング言語に関する研究がかなり進んでいること
– 参考文献も多い
– 書籍Webにも資料が多く転がっている
• yacc や lex などの自動生成のためのツールが用意されていること
次:なぜ作るのか
なぜ作るのか?
• 既に多くの言語があるのに、なぜ新しい言語を作るのか?
– 【学 習】自分の力で作ってみることにより、とても勉強になる
– 【楽しい】仕事のプログラミングでは味わえない楽しさがある!!
– 【ロマン】プログラマの三大ロマンの1つ(人工知能、OS、プログラミング言語)
次:俺様言語の分類
俺様言語の分類
• ネタ言語• 面白ければそれでいい。話題性重視。
• 実用性重視• 特定の用途に特化した言語
• 学習用・初心者のための言語• プログラミングの学習用。
• 研究目的• 将来の言語のための実験的な研究のために
次:ネタ言語とは
ネタ言語とは?
• 面白さ重視
• 話題になれば成功
• 開発時間は短め
• 実装してみると意外と勉強になる
次:代表的なネタ言語の紹介
ネタ言語~Whitespace
• スペースとタブだけの言語
– 操作(IMP), コマンド、パラメータがある
• [Space] .. スタック操作
• [Tab][Space] .. 演算
• [Tab][Tab] .. ヒープアクセス
• [LF] .. フロー制御
– 数値は二進法([space=0][Tab=1])で表現
WhitespaceのHello,World
ネタ言語~BrainF*ck
• 処理系には配列とポインタがあり、ポインタを「>」「<」命令で移動させ値を増減させて処理を進める。
• 命令は8つだけ
– 「>」「<」(ポインタ移動)
– 「+」「-」(値の増減)
– 「.」「,」(出力と入力)
– 「[」「]」(ジャンプ)
次:自作言語の分類
BrainF*uckのHello,World
• +++++++++[>++++++++>++++++++++
+>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--
------.>+.
ネタ言語~ Befunge
• プログラムが二次元で表現される図形的言語。1命令が1文字
• 実行する向きを上下左右に変更できる。
– 実は以前携帯Flashで実装してみた。
– 「<>^v」… 向きを変更する
– 「_ |」… 条件分岐
– 「#」… コメント, 「@」… 終了
– 「.,」… スタックをポップして表示
BefungeのHello,World
ネタ言語のまとめ
• 面白いことは良いことだ
• 知的好奇心を満たしてくれる
• 短時間で作れるので週末プログラミングにお勧め
• アイデアを形にしやすい
– Perl/Ruby/Python/JS/Flashなどスクリプト言語でも実装が可能
次:実用性を重視する場合
実用指向な俺様言語
• 特定の用途に特化して作られた言語
– CADや図形描画のためのマクロ
– ゲーム用スクリプト言語
– バッチ処理用スクリプト
• なでしこ(Excel / Wordなど定型処理に特化)
• 特定用途向きなので、ある程度使ってもらえる可能性が高いのがポイント★
次:マクロ言語の特徴
マクロ言語の特徴
• 特定用途に特化している分、既存言語では記述が面倒な構文を省略して書けるようになっている
– 音楽記述言語→テキスト音楽サクラ
– グラフィック描画に特化 →Processing
– Second Life→Linden Script
– テキストエディタの秀丸のマクロ
次:マクロ言語を紹介
マクロ~音楽記述言語
• テキスト音楽「サクラ」は、MML というマクロ言語をベースにしている
• MML (Music Macro Language)
• ドレミと書くとそのまま音が鳴る
マクロ~音楽用(文法)
• ドレミファソラシで発音
• オクターブ変更は「↑」や「↓」
• 音色の変更は「音色(GrandPiano) 」
• 繰り返しは「【4ドレミソ】」
音楽記述言語~さくら
音色(Shakuhachi)
音階6 音量120 ゲート80
音符4
【2 ララシー】
ラシ↑ド↓シ ラシ8ラ8ファー
ミドミファ ミミ8ド8↓シー↑
ラシ↑ド↓シ ラシ8ラ8ファー
ミドミファミミ8ド8 ↓シー↑
【2 ララシー】
ッミファー シ8ラ8ファミー
マクロ言語~Processing
• グラフィックの描画に特化した構造化ベースのスクリプト言語
マクロ言語~Processing
• エディタ+実行環境が配布されている
• If / while / for などが使える
• 円の描画「ellipse(100,100,180,180); 」
マクロ言語~Processing// 描画のためのセットアップを行う関数
void setup() {
size(400,200); // ウィンドウのサイズを決める
noStroke();
}
// 毎フレーム描画する関数
void draw() {
for (int i = 0; i < 10; i++) {
// ランダムに描画位置を決める
float x = random(width);
float y = random(height);
// ランダムに色を決める
float r = 255; // 赤 (0~255)
float g = random(256); // 緑 (0~255)
float b = random(256); // 青 (0~255)
float alpha = 150; // 透明度 (0~255)
// 描画
fill(r, g, b, alpha); // 塗りつぶし色を決める
ellipse(x, y, 32, 32); // 円を描画する
}
}
ゲーム用~Linden Script
• 3D仮想世界のSecond Lifeでオブジェクトを動かすのに利用されるスクリプト
• ユーザーと対話したり、乗り物を動かしたり、扉を開ける、簡単なゲームを作ることができる
ゲーム用~Linden Script
マクロ~秀丸マクロ
• テキストエディタ「秀丸」のマクロ
• 変数は「$xxx(文字列方)」「#xxx(数値型)」
• 制御構文に、if/while/for が使える
• 秀丸の各種機能を操作するAPIが用意されている
秀丸マクロの例~文挿入
openfile “c:¥¥test.txt”;
insert “挿入する文章”;
searchdown “¥¥n, regular;
endmacro;
マクロ言語 まとめ
• 特定用途に特化している
• 構文はシンプル
• 変数と計算、If/while/for など制御構文
• CやBASICなど特定の言語を模倣しているものが多い
• 習得が容易
プログラミング学習用言語
• 視覚要素が強く、プログラムの学習に向いている教育用言語
• Logo – 亀が絵を描く
• Squak e-Toyes – お絵かきしたオブジェクトを動かす
• Lego Mind Storm – ブロックでプログラム
学習用 - Logo
• Forward(前進), Right(右回転)などの命令を用いてカメを動かして、絵を描く教育用言語
教育用言語~スクイーク
• ペイントツールで絵を描き、その絵をどのように動かすかをプログラムできる
• タイルをぺたぺた貼ることでプログラムを完成させることができる→エラーも出ない
スクイークで車を動かす
引用元:http://swikis.ddo.jp/WorldStethoscope/7
教育用~MindStorm
• LEGO から発売されているプログラム可能なロボット。
• このロボットを制御するための視覚的なプログラミングツールはブロックを並べるようにしてプログラムできる
教育用~MindStorm
学習用言語のまとめ
• 視覚的で楽しい
• 初歩的なエラーが出にくい仕組み
• マウスでオブジェクトを操作するのが中心
人気の言語を作るには?
• なでしこから学んだもの
– 特定用途に特化すること
– ライブラリを充実させること
– 開発を継続し続けること
• なでしこは月1回バージョンアップしている
– 互換性を大切にすること
– ライバルと手を取り合っていこう!
• ライバル言語(TTS/言霊/ドリトル)の存在が大切
プログラミング言語は楽しい
• ネタ言語、実用マクロ、教育用系など、プログラミング言語の数だけ、楽しめる世界がある
• どうせ言語を作るなら、自分だけの世界観を作りこむと素敵
• やりたいことがあるなら、実用系言語がお勧めだが、ネタ言語も魅力的!
俺様言語製作のまとめ
• プログラミング言語を作ると
– 楽しい
– 勉強になる
– 使ってくれる人がいると、嬉しい
– Rubyみたいに有名になると、スゴイ!
なでしこの仕組み
日本語プログラミング言語について
2番目の質問
• なでしこについて、どの程度知っていますか?
– (い)なでしこのソースコードを読んだことがある
– (ろ)既になでしこユーザーである
– (ろ)ためしに使ってみたことがある
– (は)名前は知っている
なでしこの基本スペック
• 日本語プログラミング言語
• Delphi で作られている
• インタプリタ
– プログラムを読み込んで構文木に変換し実行している
• 変数、関数、制御構文、簡単なオブジェクト指向をサポート
なでしこの基本スペック2
• 2004年から開発されている
• 月に1回バージョンアップされる
• 組み込み命令が 1242個(2009/2現在) ある
• Windows のみで動く (*葵はブラウザで動く)
• ライブラリは、Windowsの定型処理に特化している
実行方法
• 実行方式に、GUIベースの vnako と、CUIベースのcnako、簡易GUIの gnako の3つがある
• それぞれ言語エンジンの dnako.dll をロードしている
言語エンジンとプラグイン
• 言語エンジンの dnako.dll は、起動時になでしこのプラグインを探してロードする
プログラムの実行まで
• プログラムは次の順序で実行される
– 1) 半角全角など、日本語特有の揺れを解決
– 2) コメントなど不要な部分を除去する
– 3) プログラムを単語やブロックで区切る
– 4) プログラムをツリー状の構文木に直す
– 5) 構文木をたどってプログラムを実行する
構文木の仕組み
• 構文木は構文要素が繋がっている状態のもの
足し算
3
5
代入式
ユーザー関数実行
条件文
関数ブロック A実行
B実行
実行方式について補足
• なでしこでは、ソースコードから構文木を作り、これを直接実行している
• 最近の言語では、構文木からバイトコードを出力し、それから実行する方式が一般的
– Ruby 1.9以降、Lua 、ActionScript など
– 最適化のし易さ、既存のVMへの対応、ネイティブコードへ変換して実行
日本語(なでしこ)ならではの処理
• 大きなところでは、日本語プログラミング言語と、他の言語で実装の差異はほとんどないが・・・
• 構文解析で苦労する– ちなみに「葵」という日本語プログラミング言語では、構
文解析を自動生成するツール yacc を利用して作ったが、自由度を高めるためには、構文解析は自作した方が良かった
– 前後のトークンに応じて要素を動的に決定する必要があるため(曖昧な文法に対処する必要が多いことの代償)
構文解析の問題
• 関数呼び出しに際して
– C言語など … 関数( 引数, 引数 .. )
– なでしこ .. 引数、引数、関数
• 引数を読んで、スタックに乗せて、関数を読んで、スタックから下ろすようにする
構文解析
• 「ファイルAからBへファイルコピー」
スタック
ファイルA
ファイルB
ファイルコピー
pop
pop
曖昧性の判定
• 当然だが、構文上の優先度を明確にしなければならない
• 「3+5に4を足して表示。」
– ((3)+(5に4を足して))表示
– ((3+5)に4を足して)表示。★
曖昧性の判定
• オブジェクト指向を導入したせいで、曖昧性の判定が難しくなった
– OKボタンのテキストを表示する。
• OKボタンの --- オブジェクト
• テキストを --- プロパティ
• 表示 する--- 関数
– (OKボタンのテキスト)を、表示 ?
– OKボタンの、テキストを、表示 ?
ライブラリ重要
• 言語を作るとき、ライブラリがどれだけ充実しているかは、重要な要素となる
• 機能を拡張しやすい仕組みを作ることで、多くのライブラリを用意できるようになる
なでしこのライブラリを作る
• (1)インクルードファイル
– なでしこ自身でライブラリが記述する(自作関数やクラスを取り込む)
• (2)DLLにある関数を実行する
– CやDelphiで書いたDLLを取り込んで実行
• (3)なでしこのプラグインにする
– CやDelphiでDLLを一定の書式に沿って作る
(1) インクルードする
なでしこで、以下のように書くと、任意のファイルをライブラリとして利用できる
===
!「ファイル.nako」を取り込む
===
【長所】なでしこだけでできる
【短所】なでしこで、できることしかできない
(2) 既存DLLの関数を実行する
なでしこには、DLLにある関数を、なでしこの関数として取り込む機能がある。
●MessageBox(h,{参照渡し}t,{参照渡し}c,u) =DLL(“user32.dll”,// DLLの名前“int MessageBoxA (
HWND hWnd, LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)”// C言語の宣言文
)
【長所】Window API など OSの機能を直接呼び出せる【短所】C言語の宣言を指定する必要がある
(3) なでしこのプラグイン
• 【長所】なでしこのプラグインフォルダにDLLをコピーするだけで使えるようになる
• 【短所】プラグインの書式に従って作る必要がある
– 次に、簡単にC言語で、なでしこのライブラリを作る方法を紹介
(3-1) プラグインSDKを入手
• なでしこのページから、プラグインSDKを入手する(なでしこ本体のダウンロードページの一番下の方にある)
http://nadesi.com/download.htm
ここでは、C言語版を利用する
(3-2) 必要な関数を実装する
• DLLにプラグインに必要な5個の関数を定義する(DLLImportNakoFunction、PluginInfo、 PluginVersion、PluginRequire、 PluginInit、PluginFin)
• ほとんどが定型的。SDKに入っているSamplePlugin01.c をコピーすればOK
(3-3) なでしこに命令を追加
• なでしこに、命令を登録する関数「ImportNakoFunction」を定義する
NAKO_API(void) ImportNakoFunction(void) {// ユーザー命令の追加nako_addFunction(
“サンプル1実行”, // 命令の名前“STRで”, // 命令の引数の定義sample01, // 関数へのポインタ0); // 0 を指定。
}
(3-4) Cの関数を記述
• 「ImportNakoFunction」で登録した関数を実際に定義したらコンパイルして完成!
// コールバックして呼ばれるユーザー関数PHiValue __stdcall sample01(DWORD h) {
MessageBox(0, “Hello!”, “test", MB_OK);return NULL;
}
(3-5) プラグインまとめ
• なでしこの言語機能にアクセスするヘルパー関数がたくさんあるので、これを利用することで、プラグインを手軽に作ることができる
• せっかく、ここで、作り方を覚えたので、言語製作に興味のある皆さん、有用ななでしこプラグインを作りませんか?
なでしこ:今後の課題
• なでしこは、特定用途に特化していることに加え、ライブラリも充実している
• しかし、課題がないわけではない…
なでしこ:現状の問題点
• なでしこは、2000年に作られた「ひまわり」をベースにして、2004年に主要部分が完成した
– そろそろソフトウェアの寿命
– OSの最新機能が利用できない問題
– Mac/Linux でも動かしたいという要望あり
なでしこ:ライフサイクルの問題
• 文字コードの問題(内部文字コードが、SHIFT_JIS として処理される).. 多国
語の同時表示ができない、処理ができない(日本語に特化しているので不要という見方もできるが…)
• Delphiのせいでもあるが、Windows API など、Unicode版が使われてい
ないせいで、ファイル名の最大文字数など旧OSの制限が適用されている
なでしこ:問題点への対処
• OSの最新機能は、ライブラリの追加で対処しているが…
• 内部文字コードの書き換えは、大幅な変更が必要
– せっかくなので、Delphi で書かれたコードを移植性の高い言語(C/Java)などに置き換える計画あり。
未来のプログラミング言語
なでしこ2.0を考える
夢いっぱいの自作言語
• 欠点もあるけれど「なでしこ」は夢いっぱいの自作言語
• 今後どのように開発を進めていくのか、なでしこユーザーの方々とよく話し合い、アイデアはたくさん!
• 夢いっぱいで開発していくことは楽しい
言語を作るとき考えたいこと
• 対象とするプラットフォーム
– プラットフォームにより開発言語を選ぶ必要がある、どれも一長一短
– Delphiは生産性が高いが、Windows専用
– C# なら、生産性が高く、Windows + Linux
(Mono) でも動く
– C なら移植性が高くどこでも動くが、開発コストが高いのが気になるかも..
– Java なら、Win/Linux/Mac で同じように動くが、ランタイムが必要
どの言語で作るか?
• ネタ言語や教育用言語なら、JavaScript
や Flash で作るといいかも。ブラウザ上ですぐ試してもらえるのは魅力★
• OS のコア機能を使えるようにしたいなら C/C++
• 生産性やライブラリの豊富さを求めるなら、C# や Java
「葵」の紹介 (1/2)
• なでしこの後、Web上で動く日本語プログラミング言語「葵」を開発した
– 葵(v1)は、C言語で作ってCGIが作れるようにした
– 葵(v2)は、Java+ Flash で作って、可搬性を高めた
• http://aoikujira.com/
「葵(v2)」の紹介 (2/2)
• Java (Applet) で、日本語プログラミング言語を、独自バイトコードに変換。
• Flash が独自バイトコードを読んで実行する。
• Webブラウザだけあれば、開発・実行できる!!
しかし、現状、キャパ不足のために、開発継続できず..
なでしこ 2.0 について
• 葵の成果を踏まえた上で、なでしこ2.0
の方針を練っているところ。
• 既存の問題点を解決するだけでなく、せっかく作るなら「強烈なインパクト」を持った機構を追加したい
誰でも簡単を目指して
• なでしこの目指すところは、「誰でも簡単プログラマー!」
• どうすれば、この標語が達成できるか?よく考える。
– 冒頭で紹介した、Squak や MindStorm のような、視覚要素を取り入れたプログラミング言語?
– 「簡単」にオブジェクト指向は必要・不要?
世界展開
• 日本のソフトウェアは輸入超過
– Rubyを目標に世界展開を!
• なでしこ2.0では、日本語に加えて、韓国語や中国語をサポートしたい!!
俺様言語の普及について
• せっかく作った自作言語を有名にしたい!!世界に羽ばたかせたい!!
• そのためには、じっくりと時間をかけて「継続して安定した開発」が求められる
– Ruby もブレイクするまでに、10年以上かかっている!!
– なでしこもいつか、ブレイクさせたい!!
人気の言語を作るには?
• 良い言語であるためには人気がなければだめだ。そして、良い言語で有り続けるためには人気があり続けなければならない。(Paul Graham”人気の言語を作るには”より)
• プログラミング言語は、優れたものが生き残るわけではない、人気のある言語が優れたものに進化していく
人気の言語を作るには?
• Paul 氏の主張
– 簡潔さ(簡潔に記述できる)
– ハックしやすい(内部まで深く触れる)
– 使い捨てしやすいこと(手軽に使える)
– ライブラリが充実(Perlを見習う)
– 構文(使いやすさ、見易さ)
– 実行効率
– 時間(開発が継続され続けること)
継続して安定した開発
• とにかく時間をかけて作り続けること
– 言語そのものだけでなく、ライブラリをたくさん用意する、マニュアルを書く、使ってもらえるように宣伝する・・・
• 言語の完成度を高めるには、時間がいくらあっても足りない!!
– 言語の普及にはとにかく時間がかかるもの
– 夢を語るのは簡単、夢を実現するには時間がかかる
長年開発を継続するために
• 時間の確保=予算の確保– 霞を食べて生活できる修行をする(或いは、国や企業に資金援助を求める)
– なでしこは、IPA未踏からの資金援助があったので完成までたどりつけた経緯がある
– 未踏の後、引き続き夢の中で生活するために、なでしこのコラム・本を書く、有料版を出す、業務で積極的に利用するなど(去年は本を書いたので2割達成)
長年開発を継続するために
• モチベーションの維持
– 自分だけで作っていると、すぐにモチベーションが下がってしまう
– 一般公開して使ってもらう、人が使ってくれるのが分かると、やる気アップにつながる
– OSCなどの場で、共同開発者を募る、みんなで作れば、楽しさアップ!
俺様言語開発への誘い
• 一緒になでしこを作りたい人を大募集しています!!
• 或いは、なでしこのライバル言語を作ってください!!– (開発が継続されている場合)パイの奪い合いにはなりません。共に繁栄します。
<完>そして続く
ご清聴ありがとうございました!!
質問やアイデア募集
• このプレゼンについての質問
• 未来の「日本語プログラミング言語」についてのアイデア