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

超軽量型プログラミング言語 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. 自己紹介(2) • 第二世代OSASK [2008年~] – これも小さくて速い – 他のOSの上でも動くOS(?) • OSECPU-VM

    / 第三世代OSASK [2013年~] – これも小さい(小ささの限界に迫った) – x86の限界を超えるために理想のCPUを設計して エミュレーション • つまり、 高速に動作するプログラムを、 小さく作るのが得意なだけの、おじさん
  2. なぜ言語を作ったのか?(1) • うちには小学1年生の子供がいた • ある日、妻がプログラミング教室のパンフレッ トを持ってきた – 「うちも、こういうのをやらせたほうがいいのかし ら?」 –

    「・・・はあああああああ????!!!」 おいこら、私を誰だと思っているんだ! そんなに高額な月謝を払いたいのなら、私に 払え!!(笑)
  3. なぜ言語を作ったのか?(2) • どうせ教えるのなら、学校とかではやらないやり方で • つまり、あえてScratch以外で – (Scratchは学校でやればいい) • C言語でやってみると・・・ #include

    <stdio.h> がそもそも入力できない! • 理由: – キーの刻印は大文字しかないので、ひらがな・カタカナの 「お勉強」をしているレベルでは小文字入力は到底無理 – #とか<とかの記号も、たくさんあるとやる気をなくす – ピリオドとカンマの区別も苦しそう 日本語入力が困難で なでしこも挫折!
  4. なぜ言語を作ったのか?(4) • フリーでいいのはないかと探したけど、微妙に一長一短 – でも、単に探し方が悪かっただけかも • 「BASICくらいその気になれば作れるんじゃないの?」 – という思い付きで200行くらい書いたら、まあまあできた –

    (探す時間がもったいないとも思った) – 「親が作った言語を使って、子がプログラミングをする」 ・・・なんか、かっこいい!(笑) • しかし子供の上達はゆっくり – 待てなくなった「親」は、言語に自分しか使わないような機能を どんどん追加していく・・・(苦笑) – もはや当初の目的が関係なくなっている・・・
  5. 基本スペック • Windows版はコンパイル済みバイナリあり – 32bit版: 57.5KB, 64bit版: 65.0KB • それ以外のOSでもソースからのコンパイルでOK(Linux,

    FreeBSD, たぶんmacOSもいける?) • 基本的にスクリプト言語(インタプリタ言語)だが、実行 速度はgccの-O3レベルにかなり迫っている(1~2割く らい負ける程度) – これはスクリプト言語としてはトップクラス! • グラフィック命令がincludeなしでいきなり使える – 子供にはそのほうが使いやすいから
  6. ダウンロード & より詳しい説明 • まず http://osask.jp へアクセスしてください • そこから「OSC特設ページ」へ進んでください •

    その中に「ES-BASIC ver.0.2a」へのリンクがありま す – ( http://essen.osask.jp/?esbasic02a へ直接行っても いいです) • ここからダウンロードできます – より詳しい説明もあります – このスライドへのリンクもあります
  7. プログラム例(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
  8. サイズ比較 • 言語処理系のインストールサイズ – なんでこんなに小さいの? – まだ機能が少ないから・・・?? 言語 サイズ サイズ比

    備考 gcc 8.1.0 449256KB 6912倍 ES-BASIC 0.2 65KB 1倍 圧倒的な小ささ! Ruby 2.6.4 75323KB 1159倍 Python 3.7.4 85771KB 1320倍
  9. デバッグ支援機能 • 演算でオーバーフローしたら、実行時エラーでちゃんと 止まる • 配列の要素数を超えたアクセスをしようとしたら、実行 時エラーでちゃんと止まる • どの行を何回実行したのか、報告させる命令がある(= プロファイリングできる)

    • ブレークポイントを設定できるし、キーボードでも一時停 止できるし、変数などを確認したのちに、再開もできる • ES-BASICは動作が速すぎるので(!)、デバッグ中には 減速させる命令がある • → もはやデバッガがいらない! • (これらの機能は65KB内に含まれています)
  10. コンパイラとして利用 • 実行速度を上げるために、RUNされた瞬間に 機械語にコンパイルしている • だったら、それを実行ファイル形式で出力する だけで、コンパイラにもなるのでは? • とりあえずやってみた –

    なんか超絶に小さい実行ファイルができた! – スクリプト言語+デバッガ+コンパイラ = 65KB hello.exe calendar.exe gccで作成 18944バイト 19456バイト ES-BASICで作成 1076バイト 1588バイト
  11. 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バイト
  12. アセンブラとして利用 • 思いつき:「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行で書いてすみません
  13. ここまでのまとめ • 高速&コンパクトが得意なおじさん • 妻はおじさんのスキルを甘く見すぎ • 既存言語は大きすぎ (表再掲) • これだけいろいろやっても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倍
  14. 今後の開発予定 • ちょっと思いつきで作りすぎたので、作り直したい • 子供はBASICでいいかもしれないけど、私はC言 語の方が好きなので、ES-Cを作って常用したい • 実行中の状態を保存し、再開する機能を付けた い •

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