プログラミング
Matheus Moreira氏へのインタビュー:Lone LispとLinuxカーネルについて
Interview with Matheus Moreira about Lone Lisp and Linux Kernel (alexalejandre.com)
要約
Matheus Moreira氏は、Linuxシステムコール上で直接動作するLone Lispを開発しました。本インタビューでは、コンピューティングへの道のり、C++からRuby、そしてC言語へと至る言語遍歴、そしてLinuxカーネルのソースコードを読むことの重要性について語っています。また、自身のラップトップのRGBキーボードの挙動をリバースエンジニアリングしてLinux用ドライバーを作成した経験も共有しています。
全文翻訳
2026年7月 - Alex Alejandre
Matheus Moreira(ブログ)は、Linuxシステムコール上で直接Lone Lispを構築しました。このインタビューでは、C言語とLinuxカーネルに関する彼の知識を共有します。
コンピューティングに最初どのようにして興味を持ったのですか? Lispなどを見つける前のあなたの道のりはどのようなものでしたか?
私は昔からコンピューターが好きでしたが、プログラミングに本当にハマったのはビデオゲームがきっかけでした。子供の頃、メガマン バトルネットワークというシリーズのゲームをプレイしていて、それらに触発されました。結局、それらが私の英語学習の原因となりました。英語を話せないながらもフォーラムに参加して交流しようとしました。最初は大変でしたが、上達しました! 私の最初の言語であるC++も同様です。
C++を始めたのは何歳くらいの時でしたか?
ブラジルには「テクニカルスクール」があり、私はそこに行きました。通常の高校のカリキュラムに、専門的な追加クラスがありました。これが海外でも一般的かどうか、それに相当する用語があるかは分かりません。他にも化学やメカトロニクスなどのコースもありました… 品質としては、基本的なものでしたが、高校レベルとしてはかなり良かったです。しかし、それは私が独学を始めるきっかけとなりました。6ヶ月以内に、カリキュラム全体を習得しました。最終的には、仲間の学生を助けるために、ティーチングアシスタントとして雇われました。
それで、13〜14歳くらいで高校に入ったとき、情報コースを取り、Dev-C++という非常に古いIDEでC++を学び始めました。これはSourceForgeにまだ存在しています! cplusplus.comのチュートリアルも見ていました。ゲームを作ろうとしましたが、あまり成功しませんでした! 特にシミュレートすべき物理学をまだ学んでいなかったため、非常に難しかったです :) 結局、もっと多くの言語を学ぶことになりました。基本的なC++の習熟後、Javaをかなり学び、次にRuby、そしてPythonを学びました… それが最終的にLispとSchemeにつながりました! 初めて見たとき、Schemeが非常にエレガントだと感じたのを覚えています。しかし、Rubyが私のお気に入りの言語でした。当時、いくつかのgemを作成しました。一つは実際に小さな支持を得たと思います:Acclaim、gitのようなコマンドベースの引数パーサーです。
クールですね! 新しい言語にすぐに飛びつきましたか、それともまずC++に留まろうとしましたか?
cplusplus.comのチュートリアルをすべて終えた後、より多くの言語を学び始めたと思います。そのサイトで他に学ぶことはないと感じたので、次に進むべきだと思ったのです。当時、Sunは非常に大きなJavaチュートリアルサイトを持っていました。そのサイト全体を読んだと思います。その時にオブジェクト指向プログラミングを学びました。10代の頃、Javaコードをいくつか書きました… いくつかの「ユーティリティライブラリ」です。今から考えると、Apache Commonsが持つ機能の1%を悪く実装したようなものでした! それも公開したと思います、どこかにまだ残っているかもしれません… Java Swingアプリケーションでもたくさん実験したのを覚えています。当時、Nimbusルックアンドフィールが本当に気に入っていて、数学の教授のために円/弧描画アプリケーションを作成したことがあります。
これらの探求のすべてを動機づけたものは何ですか? なぜ異なる言語などを調べ続けることにインスピレーションを得たのですか? Rubyにも留まりましたか?
初期の学校生活では学校のプロジェクトが大きなモチベーションでしたが、ある時点からは好奇心と「正しいもの」への欲求が動機となりました。私は呼び出すべき「ホーム」となる言語が欲しかったのです。Rubyには最も長く留まりました。本当に素晴らしい言語です。常にインストールしており、最近Railsプロジェクトを開始しました! しかし、それにも欠点があります。私が留まったもう一つの言語はCです。その低レベルのシンプルさが私を非常に魅了しました。
C++を忘れたわけではありませんが、知識を更新しませんでした。現在のC++は本質的に全く新しい言語なので、もはや自分がC++を知っているとは主張しません。ある意味で、それをCに置き換えました。Cは、すべての問題や遺産にもかかわらず、なぜか常に魅力的でしたが、10代の頃にCRuby VMのソースコードを探索し始めたときに、それが私の心に深く根付き始めました。私は、誰かが「なぜRubyはXのように振る舞うのか?」と尋ねる興味深いStack Overflowの質問を見つけると、ソースコードを掘り下げてそれを理解するという、非常に楽しい趣味を持っていました。
数年前、Rustへの移行を試みましたが、あまりうまくいきませんでした。また、Zigとその作成者の大ファンでもあります。「Zig 1.0への道」の基調講演を見て以来、人々が「Cに書き直す理由」として挙げた理由(速度、ABIなど)を理解しました。
CとRubyに留まった理由は何ですか?
Rubyは私のメンタルモデルに「ぴったり」合う、非常に表現力豊かな言語でした。しばしばメソッド名を推測でき、それが機能しました。メソッド名の単数形/複数形、同義語のような素晴らしい機能があります。私たちの脳はこれらの言葉で機能し、Rubyはそれらすべてをサポートしています。
Matkladは、良いAPIは推測可能であるべきだと述べ、もし存在しないものを推測した場合、APIがそれを要求していると主張してバグレポートを提出することがよくあると言っています。
Rubyは、驚くほどシェルライクな処理パイプラインを構築することも可能にします… items.each.with_index.map… それは継続的に構築され、非常に少ない文字数で多くの作業を行うことができます。
Cに関しては、主な利点は出力のシンプルさです。関数を記述すると、ELFシンボルと関連するアセンブリコードにコンパイルされます。Cを書いているとコンパイラ出力を確認できると言われますが、それは本当です。C++では、コンパイラは多くの仕組みを追加するため、すべてがどのように連携しているかを理解するのは非常に困難です。動的言語でも同様ですが、コンパイラのソースコードよりも仮想マシンのソースコードを探索する方が簡単だと感じました。
それで、あなたのC++スタイルは、シュガーを取り除いてCを書くように変わったのですか?
はい。他の開発者が書いたコードをますます読むにつれて、私のスタイルも変わりました。CRubyコード、CPythonコード、JVMコード、Guileコードの一部、さらにはV8コードの一部も探索しました… しかし、Linuxカーネルのソースコードを読み始めたとき、私は熟練したCプログラマーに本当に感心するようになりました。それは本当に素晴らしく、おそらくゴールドスタンダードです。
最初から、たくさん読んだのですか? 特に今日、他人のコードを本当に読む人はまれです。どのようにアプローチしますか? 何かコツやテクニックはありますか?
たくさん読みます。私は常に、それがどのように機能するかを知りたいという好奇心旺盛な人間でした。ライブラリを使うだけでなく、それが内部で何をしているのかを知りたかったのです。ドライバーがハードウェアとどのように通信するのかを知りたかったのです。隠された面白いことすべてを知りたかったのです。それが私にとって興味深いことです。私が作ろうとした実際のアプリケーションでは、これらの無関係な探求に脱線してしまうことがありました。他のプログラマーは「なぜそれに時間を無駄にするんだ?それはすでに解決されている」と言いましたが、私はそれがどのように行われたのか知りたかったのです。そして最終的には、車輪の再発明をしたい、しかしより良くしたいという一種の傲慢さも育っていきました。
しかし、メッセージは受け取りました。この癖のために、ソフトウェア開発のキャリアには不向きだと感じたので、最終的には追求しませんでした。今日まで趣味として続けています。
ドライバーコードを初めて見たとき、どのように理解できましたか?
最初は全く理解できませんでした… 最初は。それはフラストレーションでしたが、粘り強く続け、最終的には少なくともいくつかのことを理解できるようになりました。私は確かにハードウェアエンジニアではありません… しかし、私のラップトップのいくつかの機能をリバースエンジニアリングすることに成功しました。それでも私の最も誇りに思っているプロジェクトの一つです。私のラップトップは、Clevoのベアボーンモデルの一つです。個別にアドレス指定可能なRGB LEDを備えた、かなり素敵なキーボードがあります。それらのLEDを制御するための非常にひどいWindowsアプリケーションがありました。ウィンドウが表示されるのに1分以上かかり、本当にイライラしました。Wiresharkを使って、それがキーボードに送信しているUSBパケットを傍受し、それ用のLinuxユーザー空間ドライバーを作成しました。パケットをキャプチャし、画面を見つめて構造を理解し、キーボードを設定するための小さなCプログラムを書きました。それをGitHubに公開して忘れました… ある日、戻ってみると、人々がそれを使っていることが分かりました。一人はそれのためにGUIまで作成していました。それは pretty good feeling でした。ラップトップの他の機能のリバースエンジニアリングを試みることで、ドライバーとコンピューターテクノロジーについてさらに学びました。ACPI電源管理