Scratch 3.0 自分専用機 を作ろう!! (15) ScratchVM の Opcode

By kyorohiro (河村潔広)

Scratch VM を実行した時、その中で何が起きているのでしょうか。
見て行きましょう。





https://wiki.scratch.mit.edu/wiki/VM_Preferences
https://wiki.scratch.mit.edu/wiki/Scratch_2.0
https://wiki.scratch.mit.edu/wiki/Scratch_3.0



VMってなんだろう?
VMは、Virtual Machine の 略です。
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0


何らかの、機会を模倣して動作するソフトウェアのことです。
例えば、VirtualBox という x86仮想化 VM があります。 このソフトウエアを利用すると、自分のPCに、別の
OSを動作させることとかできます。

Java言語なども、 Java仮想マシン を持ちます。
Javaのバイトコードを、実行するスタック型のソフトで、Javaで書かれたプログラムを
動かすことができます

Scratch VM は、Javaのように、Scratchで書かれたコードを理解して
実行してくれるソフトウエアのことです。


プログラム言語のVMの共通点


OPCODE / ByteCode なるものが存在する。
これは、VMの一個の命令で、非常に単純なことしかしません。

プログラム言語は、「人間の言語に近い記述」を「OPCODE」に変換したあとで、
それを実行します。


 

Scratch のコードを追ってみよう

Scratch は、どんな、OPCODE を持つのだろうか? どんな感じに動作するのだろうか?
探ってみましょう!!

前回のコードをみると、ScratchVM->start() から、始まるのでした。
コードを追って見ましょう!!

ScratchVM->start ()
ScratchRuntime->start ()
this._steppingInterval = setInterval(() => { this._step(); }, interval);

https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js



と、なっていました。
つまり、Scratch VM は、  ScratchRuntime->_step(); を、短い感覚で何度も呼ぶ作りのようです。

_step () {
...
this.monitorBlocks.runAllMonitored(this);
...
this.sequencer.stepThreads();
...
this.renderer.draw();

}

this.sequencer.stepThreads();では、
ScratchExecute->execute()
ScratchExecute->thread.goToNextBlock();


https://github.com/LLK/scratch-vm/blob/develop/src/engine/execute.js


と、なっており、ScratchExecute を、順次実行しながら、
描画していることが、解ります。



ScratchExecute

ScratchExecute->execute()の中では、ブロックを、順次取り出して、

let block = blockContainer.getBlock(currentBlockId);
const opcode = blockContainer.getOpcode(block); const fields = blockContainer.getFields(block); const inputs = blockContainer.getInputs(block); const blockFunction = runtime.getOpcodeFunction(opcode); const isHat = runtime.getIsHat(opcode);


順次、実行していきます。
primitiveReportedValue = blockFunction(argValues, blockUtility);

https://github.com/LLK/scratch-vm/tree/develop/src/blocks
のコードが実行されるわけです。

また、この、blocks のことを、Scratchでは、OPCODEをして扱っているようです。

Scratch のOpcodeは、Blockの種類から類推できる


scratch-blocks で、 GUIのBlockを、 json 形式などにに変換
scratch-vm ないで、 json を、木構造に変換
そして、 Spriteを上下左右に移動するとか、 if文を動かすとか、ループ処理をすると行った、
OPCODE として、実行されると...


ScartchVM が  解釈するOPCODE については、ScratchのGUIで操作している内容と、ほとんど同じです。直ぐに理解できると思います。
https://github.com/LLK/scratch-vm/tree/develop/src/blocks



















Comments