85
なでしこに学ぶ プログラミング言語の作り方 日本語プログラミング言語 「なでしこ」友の会 クジラ飛行机 なでしこ作者 2009/02/20 OSC Tokyo

なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

  • Upload
    lyanh

  • View
    229

  • Download
    1

Embed Size (px)

Citation preview

Page 1: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこに学ぶプログラミング言語の作り方

日本語プログラミング言語

「なでしこ」友の会

クジラ飛行机なでしこ作者

2009/02/20 – OSC Tokyo

Page 2: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

発表の内容

• プログラミング言語を作る楽しさ(10分)

• なでしこの仕組み(10分)

• 未来のプログラミング言語(10分)

Page 3: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

プログラミング言語を作る楽しさ

プログラミング言語を作ろう!

Page 4: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

はじめの質問

• 自分でプログラミング言語を作ってみたいですか?

– (A) 既に作ったことがある

– (B) ぜひとも作ってみたい!

– (C) 作りたいけど難しそう…

– (D) 余力があれば

次:言語の制作は難しいか?

Page 5: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

言語を作ることは難しくない

• 作る物によるが、プログラミング言語

の製作は、難しくない• 思ったよりも難易度は高くない

• プログラミング中上級者なら可能

その理由は?

Page 6: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

言語制作が難しくない理由

• プログラミング言語に関する研究がかなり進んでいること

– 参考文献も多い

– 書籍Webにも資料が多く転がっている

• yacc や lex などの自動生成のためのツールが用意されていること

次:なぜ作るのか

Page 7: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なぜ作るのか?

• 既に多くの言語があるのに、なぜ新しい言語を作るのか?

– 【学 習】自分の力で作ってみることにより、とても勉強になる

– 【楽しい】仕事のプログラミングでは味わえない楽しさがある!!

– 【ロマン】プログラマの三大ロマンの1つ(人工知能、OS、プログラミング言語)

次:俺様言語の分類

Page 8: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

俺様言語の分類

• ネタ言語• 面白ければそれでいい。話題性重視。

• 実用性重視• 特定の用途に特化した言語

• 学習用・初心者のための言語• プログラミングの学習用。

• 研究目的• 将来の言語のための実験的な研究のために

次:ネタ言語とは

Page 9: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ネタ言語とは?

• 面白さ重視

• 話題になれば成功

• 開発時間は短め

• 実装してみると意外と勉強になる

次:代表的なネタ言語の紹介

Page 10: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ネタ言語~Whitespace

• スペースとタブだけの言語

– 操作(IMP), コマンド、パラメータがある

• [Space] .. スタック操作

• [Tab][Space] .. 演算

• [Tab][Tab] .. ヒープアクセス

• [LF] .. フロー制御

– 数値は二進法([space=0][Tab=1])で表現

Page 11: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

WhitespaceのHello,World

Page 12: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ネタ言語~BrainF*ck

• 処理系には配列とポインタがあり、ポインタを「>」「<」命令で移動させ値を増減させて処理を進める。

• 命令は8つだけ

– 「>」「<」(ポインタ移動)

– 「+」「-」(値の増減)

– 「.」「,」(出力と入力)

– 「[」「]」(ジャンプ)

次:自作言語の分類

Page 13: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

BrainF*uckのHello,World

• +++++++++[>++++++++>++++++++++

+>+++++<<<-]>.>++.+++++++..+++.>-.

------------.<++++++++.--------.+++.------.--

------.>+.

Page 14: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ネタ言語~ Befunge

• プログラムが二次元で表現される図形的言語。1命令が1文字

• 実行する向きを上下左右に変更できる。

– 実は以前携帯Flashで実装してみた。

– 「<>^v」… 向きを変更する

– 「_ |」… 条件分岐

– 「#」… コメント, 「@」… 終了

– 「.,」… スタックをポップして表示

Page 15: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

BefungeのHello,World

Page 16: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ネタ言語のまとめ

• 面白いことは良いことだ

• 知的好奇心を満たしてくれる

• 短時間で作れるので週末プログラミングにお勧め

• アイデアを形にしやすい

– Perl/Ruby/Python/JS/Flashなどスクリプト言語でも実装が可能

次:実用性を重視する場合

Page 17: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

実用指向な俺様言語

• 特定の用途に特化して作られた言語

– CADや図形描画のためのマクロ

– ゲーム用スクリプト言語

– バッチ処理用スクリプト

• なでしこ(Excel / Wordなど定型処理に特化)

• 特定用途向きなので、ある程度使ってもらえる可能性が高いのがポイント★

次:マクロ言語の特徴

Page 18: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ言語の特徴

• 特定用途に特化している分、既存言語では記述が面倒な構文を省略して書けるようになっている

– 音楽記述言語→テキスト音楽サクラ

– グラフィック描画に特化 →Processing

– Second Life→Linden Script

– テキストエディタの秀丸のマクロ

次:マクロ言語を紹介

Page 19: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ~音楽記述言語

• テキスト音楽「サクラ」は、MML というマクロ言語をベースにしている

• MML (Music Macro Language)

• ドレミと書くとそのまま音が鳴る

Page 20: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ~音楽用(文法)

• ドレミファソラシで発音

• オクターブ変更は「↑」や「↓」

• 音色の変更は「音色(GrandPiano) 」

• 繰り返しは「【4ドレミソ】」

Page 21: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

音楽記述言語~さくら

音色(Shakuhachi)

音階6 音量120 ゲート80

音符4

【2 ララシー】

ラシ↑ド↓シ ラシ8ラ8ファー

ミドミファ ミミ8ド8↓シー↑

ラシ↑ド↓シ ラシ8ラ8ファー

ミドミファミミ8ド8 ↓シー↑

【2 ララシー】

ッミファー シ8ラ8ファミー

Page 22: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ言語~Processing

• グラフィックの描画に特化した構造化ベースのスクリプト言語

Page 23: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ言語~Processing

• エディタ+実行環境が配布されている

• If / while / for などが使える

• 円の描画「ellipse(100,100,180,180); 」

Page 24: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ言語~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); // 円を描画する

}

}

Page 25: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ゲーム用~Linden Script

• 3D仮想世界のSecond Lifeでオブジェクトを動かすのに利用されるスクリプト

• ユーザーと対話したり、乗り物を動かしたり、扉を開ける、簡単なゲームを作ることができる

Page 26: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ゲーム用~Linden Script

Page 27: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ~秀丸マクロ

• テキストエディタ「秀丸」のマクロ

• 変数は「$xxx(文字列方)」「#xxx(数値型)」

• 制御構文に、if/while/for が使える

• 秀丸の各種機能を操作するAPIが用意されている

Page 28: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

秀丸マクロの例~文挿入

openfile “c:¥¥test.txt”;

insert “挿入する文章”;

searchdown “¥¥n, regular;

endmacro;

Page 29: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

マクロ言語 まとめ

• 特定用途に特化している

• 構文はシンプル

• 変数と計算、If/while/for など制御構文

• CやBASICなど特定の言語を模倣しているものが多い

• 習得が容易

Page 30: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

プログラミング学習用言語

• 視覚要素が強く、プログラムの学習に向いている教育用言語

• Logo – 亀が絵を描く

• Squak e-Toyes – お絵かきしたオブジェクトを動かす

• Lego Mind Storm – ブロックでプログラム

Page 31: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

学習用 - Logo

• Forward(前進), Right(右回転)などの命令を用いてカメを動かして、絵を描く教育用言語

Page 32: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

教育用言語~スクイーク

• ペイントツールで絵を描き、その絵をどのように動かすかをプログラムできる

• タイルをぺたぺた貼ることでプログラムを完成させることができる→エラーも出ない

Page 33: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

スクイークで車を動かす

引用元:http://swikis.ddo.jp/WorldStethoscope/7

Page 34: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

教育用~MindStorm

• LEGO から発売されているプログラム可能なロボット。

• このロボットを制御するための視覚的なプログラミングツールはブロックを並べるようにしてプログラムできる

Page 35: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

教育用~MindStorm

Page 36: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

学習用言語のまとめ

• 視覚的で楽しい

• 初歩的なエラーが出にくい仕組み

• マウスでオブジェクトを操作するのが中心

Page 37: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

人気の言語を作るには?

• なでしこから学んだもの

– 特定用途に特化すること

– ライブラリを充実させること

– 開発を継続し続けること

• なでしこは月1回バージョンアップしている

– 互換性を大切にすること

– ライバルと手を取り合っていこう!

• ライバル言語(TTS/言霊/ドリトル)の存在が大切

Page 38: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

プログラミング言語は楽しい

• ネタ言語、実用マクロ、教育用系など、プログラミング言語の数だけ、楽しめる世界がある

• どうせ言語を作るなら、自分だけの世界観を作りこむと素敵

• やりたいことがあるなら、実用系言語がお勧めだが、ネタ言語も魅力的!

Page 39: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

俺様言語製作のまとめ

• プログラミング言語を作ると

– 楽しい

– 勉強になる

– 使ってくれる人がいると、嬉しい

– Rubyみたいに有名になると、スゴイ!

Page 40: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこの仕組み

日本語プログラミング言語について

Page 41: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

2番目の質問

• なでしこについて、どの程度知っていますか?

– (い)なでしこのソースコードを読んだことがある

– (ろ)既になでしこユーザーである

– (ろ)ためしに使ってみたことがある

– (は)名前は知っている

Page 42: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこの基本スペック

• 日本語プログラミング言語

• Delphi で作られている

• インタプリタ

– プログラムを読み込んで構文木に変換し実行している

• 変数、関数、制御構文、簡単なオブジェクト指向をサポート

Page 43: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこの基本スペック2

• 2004年から開発されている

• 月に1回バージョンアップされる

• 組み込み命令が 1242個(2009/2現在) ある

• Windows のみで動く (*葵はブラウザで動く)

• ライブラリは、Windowsの定型処理に特化している

Page 44: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

実行方法

• 実行方式に、GUIベースの vnako と、CUIベースのcnako、簡易GUIの gnako の3つがある

• それぞれ言語エンジンの dnako.dll をロードしている

Page 45: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

言語エンジンとプラグイン

• 言語エンジンの dnako.dll は、起動時になでしこのプラグインを探してロードする

Page 46: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

プログラムの実行まで

• プログラムは次の順序で実行される

– 1) 半角全角など、日本語特有の揺れを解決

– 2) コメントなど不要な部分を除去する

– 3) プログラムを単語やブロックで区切る

– 4) プログラムをツリー状の構文木に直す

– 5) 構文木をたどってプログラムを実行する

Page 47: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

構文木の仕組み

• 構文木は構文要素が繋がっている状態のもの

足し算

3

5

代入式

ユーザー関数実行

条件文

関数ブロック A実行

B実行

Page 48: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

実行方式について補足

• なでしこでは、ソースコードから構文木を作り、これを直接実行している

• 最近の言語では、構文木からバイトコードを出力し、それから実行する方式が一般的

– Ruby 1.9以降、Lua 、ActionScript など

– 最適化のし易さ、既存のVMへの対応、ネイティブコードへ変換して実行

Page 49: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

日本語(なでしこ)ならではの処理

• 大きなところでは、日本語プログラミング言語と、他の言語で実装の差異はほとんどないが・・・

• 構文解析で苦労する– ちなみに「葵」という日本語プログラミング言語では、構

文解析を自動生成するツール yacc を利用して作ったが、自由度を高めるためには、構文解析は自作した方が良かった

– 前後のトークンに応じて要素を動的に決定する必要があるため(曖昧な文法に対処する必要が多いことの代償)

Page 50: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

構文解析の問題

• 関数呼び出しに際して

– C言語など … 関数( 引数, 引数 .. )

– なでしこ .. 引数、引数、関数

• 引数を読んで、スタックに乗せて、関数を読んで、スタックから下ろすようにする

Page 51: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

構文解析

• 「ファイルAからBへファイルコピー」

スタック

ファイルA

ファイルB

ファイルコピー

pop

pop

Page 52: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

曖昧性の判定

• 当然だが、構文上の優先度を明確にしなければならない

• 「3+5に4を足して表示。」

– ((3)+(5に4を足して))表示

– ((3+5)に4を足して)表示。★

Page 53: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

曖昧性の判定

• オブジェクト指向を導入したせいで、曖昧性の判定が難しくなった

– OKボタンのテキストを表示する。

• OKボタンの --- オブジェクト

• テキストを --- プロパティ

• 表示 する--- 関数

– (OKボタンのテキスト)を、表示 ?

– OKボタンの、テキストを、表示 ?

Page 54: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

ライブラリ重要

• 言語を作るとき、ライブラリがどれだけ充実しているかは、重要な要素となる

• 機能を拡張しやすい仕組みを作ることで、多くのライブラリを用意できるようになる

Page 55: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこのライブラリを作る

• (1)インクルードファイル

– なでしこ自身でライブラリが記述する(自作関数やクラスを取り込む)

• (2)DLLにある関数を実行する

– CやDelphiで書いたDLLを取り込んで実行

• (3)なでしこのプラグインにする

– CやDelphiでDLLを一定の書式に沿って作る

Page 56: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(1) インクルードする

なでしこで、以下のように書くと、任意のファイルをライブラリとして利用できる

===

!「ファイル.nako」を取り込む

===

【長所】なでしこだけでできる

【短所】なでしこで、できることしかできない

Page 57: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(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言語の宣言を指定する必要がある

Page 58: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3) なでしこのプラグイン

• 【長所】なでしこのプラグインフォルダにDLLをコピーするだけで使えるようになる

• 【短所】プラグインの書式に従って作る必要がある

– 次に、簡単にC言語で、なでしこのライブラリを作る方法を紹介

Page 59: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3-1) プラグインSDKを入手

• なでしこのページから、プラグインSDKを入手する(なでしこ本体のダウンロードページの一番下の方にある)

http://nadesi.com/download.htm

ここでは、C言語版を利用する

Page 60: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3-2) 必要な関数を実装する

• DLLにプラグインに必要な5個の関数を定義する(DLLImportNakoFunction、PluginInfo、 PluginVersion、PluginRequire、 PluginInit、PluginFin)

• ほとんどが定型的。SDKに入っているSamplePlugin01.c をコピーすればOK

Page 61: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3-3) なでしこに命令を追加

• なでしこに、命令を登録する関数「ImportNakoFunction」を定義する

NAKO_API(void) ImportNakoFunction(void) {// ユーザー命令の追加nako_addFunction(

“サンプル1実行”, // 命令の名前“STRで”, // 命令の引数の定義sample01, // 関数へのポインタ0); // 0 を指定。

}

Page 62: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3-4) Cの関数を記述

• 「ImportNakoFunction」で登録した関数を実際に定義したらコンパイルして完成!

// コールバックして呼ばれるユーザー関数PHiValue __stdcall sample01(DWORD h) {

MessageBox(0, “Hello!”, “test", MB_OK);return NULL;

}

Page 63: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

(3-5) プラグインまとめ

• なでしこの言語機能にアクセスするヘルパー関数がたくさんあるので、これを利用することで、プラグインを手軽に作ることができる

• せっかく、ここで、作り方を覚えたので、言語製作に興味のある皆さん、有用ななでしこプラグインを作りませんか?

Page 64: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこ:今後の課題

• なでしこは、特定用途に特化していることに加え、ライブラリも充実している

• しかし、課題がないわけではない…

Page 65: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこ:現状の問題点

• なでしこは、2000年に作られた「ひまわり」をベースにして、2004年に主要部分が完成した

– そろそろソフトウェアの寿命

– OSの最新機能が利用できない問題

– Mac/Linux でも動かしたいという要望あり

Page 66: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこ:ライフサイクルの問題

• 文字コードの問題(内部文字コードが、SHIFT_JIS として処理される).. 多国

語の同時表示ができない、処理ができない(日本語に特化しているので不要という見方もできるが…)

• Delphiのせいでもあるが、Windows API など、Unicode版が使われてい

ないせいで、ファイル名の最大文字数など旧OSの制限が適用されている

Page 67: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこ:問題点への対処

• OSの最新機能は、ライブラリの追加で対処しているが…

• 内部文字コードの書き換えは、大幅な変更が必要

– せっかくなので、Delphi で書かれたコードを移植性の高い言語(C/Java)などに置き換える計画あり。

Page 68: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

未来のプログラミング言語

なでしこ2.0を考える

Page 69: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

夢いっぱいの自作言語

• 欠点もあるけれど「なでしこ」は夢いっぱいの自作言語

• 今後どのように開発を進めていくのか、なでしこユーザーの方々とよく話し合い、アイデアはたくさん!

• 夢いっぱいで開発していくことは楽しい

Page 70: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

言語を作るとき考えたいこと

• 対象とするプラットフォーム

– プラットフォームにより開発言語を選ぶ必要がある、どれも一長一短

– Delphiは生産性が高いが、Windows専用

– C# なら、生産性が高く、Windows + Linux

(Mono) でも動く

– C なら移植性が高くどこでも動くが、開発コストが高いのが気になるかも..

– Java なら、Win/Linux/Mac で同じように動くが、ランタイムが必要

Page 71: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

どの言語で作るか?

• ネタ言語や教育用言語なら、JavaScript

や Flash で作るといいかも。ブラウザ上ですぐ試してもらえるのは魅力★

• OS のコア機能を使えるようにしたいなら C/C++

• 生産性やライブラリの豊富さを求めるなら、C# や Java

Page 72: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

「葵」の紹介 (1/2)

• なでしこの後、Web上で動く日本語プログラミング言語「葵」を開発した

– 葵(v1)は、C言語で作ってCGIが作れるようにした

– 葵(v2)は、Java+ Flash で作って、可搬性を高めた

• http://aoikujira.com/

Page 73: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

「葵(v2)」の紹介 (2/2)

• Java (Applet) で、日本語プログラミング言語を、独自バイトコードに変換。

• Flash が独自バイトコードを読んで実行する。

• Webブラウザだけあれば、開発・実行できる!!

しかし、現状、キャパ不足のために、開発継続できず..

Page 74: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

なでしこ 2.0 について

• 葵の成果を踏まえた上で、なでしこ2.0

の方針を練っているところ。

• 既存の問題点を解決するだけでなく、せっかく作るなら「強烈なインパクト」を持った機構を追加したい

Page 75: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

誰でも簡単を目指して

• なでしこの目指すところは、「誰でも簡単プログラマー!」

• どうすれば、この標語が達成できるか?よく考える。

– 冒頭で紹介した、Squak や MindStorm のような、視覚要素を取り入れたプログラミング言語?

– 「簡単」にオブジェクト指向は必要・不要?

Page 76: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

世界展開

• 日本のソフトウェアは輸入超過

– Rubyを目標に世界展開を!

• なでしこ2.0では、日本語に加えて、韓国語や中国語をサポートしたい!!

Page 77: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

俺様言語の普及について

• せっかく作った自作言語を有名にしたい!!世界に羽ばたかせたい!!

• そのためには、じっくりと時間をかけて「継続して安定した開発」が求められる

– Ruby もブレイクするまでに、10年以上かかっている!!

– なでしこもいつか、ブレイクさせたい!!

Page 78: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

人気の言語を作るには?

• 良い言語であるためには人気がなければだめだ。そして、良い言語で有り続けるためには人気があり続けなければならない。(Paul Graham”人気の言語を作るには”より)

• プログラミング言語は、優れたものが生き残るわけではない、人気のある言語が優れたものに進化していく

Page 79: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

人気の言語を作るには?

• Paul 氏の主張

– 簡潔さ(簡潔に記述できる)

– ハックしやすい(内部まで深く触れる)

– 使い捨てしやすいこと(手軽に使える)

– ライブラリが充実(Perlを見習う)

– 構文(使いやすさ、見易さ)

– 実行効率

– 時間(開発が継続され続けること)

Page 80: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

継続して安定した開発

• とにかく時間をかけて作り続けること

– 言語そのものだけでなく、ライブラリをたくさん用意する、マニュアルを書く、使ってもらえるように宣伝する・・・

• 言語の完成度を高めるには、時間がいくらあっても足りない!!

– 言語の普及にはとにかく時間がかかるもの

– 夢を語るのは簡単、夢を実現するには時間がかかる

Page 81: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

長年開発を継続するために

• 時間の確保=予算の確保– 霞を食べて生活できる修行をする(或いは、国や企業に資金援助を求める)

– なでしこは、IPA未踏からの資金援助があったので完成までたどりつけた経緯がある

– 未踏の後、引き続き夢の中で生活するために、なでしこのコラム・本を書く、有料版を出す、業務で積極的に利用するなど(去年は本を書いたので2割達成)

Page 82: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

長年開発を継続するために

• モチベーションの維持

– 自分だけで作っていると、すぐにモチベーションが下がってしまう

– 一般公開して使ってもらう、人が使ってくれるのが分かると、やる気アップにつながる

– OSCなどの場で、共同開発者を募る、みんなで作れば、楽しさアップ!

Page 83: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

俺様言語開発への誘い

• 一緒になでしこを作りたい人を大募集しています!!

• 或いは、なでしこのライバル言語を作ってください!!– (開発が継続されている場合)パイの奪い合いにはなりません。共に繁栄します。

Page 84: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

<完>そして続く

ご清聴ありがとうございました!!

Page 85: なでしこに学ぶ プログラミング言語の作り方 · ゲーム用~Linden Script •3D仮想世界のSecond Life

質問やアイデア募集

• このプレゼンについての質問

• 未来の「日本語プログラミング言語」についてのアイデア