[過去ログ] (強いAI)技.術的特.異点/シ.ンギュラリティ158 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
63
(1): yamaguti 2019/05/14(火)13:46 ID:2vGaUUWM(50/82) AAS
2chスレ:future Yuugou <-> TagguTiimu
64: yamaguti 2019/05/14(火)13:47 ID:2vGaUUWM(51/82) AAS
4. Subleq用Cコンパイラ

? ry するコンパイラ ry 。
、簡単なCコードをSubleq [11]にコンパイルする自前コンパイラのいくつかの要素について簡単に説明
? ry テストの1つで、コンパイル ry 。
ラは私たちのテストの 1 つで用い、同じ C ソースからコンパイルされたネイティブ C コードと Subleq コードとの実行の間で直接比較が可能
? The compiler is a high-level language interface to OISC ?
? ry コンパイラ ry インタフェースですか? 私たちに知られている唯一のこのようなコンパイラは、執筆の時点で。
そのコンパイラはOISCの高水準言語インタフェースです - その様なコンパイラとして執筆時点で私たちに知られている唯一の。

4.1 スタック

? ry 主要なCプログラミング言語の概念は、 ry 。
省7
65: yamaguti 2019/05/14(火)13:48 ID:2vGaUUWM(52/82) AAS
  void f()
  {
    ...
  }

  void main()
  {
    ...
  }

  f();
     ...
省13
66: yamaguti 2019/05/14(火)13:49 ID:2vGaUUWM(53/82) AAS
AA省
67
(3): yamaguti 2019/05/14(火)13:49 ID:2vGaUUWM(54/82) AAS
  dec sp
  A; sp A
  B; sp B
  A:0 B:0
  C; sp C
  D C:0 _f
  . D:?
  inc sp

? ry クリアすることです。これは、前回の使用時に残っていた値があるためです。
4行目の命令は、スタック内のセルをクリアする為で、前回の使用時に値を残した事に因ります
省19
68
(2): yamaguti 2019/05/14(火)13:51 ID:2vGaUUWM(55/82) AAS
?9?

Page 10

? ry 、ラベル_fにジャンプします。
スタックに書き込まれた負の値は、ラベル _f へのジャンプを強制します。 >>67

関数fの内部では、スタックポインタを変更することができますが、関数が終了する前にそれを復元すると仮定 。
したがって、リターンコードはスタックから抽出されたアドレスにジャンプしなければなりません:

  A; sp A
  B; A:0 B
  Z Z B:0
省6
69: yamaguti 2019/05/14(火)13:52 ID:2vGaUUWM(56/82) AAS
2chスレ:future Hoken
70: yamaguti 2019/05/14(火)13:52 ID:2vGaUUWM(57/82) AAS
AA省
71
(1): yamaguti 2019/05/14(火)13:53 ID:2vGaUUWM(58/82) AAS
  a + ( b - c )

? ノード ry 変数a、およびノー??ド「 - 」と変数bおよびcからなるサブツリーからなる。
は、 ノード「+」、変数 a、および、ノード「 - 」と変数 b および c とからなるサブツリー、からなる。



  a

+
    b
   -
    c
省10
72: yamaguti 2019/05/14(火)13:55 ID:2vGaUUWM(59/82) AAS
最初の行は値bを一時的なtにコピーします。 >>71
2行目は、一時的な値から値cを減算
? ry 、コンパイラはサブツリーで終了します。
この時点で、サブツリーを携えてコンパイラは終了 。
その結果は、生成されたコードと、計算されたサブツリーの値を保持する一時変数t 。
今度はコンパイラが追加用のコードを生成 。
? その引数は変数aと一時tです。
その今度の引数は変数 a とテンポラリ t
? 3行目にaを追加します。
a を t に 3 行目で加算 。
省15
73: yamaguti 2019/05/14(火)13:55 ID:2vGaUUWM(60/82) AAS
2chスレ:future YowaiAI Kiken ## KoutuuJiko
外部リンク:google.jp
74
(1): yamaguti 2019/05/14(火)13:56 ID:2vGaUUWM(61/82) AAS
AA省
75
(1): yamaguti 2019/05/14(火)13:58 ID:2vGaUUWM(62/82) AAS
AA省
76
(1): yamaguti 2019/05/14(火)13:58 ID:2vGaUUWM(63/82) AAS
AA省
77: yamaguti 2019/05/14(火)13:59 ID:2vGaUUWM(64/82) AAS
? ry 扱っていません。
上のコードは戻り値も間接呼び出しもまだ扱っていません。 >>76
戻り値は特別な変数(レジスタ)に格納できます
? ry サブ式でする場合は、戻り値をすぐに一時的に値にコピー ry 。
プログラムがサブ式の戻り値を使用するならば、戻り値を return 後すぐにテンポラリにコピー 要
? ry アドレスを一時的に保持する参照解除によって ry 。
間接呼び出しは、関数のアドレスを保持しているテンポラリを間接参照する事によって実現できます。
それは簡単ですが、より複雑なコード

スタックポインタは、関数がスタック(ローカル)変数を要求するときに関数内で変更できます。
ローカル変数にアクセスするには、通常、ベースポインタbpが使用されま
省8
78
(1): yamaguti 2019/05/14(火)14:00 ID:2vGaUUWM(65/82) AAS
  1. # push bp     1.#プッシュbp
  2. # sp -> bp
  3. # sp -= stack_size
  # ... function body  #...関数本体
  5. # bp -> sp
  6. # pop bp
  7. # return     ? 7.#返品

またはSubleqコードで。

  dec sp; ?+11; sp ?+7; ?+6; sp ?+2; 0
  ?+6; sp ?+2; bp 0
省6
79
(2): yamaguti 2019/05/14(火)14:01 ID:2vGaUUWM(66/82) AAS
? ry 、解析中の関数 ry 。
stack_sizeは定数で、パーシングに伴って関数ごとに計算されます >>78
? bp ry 不十分であることが判明しました。
要するに bpを保存するだけでは不十分 。
関数呼び出しは、式の中で起こることがあります
? ry 、表現の一時的なものを保存 ry 。
そのような場合には、式の全てのテンポラリを保存しなければならない
? 新しい機能は、 ry 同じ一時メモリセルを ry 。
新しい関数は、それ自身の必要性のために同じテンポラリメモリセルを使用することになります。
式f()+ g()に対して、呼び出しの結果は変数t1とt2に格納
省11
80: yamaguti 2019/05/14(火)14:02 ID:2vGaUUWM(67/82) AAS
AA省
81: yamaguti 2019/05/14(火)14:03 ID:2vGaUUWM(68/82) AAS
?13?

Page 14

コードのどこかに他の関数の呼び出しがある場合、他の関数が実行時にそれらを保存して復元するため、一時変数t1とt2は計算値を保持
? ry すべての一時的なデータはスタック ry されるので、使用された一時的なデータの数を減らすために支出されます。
関数内で使用された全てのテンポラリがスタックにプッシュされる事を以て、使用されるテンポラリの数を減らす為の支払となります。
? これは、使用された一時的なものを、使用された一時的なもののプールに解放することによって、これを行うことができます。
これは、使用されたテンポラリを、使用テンポラリのプールに逃がすだけで可能
? ry 、新しい一時的なものが要求 ry 新しい一時的なものが割り当てられます。
その後、新しいテンポラリが要求されると、プールが最初にチェックされ、そのプールが空の場合にのみ新しいテンポラリがアロケート

? 表現
省1
82
(1): yamaguti 2019/05/14(火)14:04 ID:2vGaUUWM(69/82) AAS
  1+k[1]

? コンパイルする
は以下の通りにコンパイルされる

  t1; t2; _k t1; dec t1; t1 t2
  t3; t4; ?+11; t2 Z; Z ?+4; Z; 0 t3; t3 t4;
  t5; t6; dec t5; t4 t5; t5 t6
  # result in t6  ? #t6の結果  # 結果は t6 の中

? ry 時間軸のプール ry 、時間軸の数 ry 半分になります。
テンポラリのプールが導入されると、テンポラリの数は半分になり :

  t1; t2; _k t1; dec t1; t1 t2
省10
1-
あと 920 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.019s