HN 日本語サマリー

← 一覧へ戻る
プログラミング

Cプログラマーが可読性に対する新たな犯罪を犯す

C programmers commit fresh crimes against readability (theregister.com)

89 pointsby Bender9 コメント

要約

第29回国際難読化Cコードコンテスト(IOCCC)2025の結果が発表され、驚くほど小さく、巧妙で、時には実用的な応用を持つ23の受賞作品が紹介されています。特に注目すべきは、ソフトウェア保存という実用的な目的を持つSubleqエミュレータや、ゲームボーイエミュレータ、自己生成・再構築するプログラムなどです。

全文翻訳

OFFBEAT Cプログラマーが可読性に対する新たな犯罪を犯す 困惑し、翻弄され、そしておそらく魅了される準備をしてください – そしておそらく魔法にかかるでしょう リアム・プルーブン リアム・プルーブン 公開 2026年7月5日 // UTC 13:00 第29回国際難読化Cコードコンテスト、略してIOCCCが、2025年大会の結果とともに再び開催されました。今年の参加者の一人は、ユニークな新技法を披露しました。それは、有効なユースケースです。 昨年のイベントについて報じた際、4年間の休止期間を経て復活したばかりでしたので、今回もすぐに戻ってきたことを嬉しく思います。 この記事を書いている時点で、審査は3週間ほど前に終了しましたが、YouTubeに録画があるものの、ほぼ3時間あります。各受賞者のための個別のクリップに編集するには時間がかかったため、今頃になって取り上げています。これらのプログラムの多くは、その動作を見るまで信じられないでしょう。一般的に私たちの好む形式ではありませんが、ビデオクリップはこれに最適です。 今年は23もの受賞エントリーがあり、ハットトリックのハットトリック、つまり3人の参加者、 Yusuke Endoh、Nick Craig-Wood、Don Yang がそれぞれ3つの受賞エントリーを獲得しました。ここでは個人的なハイライトをいくつかしか紹介できませんが、すべての受賞作品を読むことを強くお勧めします。それらはあなたの時間を十分に費やす価値があります。 IOCCCの要素の一つは、審査員のLandon Curt NollとLeonid A. Broukhisが、各受賞エントリーのために毎回新しいカテゴリを発明することです。私たちは彼らのタイトルを使用しているので、小見出しが最初からあまり意味をなさない場合は、関連するIOCCCのページを読むとすべてが説明されるかもしれませんが…それを頼りにするわけではありません。 IOCCC29 – 2025/cable – ベスト・イマジナリー・エミュレータ 私たちは、すべてのIOCCCの結果をすべて研究したと主張することはできません。最初のコンテストが1984年に行われたとき、このハゲタカはまだ学校に通い、BASICを学んでいました。しかし、今年は、Adrian CableのSubleqコンピュータが最も私たちの注意を引きました。 その理由は、私たちがすでにそれと、それが何をするのか、少なくとも密接に関連するプロジェクトを見ていたからです。IOCCCとしては珍しく、ソフトウェア保存という実生活でのユースケースがあります。 Eternal Software Initiative (ESI) のアイデアは、元のハードウェアプラットフォームが存在しなくなった後もソフトウェアを保存するために、エミュレートが非常に容易になるように特別に設計されたコンピュータアーキテクチャを実装することです。GitHubにサンプル実装があります。 CPUアーキテクチャは新しいものではありません。Subleqと呼ばれるOne Instruction Set Computerです。OISCはRISCの論理的な外挿です。命令セットを1つの命令にまで削減することはできません。この場合、その命令はSubleq(ゼロ以下なら減算して分岐)です。2020年の説明はこちら、そしてそれは当時も新しくはありませんでした – 2011年のFPGAハードウェアはこちら[PDF]です。 ESIはSubleqをソフトウェアで実装し、LLVMを使用してそれをターゲットとするCコンパイラを構築し、CおよびC++ランタイムライブラリを含めてLinuxを移植しました。そのLinux上でエミュレータを実行すると、この小さな基盤から任意のハードウェアアーキテクチャの実行可能なバージョンをブートストラップできます。 そして、本当に小さいのです。これがアーキテクチャのIOCCC受賞実装です。 #include<SDL3/SDL.h> #define o s[1&s[t=e++]?s[t]/4:t]/4,t b,y,t,e,s[3<<27],V[32],*w,**g; main(_){for(g =SDL_GetWindowSurface(w=SDL_CreateWindow(0, 800,512,!read(b,s,'frog')));_=o=y=o=o;~_?~y ?e=1>(s[y]-=_[s])?t:*s&&++b>8e5?s[memcpy(3[ g],6[s]+s,25<<16),b=SDL_UpdateWindowSurface (w)]=4*e,*s/4:e:e:SDL_PollEvent(V)?y[s]=6[V ]*(1537-2**V):0)_^64||timespec_get(s+_,1);} これがすべてです。366バイトです。 はい、グラフィックを表示するためにSDLライブラリに依存していますが、それでも、これは非常に注目に値すると同意していただけると思います。 デモビデオでは、比較的合理的な速度でフルカラーのマンデルブロ集合を生成し、その後ポンのゲームをプレイし、その後SubleqがLinuxといくつかのアプリを実行する様子を示しています。これを見るときは、がきと切手のための十分なスペースがあるはがきにソースコードを手書きできることを覚えておいてください。それは9行の長さです。少し読みやすいバージョンのコードは、まだ91行の長さです。 ニック・クレイグ=ウッドのハットトリック ベスト・イマジナリー・エミュレータに加えて、ベスト・リアル・エミュレータという受賞作もあります。Nick Craig-Woodは、驚くべき66行のC言語で、オリジナルの任天堂ゲームボーイの動作するエミュレータを提供しており、コンテストのためにコンソールのようにフォーマットしました。 彼のもう一つの受賞作は、ベスト・フラクショナル・エミュレータです。これは、John ConwayのFRACTRAN言語でエミュレートされた、信じられないほど小さなコモドール64エミュレータの組み合わせです。 そして彼は、Unicodeのベスト使用という賞も受賞しました。これはForthのバージョンを実装しており、Cコード内には、回転するマンデルブロ集合のズームを生成するForthプログラムが含まれています。 2025/endoh1 – 最も輝かしい賞 Yusuke Endohの3つの受賞エントリーの最初のものは、ニクシー管シミュレータです。The Reg FOSSデスクが若かった頃、これは電子計算機(と一部のガソリンポンプ)が数字を表示する方法でした。ニクシー管は、すべての数字の形をしたフィラメントが積み重ねられた小さな電気管で、そのフィラメントだけを光らせることで目的の数字を表示します。今日でも新しいニクシー管を購入できます – チェコの小さな会社が手作りしています。 多くのIOCCCエントリーと同様に、Endohのソースコードはそれがシミュレートするものの外観になるようにフォーマットされています。しかし、このエントリーでは、これは単なる楽しい後付けではありません。プログラムは、ニクシー管の出力をシミュレートするために、自身のソースコード内の数字を色で強調表示します。ソースコード自体が出力メカニズムでもあります。 私たちは、Endohの2番目のエントリー、最もショックを与える可能性が高い賞も気に入りました。これは、驚くほど少ないスペースでリヒテンベルグ図形を生成します。IOCCCが始まった頃、このハゲタカは自分でこれを実装しようとしましたが、うまくいきませんでした。 Endohの3番目の受賞エントリー、最も回復力のある受賞者は、自身のコードを繰り返しパッチ適用し、その後自身を再構築して、使用したdiffツールのソースコードを出力します。これは(少なくともこのハゲタカにとっては)心を揺さぶるものであり、日本のプログラマーにとって驚異的で記録破りの23回目の勝利を表しています。 最初の2つにショックを受け、輝かされましたが、審査員はTomoya Ishidaの最も落ち着かせる賞を受賞した作品を称賛しました。これはわずか36行のコードで、「RELAX」というメッセージを含み、合成された海岸の音を備えた5分間のアンビエントチューンを含むWAVファイルを生成します。 2025/uellenberg – ピンポン賞 Endohの自己フォーマットされたCコードが自身のソースからニクシー管を出力するというアイデアは素晴らしいと思っていましたが、次にJonah Uellenbergのエントリーを見ました。彼のポンゲームはクイーンです。つまり、実行すると自身のソースコードを出力するプログラムです。オリジナルのWikiサイトC2が説明しているように、これは想像以上に困難です。 Uellenbergのプログラムは、私たちが想像していた以上に進んでいます。他の多くのIOCCCエントリーと同様に、そのソースコードリストにはメッセージが含まれています。少し目を細めると、空白の中にポン画面が見えます – 2つのパドルとボールです。 それをコンパイルして実行すると、一方のパドルを動かすのにキーストロークが必要です…その後、自身のソースコードを再フォーマットし、更新されたゲーム画面を示す、わずかに異なる新しいバージョンを出力します。ゲームは、前の実行からの出力を繰り返しコンパイルすることによってプレイされます。各実行は次のゲームのソースコードを出力します。ゲームのフレームは、変化する自身のソースコードです。 より一般的なゲームの楽しみのために、3人組の最もテレポートする可能性が高い受賞者は比較的簡単です。54行のキュートなコードで書かれたローグライクゲームです。 ドクター・フーのファンにとって、「Who won」という賞を受賞した「jingp49」という名前の台湾のコーダーは、TARDISのように見え、どのようにかは不明ですが、テレビ番組のタイトルシーケンスのASCIIアニメーションバージョンを出力します。 ここでは受賞エントリーのほんの一部をハイライトしました。それらはすべて、さまざまな理由で正当に驚異的です。例えば、Gil Dogonの「Consistently constant」受賞者は、オイラー定数の多くの桁を出力しますが、それは...