comparison Slide/slide.html @ 93:c3b973a23fee

update
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 11 Jan 2019 10:41:24 +0900
parents 3beea12854b0
children 4f0eaa330295
comparison
equal deleted inserted replaced
92:2387a5edfd58 93:c3b973a23fee
187 <h2 id="moarvm">MoarVM</h2> 187 <h2 id="moarvm">MoarVM</h2>
188 188
189 <ul> 189 <ul>
190 <li>Perl6専用のVMであり, Cで記述されている</li> 190 <li>Perl6専用のVMであり, Cで記述されている</li>
191 <li>レジスタマシンとして実装されている.</li> 191 <li>レジスタマシンとして実装されている.</li>
192 <li>MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する</li> 192 <li>
193 </ul> 193 MoarVMはバイトコードインタプリタを <code>src/core/interp.c</code> で定義しており, この中の関数 <code>MVM_interp_run</code> でバイトコードに応じた処理を実行する
194 194 </li>
195 195 <li>マクロDISPATCHで, ラベルgotoかcase文に, バイトコードに対応した処理を行う
196 196 <ul>
197 </div> 197 <li>この中の <code>OP</code> で宣言されたブロックがそれぞれバイトコードに対応する処理となっている.</li>
198 198 </ul>
199 <div class='slide'> 199 </li>
200 <!-- _S9SLIDE_ -->
201 <h2 id="mvm_interp_run">MVM_interp_run</h2>
202
203 <ul>
204 <li>DISPATCHマクロは次の様に記述されており, この中の <code>OP</code> で宣言されたブロックがそれぞれオペコードに対応する処理となっている.</li>
205 <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li> 200 <li>この中では <code>GET_REG</code> などのマクロを用いてMoarVMのレジスタにアクセスする.</li>
206 <li><code>cur_op</code>は次のオペコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のオペコードに遷移する.</li> 201 <li><code>cur_op</code>は次のバイトコード列が登録されており, マクロ <code>NEXT</code> で決められた方法で次のバイトコードに対応した処理に遷移する.</li>
207 </ul> 202 </ul>
208 203
209 <pre><code>DISPATCH(NEXT_OP) { 204 <pre><code>DISPATCH(NEXT_OP) {
210 OP(const_i64): 205 OP(const_i64):
211 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); 206 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
222 <div class='slide'> 217 <div class='slide'>
223 <!-- _S9SLIDE_ --> 218 <!-- _S9SLIDE_ -->
224 <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> 219 <h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2>
225 220
226 <ul> 221 <ul>
222 <li>
223 マクロDISPATCHでは
224 </li>
227 <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li> 225 <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li>
228 <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li> 226 <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li>
229 </ul> 227 </ul>
230 228
231 <pre><code> OP(const_i64): 229 <pre><code> OP(const_i64):
232 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); 230 GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2);
233 cur_op += 10; 231 cur_op += 10;
234 </code></pre> 232 </code></pre>
235 233
236 <ul> 234 <ul>
237 <li>これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> 235 <li><code>GET_REG</code>はバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li>
238 <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している</li> 236 <li><code>GET_REG</code>は次の様に展開される</li>
239 </ul> 237 </ul>
240 238
241 <pre><code> (i-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2); 239 <pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2);
242 i-&gt;cur_op += 10; 240
243 goto cbc_next(i); 241 </code></pre>
244 </code></pre> 242
245 243 <ul>
246 244 <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, MVM_interp_runではローカル変数として利用している</li>
247 245 </ul>
248 </div> 246
249 247
250 <div class='slide'> 248
251 <!-- _S9SLIDE_ --> 249 </div>
252 <h2 id="mvm_interp_run-1">MVM_interp_run</h2> 250
253 251 <div class='slide'>
254 <ul> 252 <!-- _S9SLIDE_ -->
255 <li>MVM_interp_runでは次のオペコードをフェッチする際に <code>NEXT_OP</code> マクロを介して計算を行う.</li> 253 <h2 id="mvm_interp_runで使用されているマクロ-1">MVM_interp_runで使用されているマクロ</h2>
256 <li>オペコードが対応する命令を実行する際は, <code>MVM_CGOTO</code> フラグが立っている場合はCのラベルgotoを利用し, 使えない場合はswitch文を利用して遷移する.</li> 254
255 <ul>
256 <li>次のバイトコード命令に遷移するマクロ <code>NEXT</code> は, ラベルgotoが使用可能な場合次の様に記述されている</li>
257 <li><code>NEXT</code>自体はラベルテーブルにアクセスし, ラベルを取り出す</li>
258 <li>次のバイトコードを取り出すのは, <code>NEXT_OP</code> というマクロが担っている</li>
257 </ul> 259 </ul>
258 260
259 <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) 261 <pre><code>#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
260
261 #if MVM_CGOTO
262 #define DISPATCH(op)
263 #define OP(name) OP_ ## name
264 #define NEXT *LABELS[NEXT_OP] 262 #define NEXT *LABELS[NEXT_OP]
265 #else 263
266 #define DISPATCH(op) switch (op) 264 </code></pre>
267 #define OP(name) case MVM_OP_ ## name 265 <ul>
268 #define NEXT runloop 266 <li>マクロ <code>NEXT</code> は次の様に展開される</li>
269 #endif 267 </ul>
270 </code></pre> 268
271 269 <pre><code>goto *LABELS[(op = *(MVMuint16 *)(cur_op), cur_op += 2, op)];
272 270 </code></pre>
273 271
274 </div> 272
275 273
276 <div class='slide'> 274 </div>
277 <!-- _S9SLIDE_ --> 275
278 <h2 id="mvm_interp_run-2">MVM_interp_run</h2> 276 <div class='slide'>
277 <!-- _S9SLIDE_ -->
278 <h2 id="mvm_interp_run">MVM_interp_run</h2>
279 279
280 <ul> 280 <ul>
281 <li>ラベル遷移を利用する場合は配列<code>LABELS</code>にアクセスし, ラベル情報を取得する</li> 281 <li>ラベル遷移を利用する場合は配列<code>LABELS</code>にアクセスし, ラベル情報を取得する</li>
282 </ul> 282 </ul>
283 283
302 302
303 </div> 303 </div>
304 304
305 <div class='slide'> 305 <div class='slide'>
306 <!-- _S9SLIDE_ --> 306 <!-- _S9SLIDE_ -->
307 <h2 id="mvm_interp_run-3">MVM_interp_run</h2> 307 <h2 id="mvm_interp_run-1">MVM_interp_run</h2>
308 308
309 <ul> 309 <ul>
310 <li>Cの実装の場合, switch文に展開される可能性がある為, 命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない 310 <li>Cの実装の場合, switch文に展開される可能性がある為, 命令ディスパッチが書かれているCソース・ファイルの指定の場所にのみ処理を記述せざるを得ない
311 <ul> 311 <ul>
312 <li>その為, 1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない</li> 312 <li>その為, 1ファイルあたりの記述量が膨大になり, 命令のモジュール化ができない</li>
408 __code cbc_const_i64(INTERP i){ 408 __code cbc_const_i64(INTERP i){
409 GET_REG(i-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2); 409 GET_REG(i-&gt;cur_op, 0,i).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
410 i-&gt;cur_op += 10; 410 i-&gt;cur_op += 10;
411 goto cbc_next(i); 411 goto cbc_next(i);
412 } 412 }
413 (i-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
414 i-&gt;cur_op += 10;
415 goto cbc_next(i);
413 </code></pre> 416 </code></pre>
414 417
415 418
416 419
417 </div> 420 </div>