$30 off During Our Annual Pro Sale. View Details »

OSASK計画が考える新しいプログラミング言語の構想

Hidemi KAWAI
November 08, 2016

 OSASK計画が考える新しいプログラミング言語の構想

OSC2016東京秋での発表資料

Hidemi KAWAI

November 08, 2016
Tweet

More Decks by Hidemi KAWAI

Other Decks in Programming

Transcript

  1. OSASK計画が考える 新しいプログラミング言語の構想 OSASK計画代表 川合 秀実

  2. もくじ • [1] ねえ、OSASKって終わったの? • [2] プログラミング言語Essen • [3] 競争型の開発スタイル

  3. [1] ねえ、OSASKって終わったの? そんなことはないです 今までの流れをお知らせします

  4. OSASKは「まだ」生きていた! • 簡単な歴史(リリースできた期間のみ) ・①第一世代OSASK 2000年05月~2005年01月 ・②「30日でできる! OS自作入門」 2006年02月 ・③第二世代OSASK 2008年04月~2009年10月

    ・④OSASK公開停止 2009年11月 ・⑤blikeライブラリ(描画ライブラリ) 2010年10月~2011年03月 ・⑥川合が就職 2011年09月 ・⑦第三世代OSASK(OSECPU-VM) 2013年03月~2014年08月 ・⑧プログラミング言語Essen 2016年11月~(予定) ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ 今日 2000年
  5. 第一世代OSASK 4MBのメモリでOK (BIOSによるメモリチェックの 時間を除けば)1秒で起動 33MHzのCPUで快適 100KBのインストールサイズ (シェルやドライバや標準ライ ブラリも含む) 3Dキューブ: 1,393バイト

    爆弾さがし: 3,213バイト ダンジョン: 32.4キロバイト
  6. 第二世代OSASK • この時はグラフィックをサポートしなかったの で、派手さはない – アプリがWindowsやLinux上でも動く – Windows向けのローダはたったの14.5KB – hello,

    worldが16バイト – hexdumpが168バイト – アセンブラ処理系(nask)が22.2KB
  7. 第三世代OSASK • WindowsやLinuxでもアプリが動く – Win版のシステムは29.0KB (Javaみたいなバイトコード方式) インベーダ: 430バイト フラクタル: 111バイト

    charsだけが小さいわけではない(ズルじゃないから) アプリサイズは第一世代の半分以下! しかもx86もARMもOK
  8. [2] プログラミング言語Essen 関数や型だけではなく 演算子や制御構文を自由に作れる プログラミング言語(予定)

  9. なぜプログラミング言語? • OSを作っているとシェルも作りたくなってくる • シェルを作っているとプログラミング言語みた いになってくる • そしてやっぱりコンパクトに作りたい – たくさん書いてすごいものができるのは当たり前

    – 短い処理系なのにいろいろできたらかっこいい
  10. 特徴(1) • インタプリタ言語 • 速度は追及しない – どうせCやアセンブラには勝てない – シンプルな実装を心がける •

    プログラム内に既存言語を混ぜられる(関数単位) – インライン機械語 – インラインアセンブラ – インラインC++ – インラインRuby – などなど
  11. 特徴(2) • Cは関数を自由に定義できる • C++は型を自由に定義できる • これに対して、Essenは演算子と制御構文も自 由に定義できる! • 変数は電源を切っても消えない(保存される)

    – 変数をファイル代わりに使える – 変数の削除とか変数名の変更などもできる • ファイルの代わりなので
  12. 内部アルゴリズム a = 1 + 2 * 3 a =

    1 + 2 * 3 // この掛け算が選ばれる a = 1 + 6 // 6に置換される a = 1 + 6 // この足し算が選ばれる a = 7 // 7 に置換される a = 7 // この代入命令が選ばれる 構文木とかは作らずに、優先順位と結合方向を意 識して式をたどって、演算して結果に置換 これを置換できなくなるまで繰り返す・・・シンプル!
  13. Essenにおける関数と演算子の違い • 関数: – f(a) とか g(x, y) とか h()

    のように必ず()で呼び出される – 引数はかっこでくくられているので明白 – 優先順位とか結合方向とかそういう面倒なものはない • 演算子: – 2 + 3 とか i++ のように()がなくても呼び出される – 引数は演算子の前後からもぎ取る – 優先順位や結合方向がある
  14. 作ってみたい演算子 • y = sin x // sin(x) と同じように機能する •

    a = b mod c // %よりはmodが好き • z = e ** x // powよりは**が好き • 複素数を扱う文脈では、iという演算子があると 便利そう (これはカッコがなくても発動してほしい ので演算子にするしかない) – z = 1+2i – でも普段は i は for のカウンタなどで使うので、この 定義が常にほしいわけじゃない • 時間があると、どんどんアイデアが出てくる!
  15. 作ってみたい制御構文 • 1~9の数字が書かれたカードが、それぞれ1枚ずつある。 ここから3枚を選ぶ。 • 3枚の数字の合計が10になるのは何パターンあるか? – Essenでは、セミコロンは省略できる。引数区切りのカンマも省略できる。 – 文が1文しかなくても、中カッコは省略できない。

    – 型宣言は不要。 – combiFor(f 9 3)は9個の中から3つを選ぶ組わせをすべて列挙するforループ。変数 fに(1 1 1 0 0 0 0 0 0)などが格納される。 – sum(k 1 9) { ... } は、k=1~9に対して、{ } の中を計算してその和を取る。 – Essenは制御構文を自由に作れるので、combiForやsumのような構文も思いつきで すぐに作れる。 c = 0 combiFor(f 9 3) { if (sum(k 1 9) { f[k - 1] * k } == 10) { c++ } } print(c)
  16. [3] 競争型の開発スタイル 協力して作るのとは少し違います

  17. ライバルとの競争の例 • オープンソースはみんなで仲良く作るから すばらしい・・・だけじゃない! 競争だ!! • OSASKの川合 vs MEG-OSのsakky氏 •

    charsという簡単なプログラムを小さくしたい • もしOS側も改造してよいとしたらどこまで行け るのか? • 双方にテクニックを盗みあう
  18. 競争の成果 2008年 Kが31バイトを達成 2008年 Sは13バイトを達成 2008年 Kは14バイトを達成 2008年 Sは12バイトを達成 2008年

    Kは12バイトを達成 2008年 Kは11バイトを達成 2013年 Sはなんと8バイトを達成 2013年 Kは7バイトを達成 2014年 Sは6バイトを達成 2014年 Kは5バイトを達成 第二世代 OSASK 第三世代 OSASK CLE COM64+ 競い合ったおかげで、世界一位&世界二位の実力に到達。
  19. そういえば第一世代OSASKも競争してた • 2000年05月01日 OSASKの最初のリリース • 2002年06月18日 MonaOSの開発開始 • 2002年07月13日 NWSOSの最初のリリース

    • 2002年07月28日 MEG-OSの最初のリリース • これらは「2ちゃんねる4大和製OS」と呼ばれ、 よく比較された(互いに意識もした) • OSASKとMonaOSはオープンソース
  20. 競争型の開発 • ということで、協力者よりもライバルがほしい – 共に切磋琢磨して、お互いの努力を理解しあえる 強敵(とも)がほしい! • 会社の業務で、現在、学生2名の指導を担当し ているが、あれこれ教えるのではなく、私と競 争してもらっている

    – 我ながら斬新な指導方法 – 私も堂々と好きな開発ができる! 一石二鳥!! – もし差が付いたら「敵に塩を贈る」気持ちで教える
  21. まとめ • [1] ねえ、OSASKって終わったの? • [2] プログラミング言語Essen • [3] 競争型の開発スタイル

    • ホームページ http://osask.jp/ • 次は学生の発表です(ライバル) – hikaliumさん – 小津さん