Brainf**k からはじめる自作コンパイラ

コンパイラやインタプリタは、プログラミングをするときほぼ必ず使うことになる重要なソフトウェアです。その原理ついては大学の講義で学んだことのある人も多いのではないでしょうか。

とはいえ、原理を学んだところでそれがシュッと実装できるかはコンパイラに限らずそうではない場合が多いと思います。僕もその1人でした。コンパイラの講義や Haskell でパーサコンビネータを実装した流れからコンパイラの実装に興味を持ったものの、どの程度の機能をどう実装するかに悩んでなかなか進まず、結局ほかにもやりたいことがあるからと有耶無耶になってしまった経験があったりします。

最近ふと「そういえば Brainf**k の処理系って書いたことなかったな」と思い、以前読んで気になっていた itchyny さんのブログ記事を参考にしながら Brainf**k を LLVM IR にするコンパイラのようなものを実装してみたことがありました。

これが数時間もしないうちに実装できてしまったことにまず驚きます。そして Brainf**k コンパイラの実装を眺めていると、コンパイラを構成する要素でいうところのコード生成に相当するものではないかということに気づき更に衝撃を受けます。ただ Brainf**k の処理系を書いていたつもりが、いつの間にかコンパイラの一部を、しかも比較的短時間で実装していたのです。

僕はプログラミングを完全に理解しているわけではないので、何かしらの処理をプログラムするときに、まずどのような感じになるかをイメージしやすくするための最小限の実装から始めることがよくあります1。コンパイラもそうすればよかったのです。小さなプログラミング言語? Brainf**k だ!Brainf**k レベルに機能を制限しつつも見慣れた構文を持つプログラミング言語 (これ みたいな Brainf**k の命令を別の文字列に置換しただけの言語ではない) を設計し、それを認識する字句解析や構文解析などを実装していけば、とりあえずコンパイラを構成する要素を一通り実装できるのではないか。そんなモチベーションで始めた自作コンパイラ chiya をどのように実装したかの紹介をしていきます。

Read More »

Ultra96 で Julia set をぐりぐり動かせるやつをもう少し強くした

以前 Ultra96 で Julia set をぐりぐり動かせるやつ (GitHub) の紹介をしました。この時点で当初作ろうとしていたものをだいたい実現できていたのですが、満足していない箇所もいくつかありました。

今回それらの点を改善して性能をあげたり、機能を追加したりしました。どんな感じに強くなったのかを紹介していきます。

Read More »

Exit status は無視しないようにしよう

「手順に従ってコマンドを順番に実行したけどなんか動かなかった」

*nix 系のシステムを使った開発などで、何らかの目的を実現するために複数のシェルコマンドを実行する場面はよくあると思います。その操作が上手くいかなかったとき、こんな感じの質問をしてはいないでしょうか。また、このような場面で躓いているメンバーからこんな質問を受けたりすることはないでしょうか。

僕はこういった質問をたまに受けたりするのですが、これ、とても困るのです。まず実行したコマンドのうち何が失敗したのかの特定から始めることになるため、例えば互いの貴重な時間をそれなりに消費することになったりで双方にいいことがありません1

コマンドの出力をちゃんと読んでエラーを特定してから質問しろとは言いません2。でもせめて、Exit status ってやつくらいは確認してください。たった数桁の数字がゼロでないかを確認するだけです。これで、「xxx のコマンドの実行に失敗したんだけど…」と言えるようになりましょう。

Read More »

Ultra96 で Julia set をぐりぐり動かせるやつを作った

Ultra96 というデバイスがあります。Ultra96 は Xilinx 社の Zynq UltraScale+ MPSoC が載っている開発ボードで、FPGA 開発から最新の ARM 開発、Linux カーネルやそのデバイスドライバ開発なんかも学べて、しかも$249で入手できるというコスパの高い1デバイスです。

今回いろいろあって Ultra96 で遊べる環境ができたので、Julia set を表示してぐりぐり動かせるやつを作ってみました。こんな感じです。

関連するソースコードはほぼ全て GitHub のリポジトリ に公開してあります。

まだ当初予定していた機能を実装しきれていなかったりしますが、とりあえずシステム全体とその開発方法などを紹介していきたいと思います。

Read More »

Boost.Asio の posix::stream_descriptor を使う

C++熱は冷めてしまったのですが、いつか書こうと思っていたことを書かないのもアレだなぁということで、久しぶりの C++ ネタです。

Boost.Asio は、個人的に好きな C++ ライブラリの1つです。以前にもこのブログで、HTTP クライアント (Twitter API というか OAuth を叩くライブラリ) やシリアル通信をする例を紹介しました。

今回紹介するのは posix::stream_descriptor です。名前からなんとなく想像できるように、ファイルディスクリプタを渡してストリーム形式のデータをやり取りするためのものです。これを使って、open(2) したデバイスを Boost.Asio の API で操作してみたいと思います。

Read More »