エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

【Tech Talk 動画紹介】純粋関数型言語Cプリプロセッサで足し算をする

新卒の永山です。

エムスリーでは隔週金曜日に Tech Talk という社内勉強会を実施しています。 エムスリー公式テックチャンネル 【M3 Tech Channel】 では過去の発表のアーカイブを公開しています。

www.youtube.com

今回は上記YouTubeチャンネルに公開されている私の過去の発表について紹介いたします。

www.youtube.com

概要

ADD(5, 8)13 に展開できるマクロ関数 ADD(x, y) を実装する方法についての発表です。

#define ADD(x, y) /* ??? */

ADD(5, 8) /* 13 */

これは一見、以下のように定義すればよいように思えますが、

#define ADD(x, y) ((x)+(y)) /* これでよくない? */

ADD(5, 8) /* ((5)+(8)) : `13`じゃない */

この展開結果は 13 ではなく ((5)+(8)) になってしまいます。

純粋関数型プログラミングによるアプローチと様々な力技によりCプリプロセス時に足し算を実現する方法を解説しています。

オススメの対象

  • CPUや言語処理系の自作が好きな方

整数同士の加減算などの多くの言語ではプリミティブな操作のためのルールを自らの手で記述するのは、CPUや言語処理系の自作に通ずる面白さがあります。 Cプリプロセッサはそのようなことが好きな方におすすめできる言語です。

余談

発表の最後に示したプリプロセス時ライフゲームのソースコードは以下で閲覧できます。

preprocessing time lifegame implementation · GitHub

f:id:ryoga-nagayama:20220207095608p:plain
プリプロセス時ライフゲーム(銀河パターン)

GCCのプリプロセッサは実行中にメモリを解放しないため、15*15の盤面を3ステップ分計算するのに約10GBのメモリを使用します (Clangではスタックオーバーフローによって Segmentation fault が起きるためビルドに失敗しました)。

まとめ

Cプリプロセッサは意外となんでもできます。

We are hiring!

社外の方も Tech Talk にご参加いただけます。以下ページの「カジュアル面談はこちら」からお申し込みください。

jobs.m3.com