コンピューターの小さな男

チューリングマシンとポストマシンを知っています。 これらは、アルゴリズムの理論のために数学者によって発明された抽象的なコンピューターです。 小さな男のコンピューターLittle man computer )-コンピューターの配置と動作を教えるために設計されたコンピューターモデル。 このモデルは、1965年にスチュアートマドニック教授によって提案され、プログラミングとコンピューターデザインの両方で小学生に教えることに成功しています。





コンピューターを小さな郵便局として見てみましょう。



部門には、外部と通信するための2つのウィンドウがあります。それらは、INPウィンドウに入り、番号が0から999までの番号になります。 3桁の番号のリーフレットを作成し、これらのリーフレットを新しいものに置き換えることもできます。 彼はまた、3桁の数字を加算および減算できる単純な電卓(バッテリー)を持っています。 計算機で数値を処理するとき、0以上で0より大きい数値のフラグが自動的に立てられます。



コンピューターオペレーターは、プログラムをリーフレットに書き込み、それらをメールボックスに配置してから、コマンドカウンター(PC)を0に設定し、[開始]ボタンをクリックします。 郵便局の中では、小さな男がメールボックスに番号が入ったリーフレットを処理しています。 処理サイクルをステップで説明します。



  1. コマンドカウンターから番号を選択します。 この番号はメールボックス番号です。
  2. 手順1で番号を取得したメールボックスの番号を覚えておいてください。
  3. コマンドカウンターを1増やします。
  4. コマンドを解析します(手順2で取得した数)。
  5. 必要に応じて、メールボックスからデータを取得します。
  6. コマンド自体を実行します。
  7. 必要に応じて、データをメールボックスに保存します。
  8. ステップ1に戻るか、コマンドが0の場合は停止します。


コマンドは3桁の10進数であり、数百の数がコマンドのタイプを決定し、数十と単位の数はメールボックスの数を示します。

チームコード チームの種類 アクション
1xx 追加 xxボックスの数字をバッテリーに追加します。 フラグZEROまたはPOSITIVE NUMBERを上げます。 結果が999を超える場合、ジョブをエラーで終了します。
2xx SUB バッテリーのxxボックスから数値を引きます。 フラグZEROまたはPOSITIVE NUMBERを上げます。 結果が0未満の場合、バッテリーは変更されず、フラグは省略されます。
3xx STA ボックスxxにバッテリーの内容を保存します。
5xx LDA xxボックスからバッテリーに番号をロードします。 フラグZEROまたはPOSITIVE NUMBERを上げます。
6xx ブラジャー コマンドカウンタをxxに設定します。
7xx BRZ フラグがゼロの場合、コマンドカウンターをxxに設定します。
8xx BRP フラグがZEROまたはPOSITIVE NUMBERの場合、コマンドカウンターをxxに設定します。
901 Inp INPウィンドウから番号を選択し、バッテリーに書き込みます。 フラグZEROまたはPOSITIVE NUMBERを上げます。 数値が0〜999の範囲に収まらない場合、エラーでジョブを終了します。
902 アウト バッテリーの番号を紙に書き、OUTウィンドウに入れます。
000 Hlt 作業を終了します。


そのため、小さなコマンドセットを備えたフォンノイマンアーキテクチャのコンピューターについて説明しました。 モデルはコマンドのバイナリエンコーディングを使用しないため、このコンピューターのプログラムを簡単に作成できます。コンピューターデバイスをホワイトボードに描画し、プログラムを紙の上で実行できます。 20世紀の60年代には、多くの学生がこの方法でプログラムを実行したと思いますが、AWKで行ったようなコンピューター用のエミュレーターを作成できるようになりました。



エミュレータのソースコードとサンプルプログラム: GitHub



エミュレータは次のコマンドで起動します:

  awk -f lmc.awk 


エミュレータコマンド:

 LOAD ### [### ...]-プログラムをコードでロードします
 DUMP-メモリーの内容を表示 
 RUN-プログラムを実行する
 ASM <ファイル名>-アセンブラーでプログラムをコンパイルしてロード


いくつかの短いプログラム:

 LOAD 901 902 000-INPからOUTに番号をコピーし、停止します
 LOAD 901 104 902 000 1-INPからの数値に1を加算、OUTに書き込み、停止
 LOAD 901 902 704 600 000-INPからOUTに番号をコピーし、0の印刷後に動作を停止します


プログラムを開始する例:
負荷901902 0
ダンプ
 00:901 902 0 0 0 0 0 0 0 0 0
 10:0 0 0 0 0 0 0 0 0 0 0 0
 20:0 0 0 0 0 0 0 0 0 0 0 0
 30:0 0 0 0 0 0 0 0 0 0 0 0
 40:0 0 0 0 0 0 0 0 0 0 0 0
 50:0 0 0 0 0 0 0 0 0 0 0 0
 60:0 0 0 0 0 0 0 0 0 0 0 0
 70:0 0 0 0 0 0 0 0 0 0 0 0
 80:0 0 0 0 0 0 0 0 0 0 0 0
 90:0 0 0 0 0 0 0 0 0 0 0 0
走る
 INP:100
 OUT:100




同じ長さとシンプルなコマンド形式により、このコンピューターのアセンブラーをすばやく作成できます。 その後、アドレスを手動で計算せずに長いプログラムを作成できます。

フィボナッチ数:
awk -f lmc.awk asm fib.lma 00: #Print fibonacci numbers 00: LDA ONE #Load init values 01: STA FIB1 #First number 02: STA FIB2 #Second number 03: OUT #Print first 04: OUT #Print second 05: LOOP LDA MAX #ACC=MAX 06: SUB FIB1 #ACC=ACC-FIB1 07: SUB FIB2 #ACC=ACC-FIB2 08: BRP CONT #ACC positive ? Continue 09: BRA END #Negative : goto end of program 10: CONT LDA FIB1 #ACC=FIB1 11: ADD FIB2 #ACC=ACC+FIB2 12: STA FIBN #Store FIBN - next number 13: OUT #Print it 14: LDA FIB2 #FIB1=FIB2 15: STA FIB1 16: LDA FIBN #FIB2=FIBN 17: STA FIB2 18: BRA LOOP #Next LOOP 19: END HLT 20: ONE DAT 1 #Init value 21: FIB1 DAT #First fib number 22: FIB2 DAT #Second fib number 23: FIBN DAT #Next fib number 24: MAX DAT 999 #Max computer number Labels: LOOP 05 MAX 24 FIB1 21 FIB2 22 FIBN 23 ONE 20 END 19 CONT 10 Xrefs: LOOP 18 MAX 5 FIB1 1 6 10 15 FIB2 2 7 11 14 17 FIBN 12 16 ONE 0 END 9 CONT 8 LOAD 520 321 322 902 902 524 221 222 810 619 521 122 323 902 522 321 523 322 605 0 1 0 0 0 999
      
      








All Articles