デガーベージを見る
2026.02.22
いまさらBASICなんて、と思いますが、Pythonは忘れてもMSX-BASICは身に染み込んでいるのか、いまでも覚えています。ちょっとしたテストにはピッタリです。
たいていの事はわかったような気分でしたが、未だに知らない事があります。動作を早くするための工夫は、たとえば整数型変数を使うとか色々ありますが、手っ取り早くマシン語に逃げてしまった感じがします。
BASICインタプリタ特有の現象で、知らないこともあるものです。デガーベージもそのひとつです。
ガーベッジ・コレクションという言葉のほうが知られているかも。言いたいことは同じです。
古くて新しい問題のようで、いまどきの言語でもガーベッジ・コレクションは有ります。
このプログラムで、デガーベージを体験できます。(de-garbage、ごみ捨て)
10 '
15 DEFINT A-Z:CLEAR 10000:DIM A$(200)
16 TIME=0
20 FOR I=1 TO 200
25 A$(I)=STR$(I)+"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890#$%&()"
30 NEXT
35 T0=TIME
40 FOR I=1 TO 200
45 A$=A$(I):PRINT A$:NEXT
50 PRINT T0:PRINT TIME:END
実行すると、途中で引っ掛かり、また動いてひっかかります。
何が起きているのか。
(※引用)
文字列の連結や書き換えを行うと、書き換える前の文字列はそのままにしておいて、新しい文字列を別のメモリ・エリアに次々に書いていきます。こうして使えるメモリ・エリアが一杯になると、前に使った領域を整理して古い文字列を消し、その後にまた書いていきます。この作業を文字列のデガーベージと呼びます。
CLEAR 10000で確保した領域がいっぱいになったのをBASICインタプリタが整理する間、プログラムが止まってしまいます。
たとえば、リアルタイムで動作するプログラムでこんな現象が発生したら困りますという話。
もしCLEAR 20000にしたら引っかかることなく短時間で終わります。
解決方法が書かれていて、
(1)文字列の書き換えをできるだけ少なくする。
(2)強制的にデガーベージをさせる。たとえば待ち時間の間にPRINT FRE(A$) これはBASICの方言によって異なる。
それでも手に負えない場合の解決方法も述べられていましたが割愛します。
もしBASICでテキストエディタを自作したら、こんな問題が起きそうです。でも実際にはBASICではなくマシン語などで作り、領域は自分で管理しますね。
そういえばテキストエディタを当時(高校生の頃)作ろうとして、この本を見ていたような気がします。
文字や行を追加したら、その後の領域を後ろにずらしますね。画面に例えればスクロールです。文字を削除したら、今度はその文字の後ろの領域を前に詰める。
テキストエディタは結局自分で作ることなく、MSX-DOS2関連でKIDとかAKIDを使っていました。
※「super BASIC」(岡村迪夫著)(CQ出版社)P.114~115より。
たいていの事はわかったような気分でしたが、未だに知らない事があります。動作を早くするための工夫は、たとえば整数型変数を使うとか色々ありますが、手っ取り早くマシン語に逃げてしまった感じがします。
BASICインタプリタ特有の現象で、知らないこともあるものです。デガーベージもそのひとつです。
ガーベッジ・コレクションという言葉のほうが知られているかも。言いたいことは同じです。
古くて新しい問題のようで、いまどきの言語でもガーベッジ・コレクションは有ります。
このプログラムで、デガーベージを体験できます。(de-garbage、ごみ捨て)
10 '
15 DEFINT A-Z:CLEAR 10000:DIM A$(200)
16 TIME=0
20 FOR I=1 TO 200
25 A$(I)=STR$(I)+"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890#$%&()"
30 NEXT
35 T0=TIME
40 FOR I=1 TO 200
45 A$=A$(I):PRINT A$:NEXT
50 PRINT T0:PRINT TIME:END
実行すると、途中で引っ掛かり、また動いてひっかかります。
何が起きているのか。
(※引用)
文字列の連結や書き換えを行うと、書き換える前の文字列はそのままにしておいて、新しい文字列を別のメモリ・エリアに次々に書いていきます。こうして使えるメモリ・エリアが一杯になると、前に使った領域を整理して古い文字列を消し、その後にまた書いていきます。この作業を文字列のデガーベージと呼びます。
CLEAR 10000で確保した領域がいっぱいになったのをBASICインタプリタが整理する間、プログラムが止まってしまいます。
たとえば、リアルタイムで動作するプログラムでこんな現象が発生したら困りますという話。
もしCLEAR 20000にしたら引っかかることなく短時間で終わります。
解決方法が書かれていて、
(1)文字列の書き換えをできるだけ少なくする。
(2)強制的にデガーベージをさせる。たとえば待ち時間の間にPRINT FRE(A$) これはBASICの方言によって異なる。
それでも手に負えない場合の解決方法も述べられていましたが割愛します。
もしBASICでテキストエディタを自作したら、こんな問題が起きそうです。でも実際にはBASICではなくマシン語などで作り、領域は自分で管理しますね。
そういえばテキストエディタを当時(高校生の頃)作ろうとして、この本を見ていたような気がします。
文字や行を追加したら、その後の領域を後ろにずらしますね。画面に例えればスクロールです。文字を削除したら、今度はその文字の後ろの領域を前に詰める。
テキストエディタは結局自分で作ることなく、MSX-DOS2関連でKIDとかAKIDを使っていました。
※「super BASIC」(岡村迪夫著)(CQ出版社)P.114~115より。
トラックバックURL
トラックバック一覧
コメント一覧
コメント投稿
2026.02.22 13:23
|
