Upgrade to Pro — share decks privately, control downloads, hide ads and more …

超軽量型プログラミング言語 ES-BASIC

超軽量型プログラミング言語 ES-BASIC

ES-BASIC ver.0.2a → http://essen.osask.jp/?esbasic02a

前回発表のES-BASICをパワーアップしました。
スクリプト言語だけではなく、コンパイラやアセンブラとしても使えるようになっています。
しかもサイズは前のバージョンよりも小さくなっています!

Hidemi KAWAI

April 24, 2020
Tweet

More Decks by Hidemi KAWAI

Other Decks in Programming

Transcript

  1. 超軽量型スクリプト言語
    ES-BASIC
    OSASK計画代表
    川合 秀実

    View full-size slide

  2. 自己紹介(1)
    • 川合 秀実 (1975年生まれ)
    • OSASK計画(おさくすけいかく) [2000年~]
    – 「OSから作り直して、PCをすごく良くしよう!」
    – 100KB未満のOSが
    超快適に動作
    (33MHz, 8MBでも)

    View full-size slide

  3. 自己紹介(2)
    • 第二世代OSASK [2008年~]
    – これも小さくて速い
    – 他のOSの上でも動くOS(?)
    • OSECPU-VM / 第三世代OSASK [2013年~]
    – これも小さい(小ささの限界に迫った)
    – x86の限界を超えるために理想のCPUを設計して
    エミュレーション
    • つまり、 高速に動作するプログラムを、
    小さく作るのが得意なだけの、おじさん

    View full-size slide

  4. なぜ言語を作ったのか?(1)
    • うちには小学1年生の子供がいた
    • ある日、妻がプログラミング教室のパンフレッ
    トを持ってきた
    – 「うちも、こういうのをやらせたほうがいいのかし
    ら?」
    – 「・・・はあああああああ????!!!」
    おいこら、私を誰だと思っているんだ!
    そんなに高額な月謝を払いたいのなら、私に
    払え!!(笑)

    View full-size slide

  5. なぜ言語を作ったのか?(2)
    • どうせ教えるのなら、学校とかではやらないやり方で
    • つまり、あえてScratch以外で
    – (Scratchは学校でやればいい)
    • C言語でやってみると・・・
    #include
    がそもそも入力できない!
    • 理由:
    – キーの刻印は大文字しかないので、ひらがな・カタカナの
    「お勉強」をしているレベルでは小文字入力は到底無理
    – #とか<とかの記号も、たくさんあるとやる気をなくす
    – ピリオドとカンマの区別も苦しそう
    日本語入力が困難で
    なでしこも挫折!

    View full-size slide

  6. なぜ言語を作ったのか?(3)
    • 「そうだBASICにしよう」
    – 基本大文字のみ
    – カッコが少ない、記号も少ない
    – 行番号があるので「運動会のプログラム」に似て
    いる!(=教えやすそう)
    – ×: Visual Basic (高級すぎる)
    – ×: Quick BASIC (高級すぎる)
    – ○: MSX-BASIC, N88-BASIC, F-BASIC など

    View full-size slide

  7. なぜ言語を作ったのか?(4)
    • フリーでいいのはないかと探したけど、微妙に一長一短
    – でも、単に探し方が悪かっただけかも
    • 「BASICくらいその気になれば作れるんじゃないの?」
    – という思い付きで200行くらい書いたら、まあまあできた
    – (探す時間がもったいないとも思った)
    – 「親が作った言語を使って、子がプログラミングをする」
    ・・・なんか、かっこいい!(笑)
    • しかし子供の上達はゆっくり
    – 待てなくなった「親」は、言語に自分しか使わないような機能を
    どんどん追加していく・・・(苦笑)
    – もはや当初の目的が関係なくなっている・・・

    View full-size slide

  8. 基本スペック
    • Windows版はコンパイル済みバイナリあり
    – 32bit版: 57.5KB, 64bit版: 65.0KB
    • それ以外のOSでもソースからのコンパイルでOK(Linux,
    FreeBSD, たぶんmacOSもいける?)
    • 基本的にスクリプト言語(インタプリタ言語)だが、実行
    速度はgccの-O3レベルにかなり迫っている(1~2割く
    らい負ける程度)
    – これはスクリプト言語としてはトップクラス!
    • グラフィック命令がincludeなしでいきなり使える
    – 子供にはそのほうが使いやすいから

    View full-size slide

  9. ダウンロード & より詳しい説明
    • まず http://osask.jp へアクセスしてください
    • そこから「OSC特設ページ」へ進んでください
    • その中に「ES-BASIC ver.0.2a」へのリンクがありま

    – ( http://essen.osask.jp/?esbasic02a へ直接行っても
    いいです)
    • ここからダウンロードできます
    – より詳しい説明もあります
    – このスライドへのリンクもあります

    View full-size slide

  10. プログラム例(1)
    • このグラデーションを書くプログラム(7行)
    1000 OPENWIN 256,256
    1010 FOR Y=0,255
    1020 FOR X=0,255
    1030 C=RGBCOL(Y,X,0)
    1040 SETPIX X,Y,C
    1050 NEXT
    1060 NEXT

    View full-size slide

  11. プログラム例(2)
    • 迷路作成プログラム(26行)
    1000 OPENWIN 752,496
    1010 CHRBOX 47,31,0,0,1,2; // 画面を緑色(2)の四角で埋め尽くす
    1020 ECHR 1,1,0; // 左上に一つだけ穴をあける(キャラクタ番号#0をおく)
    1030 FOR I=0,1000000
    1040 X=(RAND%23)*2+1
    1050 Y=(RAND%15)*2+1
    1060 GETCHR X,Y,C
    1070 IF C==0 THEN
    1080 DOLOOP; // (X,Y)から掘り進める.
    1090 D0=0; D1=0; D2=0; D3=0
    1100 IF X<45 THEN GETCHR X+1,Y,C; GETCHR X+2,Y,CC; D0=C*CC; FI
    1110 IF X> 1 THEN GETCHR X-1,Y,C; GETCHR X-2,Y,CC; D1=C*CC; FI
    1120 IF Y<29 THEN GETCHR X,Y+1,C; GETCHR X,Y+2,CC; D2=C*CC; FI
    1130 IF Y> 1 THEN GETCHR X,Y-1,C; GETCHR X,Y-2,CC; D3=C*CC; FI
    1140 D=D0+D1+D2+D3
    1150 IF D==0 GOTO SKIP; // もう掘り進められない
    1160 DD=RAND%D
    1170 IF D0!=0 THEN IF DD==0 THEN ECHR X+1,Y,0; X=X+2; FI; DD=DD-1; FI
    1180 IF D1!=0 THEN IF DD==0 THEN ECHR X-1,Y,0; X=X-2; FI; DD=DD-1; FI
    1190 IF D2!=0 THEN IF DD==0 THEN ECHR X,Y+1,0; Y=Y+2; FI; DD=DD-1; FI
    1200 IF D3!=0 THEN IF DD==0 THEN ECHR X,Y-1,0; Y=Y-2; FI; DD=DD-1; FI
    1210 ECHR X,Y,0
    1220 ENDDO
    1230 SKIP:
    1240 FI
    1250 NEXT

    View full-size slide

  12. プログラム例(3)
    • マンデルブロ画像(36行)

    View full-size slide

  13. プログラム例(4)
    • ブロック崩し(142行)

    View full-size slide

  14. プログラム例(5)
    • キューブ回転(114行)

    View full-size slide

  15. サイズ比較
    • 言語処理系のインストールサイズ
    – なんでこんなに小さいの?
    – まだ機能が少ないから・・・??
    言語 サイズ サイズ比 備考
    gcc 8.1.0 449256KB 6912倍
    ES-BASIC 0.2 65KB 1倍 圧倒的な小ささ!
    Ruby 2.6.4 75323KB 1159倍
    Python 3.7.4 85771KB 1320倍

    View full-size slide

  16. デバッグ支援機能
    • 演算でオーバーフローしたら、実行時エラーでちゃんと
    止まる
    • 配列の要素数を超えたアクセスをしようとしたら、実行
    時エラーでちゃんと止まる
    • どの行を何回実行したのか、報告させる命令がある(=
    プロファイリングできる)
    • ブレークポイントを設定できるし、キーボードでも一時停
    止できるし、変数などを確認したのちに、再開もできる
    • ES-BASICは動作が速すぎるので(!)、デバッグ中には
    減速させる命令がある
    • → もはやデバッガがいらない!
    • (これらの機能は65KB内に含まれています)

    View full-size slide

  17. コンパイラとして利用
    • 実行速度を上げるために、RUNされた瞬間に
    機械語にコンパイルしている
    • だったら、それを実行ファイル形式で出力する
    だけで、コンパイラにもなるのでは?
    • とりあえずやってみた
    – なんか超絶に小さい実行ファイルができた!
    – スクリプト言語+デバッガ+コンパイラ = 65KB
    hello.exe calendar.exe
    gccで作成 18944バイト 19456バイト
    ES-BASICで作成 1076バイト 1588バイト

    View full-size slide

  18. hello と calendar
    1000 PRINTF "hello, world¥n"
    1000 ARY STATIC CONST INT NEW A:[61]
    1010 ARY STATIC CONST INT A:[0...]="Jan13Feb40Mar33Apr62May13Jun42Jul63Aug23Sep52Oct03Nov32Dec53"
    1020 Y=2020; M=0; M1=0; GETARG Y, M; IF M<1 THEN M=1; M1=12; FI
    1030 M=(M-1)*5; A9=0; IF Y%400==0 THEN A9=1; FI
    1040 IF Y%4==0 THEN IF Y%100!=0 THEN A9=1; FI; FI
    1050 DOLOOP
    1060 PRINTF "¥n %c%c%c %4d¥n¥n",A:[M],A:[M+1],A:[M+2],Y
    1070 PRINTF "Sun Mon Tue Wed Thu Fri Sat¥n"
    1080 W=Y; IF M<=5 THEN W=Y-1; FI
    1090 W0=W/4; W1=W/100; W2=W/400; W3=A:[M+3]&7
    1100 W=(W+W0-W1+W2+W3)%7
    1110 IF W>0 THEN FOR D=1,W; PRINTF " "; NEXT; FI
    1120 D1=A:[M+4]&7; IF M==5 THEN D1=A9; FI; D1=D1+28
    1130 FOR D=1,D1
    1140 PRINTF " %2d ",D
    1150 W=(W+1)%7
    1160 IF W==0 THEN PRINTF "¥n"; FI
    1170 NEXT
    1180 IF W>0 THEN PRINTF "¥n"; FI
    1190 M=M+5
    1200 ENDDO M1*5>M
    1076バイト
    1588バイト

    View full-size slide

  19. アセンブラとして利用
    • 思いつき:「ES-BASICの命令だけではなく、 アセン
    ブラの命令も高速実行&コンパイルできたら面
    白いかな?」
    • とりあえずやってみた
    • スクリプト言語+デバッガ+コンパイラ+アセン
    ブラ = 65KB
    • もはや テレビショッピング級のセット販売?!
    10 XOR EAX,EAX; XOR EBX,EBX
    20 ADD EBX,EAX; INC EAX; CMP EAX,10; JLE 20; // 20は行番号
    30 PRINTF "%d¥n", EBX; // 無理やり3行で書いてすみません

    View full-size slide

  20. ここまでのまとめ
    • 高速&コンパクトが得意なおじさん
    • 妻はおじさんのスキルを甘く見すぎ
    • 既存言語は大きすぎ (表再掲)
    • これだけいろいろやっても65KB
    – 最初と印象が違いませんか?
    – これがx86の本当の実力なのです
    言語 サイズ サイズ比 備考
    gcc 8.1.0 449256KB 6912倍
    ES-BASIC 0.2 65KB 1倍 圧倒的な小ささ!
    Ruby 2.6.4 75323KB 1159倍
    Python 3.7.4 85771KB 1320倍

    View full-size slide

  21. 今後の開発予定
    • ちょっと思いつきで作りすぎたので、作り直したい
    • 子供はBASICでいいかもしれないけど、私はC言
    語の方が好きなので、ES-Cを作って常用したい
    • 実行中の状態を保存し、再開する機能を付けた

    • デバッグ支援を強化して、ファジングテストも簡単
    にできるようにしたい
    – 入力値を自動でいろいろ試して、予期せぬエラーにな
    るケースがないか探す機能

    View full-size slide