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で書かれたコードを理解して
実行してくれるソフトウエアのことです。
OPCODE / ByteCode なるものが存在する。
これは、VMの一個の命令で、非常に単純なことしかしません。
プログラム言語は、「人間の言語に近い記述」を「OPCODE」に変換したあとで、
それを実行します。
探ってみましょう!!
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 を、順次実行しながら、
描画していることが、解ります。
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-blocks で、 GUIのBlockを、 json 形式などにに変換
scratch-vm ないで、 json を、木構造に変換
そして、 Spriteを上下左右に移動するとか、 if文を動かすとか、ループ処理をすると行った、
OPCODE として、実行されると...
ScartchVM が 解釈するOPCODE については、ScratchのGUIで操作している内容と、ほとんど同じです。直ぐに理解できると思います。
https://github.com/LLK/scratch-vm/tree/develop/src/blocks
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
millions of thx
ReplyDelete