アセンブリでAI彼女を実装する
アセンブリでAI彼女を実装する
クソアプリ Advent Calendar 2022 の17日目の記事です。
CASL2という学習用アセンブリ言語でAI彼女を実装しました🎉
25日に予定がないのではなくあえて予定を開けている方などにお勧めです。
(下記リンクから実行することができます)
このようにできるAI彼女の「サシスセソ」で答えてくれます。
ウレシイヤッター!
これは何?
この記事は1年前の Dart Advent Calendar 2021 の25日目に公開した、易しいアセンブリという記事の続編にあたります。
今回このAI彼女を実装するために、自作のCASL2エミュレータをv1.1.0
にバージョンアップしました(パチパチパチ🎉)。
CASL2とはIPAが試験用に仕様を作成している仮想のアセンブリ言語です。
このCASL2エミュレータはCASL2を解析し、エミュレートするライブラリを作成しているのですが、それにFlutterを用いて簡易的に画面をつけたものになります。
ですので、このアプリに大きな修正を加えたのではなく、ライブラリの方に大幅に修正を加え、ライブラリの修正に合わせて若干の修正をアプリ側に加えています。
主な変更内容は次の2点です
- CASL2の構文解析に、スコープの概念を導入
- COMET2エミュレータの入力を非同期に変更
CASL2の構文解析に、スコープの概念を導入
v1.0
ではこの構文のコンパイルが通っていたのですが、v1.1
ではこの構文が通らなくなります。
MAIN START
JUMP BAR ; エラー
RET
END
FOO START
BAR RET
END
L2: [EXCEPTION] UNKNOWN LABEL BAR
CASL2
の構文は基本的に1行で完結するのですが、プログラムの開始と終了を表す命令(START
, END
) が存在します。
v.1.1
からは、構文解析をこのSTART
-END
のブロック単位で行うように変更し、合わせてスコープをこのブロック単位に限定するようコードの変更を行っています(BIG BANG!)。
これにより、全てのラベルを異なる名称に設定しないといけなかったv.1.0
とは異なり、START
-END
のブロック間のラベルはブロックに閉じるようになったため、CASL2コードの生産性が上がるようになりました🎉
COMET2エミュレータの入力を非同期に変更
これは v1.0
を作っていた時の課題だったのですが、I/Oが非同期でないために非常に画面実装が面倒でしたが、より対話的なプログラムを作成するためにI/Oを非同期に変更し、より柔軟に画面実装を行えるようになりました🎉
v.1.0
ではあらかじめINPUT欄に入力するテキストを用意しておく必要がありましたが、v.1.1
ではこのように、入力を実行のタイミングで行えるようになっています。
ライブラリについて
このCASL2エミュレータのコア部分は、Dartのライブラリとして実装されています。
Dartを選択している理由は主に多くの環境でプログラムを実行できるようにしたいという目的があるためです。ですのでこのようにCLIとしてCASL2エミュレータを実行することができます。
(JSやTSを選ばなかったのはFlutterの存在によるものですので、FlutterがなければDartを選んでいなかったかもしれません)
UIアプリとして初めから実装してしまうと、このようなことが難しいですが、ライブラリとして基本機能を実装することで、そこにUIを付ける形でアプリを作るということが可能になります。
ライブラリを実装していると動作確認のためにテストを書かないといけないですし、UIの差し替えもかなり自由なので、ライブラリの実装は多くの人にお勧めしたいです。
残課題
易しいアセンブリの方で書いていた残課題のうち、3つが今回解消されています。
- =を利用したリテラル記法(e.g. ='A')
- 全てのシンタックスエラーパターン
- マクロのラベルが効いていない
- いつの間にか消えたNOP
- JUMP先のラベルをサブルーチン内に限定
- サブルーチン内のラベルスコープをサブルーチン内に限定
- 独自のマクロ定義
JUMP先のラベルをサブルーチン内に限定
はスコープによって一部解決できているものの、START
のラベルにジャンプできていいのか?という問題が残っているので解決扱いにしていません。
独自のマクロ定義
定義もできるようになると、よりCASL2を用いた生産性が上がるので来年実装されているといいな(一方で独自マクロを多用したプログラムというのは、元々のCASL2を学びたいという人には毒になるのでどうしたものか)
合わせて追加の課題群。
- UIの改善(モバイルでもう少し使いやすいように)
- プログラムの実行ポイント(ラベル)を指定可能にしたい
-
MAIN
ラベルから実行されなくなった(これはデグレ、現状はトップのコードから実行されています) - 乱数・日付を扱いたい(独自拡張)
デグレなどは近いうちに直します。
独自拡張になりますが乱数と日付を扱えるようにしたいんですよね、これがあるとさらにCASL2のプログラムを組みやすくなるので。
最後に
良いクリスマスを!
Discussion