LoginSignup
0
1

それでも DNCL 向けの学習環境を作る

Last updated at Posted at 2023-10-12

情報Iで出題される擬似言語 (DNCL) を、ブロックを使って学ぶための環境を実装しました。

はじめに全体像を示します。
ビジュアルプログラミング環境「カルシウム」の全体像

上図左から見ると

  • UI は Vue (Vuetify) と Blockly
  • コード生成では、Python 上で実行するためのコードと、画面表示する擬似言語コードの2種類を出力

Vue + Blockly

Blockly を Lit 内で使うことができなかった

そのため、Vue を利用することになりました。どうやら Lit の shadowDom と Blockly の相性が悪かったようです。
追記:Vue についても、component 化できないことがわかりました。トップレベルの App.vue の中であれば Blockly.inject() できます。

renderer には zelos

デフォルトの renderer では、パズルのピースのような形になります。これを Scratch に近づけるには、

const workspace = Blockly.inject(document.querySelector('#div-blockly'), {
    ...
    renderer: 'zelos', // ここで指定する
  })

と追加します。大分見た目が変わり、子どもたちにもなじみのあるブロックの形になると思います。

generator から Calcium, 擬似言語それぞれのコードを生成する

generator を2つ実装することにしました。1つは後述の Calcium で実行するための JSON 配列。そしてもう1つは擬似言語のコードを generator から出力します。
ちなみに Blockly にはブロックで組み立てたプログラムのコードをテキストとして生成するための仕組みはありますが、実行環境が付属していません。

Pyodide + Calcium

Pyodide を WebWorker 内で実行する

公式サイトを参考に実装し、プログラム自体が無限ループの時でも、ページごと固まらないようにしました。

外部ライブラリを micropip で読み込む

Pyodide では numpyscipy も実行することができますが、これらは Pyodide 側で用意した対応ライブラリに含まれているためです。今回、自作インタプリタを読み込むためにmicropip モジュールを最初に import しておく必要がありました。

const pyodide = await loadPyodide()
await pyodide.loadPackage(['micropip', 'numpy', 'pandas', 'scipy'])
pyodide.runPythonAsync(`import micropip
await micropip.install('calciumlang')
from calciumlang.runtime import Runtime
`)

最後に

Scratch から Python へ...

Scratch から次のステップへ進むための学習環境を目指しています。

こちらのページで、実際に試すことができます。また本環境はソースコードを公開しています。少しでも興味を持っていただけたら嬉しいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1