c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud 等に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開発中です。

Clojerl の runtime に起動してゐる process 達

Clojure Advent Calendar 2021 12/11 (土) です☆ 12/10 (金) は id:kbaba1001 さんのClojureで仕事をはじめて1年経った - さめたコーヒーでした♪

www.kbaba1001.com

Clojerl は Erlang VM で動く Clojure です。Erlang/OTP や Erlang library の函數を Clojure の函數であるかの樣に呼べるのが特徴です。Clojure の library は、ClojureScript に於けると同じく reader conditionals を書けば使へます。

Clojerl の、實行中の動きを覗きませう。REPL を起動します。

rebar3 clojerl repl

Clojerl を使ふ時は OTP application として追加します。*.app.src に書く { application, […, { applications, […, clojerl]}, …]}. の奴です。なので clojerl と云ふ名の OTP application が動いてゐる筈です。

Erlang/OTP に備はる observer (Erlang -- Observer) で樣子を見ませう。

(observer/start)

Clojerl の supervisor tree が見られます。便利ですね。

Clojerl の supervisor tree

clojerl_sup と云ふ supervisor が有ります。この下に六つの gen_server が立ってゐます。これを參考に source code を見ます。

github.com

src/clojerl.app.src に依れば、Clojerl application を 起動すると clojerl_app:start(). が呼ばれます。src/erl/clojerl_app.erl です。ここで clojerl_sup:start_link() を呼び起動を待ち、VM の動作 option を設定し、clje.userclojure.core の namespace を作ります。

clojure_supsrc/erl/clojerl_sup.erl の supervisor です。supervisor が管理するのは以下の六つの gen_server を起動します。引數は有りません。

  • clojerl.Namespace
  • clj_module
  • clj_cache
  • clojerl.Agent.Server
  • clojerl.Atom
  • clojerl.Delay

clojerl.Namespace gen_server は Clojerl の namespace を管理する ETS (Erlang term storage) table を管理します。以下の三種類の ETS が作られます。

  • clojerl.Namespace
  • mappings
  • aliases

clojerl.Namespace table はただ一つ。REPL を起動した時點では以下の五行が登錄されてゐます。

mappings table と aliases table は namespace 毎に作られます ('clojerl.Namespace':load_ns(Name, Module))。Clojerl から namespace を作ったり參照する時はこの gen_server と通信する事に成ります。

clj_module gen_server は compiler 用の gen_server で、compile が濟んでしまへば (本番環境では起動前に濟んでしまってゐます) 關係無い、と私は思ひ込んでゐます、多分さうだと思ひますがだうだらう???

clj_cache gen_server は Clojerl が内部で使ふ cache を ETS として管理します。

clojerl.Agent.Server gen_server は Clojure の agent (Clojure - Agents and Asynchronous Actions) の狀態を ETS で管理します。

clojerl.Atom gen_server は Clojureatom (Clojure - Atoms) を ETS で管理します。

clojerl.Delay gen_server は Clojure の delay (delay - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples) を ETS で管理します。delay 以外の future (cljerl.Future) 等は clojerl application の supervisor tree には連ならず、user の application の supervisor tree で動きます。

以上が Clojerl の實行時の靜的な樣子でした。動的な樣子は宿題とします。

qiita.com

12/12 (日) は hden さんです♪