esbasic0001
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* ES-BASIC #1
-(by [[K]], 2019.07.16)
** (0) はじめに
-ES-BASICはEssen開発プロジェクトのサブプロジェクトで、昔...
** (1) なぜBASICか
-BASIC言語は、今になって思えば、とても「教えやすい」言語...
-行番号とかも、一般には嫌われているように思いますが、しか...
-コンソールで、数値で始まる一行を入力されたら、それはプロ...
-今の私は、JITコンパイラを簡単に作れるライブラリを手にし...
** (2) 1日目
-とりあえず思いつきで6時間くらい書いて、これくらいはでき...
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倍く...
-ここではダイレクト実行をやっていますが、もちろんプログラ...
** (3) 2日目
-[30分, +10行] まず30分くらいで、プログラムの大文字化ルー...
-・・・よしよし。プログラムは10行増えて、214行になりまし...
--そもそも大文字化する必要はないという考え方もできるので...
----
-[10分, +8行] 今度はMEMコマンドを作ってみました。現在どの...
-すると問題が発覚しました。MEMコマンドを連続して打ってい...
--バグを突き止めて修正しました。ライブラリに問題がありま...
----
-[1時間半, +89行] if~then~else~fiを追加して、inputを追...
-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時間くらいかけて、%演算子を追加し...
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 ...
149 151 157 163 167 173 179 181 191 193 197 199 211 223 ...
293 307 311 313 317 331 337 347 349 353 359 367 373 379 ...
461 463 467 479 487 491 499 503 509 521 523 541 547 557 ...
641 643 647 653 659 661 673 677 683 691 701 709 719 727 ...
823 827 829 839 853 857 859 863 877 881 883 887 907 911 ...
Ok
-絶好調です!
----
-[10分, +4行] ついでに乗算と除算も追加しました。現在処理...
** (4) 3日目
-[50分, -9行] 今日はまずGOTO命令とIF~GOTO構文を追加しま...
-そして私の定番ベンチマークの一つ、「1000万以下の素数の個...
list
1 C=2; L=3; // 2,3の分は最初から数えてある、5から探す
2 FOR I=5,10000000,2
3 T=L*L; IF T < I THEN L=L+1; FI
4 FOR K=3,L,2
5 T=I%K; IF T==0 GOTO 8
6 NEXT
7 C=C+1
8 NEXT
9 PRINT C
Ok
run
664579
-よし、答えは合っています。しかも3.4秒しかかかりませんで...
-このプログラムの場合、剰余算で律速しているので、レジスタ...
----
-[10分, +4行] 今度はRAND文を作ってみました。これはINPUTと...
list
1 RAND R; R=R%90; R=R+10; // これで10~99になる.
2 PRINT "いくつだとおもいますか? ",; INPUT I
3 IF R==I THEN PRINT "あたりです!"; FI
4 IF R> I THEN PRINT "もっと大きいです"; FI
5 IF R< I THEN PRINT "もっと小さいです"; FI
6 IF R!=I GOTO 2
Ok
run
いくつだとおもいますか? 50
もっと小さいです
いくつだとおもいますか? 30
もっと大きいです
いくつだとおもいますか? 40
もっと大きいです
いくつだとおもいますか? 45
もっと大きいです
いくつだとおもいますか? 47
もっと大きいです
いくつだとおもいますか? 49
もっと小さいです
いくつだとおもいますか? 48
あたりです!
Ok
run
いくつだとおもいますか? 48
もっと大きいです
いくつだとおもいますか? 75
もっと大きいです
いくつだとおもいますか? 86
もっと大きいです
いくつだとおもいますか? 95
もっと大きいです
いくつだとおもいますか? 99
あたりです!
Ok
run
いくつだとおもいますか? 50
もっと大きいです
いくつだとおもいますか? 88
もっと大きいです
いくつだとおもいますか? 90
もっと大きいです
いくつだとおもいますか? 99
もっと小さいです
いくつだとおもいますか? 98
もっと小さいです
いくつだとおもいますか? 94
もっと小さいです
いくつだとおもいますか? 92
もっと小さいです
いくつだとおもいますか? 90
もっと大きいです
いくつだとおもいますか? 91
あたりです!
Ok
----
-[1時間, +19行] ここまでできるようになったら、もうやるし...
-19行の追加でここまでできるのだから、まあ悪くはないかな、...
Ok
openwin win,256,256; // まずこれでウィンドウを開いておく.
Ok
list
1 C=0
2 FOR Y=0,255
3 FOR X=0,255
4 SETPIX WIN,X,Y,C
5 C=C+256
6 NEXT
7 NEXT
8 FLUSHWIN WIN
Ok
run
-こうすると、こんな感じの絵が出ます(ウィンドウタイトルは...
--http://osecpu.osask.jp/download/app0006a.png
----
-[1時間, +27行] さらに頑張って、gosub作りました。push/pop...
-ローカル変数がないので、すごく苦し紛れですが、しかし一応...
-これは再帰でフィボナッチ数を計算しているプログラムです。
1 INITSTACK 1000; I=34; GOSUB 2; PRINT R; GOTO 10
2 // fibo: input i, output r.
3 R=I
4 IF I >= 2 THEN
5 I=I-2; GOSUB 2; PUSH R
6 I=I+1; GOSUB 2; POP T; R=T+R
7 I=I+1
8 FI
9 RETURN
10 //
-実行時間を測定したところ、C言語で書いた場合のちょうど2倍...
* こめんと欄
#comment
終了行:
* ES-BASIC #1
-(by [[K]], 2019.07.16)
** (0) はじめに
-ES-BASICはEssen開発プロジェクトのサブプロジェクトで、昔...
** (1) なぜBASICか
-BASIC言語は、今になって思えば、とても「教えやすい」言語...
-行番号とかも、一般には嫌われているように思いますが、しか...
-コンソールで、数値で始まる一行を入力されたら、それはプロ...
-今の私は、JITコンパイラを簡単に作れるライブラリを手にし...
** (2) 1日目
-とりあえず思いつきで6時間くらい書いて、これくらいはでき...
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倍く...
-ここではダイレクト実行をやっていますが、もちろんプログラ...
** (3) 2日目
-[30分, +10行] まず30分くらいで、プログラムの大文字化ルー...
-・・・よしよし。プログラムは10行増えて、214行になりまし...
--そもそも大文字化する必要はないという考え方もできるので...
----
-[10分, +8行] 今度はMEMコマンドを作ってみました。現在どの...
-すると問題が発覚しました。MEMコマンドを連続して打ってい...
--バグを突き止めて修正しました。ライブラリに問題がありま...
----
-[1時間半, +89行] if~then~else~fiを追加して、inputを追...
-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時間くらいかけて、%演算子を追加し...
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 ...
149 151 157 163 167 173 179 181 191 193 197 199 211 223 ...
293 307 311 313 317 331 337 347 349 353 359 367 373 379 ...
461 463 467 479 487 491 499 503 509 521 523 541 547 557 ...
641 643 647 653 659 661 673 677 683 691 701 709 719 727 ...
823 827 829 839 853 857 859 863 877 881 883 887 907 911 ...
Ok
-絶好調です!
----
-[10分, +4行] ついでに乗算と除算も追加しました。現在処理...
** (4) 3日目
-[50分, -9行] 今日はまずGOTO命令とIF~GOTO構文を追加しま...
-そして私の定番ベンチマークの一つ、「1000万以下の素数の個...
list
1 C=2; L=3; // 2,3の分は最初から数えてある、5から探す
2 FOR I=5,10000000,2
3 T=L*L; IF T < I THEN L=L+1; FI
4 FOR K=3,L,2
5 T=I%K; IF T==0 GOTO 8
6 NEXT
7 C=C+1
8 NEXT
9 PRINT C
Ok
run
664579
-よし、答えは合っています。しかも3.4秒しかかかりませんで...
-このプログラムの場合、剰余算で律速しているので、レジスタ...
----
-[10分, +4行] 今度はRAND文を作ってみました。これはINPUTと...
list
1 RAND R; R=R%90; R=R+10; // これで10~99になる.
2 PRINT "いくつだとおもいますか? ",; INPUT I
3 IF R==I THEN PRINT "あたりです!"; FI
4 IF R> I THEN PRINT "もっと大きいです"; FI
5 IF R< I THEN PRINT "もっと小さいです"; FI
6 IF R!=I GOTO 2
Ok
run
いくつだとおもいますか? 50
もっと小さいです
いくつだとおもいますか? 30
もっと大きいです
いくつだとおもいますか? 40
もっと大きいです
いくつだとおもいますか? 45
もっと大きいです
いくつだとおもいますか? 47
もっと大きいです
いくつだとおもいますか? 49
もっと小さいです
いくつだとおもいますか? 48
あたりです!
Ok
run
いくつだとおもいますか? 48
もっと大きいです
いくつだとおもいますか? 75
もっと大きいです
いくつだとおもいますか? 86
もっと大きいです
いくつだとおもいますか? 95
もっと大きいです
いくつだとおもいますか? 99
あたりです!
Ok
run
いくつだとおもいますか? 50
もっと大きいです
いくつだとおもいますか? 88
もっと大きいです
いくつだとおもいますか? 90
もっと大きいです
いくつだとおもいますか? 99
もっと小さいです
いくつだとおもいますか? 98
もっと小さいです
いくつだとおもいますか? 94
もっと小さいです
いくつだとおもいますか? 92
もっと小さいです
いくつだとおもいますか? 90
もっと大きいです
いくつだとおもいますか? 91
あたりです!
Ok
----
-[1時間, +19行] ここまでできるようになったら、もうやるし...
-19行の追加でここまでできるのだから、まあ悪くはないかな、...
Ok
openwin win,256,256; // まずこれでウィンドウを開いておく.
Ok
list
1 C=0
2 FOR Y=0,255
3 FOR X=0,255
4 SETPIX WIN,X,Y,C
5 C=C+256
6 NEXT
7 NEXT
8 FLUSHWIN WIN
Ok
run
-こうすると、こんな感じの絵が出ます(ウィンドウタイトルは...
--http://osecpu.osask.jp/download/app0006a.png
----
-[1時間, +27行] さらに頑張って、gosub作りました。push/pop...
-ローカル変数がないので、すごく苦し紛れですが、しかし一応...
-これは再帰でフィボナッチ数を計算しているプログラムです。
1 INITSTACK 1000; I=34; GOSUB 2; PRINT R; GOTO 10
2 // fibo: input i, output r.
3 R=I
4 IF I >= 2 THEN
5 I=I-2; GOSUB 2; PUSH R
6 I=I+1; GOSUB 2; POP T; R=T+R
7 I=I+1
8 FI
9 RETURN
10 //
-実行時間を測定したところ、C言語で書いた場合のちょうど2倍...
* こめんと欄
#comment
ページ名: