3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VTuber Tech #2Advent Calendar 2018

Day 19

Akari言語のインタプリタを作ってみた【祝VTuberアニメ化】

Last updated at Posted at 2018-12-18

この記事は VTuber Tech #2 Advent Calendar 2018 の19日目の記事です。

はじめに

VTuberのアニメ放送が決定しました!おめでとうございます!
https://virtualsan-looking.jp/

お祝いに何かしたいなと思い、以前作ったAkari言語のインタプリタを作ることにしました。
(本当はRubyの勉強のために2週間くらい前からコツコツ作ってましたw)

Akari言語とは?

Brainf*ckの派生言語です。詳細はこちらをご覧ください。
ミライアカリちゃんの独自プログラミング言語Akariを作ってみた【Brainf*ck】

今回作ったもの

Akari言語のインタプリタakariをRubyで実装しました。

akariをインストールする

RubyがインストールされているPCで、以下のコマンドを実行すれば、akariをインストールできます。

$ gem install akari

ヘルプを表示する

一応ヘルプもあります。

$ akari h

Commands:
  akari convert {akari_code_file}  # Convert {akari_code} to {brainfxxk_code}
  akari execute {akari_code_file}  # Execute {akari_code}
  akari help [COMMAND]             # Describe available commands or one speci...
  akari version                    # Show akari version

Akari言語を実行する

congratulations.akari というテキストファイルを作成して、以下のAkari言語のソースコードファイルをコピペします。

congratulations.akari
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!あ、カラスだヤミあ、カラスだヤミヤミヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!悪い子ちゃん
ヤミ卍ピロリンッハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミ
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!あ、カラスだハロー!あ、カラスだ悪い子ちゃんハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍
ピロリンッあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!悪い子ちゃんヤミ卍
ピロリンッハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミあ、カラスだハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!あ、カラスだヤミあ、カラスだハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃん
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミ
ヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!悪い子ちゃんヤミ卍
ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ
卍ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミ
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミ
ヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッあ、カラスだ
ハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだヤミヤミヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!悪い子ちゃんヤミ
卍ピロリンッハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍
ピロリンッヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミヤミあ、カラスだ
悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッ
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!
ハロー!ハロー!あ、カラスだヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミあ、カラスだハロー!
ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!あ、カラスだハロー!
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミあ、カラスだ悪い子ちゃんハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミヤミあ、カラスだハロー!ハロー!ハロー!
あ、カラスだあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミあ、カラスだ
悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッ
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!
あ、カラスだハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミ
ヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍
ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミあ、カラスだ
ハロー!ハロー!ハロー!あ、カラスだハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッ
ヤミヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ
卍ピロリンッハロー!あ、カラスだハロー!ハロー!ハロー!ハロー!ハロー!あ、カラスだハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!あ、カラスだヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃん
ヤミ卍ピロリンッヤミヤミヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!
ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!
ハロー!ハロー!あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!
いきま→しょう!ピロリンッヤミヤミヤミヤミヤミヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミヤミヤミ
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!
あ、カラスだ悪い子ちゃんハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!
ピロリンッハロー!悪い子ちゃんヤミ卍ピロリンッハロー!ハロー!ハロー!ハロー!あ、カラスだヤミヤミヤミヤミヤミ
あ、カラスだハロー!ハロー!ハロー!ハロー!あ、カラスだヤミヤミヤミヤミヤミヤミヤミヤミあ、カラスだ悪い子ちゃん
ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!ハロー!いきま→しょう!ピロリンッヤミヤミヤミヤミ
ヤミヤミヤミ悪い子ちゃんヤミ卍ピロリンッヤミヤミヤミヤミヤミあ、カラスだ

以下のコマンドを実行すると、ソースコードが実行されます!

$ akari execute congratulations.akari

Congratulations Akari-chan!
VTubers will be made into an anime!

技術解説

コマンドラインツールの作成は thor というgemを利用させていただきました。

ソースコードはこんな感じです。

cli.rb
Encoding.default_external = "UTF-8"
require_relative "../akari"
require "thor"

module Akari
  class CLI < Thor
    desc "convert {akari_code_file}", "Convert {akari_code} to {brainfxxk_code}"
    def convert(filename)
      # ~~中略~~
    end

    desc "execute {akari_code_file}", "Execute {akari_code}"
    def execute(filename)
      # ~~中略~~
    end

    desc "version", "Show akari version"
    def version
      # ~~中略~~
    end
  end
end

こんな風に関数定義をするだけで、コマンドを定義することができました。

さいごに

VTuberの皆さん、アニメ化おめでとう!

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?