プログラミング言語処理系技術雑誌
世界は何故こんなにも多くの言語で溢れているのだろうか。 それは日夜研究に勤しむ言語開発者たちの絶え間ない努力と才能の成果であった。 何がそんなに彼らを掻き立てるのか?知られざる言語開発の魅力をお伝えします!
記事を掲載したい方はメールかDiscordサーバーで名前と本文(HTML)を送ってください。内容によってアドバイスさせて頂いたり採用されない場合もあるのでご了承ください
2024/12/10 梶塚太智
プログラミング言語に関するジャーナルは学術系では多いが、ビジネス系・ホビイスト向けの雑誌はあまり見かけない。 そもそも言語開発は趣味でやる人が多いのが事実だ。恐らく世界の言語開発者のほとんどはホビイストである(無論私もである)。 私見だが、ホビイストは利益や役職などのしがらみが無いので自由な発想で自分の要望に応えた言語が作れる良さがある。 今では広く使われているRubyもPythonもRustも、最初は個人的なプロジェクトで自分の要望に応えたものが、みんなの要望にもマッチして世界で広く使われるようになったのだ。 本誌は、言語開発をしている・言語開発に興味があるという純粋に技術を愛するホビイストの同志諸君に向けて開始された。 本誌「JISAKU GENGO」がそんな言語開発者の、言語開発ライフをより楽しくインスピレーションに満ちたものに少しでも近づく一助になれば筆者はこの上なく幸いである。
2024/12/10 梶塚太智
関数型言語を開発する際に重要な概念になってくるのがカリー化である。 カリー化とは、関数が複数の引数を取るとき、引数を適用した関数を返して部分適用を可能にする技術である。 普通のスコープ管理だと最初に引数を適用しても関数のスコープを抜けると適用が無効になる問題が発生する。 しかし、単一のグローバルスコープで行うとその問題は解決できるが、何度か呼び出す時にデータ競合する。 そこで私がLamutaで取った解決策は関数呼び出しの際に引数を定数置換することである。 大きなデータ構造の場合は多少オーバヘッドになるが、これは関数の挙動の予測可能性が高める強力な手法になり得る。
2024/12/11 梶塚太智
結論から言うと、確かに簡潔になって可読性は上がる。ただしそれは書きやすさや柔軟性と等価では無い。 それは何故かというと、例えばコードをブロックに入れたり外したりとなるとインデントを変えなければならないからだ。 一見些細な問題に見えるが、実際私はPythonでコードを書く時それが大きな負担になりPythonはあまり好きでは無くなった。 そもそも多くの言語でフォーマッタが提供されていて、それを使えばコードは綺麗に整うので、むしろインデントを強制するのは開発者体験を損なう可能性がある。
言語開発者の視点からも、インデントベースの言語はパーサーの実装が括弧でブロックを囲む言語に比べて難しい。
括弧でブロックを囲む言語のパースアルゴリズムでは、{
が来たらブロックのネスト具合を保持するカウンタを上げて、
}
が来たらそのカウンタを下げてネストは管理できるし、そのカウンタが0では無い場合はデリミタを無視すれば良い。
それに比べてインデントベースの文法は何しろ文脈に依存する事が多いし、私も実際インデントベースの言語を開発してみたが、かなり大変である。
個人的にインデントベースは好かないが、そのパーサーを実装してみて非常に勉強になったし、言語デザインを探求する上でなかなか面白い手法なので興味ある人はぜひ実装してみることをお勧めする。
実装できた折にはこのJISAKU GENGO誌に寄稿していただけると嬉しい。
2024/12/11 梶塚太智
自作言語があらかた出来て、早速コードを試してみよう!という時に対話環境があると無いのでは大きく違う。
いちいちファイルに保存して読み込むより、コードの断片を対話環境に打った方が、自作言語のコードが想定通り上手く評価されるのかを即座に確認できる。
また、言語のユーザーにとっても対話環境の使い心地は言語の評判にかなり影響する。なぜならユーザーが初めてその言語に触れるのが対話環境だからだ。
そこで大事になるのが対話環境のデザインである。鉄則として、入力プロンプトは>>>
などで囲むのが分かりやすい。
評価結果の出力に関してだが、printなどの標準出力と混同しないようにすることが肝要である。評価結果は矢印や色をつけて表示すると分かりやすい。
そう、色も重要である。エラーは赤など警戒色で成功の場合は緑で表すなど色に工夫を凝らすとUXを大きく向上させることが出来る。
もちろん言語開発においては言語根幹が一番大事だが、対話環境の重要性を意識してみるのも言語を成功に導く鍵になり得る。
2024/12/12 梶塚太智
言語処理系とパッケージマネージャは、それぞれ別のツールとして提供されることが多い。 例えばRustではrustcとcargo・Pythonではpythonとpip・JavaScriptではnodeとnpmのように。 ツールを別々に使わなくても良いよう、パッケージマネージャが言語機能に組み込まれている言語もある(有名どころだとGo言語)。 このような言語をこれからパッケージマネージャ組み込み型言語と呼ぶことにしよう。
なので早速、私が最近開発しているLamutaの言語機能にパッケージマネージャを実装してみた。 例えばnewProject関数はカレントディレクトリに引数を名前として新しいプロジェクトの雛形を作成し、そのプロジェクトにログインする。 実行エンジンはシェルでカレントディレクトリを表す代わりにログイン機能を持っていて、今どのプロジェクトで動かしてるかメタ的に分かるようになっている。 そしてrunProject関数でログインしているプロジェクトを動かすことが出来る。これらの操作は対話環境で行う。
パッケージマネージャ組み込み型言語のメリットは何といっても言語とシームレスに統合できることだ。 一般的な言語では、設定ファイルでビルドなどを管理するので言語の文法と同時に設定ファイルの記法も学ぶ必要が出てくる。 一方のパッケージマネージャ組み込み型言語では、実行エンジンでプロジェクト情報を管理するから設定ファイルが不要で、設定は言語のオブジェクトをそのまま使って簡単に出来る。 なので諸君も今度の自作言語はパッケージマネージャを組み込んでみることをお勧めする。
2024/12/15 梶塚太智
「自作言語で自作言語を作る」という表現は複雑でゲシュタルト崩壊を起こすかもしれない。この記事はそんな言葉が多く出てくるので注意せしたり。 自作言語のセルフホスティングは言語開発における一種のステータスで、外部の影響を排除してプロジェクトが自走できることを意味する。 セルフホスティングは、自作言語で自分自身のパーサーや評価機・コンパイラを実装できるほど構造化されて成熟してないとそう簡単には出来ない代物だ。 その前に、自作言語で別の簡単な自作言語製自作言語を作るのも全然アリだ。そこからセルフホスティングに繋がる可能性がある。 その自作言語製自作言語を自作言語の改良が進むにつれ実装を進め徐々に自作言語に近づけて行き、最終的には自作言語製自作言語が自作言語と完全に一致し、自作言語で自作言語が動かせるようになりセルフホスティングが実現される。 自作言語製自作言語はLISP系が実装が簡単なのでお勧めする。もちろんあなたの自作言語は中期記法かもしれないが、いきなり中期記法を自作言語で自作言語製自作言語に実装するのが難しい場合はS式で自作言語製自作言語を実装しよう。 今すぐに互換性を実現する義務はないので、じっくりと自作言語の仕組みを固め自作言語製自作言語の開発にチャレンジしよう。いずれはセルフホスティングを目指して頑張ろう!
2024/12/16 >_<
自作プログラミング言語あるあるなのが、既存の超人気言語と比べてしまって自分のプログラミング言語に対するモチベーションが失われてしまうことです。そんなことになったら、一度自分のプログラミング言語のアイデンティティをじっくり考えてみることをお薦めします。
いくつか案を挙げてみましょうか...
それから、アイデンティティに悩んだときは Homebrew Language Club
でいつでも相談に乗りますので、一緒にプログラミング言語の可能性を探求していきましょう!
(それに、一人で作っていると方向性が分からなくなってきたとき病みますしね...)
ではまた~