Aikの技術日記

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

プログラミング言語Mysticalやってみた

はじめに

こんにちは、筆者です。

先日Chromeディスカバリーを何となしに眺めてると、以下記事に目が留まり:
gigazine.net

方陣のようなプログラムを作れるプログラミング言語なるものがあるとの事で…。
方陣というと、私は『とんがり帽子のアトリエ』を連想しちゃいます。

どんな感じのプログラムを作れるのか、少し触ってみたので…。
この言語の概要や、実行方法、こんな感じのが作れるよみたいな紹介ができればと。

それではいきましょう٩( ‘ω’ )و

Mysticalの概要

まずはこの言語の概要から。
Githubに公開されてるプロジェクトで、誰でもClone可能です。

github.com

どういうプロジェクトなのか、端的な説明がREADME.mdの「Is this a programming language?(訳: これはプログラミング言語ですか?)」に記載されてるので引用すると:

At the moment it's a way to draw a PostScript program - there's no interpreter that will ingest a Mystical image and perform the appropriate computation.
It could be run and interpreted by a human, or (more likely) a human could read it and turn it into a PostScript program and run that.
I'll leave further philosophical arguments to other people for now.

日本語訳:

現時点では、これはPostScriptプログラムを描画する方法の一つに過ぎません。
Mystical画像を読み込んで適切な計算を実行するインタープリタは存在しません。
人間が実行して解釈することも、(より可能性が高いのは)人間がそれを読み込んでPostScriptプログラムに変換し、実行することも可能です。
これ以上の哲学的な議論は、今のところ他の方々にお任せします。

要は「PostScript言語で構成されたプログラムを、魔方陣っぽく描画する」事ができるものです。

プログラミング言語という前提を踏まえると、Mysticalの言語記法を学んで直に記述するのが良いでしょうが…。
執筆当時(2025/05/20)時点ではインタプリンタが無い都合上、実行ができないので。

PostScriptで記述したコードをMysticalに食わせ、「このコードからこんなコード(魔方陣)が出来るんだ」とする方が良さそうです。

PostScriptについての詳細や、PostScript実行環境構築については以下の記事に詳しくまとまってるのでおすすめです:
zenn.dev

方陣の生成方法

ここからは「PostScriptで記述したコードをMysticalで出力する」方法についてまとめます。

なお実行方法に当たっては、以下のX投稿に大変お世話になりました!
この場を借りてお礼申し上げます。

環境構築

まずは環境構築から、以下を行えばOKです:

  1. PostScript実行環境構築(参考記事)
    • ターミナルでgsを叩いて帰ってくればOK
    • MacOSの場合、標準搭載されてる筈
  2. MysticalのGithubリポジトリをClone
  3. Mystical作者の別Gitリポジトリdmmlibを、MysticalのGithubリポジトリ内部に格納

MysticalのGithubリポジトリである「mystical_psフォルダ」配下に、
dmmlibのフォルダがある構成になってればOKです。

サンプルプログラムで実行

次はいよいよ実行です。

MysticalのGithubリポジトリ > examples.psファイルにサンプルプログラムがあるので…。
手っ取り早く試してみたい時はこれを使いましょう。

mystical_psフォルダ内部で以下コマンドを実行します:

gs -dNOSAFER -dBATCH -dNOPAUSE \
-dDEVICEWIDTHPOINTS=1000 -dDEVICEHEIGHTPOINTS=1000 \
-sDEVICE=jpeg -r144 -sOutputFile=output.jpg \
examples.ps \
-c gcd_example \
-c showpage

gcd_exampleの箇所には、examples.psで定義されてる他マクロを入れてもOKです

実行すると同フォルダにoutput.jpgが生成されます。

"Mysticalサンプルプログラム出力結果"
方陣生成!

余談:このコマンドの意味

Mysticalは執筆当時時点(2025/05/20)では、Mystical自身専用のコマンドや出力装置を持っていません。
※PostScript言語のライブラリに近いイメージです

出力の際はPostScript言語の実行環境「GhostScript」を使ってMysticalを実行します。
gsコマンドはGhostScriptを実行するコマンドという訳です。

またgsコマンドは先に示した通り、様々なオプションを付けることが出来ます。
参考に、先に記載したコマンドの各オプションの説明を載せておきます:

gs \
-dNOSAFER \ #セーフモード解除(ファイル読み取り&書き込みのため)
-dBATCH \ #実行ファイル処理後、GhostScriptのコンソールを開かずそのまま終了する
-dNOPAUSE \ #`-dBATCH`と併用推奨オプション、各ページ末尾のプロンプトと一時停止を無効にする
-dDEVICEWIDTHPOINTS=1000 \ #出力ファイルの画像サイズを指定(幅)
-dDEVICEHEIGHTPOINTS=1000 \ #出力ファイルの画像サイズを指定(高さ)
-sDEVICE=jpeg \ #出力デバイスをJPEG画像保存に
-r144 \ #解像度の指定、これだと144dpiで出力
-sOutputFile=output.jpg \ #出力ファイル名を指定
examples.ps \ #実行ファイル
-c gcd_example \ #コマンド実行、メインプログラム実行
-c showpage #コマンド実行、ページの印刷

なお、gsコマンドには他にもつけれるオプションがたくさんあります。
気になった方はこちら参考に…: Using Ghostscript — Ghostscript 10.05.1 documentation

余談:トラブルシューティング_フォントについて

筆者の環境で発生したトラブルと解消法についても記載しておきます。
筆者がMacOSで実行した際、以下の様なエラーが発生しました:

Can't find (or can't open) font file Zapf-Chancery.
Didn't find this font on the system!
Substituting font ZapfChancery-MediumItalic for Zapf-Chancery.

Mysticalでは、魔方陣出力時に「Zapf-Chancery」というフォントを使ってますが…。
このフォントがない場合に出るエラーとなります。

上記出力の最後に「代わりにZapfChancery-MediumItalicを使うよ」とある通り、代替フォントがあれば問題ないですが…。
もしダメな場合は、mystical_ps/mystical.psファイル内部の以下記述を:

/Zapf-Chancery 0.5 selectfont

別のフォント名に変えてあげればOKです。

/ZapfChancery-MediumItalic 0.5 selectfont

色んなプログラムを魔方陣に変えてみよう

サンプルプログラムの実行ができる様になった、という事で…。
お次はいよいよ「自分が作ったプログラム」を魔法陣に変えてみましょう!

なお実行する際は、プロンプトに直打ちするよりPostScript用ファイルを作ってそちらを読み込ませる方が早いですので…その方式で。

以下の様なファイルをmystical_psフォルダ内部に作成し:

%!PS
% ↑PostScriptファイルの先頭に記述する必要のあるマジックナンバー

% Mystical読み込み
(mystical.ps) run

% 出力先の座標調整
72 dup scale
4.25 5.5 translate
4 dup scale

% 魔法陣にしたいコード実行
% 魔法陣にしたいコードを`{}`内部に記載する
% ↓のコードは`https://paulbourke.net/dataformats/postscript/`から引用
{
    newpath
    100 200 moveto
    200 250 lineto
    100 300 lineto
    2 setlinewidth
    stroke
} mystical

% 画像へ出力
showpage

以下コマンドを実行します:

gs -dNOSAFER -dBATCH -dNOPAUSE \
-sDEVICE=jpeg -r144 -sOutputFile=output.jpg \
my_code.ps \
-c showpage

実行すると、指定したプログラムを元に魔法陣が描かれた画像が、同フォルダ内部にoutput.jpgとして生成されます。
参考に、↑で実行したら以下の画像が出てきます:

"Mysticalプログラム出力結果"
こんな感じ

後は好きにコードを改良していきましょう!

なお、MysticalのGithub>README.mdには「どのPostScriptコードがどんな魔法陣を出力するか」の対応表も記載されています。
好みの魔法陣を出したい時の参考にしても良いかもしれません。

おわりに

今回はプログラミング言語Mysticalの紹介として、概要や実行方法までをまとめました。

現在(2025/06/17)はMysticalのGithubインストールガイドチュートリアルが存在してますが…。
私が当ブログをまとめ始めた際は無かったんですよね…。

このため出力にはだいぶ苦労しましたorz。
まさか実行に作者さんの別Githubリポジトリが必要とは…。

また、PostScript言語について触れる事も出来て嬉しかったです。
((まさかこんな形でPostScriptに触れる事になるとは…。

PDFファイルにも使われてる言語みたく、非常に歴史ある言語と見受けられたので…。
別記事でまとめてみようかと思いましたが、歴史ある言語だからか参考になる記事も多かったので。
そちらへのリンクを貼る形で終えようと思います。

それでは|д゚)