アルゴリズムの擬似コードと関数型言語

アルゴリズムの擬似コードを書く際は、いわゆる手続き型のスタイルで書くことが多いかと思います。つまり、更新可能な変数とループを使います。

一方、私がよく書くのは関数型言語で、これは更新可能な変数やループの代わりに末尾呼び出しを使用します。

では、アルゴリズムを提示してそれを関数型言語で実装する、というスタイルの文章を書く場合、アルゴリズムの擬似コードはどう書けばいいのでしょうか?

(ここでは、アルゴリズムの停止性、計算量、不変条件の明示等の観点から擬似コードの方が有益であり、関数型のコードだけを書けば良いというものではない、という立場を取ります。)

続きを読む

Universal MachineのJITコンパイラーを書いた/x86_64編

前にこういう記事を書きました:

かいつまんで説明しておくと、Universal Machineというのは2006年のICFP Programming Contestで挑戦者が実装する必要のあるVMです。これは速ければ速いほどいいので、JITコンパイルに挑戦したくなります。2年前の記事ではAArch64向けのJITコンパイラーを書きました(私の家の最速マシンがM1 Macだったので)。

時は流れ、私の家の最速のマシンはM1 MacからRyzen搭載ミニPCへ交代しました。なので、x86_64版のJITコンパイラーも書きたくなりました。

今回対応したのはUnix系で、Windows版は未実装です。

続きを読む

Haskell/GHCのSIMDについて考える

最近のコンピューターの性能を活用するには、何らかの並列化が必須です。具体的にはSIMDの活用やマルチコア(それとGPU)です。プログラミング言語でこれらを利用できれば「C言語よりも速い」を名乗れます。この記事では並列化技術のうち、SIMDを考えます。

HaskellコンパイラーであるGHCにはSIMDのプリミティブ(データ型と関数)が実装されています。しかし、広く使われているとは言い難いです。

続きを読む

鳥海山登山

私が学部生の頃(10年ほど前)、鉄道旅の折に羽越本線の車窓から見えた山が立派だった。調べたらその山は鳥海山というのだった。その時から私にとって鳥海山はいつか登りたい山になった。

ただ、東北は学生の気持ちとしては遠く、なかなか行く機会に恵まれなかった。所属していた登山サークルの夏合宿で鳥海山の計画が立ったこともあったが、その時は何らかの事情で参加できなかった(人数の関係で遠慮したのか、日程が近い別の山行に誘われていたからだったのか)。

時は流れ、会社の人と山に行きたいですねという話になった。どうせなら私が登ったことのない山ということで、鳥海山に白羽の矢が立った。10年越しの夢を叶える時が来た。

続きを読む

ミニPCを買った

新しいPCが欲しい

私が普段使うコンピューターはMacですが、Macでは動かないあれこれのために一応Windows環境も持っています。ですが、そのWindowsマシンが10年ほど前に組んだIvy Bridge世代の自作機なので、いい加減辛くなってきました。Windows 11に正式対応していないし。

ということで新しいマシンが欲しいのですが、部屋のスペースを消費したくないので大型のマシンは避けたいです。持ち運ぶ必要性も小さいと思われるので、無用なディスプレイやキーボードやバッテリーの付属するノート型も微妙です。なので、最近[いつ?]色々出ているミニPCを物色することにしました。

続きを読む

やりたいことリスト

Je n’ai pas le temps

Évariste Galois

最近、やりたいことが急速に増大しており、時間の不足を感じます。この記事では私のやりたいことを列挙してみます。

プログラミング関連

LunarML

別の記事でも書きますが、そろそろリリースしたいです。

ClutTeX

放置気味です。

GitHubにIssueとPRがいくつか届いていますが、対応できていません。

TeX Live 2023になってBibTeX関連の機能が壊れたような噂をキャッチしています。それもなんとかしなければなりません。

ClutTeXは現在Luaで実装されていますが、型がなくて改修が辛いです。そこで、ClutTeXの実装に使う言語をStandard MLに置き換えることを考えています。ソースはStandard MLで書いて、LunarMLを使ってLuaにコンパイルする計画です。

書き直しのためにはまとまった時間が欲しいです。

Haskell関連

最近はGHCのSIMDプリミティブをもうちょい活用できないか考えています。

コンパイラーの用意するプリミティブがへぼいから使われないのか、誰も関心がないからコンパイラーに機能追加されないのかわかりませんが、とにかく何かしたいです。もったいない精神ってやつ?

できることはいくつか考えられて、

などがあります。

このうち、x86 NCGについては先人が(確か)Summer of Codeで実装したパッチがありますが、一旦取り込まれた後不具合によりrevertされたという経緯があります。レジスターアロケーション周りだったかな?とにかく、モノはある程度できているので気合いがある人が時間をかければ修正できるかもしれません。

LLVM/AArch64の対応は難しいところをLLVMがやってくれるので比較的楽です。なので試しにパッチ(マージリクエスト)を作ってみました。まだ十分テストされているとは言えないのでDraft扱いですが。

テストのためにはSIMDを使うアプリケーションが必要です。ベクトルの内積なら誰でも書けますが、もっと複雑な例が欲しいです。N体問題とかハッシュの計算とかですかね。私は高性能計算に興味はありますが実力も動機付けも伴っていない人間なので、こういう時弱いです。

数学文書システム

既に何回か書いている気もしますが、Webと相性のいいやつを何か作りたいです。

執筆物

数学科のためのHaskell入門

数学とコンピュータの絡みに興味がある人間として、「数学科のためのHaskell入門」みたいな記事(本?)を書きたいです。

勉強したいこと

構成的数学をやりたいというのは4月の記事に書きました。

その時やっていた勉強は、本のUFDの定義が間違っていたことで精神力を消耗し、中断したままです。

そういえば親戚から誕生日のお小遣いを頂いたので、Handbook of Constructive Mathematicsをポチりました。足りない分は自腹です。海外からの取り寄せなので、いつ届くかはわかりません。

アウトドア

夏山に行きたいです。登山靴も新しいのを買ったし。

行きたい山は色々ありますが、今気になっているのは剱岳です。若いうちに登っておきたいです。

欲しいもの

自分の持っているWindowsマシンがIvy Bridge世代でいい加減古いので、新しいのをポチりました。高性能GPU搭載は諦めて、ミニPCです。それともeGPUできるのだろうか?(調べてない)

CPUはAMDのZen 4世代のやつです。AMDのCPU/GPUも触ってみたいなと思ってそれにしました。

ミラーレス一眼も欲しいですが、今年は色々大きな出費があった(iPhone、登山靴、ミニPC)ので先送りでいいかなと思っています。

写真の管理

自分の持っている写真の管理をどうにかしたいです。現状はApple謹製の写真アプリを使っていますが、自分に万が一のことがあった時に残された人がアクセスできません。

そこで、バックアップも兼ねて、これまでの写真をブルーレイに焼いてみようかと思っています。とりあえず結婚式の写真・動画をBD-R(2層)に焼こうとしています。他の写真はどうするか未定です。

スマートフォンで撮った写真はGoogleやAppleのクラウドストレージに流し込んでいますが、保存容量にはお金が必要なので、引き揚げたいです。iCloud Driveは現在月額400円の200GBプランですが、月額130円の50GBプランにならないかと思っています。

時間もお金も欲しい

やりたいことが多いと、なんとかして時間を捻出したいです。睡眠時間を削るのはやりたくないです。そうすると、日中の活動時間の多くを占めるのは労働なので、これに目が行きます。

もしも自分のやりたいこと(LunarMLやClutTeXや執筆活動)でそれなりのお金、例えば月10万円をコンスタントに稼げるようになれば、労働時間を削ってやりたいことをやることも考えられます。しかしまあ現実的ではないです。GitHub Sponsorsをやったところでどれだけ集まるでしょうか。


「時間がない」という記事を書くくらいならその時間をやりたいことに充てろ、と言われそうですね。この記事を書くのにかかった時間は50分くらいです。50分と「記事にして吐き出すことによるスッキリ感」のどちらに価値を見出すか、という話です。

代数構造の「マグマ」と、定義の動機づけ

マグマ

「マグマ」という代数構造がある。

マグマとは、集合とその上の二項演算の組である。

普通の代数構造だと、二項演算について結合法則や単位元の存在など、なんらかの法則を課すことが多いが、マグマは何の法則も課さない。

続きを読む

Pythonについて思うこと

みなさん、Pythonは好きですか?

この記事では、私がPythonという言語とそのエコシステムについて思うところを書いていきます。全体を通したストーリーみたいなのはなくて、トピックごとに書いています。

私のPython経験は3年弱です。Pythonについてまだまだ新米だという自覚はありますが、そこは有り余る才能でカバーしてこの記事を書いています。

続きを読む

これから流行る言語

新言語にできることはまだあるかい

なんとかWIMPS

最近(1ヶ月くらい前)、こんな記事が出ました:

Kotlin, TypeScript, Rust, Swift以降にみんなが話題にするような新しい言語が出てこない、それはなぜか、みたいな趣旨です。客観的に見れば「新しい言語は常に出続けている」わけですが、「みんなが話題にするような」というのが多分曲者なんでしょうね。

例え話をすると、新しい若木は常に生えてきているんだけど、大木に成長するには時間がかかるので、大木にしか興味のない人には「この8年間で新しい大木は登場していない」と判断してしまうのかもしれません。

まあ私としても、Web (HTTP) APIを書く言語とか、JSON色付け係が使う言語はもう出揃ってしまったのかもしれないという気はしなくもないですが、それでも新しい言語が登場して話題を集め(新しい物好きの集団に絞れば「みんなが話題にする」かもしれません)、一定の地位を占める余地はあると考えています。そして、そういう「これから流行る言語」がすでに登場している可能性は十分あります。

(もちろん、どこかの組織または個人が裏でこっそり開発している言語の場合はまだ表には出ていないでしょう。Rustの場合は開発開始は2006年らしいですが、一般公開されたのは2011年で、「裏で開発している」期間が5年ほどあります。)

この記事では、私が独断と偏見で選んだ、「これから流行るかもしれない、(比較的)新しい言語」を紹介してみます。流行の可能性よりも「見るべきところがあるか」という観点で選んだものも含まれます。

なお、ここで紹介する言語は私の情報網に引っかかったというだけであって、必ずしも私自身が試しているわけではありません。不正確なことを書いていたら申し訳ありません。

続きを読む