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

F17bbe02fb6dda24d29196c2479121b1?s=47 Hidemi KAWAI
November 08, 2016

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

OSC2016東京秋での発表資料

F17bbe02fb6dda24d29196c2479121b1?s=128

Hidemi KAWAI

November 08, 2016
Tweet

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さん – 小津さん