コンテンツにスキップ

インストール

若草は今のところリポジトリの中にあります。 インストールする gem はなく、Gemfile に足すものもありません。 チェックアウトを取ってきて、二つのものを一度だけビルドすれば、あとは ./bin/wakakusa だけで足ります。

必要なもの

  • Apple silicon の macOS、または Linux。 エンジンはプラットフォーム自身の GPU の仕組みで描きます。 macOS では Metal、Linux では Vulkan で、ウィンドウは Wayland か X11 に開きます。
  • Ruby 4(CRuby)。 書いているあいだ、アプリを動かすインタプリタです。
  • spinel。 リリースしたバイナリをビルドする、事前コンパイル方式の Ruby コンパイラです。 これだけは自分で入れません。 just wakakusa-spinel が、固定しているバージョンを取ってきて ~/.cache/spinel/<sha> にビルドします。 数分かかりますが、一度きりです。
  • Rustrustup から)。 使うコンパイラのバージョンはリポジトリが固定していて、最初のビルドで取ってきます。
  • macOS では Xcode の Metal ツールチェーン。 エンジンがビルド時にシェーダをコンパイルするからです。 Linux では代わりに、C コンパイラと、エンジンがリンクするライブラリが要ります。 alsa、fontconfig、freetype、xkbcommon(x11 の分も)、xcb、そして Vulkan のローダとドライバです。

マシンごとに一度だけ

$ export CARGO_TARGET_DIR=$HOME/.cache/pixie/target
$ just wakakusa-spinel     # 固定してある Ruby コンパイラを取ってきてビルドする
$ just wakakusa-capi       # エンジンを、C から呼べる形でビルドする

CARGO_TARGET_DIR は、すべてのクレートと生成されるアプリで共有します。 二度目からのビルドが速いのは、これがあるからです。 シェルの設定ファイルに書いて、あとは忘れて構いません。

ほかに黙って取ってくるものはありません。 エンジンは同じチェックアウトの中のクレートで、最初にゲートかビルドを走らせたときに cargo がビルドします。

コマンド

以下は wakakusa/ から実行します。

$ ./bin/wakakusa run   demo/counter.rb                    # CRuby でウィンドウが開く
$ ./bin/wakakusa check demo/counter.rb                    # 受け取れない書き方を挙げる
$ ./bin/wakakusa gate  demo/counter.rb --script "click:+1,dump"
$ ./bin/wakakusa translate demo/counter.rb                # 読むための C
$ ./bin/wakakusa build demo/counter.rb --release --app    # バイナリと .app

run はウィンドウを開き、ファイルを監視します。 だから保存がその場で効きます。 check はコンパイラをまったく起動しません。 gate がいちばん大事なもので、二つの実行を一つのスクリプトで動かし、一バイトずつ比べます。

build に付くフラグが二つあります。 --release は symbol table を落とし、--app はバイナリを macOS のアプリケーションバンドルに包みます。 gate に付くフラグが一つあります。 --fresh <path> は実行のたびにその場所を消すので、ファイルやデータベースを残すアプリでも、どちらの実行も同じ「何もない」状態から始まります。

最初のファイル

require "wakakusa"

class Counter
  def initialize
    @count = 0
  end

  def view
    column(spacing: 12.0, padding: 16.0) {
      text "count: #{@count}", size: 34.0
      button("+1") { @count += 1 }
    }
  end
end

run(Counter.new, title: "counter")
$ ./bin/wakakusa run app.rb

そのウィンドウを開いたまま書き換えて保存してみてください。 ファイルが読み直され、ウィンドウが持っているオブジェクトは、それまでの値をすべて保ったまま新しい view を返します。

ビルドの結果

macOS の arm64 で、共有のビルドディレクトリが温まった状態で測ったものです。

もの
コンパイラが書き出す C 10 ミリ秒未満、120 KB ほど
コンパイルされた実行の cc リンク 0.29 秒
コンパイルしたバイナリ 16.2 MB
リリースしたバイナリ(--release 12.3 MB
アプリケーションバンドル(--app 12.5 MB
起動してウィンドウが出るまで 0.3 秒未満
ゲート一往復(エンジンはビルド済み) 2.1 秒

バイナリはエンジンとコンパイル済みの Ruby を含んでいて、システム自身のライブラリ以外は何もリンクしません。 受け取る人に、Ruby もコンパイラも要りません。

全体が動くことを確かめる

$ just wakakusa-sweep

すべてのデモを二つの実行に通し、続けて二つの言語のツアーとこのサイトにある完全な例をすべて通します。 要素の表やドア、エンジンに手を入れたときに通すものですが、手元の環境が揃っているかを確かめるいちばん速い方法でもあります。

次に読むもの

  • 最初のアプリ:言語そのものが、出会う順に並んでいます。
  • デモ:43 本のアプリを、スクリーンショットとソースつきで。