これらのインタープリターは、ツリー ウォーカー インタープリター (解析ツリーをトラバースするだけ) またはバイトコード インタープリターとして実行されていましたか?
決勝に向けて様々なBASICを見てきた。
TinyBASIC は、道路番号を 8 ビット値に変換して、道路が既に存在するかどうかを調べる程度に道路を解析しました。 もしそうなら、それは壮大な施設内に置かれ、その後、通常のテキストのドロール効果を変えずに、道路の余暇をそれの助けに保ちました. 行は改行で区切られていましたが、これは素晴らしいことです。 金額 1 シーケンス の 11 ページにあるストレージ プロット のダイアログを教えてもらいたいと思うかもしれません。 )
Tiny BASICの目標は、想像できる限り小さくすることです。 この能力を持つマシンは通常、最高級の 4k RAM を搭載して出荷されました。これは、インタープリターとユーザーのプログラムの両方に適合する必要がありました。 このように、道路番号の 1 バイトが一度に変更されたため、残りのスペースが 1 回に変更されたため、厳密な制限はなくなりました.
したがって、インタプリタが変更する必要があるこの工夫-plod-time のある段階ですべての行を解析します。 このための簡単な再帰的降下マシンは時代遅れです。 道路を解析すると、結果のトークンをミドルマン言語内の要約構文ツリーに変換した後、IL インタープリターの工夫によって結果の AST を実行しました。
言語の他のバージョン、特にPalo Alto TB は、最終ステップをアセンブリで延長せずに AST を実行するものに変更しました。 これにより、通常は道路を解析するのと同じオーバーヘッドが発生しましたが、評価プロットがより迅速に行われました.
セミトークン化 – MS
UPDATE: CBの信頼できる説明に気付いたので、いくつか編集しました.
続きは、Commodore BASIC に代表される (他に方法がない場合は数値で) MS シーケンスです。 道路番号をASCIIからバイナリに変換できる可能性があるという点でTBのように始まりましたが、この場合は16ビット値が古くなっています。 次に道路をスキャンし続け、
やなどのキー フレーズを変換します。 FORを 1 バイトのトークンに変換します。 それ以外の合計ロット、変数名、数値、および文字列は、コード内にそのまま残されています。 特定のバイトが 1 回のトークン対データに変化したことをカモフラージュするために、彼らは上位ビットの位置を特定します。その目的のために、ベクター テーブルをパーサーに組み込むことにより、上位ビットが飛躍的に導入されました。 例として、FOR
コードは、次のデータの読み取りを開始して I=1 から 10. これが一度パフォーマンス重視に変更されたという伝説では、このコードは一度 6502 内のゼロ ページ内に配置され、他の CPU で同じ領域を決定します。転送する必要がある変数は、テーブルでそれを見つめます。 そのテーブルには 2 バイトの名前がありました。これが、変数が 2 文字の長さであった理由です (さらに多くの文字を形成する可能性はありますが、何もしませんでした)。 同様に、数値は ASCII 構造であったため、評価スタックに配置するために、40 ビットの内部構造に根本的に変更する必要がありました。遅かれ早かれ、Atari BASIC に工夫します。 AB はすべてをトークン化しましたが、もはやステートメントは壮大ではありません。 したがって、
FOR I=1 TO 10の場合、FORとTOをトークンにしますが、さらに1と10 は、ASCII から 40 ビットの内部構造体 staunch に変換されます。 同様に、I 変数はホームの場所が離れており、テーブル内のインデックスがそのトークンに変化するように成長しました。これをカモフラージュするための上位ビットの位置。10 PRINT "HELLO WORLD"したがって、AB では、次のような簡単な行です。
は、
0A 0F 00 20 0F 0B HELLO WORLD 130F は文字列リテラルが 0B の長さに続くことを意味し、13 は EOL です。 ここは記憶で走っているので、いつでも
デレあたり.
実行時に、根本的に変更したり見上げたりするものは何もない可能性があります。 変数はその値を指すインデックスであるため、その値をスタックに配置するのは 1 つの操作ではなく、1 と 10 は既に変換されているため、それらをスタックに見事に再現できます。 アイデアとしては、これが 素晴らしい )MSまたはTBのどちらよりも早く、これはBASIC09のような一部のBASICの場合に一度確かに変わり、このプロットは時代遅れになりました. 反対に、AB は、これまでで最も遅い BASIC の 1 つとなった領域で、実際には友好的でないコードをいくつか使用して、なんとかこれを窓から放り出しました。
長所と短所: ほとんどの目的は小さいです。ということで、全体の行番号は共通で3文字のようです。 AB では、これらのバッグは 40 ビットに拡張されましたが、MS では 3 バイトのままです。 そのため、場合によっては、AB は同一のプログラムにより多くのスペースを費やすことになります。 反対に、巨大な数値はより小さくなり、1.23456E-17 は AB で 88 ビットから 40 ビットになります。 他のものも同じように素晴らしいので、私は非常に魅力的です。 単純に少数ルールのおかげでMSはコモンの方が小さいのではないかと思います
ラント 余分な作業として、小さい数値の 2 番目の数値固定形式をハングアップすることができます。1 バイトを使用して 2 つの BDC 桁を格納します。 トークン化全体を通して、必要に応じて長いトークンに代わる小さくて最高の代替物であると仮定して開始するか、今はそうではありません。 それは、正確な目的で実現されるすべての数値の 75% のような 1 つのものをエンコードし、1 桁の数値の場合の最も細かい 1 バイト (トークン ヘッダー) の数値を展開します
さまざまな戦略があり、それらのすべてが本番システムでは時代遅れになっていることに気付く可能性があります.