Opcode
from バイトコード
operation code、「オペコード」と読む
機械語の命令の種類を表すもの
実行する操作 の種類を指定する
数式で言えば演算子部分に相当する
数式で言う値の部分に相当するものがOperand
1byteのバイトコード
「PUSH」とか「POP」とかは
1byte幅のopcodeに名前をつけたもの
これらの「名前」のことを「ニーモニック」と呼ぶ
実際の(バイナリ形式の)バイトコードにはニーモニックは直接表示されない
これらの名前が参照するopcodeに置き換えられている
これらはただの数値
たとえばPUSHに相当するのが40、POPに相当するのが23、といった具合
命令はoperandを持つものもあれば持たないものもある
例えば
スタックマシンに値を一つ追加する命令「PUSH」は、PUSH 5のように、「何」をスタックマシンに追加するかを指定するために一つのoperandを取る
一方で「POP」の場合は、スタックマシンの一番上から値を一つ取るという指定なので、スタックマシンが一つしか存在しないと仮定するなら、operandは不要であることがわかる
命令の種類の例
算術命令
データコピー
論理演算
プログラム制御
など
x86-64の命令とか見るとイメージしやすい
CPythonのOpcodeの定義
https://github.com/python/cpython/blob/master/Include/opcode.h
1byte単位
↑ここで定義されている
現在163個まである
docs
RubyのOpcodeの定義
https://github.com/ruby/ruby/blob/master/regint.h
YARVが解釈するやつだろうか