はじめに
この記事では 2022 年に行った Paraphrase 開発状況をまとめています。現在は Paraphrase ver.0.96 の開発している状況です。ここに記された事柄の多くは、おそらく ver.0.96 に反映されることとなるかと思います。
※ 本稿は言語実装アドベントカレンダー 2022 の 14 日目の記事です。
https://qiita.com/advent-calendar/2022/lang_dev
2022 年を振り返ってみて
今年はあまり開発に時間がとれなかったなぁ、という感が大きいです。Paraphrase の機能として何が必要で何が不要なのか。できるだけコンパクトな処理系であり、かつ、実用的な言語としたい - そんな想いを開発の初期から持っています。今年は多倍長浮動小数点である big-float の廃止が実現できたのは大きな一歩だと感じています。ただ、それ以降の進捗があまり出ず、一時期、開発が失速した感がありました。
float を廃止して double に統一する等については、その影響を見極めなければなりません。無くても困らなければ廃止できるし、困るのであれば廃止できません。Paraphrase の中だけであれば、おそらく float を廃止しても支障はないように思います。しかし、全てを Paraphrase の世界で完結するには多くのユーザーの力が必要なのですが、Paraphrase がそれほど多くの人々の興味を惹くとは思えません(残念ながら)。となると、すでに他の言語で開発されている成果を取り込む必要があるため、FFI の機能が重要になります。
そんな訳で FFI 機能の開発に着手したのですが、どうにも気分が乗らない&開発のための時間が書くとできない等々、さまざまな理由により開発が停滞してしまいました。
その後、気分を変えるためにコルーチンの機能を実装するため、各スレッドの実行環境であるコンテキストを値化し、スタックに積めるようにしたりなど、並列処理環境の整備は少しずつ進んだように感じています。
…と、こんな辺りが 2022 年の雑感となります。
開発状況に関する主なもの
- Paraphrase ver.0.95 のリリース
- big-float 型の廃止
- スレッド間の通信チャネル周りの整備
上記のうち、スレッド間の通信チャネルに関しては以下で詳しく説明します。
スレッド間における通信チャネルに関するワード名の規則
Paraphrase にはスレッドを生成する [ や ]、[[ および ]] など、様々なワードが存在しています。これまで、これらのワードで生成されるスレッドに対し、どのように情報を送受するのかについては明確な基準が存在しませんでした。
明確な基準は無くとも動作しているので、実際のところは何か規則が存在しています。しかし、それを陽に述べるほど、きちんとしたものではなかった訳です。それを現在開発中の ver. 0.96 では、言葉で説明できる程度には整備しました。
スレッド生成に関するワードの接頭詞および接尾詞として、> および >> ならびに = という記号を用意しました。例によって、言語システムとして接頭詞・接尾詞として存在しているわけではなく、あくまでも以下に示す意味を考慮し、そのようにワードに名前を付けているだけ - という状態です。
接頭詞ならびに接尾詞としての > および >> の意味は、> はスレッドを生成するコンテキストのデフォルトのチャネルに接続することを意味し、>> は TOS にあるチャネルに接続、もしくは、TOS にチャネルを積むことを示します。また、接尾詞の = は、生成したスレッドのコンテキストをスタックに積むことを意味します。]=>> などでは、生成したスレッドのコンテキストとチャネルをスタックに積むこととなります。その場合、コンテキストをスタックに積み、その後、チャネルを積みます。
言語仕様の変更
特にありません。
追加されたワード
putc
TOS にある整数値を文字コードとみなし、標準出力に 1 文字出力するワードです。
word? , @word?
TOS にある値がワードであるか否かを調べます。ワードであった場合は true をスタックに積み、さもなければ false をスタックに積みます。@word? は word? の参照型です。
sleep
TOS にある整数値を取り出し、その値の秒数だけスリープします。
>[ , >>[ , >[[ , >>[[ , >[-> , >>[-> , >[[-> , >>[[-> , >[[=> , >[[=> , ]= , ]> , ]=> , ]>> , ]=>> , ]]= , ]]> , ]]=> , ]]>> , ]]=>>
これらは、生成するスレッド間のパイプの接続方法ならびに生成したスレッドのコンテキストに関する指示を含んだワードです。スレッド生成に関するワード、[ , ] , [[ , ]] , [-> , [[-> , [=> , [[=> に接頭詞ならびに接尾詞として、> , >> を接尾詞として = を含んだワード群です。接頭詞や接尾詞としての > や >> および = については、上の「スレッド間における通信チャネルに関するワード名の規則」で説明したとおりです。
join
TOS に積まれているコンテキストまたはコンテナに格納されたコンテキストに関するスレッドの終了を待機します。
仕様変更となったワード
true , false
リスト中で使用するとシンボルとして扱われてしまっていたので、真偽値として格納されるよう仕様を変更しました。
[[=>
搭載されている CPU コア数以上の要素数を持つリストに対して本ワードを用いてもエラーとならないように変更しました。
printf
複数のスレッドから同時に本ワードを実行しても、コンソール上で出力が混ざらないようになりました。
デバッグ・言語仕様変更情報など
()
リスト中で使用した場合に、空リストを生成しなかったため、その不具合を修正しました。
>big-float , big-float?
big-float 型の廃止に伴い、これらのワードを廃止しました。
関連して、big-float 型を示す凡例記号 G を廃止しました。また、凡例記号 M の意味より big-float 型に関する記述を削除しました(関連するワードは pow のみです)。同様に、凡例記号 E の意味が double 型または big-float 型から、double 型または big-int 型に変更となりました。
>child , >parent , child> , parent>
パイプライン構成の方針を見直した結果、これらのワードは不要となりましたので、削除しました。
full-clone
シンボルが文字列に変化するバグがありましたので、それを修正しました。
サンプルプログラム attr.p8e の追加
属性を用いてユニットテストをするサンプルプログラム attr.p8e を追加しました。
2023 年へむけて
冒頭で書いたように、今年はあまり Paraphrase の開発は進まなかった印象です。とは言え、スレッド間のチャネル接続方法を見直すことにより、開発初期から存在していたワード >child, >parent, child>, parent> が廃止となったことは大きな変化です。同様に、開発の早い時期に導入した big-float 型の廃止も同様です。そのような意味では、量は少なかったが質に関しては大きな進捗があった - と言えるのかもしれません。
Paraphrase は Forth 系ということもあり、文化的にもミニマルなデザインを志向する言語でありたいと思っています。そのためにも来年度ことは FFI の実装を実現し、どのような型が言語に必要なのか、無くても何とかなりそうなのか、と見極めれれば…と思っています。
今年度中に ver.0.96 がリリースできるよう、来年早々にはリリースの準備に取りかかれるように頑張りたいと思います。少し早いですが、皆様良いお年を!