本稿は、2019 年 4 月 19 日に開催された JAGA #68 で発表した「文化としてのプログラミング: tiny code の紹介」のスライドを元に、Qiita 用の原稿として編集したものです。
Tiny Code とは?
定義などは特にありません。Reddit で tinycode と検索すると、tiny code を取り巻く雰囲気は分かるのではないかと思います。https://www.reddit.com/r/tinycode/
以下、つらつらと。
Web server in C
Web server in 58 lines of C
Linux で動作するもののようです。ダイナミックライブラリによるコンテンツを表示させています。
- サーバー本体 58 行
- dump.so ソース(dump.c 11 行)
- http://brokestream.com/httpd58.html
A tiny web server in C
こちらも Linux で動作するもののようです。
- tiny.c – 約 400 行
- 普通の web サーバー(CGI 対応等は不明)
- https://github.com/shenfeng/tiny-web-server
CG (レンダラ)
グローバルイルミネーションを 99 行の C++ で実現しています。コードは小さいですが、ノイズの少ない綺麗な画像を生成するためには、それなりの時間が必要です。
- smallpt: Global Illumination in 99 lines of C++
- http://kevinbeason.com/smallpt/
※ 上記の画像ですが、サンプル数は 1 ピクセルあたり 200 で画像生成しました。
ゲーム
名刺に印刷できるゲームプログラム
名刺にプログラムを印刷するという、なかなか洒落たことをなされているようです。
- “I’m only making business card sized games now”
- http://frankforce.com/?p=5826
Ski ゲームとか FPS などを作っていらっしゃるようです。
7 行オセロ
2ch(現在は 5ch)の「七行プログラミング」スレッドより、7行オセロ。コンピュータの思考ルーチン込。これもスゴイです。
- 79 文字 × 7 行の C コード
- https://pc3.5ch.net/test/read.cgi/tech/984182993/337
拙作ですが、先手後手を選択可能にした改造版を作ってみました:
https://qiita.com/iigura/items/c0259b1b93b3b7ed06f5
Tiny Code な言語処理系
「リハビリがてらにlis.pyをlis.rbに書き直してみた」
- 115 行の Ruby のコード
- https://blog.emattsan.org/entry/20110106/1294322889
「((Pythonで) 書く (Lisp) インタプリタ)」
上のページでも紹介されていますが、「コメントや空行を除くと90行で、ソースコードは4Kバイト以下だ」そうです。
- 90 行の Python コード
- http://www.aoky.net/articles/peter_norvig/lispy.htm
さらなる改良版「((Pythonで) 書く ((さらに良い) Lisp) インタプリタ)」
- 新しいデータ型 - 文字列、論理型、複素数、ポート
- 新しい構文 - 文字列、コメント、クォート、#リテラル
- マクロ - ユーザ定義、ならびに組み込みの派生構文
- 末尾再帰最適化するより良い eval
- 継続 (call/cc)
- 任意個の引数を持つ手続き
- エラー検出と拡張構文、等々
- http://www.aoky.net/articles/peter_norvig/lispy2.htm
Tiny Lua Forth – 75 行による Forth
拙作の Forth 処理系。Lua で記述しております。
- 内部インタプリタ:いわゆる VM(=Virtual Machine) は 6 行
- 外部インタプリタ:一般的な言語でいうところのインタプリタは 32 行
- 辞書:ライブラリ(言語システムを構成するもの含む)は 28 行
- REPL – 9 行
- https://qiita.com/iigura/items/a9b0fff73f7f9639ca3c
tinyc
Marc Feeley による C。lexer+parser+code generator+VM で 291 行だそうです。
- 記述言語 C
- https://www.reddit.com/r/tinycode/comments/py4cz/tinyc_lexerparsercode_generatorvm_in_291_lines_of/
ミニ C インタプリタ
- 500 行弱
- 字句解析 50 行程度
- 名前管理 50 行程度
- 構文解析~コード生成 260 行
- 命令実行部が 100 行余り、だそうです
- http://home.a00.itscom.net/hatada/lp/ci/minicinterpreter00.html
IOCCC
IOCCC とは、The International Obfuscated C Code Contest のことで。国際難読化 C コードコンテストなどと呼ばれています。たった 28 行で記述された、vi 風エディタ Anthony's Editor などの名作が、このコンテストにより世に広まっています( https://github.com/SirWumpus/ioccc-ae/tree/master/91 )。
なお、このコードを読みやすく普通に書くと 360 行になるそうです。現代風に書くと 120 行でまとめることができます( https://qiita.com/iigura/items/678aca225956272bdc10 )。
メガデモ - intro 系
4キロバイトでどこまでできるのかを競うものだそうです。4K intro。ちょっと信じがたいですが、YouTube にありましたので、紹介。
- elevated by Rgba & TBC | 4k intro (FullHD 1080p demoscene demo)
- https://www.youtube.com/watch?v=jB0vBmiTr6o
最後に
計算機の進歩とともにプログラムサイズは肥大の一途をたどっております。しかし、小さなコードでもここまでできるんだ、と思うと中々感慨深いものがあります。また、長いプログラムよりも短いプログラムの方が読みやすく理解もし易いため、学習に役立てるのではないか?とも思います。
とはいえ、コードゴルフ的になってしまうと、高機能は言語を使えばコードは短くなります。また、デモ系のように超絶技巧を駆使し、極限まで圧縮したコードは職人の技の競演という面白さはありますが、初学者のための教材には向いていない気もします。
文化としてのプログラミング Tiny Code - という概念については、このあたりの整理が必要なんだろうなぁ、と漠然と思いつつ本稿を終わります。