問題: 「大きな整数は (小さな) 整数のリストとして表されます。」
次があるとします。
type reg = string;; (* "$0" models register set to constant 0 *)
type label = string;; (* empty string models no label *)
type asmistr =
AsmHalt
| AsmNop
| AsmAdd of reg * reg * reg
| AsmAddi of reg * int * reg
| AsmSub of reg * reg * reg
| AsmMul of reg * reg * reg
| AsmLoad of reg * reg * reg
| AsmStore of reg * reg * reg
| AsmJmp of label
| AsmBne of reg * reg * label
| AsmBeq of reg * reg * label
| AsmSlt of reg * reg * reg
;;
type asmprog = AsmProg of (label * asmistr) list;;
type asmline =
AsmIstr of label * asmistr
| AsmComment of string
| AsmDebugReg of reg
| AsmDebugMem of int * int
;;
この一連の定義は、レジスタ、命令、およびラベル (ジャンプで使用) を使用して、アセンブリのような言語を定義するために使用されます。
次に、命令型言語 (「while」「if」などの命令を含む) から ASM へのコンパイラを実装する必要があります。
私の先生が提案した実装は、11000 が [1, 1, 0, 0, 0] のように、各要素が指定された数字の数字 (数字は整数のみ) であるリストを使用することです。
最初のギャップは次のとおりです: 一般的な O'Caml プログラムを考慮して、これをどのように実装できますか? 大きな整数を挿入する必要があるとします。「計算」を許可するために使用できるロジックは何ですか? 最後に、ASM プログラムは add、sub mul、およびその他の大きな整数を含む可能性のある命令も実行できるため、レジスタ、大きな整数、および命令でこれを処理する方法がわかりません。
私が必要としているのは、おそらく O'Caml 言語で大きな整数を実装する方法と、アセンブリに似た言語 (この場合は ASM) を考慮してこれを実現する方法の一般的なスキームです。
事前に感謝します。明確でない場合は、私の英語で申し訳ありません。誰かが私を助けることができれば、必要に応じて詳細を追加します