Mercurial > hg > Papers > 2019 > anatofuz-prosym
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->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); | 239 <pre><code> reg_base[*((MVMuint16 *)(cur_op + 0))].i64 = MVM_BC_get_I64(cur_op, 2); |
242 i->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->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); | 409 GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2); |
410 i->cur_op += 10; | 410 i->cur_op += 10; |
411 goto cbc_next(i); | 411 goto cbc_next(i); |
412 } | 412 } |
413 (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); | |
414 i->cur_op += 10; | |
415 goto cbc_next(i); | |
413 </code></pre> | 416 </code></pre> |
414 | 417 |
415 | 418 |
416 | 419 |
417 </div> | 420 </div> |