* ES-BASIC #1
-(by [[K]], 2019.07.16)
** (0) はじめに
-ES-BASICはEssen開発プロジェクトのサブプロジェクトで、昔懐かしのBASICっぽい言語を適当に作ってみようというものです。
** (1) なぜBASICか
-BASIC言語は、今になって思えば、とても「教えやすい」言語だと思います。
-行番号とかも、一般には嫌われているように思いますが、しかし運動会のプログラムなどでは番号の後に演目が書かれているほうが普通なので、プログラムの前に番号があるのは実に自然です。
-コンソールで、数値で始まる一行を入力されたら、それはプログラムとして保存すればいいわけですし、そうでなければダイレクト実行すればいいので、すごくわかりやすいじゃないですか。これは実装も簡単で済みます。こんないい発明を捨てるのはもったいないと私は思うのです。エディタを別に用意する必要もないわけです。

-今の私は、JITコンパイラを簡単に作れるライブラリを手にしているので(自作ライブラリ)、ちょっとした思いつきで言語を作っても失うものはほとんどありません。もし飽きたら中断して別の物を作ればいいだけのことです。・・・むしろだからこそ、いろいろ作って試してみることができます。


** (2)
-とりあえず思いつきで6時間くらい書いて、これくらいはできるようになりました。処理系は185行です。
 prompt>esbasic  (起動)
 Ok
 1 a=1
 2 b=2
 3 c=a+b
 4 println c
 list
    1 A=1
    2 B=2
    3 C=A+B
    4 PRINTLN C
 
 Ok
 run
 3
-さらに1時間くらいかけてfor~nextを実装しました(TOは予約語にしたくなかったので、コンマにしました)。
 Ok
 s=0; for k=1,10; s=s+k; next; println s
 55
 
 Ok
 for i=0,99999999; next; println i
 100000000
-この1億回ループに要した時間は、C言語の1億回ループの5倍くらいでしたので、まあまあの速度は出ています。
-ここではダイレクト実行をやっていますが、もちろんプログラム内でもfor~nextは使えます。

** (3)
-[30分, +10行] まず30分くらいで、プログラムの大文字化ルーチンを修正しました。これまでは何も考えずに入力された文字は全て大文字化していましたが、この修正により、文字定数やコメント内の小文字は大文字にならなくなりました。
-・・・よしよし。プログラムは10行増えて、214行になりました。
--そもそも大文字化する必要はないという考え方もできるのですが、私は今回大文字化したかったので、まじめに作りました。

-[10分, +8行] 今度はMEMコマンドを作ってみました。現在どのくらいメモリを使っているのかの確認用です。プログラムは222行になりました。
-すると問題が発覚しました。MEMコマンドを連続して打っているだけでも、消費メモリが徐々に増えていくのです。これは良くない!
--バグを突き止めて修正しました。ライブラリに問題がありました。30分くらいで直りました。よしよし。これでおかしな挙動はなくなりました。

-[1時間半, +89行] if~then~else~fiを追加して、inputを追加して、printを拡張しました。
-printは文字定数も表示できるようになりました。カンマで終わると改行しません。printlnという名前がBASICらしくないと思っていたので、printに戻しました。
-処理系は311行になって結構長くなったなーという感じではあるのですが、しかしできることが増えて結構楽しいです。
 list
    1 PRINT "How old are you? ",
    2 INPUT AGE
    3 IF AGE < 20 THEN
    4     PRINT "You are a child."
    5 ELSE
    6     PRINT "You are a adult."
    7 FI
 
 Ok
 run
 How old are you? 12
 You are a child.
 
 Ok
 run
 How old are you? 55
 You are a adult.
 
 Ok

-[1時間, +25行] さらに1時間くらいかけて、%演算子を追加して、for文にstep指定を追加しました。これで素数探しができるようになりました。現在処理系は336行です。
 list
    1 PRINT 2,,3,,
    2 FOR I=5,999,2
    3   I1=I-1
    4   F=0
    5   FOR J=3,I1,2
    6     K=I%J
    7     IF K==0 THEN F=1; FI
    8   NEXT
    9   IF F==0 THEN PRINT I,,; FI
   10 NEXT
 
 Ok
 run
 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139
 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283
 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457
 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631
 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821
 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997
 Ok
-絶好調です!

-[10分, +4行] ついでに乗算と除算も追加しました。現在処理系は340行です。

* こめんと欄
#comment

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS