最近、Google DocsにはApps Scriptと呼ばれるかなりフル機能のスクリプトシステムがあることに気付きました。 JavaScriptで非常に便利なものを作成できます。
- ドキュメントを開く、セルを変更するなどのイベントに応じてコードを実行する
- Googleスプレッドシートで数式のカスタムテーブル関数を作成する
- Google翻訳などのサービスを使用してテキストを翻訳したり、Gmailでメールを送信したりします
- カスタム機能を使用して、新しいメニュー項目をGoogleドキュメントインターフェースに追加します
当然、このため、私は何か面白いものを作成する必要がありました。 ここでは、 フィボナッチ数を生成するGoogleスプレッドシートの仮想マシンを見てください。
彼女はどのように働いていますか
VMには、0〜99の番号が付けられた100セルのメモリ領域があります。各セルには、コマンドまたは整数値を含めることができます。
また、メモリ領域の下部から開始して成長するスタックもあります。
これは、空の場合のVMシートの外観です。
次のことに注意してください。
- RA、RB、RC、およびRDは汎用レジスタです。
- RIはコマンドへのポインターです。 メモリ領域で実行される次のコマンドを示し、緑色で強調表示されます。
- RSはスタックへのポインターです。 スタックの一番上のメモリ位置を指します。 青で強調表示されます。
- 出力には、プログラムの出力が表示されます。
- エラーは、コマンドの分析または実行時に発生するエラーを表示します。
- メモリーは、100個のメモリー位置の領域です。
コマンドを実行するために、AppsスクリプトはバックグラウンドでRI値をチェックして、次に実行するコマンドを確認します。 彼女は、RIが指すセル内のコマンドを読み取り、分析します。
メモリとレジスタ間でデータを移動したり、スタックを制御したり、条件付きコマンドを実行したりするためのコマンドがあります。
コマンドを実行すると、RIの値が増加してメモリ内の次のセルを示します。
使用する
VMを制御するために使用されるいくつかの機能を備えた「コンピューター」と呼ばれる特別なメニューがあります。
- 実行終了するかエラーが検出されるまで、現在のプログラムを実行します。
- ステップは1つのコマンドを起動してから一時停止します。
- リセットすると、すべてのレジスタと出力フィールドがクリアされ、プログラムの再起動準備が整います。
- Load Factorial Programは、別のテーブルから階乗の例をロードします。
- フィボナッチプログラムをロードすると、フィボナッチのサンプルが別のシートからロードされます。
チーム
いくつかの実装されたコマンドがあります:
全般
- mov dst srcは、srcからdstに値をコピーします。
数学
- add dst srcはdstをsrcに追加し、結果をdstに保存します。
- sub dst srcは、srcをdstから減算し、結果をdstに格納します。
- mul dst srcは、dstにsrcを乗算し、結果をdstに格納します。
スタック操作
- push srcは、srcをスタックにプッシュします。
- pop dstは、スタックの最上部から値を取得し、dstに保存します。
遷移と条件付きコマンド
- jmp targetは、targetによって参照されるセル内のコマンドにジャンプします。
- jl cmp1 cmp2ターゲットは、cmp1とcmp2を比較します。 cmp1がcmp2より小さい場合、実行はターゲットに進みます。
機能
- 呼び出しターゲットは関数呼び出しです。 コマンドへの現在のポインタをスタックにロードして、後で返すことができるようにしてから、ターゲットに移動します。
- retは関数を返します。 スタックから値を取得し、そこにジャンプします。
その他
- output srcは、srcをOutput:インターフェイスセクションに書き込みます。
- endはプログラムを終了します。
アドレス指定方法
上記のコマンドのオペランドには、いくつかの形式があります。
即値は、コマンドに組み込まれたリテラル値です。 例:7および123。 たとえば、値7をraレジスタにコピーするには:
mov ra 7
レジスタは、名前でレジスタを参照します。 例:ra、rb、rc。 rcからrbに値をコピーするには:
mov rb rc
メモリは、メモリ領域のセル内の値を指します。 例:0ドル、10ドル、99ドル。 raから最初のメモリ位置に値をコピーするには:
mov $0 ra
最後のメモリ位置からrdに値をコピーするには:
mov rd $99
間接は、メモリロケーションが指す値を指します。 例:@ 15、@ 50。 したがって、メモリロケーション10に値20が含まれ、メモリロケーション20に値30が含まれる場合、次のように値30をraにコピーできます。
mov ra @10
メモリセル10をチェックして値20を見つけます。次に、メモリセル20に移動して値30を見つけ、その値をraにコピーします。
再帰
stackおよびcallおよびretコマンドを使用して、再帰呼び出しを行うことができます。 次に、再帰を使用して数値5の階乗を生成する例を示します。
jl ra 2 50で始まるコードは、raの入力値を受け取り、結果をrdで返す関数です。 自身を再帰的に呼び出して、raの値の階乗を計算します。
コピーの入手方法
自分で試してみたい場合は、 ここでコピーを作成できます 。
「ツール」、「スクリプトエディター」の順に選択すると、Appsスクリプトコードを表示できます。