Putting the “You” in CPU - 17歳が書いたCPUのプログラム実行方式ガイド
(github.com/hackclub)- コンピュータがプログラムを最初から最後まで実行する仕組みを扱う技術解説であり、起動からプログラム実行までコンピュータがどのように動作するのかを理解することに焦点を当てている
- プログラム実行時に実際には何が起きているのか、プログラムはCPU上で直接実行されるのか、syscallsとは何でどのように動作するのか、複数のプログラムが同時にどのように実行されるのかといった疑問から出発している
- 大学に進学しない場合、包括的なシステム資料があまりなく、品質がまちまちで時には矛盾する複数の情報源を調べなければならなかったという問題意識が背景にある
- 数週間にわたる調査と約40ページ分のノートをもとに、学んだ内容を1本のしっかりした文章として整理することを目的とした資料である
- 素早く読みたい、あるいはすでに理解していると感じる読者のために、Chapter 3: How to Run a Program へのリンクも別途用意されている
1件のコメント
Hacker News の意見
こんにちは! この記事/ミニブックを書いた Lexi です
「ウェブサイトを開くと何が起きるのか?」という古典的な問いがありますが、私はずっと「プログラムを実行すると何が起きるのか?」のほうが気になっていました。3か月ほど前、その問いに答えられない自分にとてももどかしさを感じて、自分で勉強することにしました
プログラミングで知っていることはすべて独学だったので、これも簡単だろうと思っていましたが、まったく違いました。OS と CPU がどのように動くのかに関するオンライン資料はほとんどがひどく、資料そのものもほとんどありませんでした。そこで勉強しながら、自分で良い資料を作ろうと思い、学んだことを整理していたら 60 ページの Google Doc になり、そこから執筆を始めました
ところが書いているうちに、その巨大な文書のかなりの部分が間違っていることに気づき、さらに調べる必要がありました。何度も繰り返し直していくうちに、インターネット上の資料の質は相変わらず悪く、記事をもっと良くしなければなりませんでした。イラストや図も必要でしたが、絵を描けなかったので Figma を開いて試行錯誤し、ハッカソンでもらった Wacom タブレットで一部を描きました
3か月ほど経った今、本当に誇らしい成果物ができました。つたない挿絵も含めて Putting the "You" in CPU の最終版を共有できてうれしいです。この作品は、コンピューター好きの高校生コミュニティである Hack Club(https://hackclub.com) の一環として作りました
数週間前、まだ作業中だったバージョンが偶然 HN で反響を得て、いただいたフィードバックには本当に感謝しています。その後かなり整理し、ようやく自分で世に共有できるくらい満足できるものになりました
ウェブサイトは静的な HTML/CSS プロジェクトで、すべて一から自分で書きました。特にナビゲーションコンポーネントが気に入っています。楽しく読んでもらえればうれしいですし、誰でも学べる資料になればと思います
新しいことを独学するときにこうした資料を書くのは、とても良い方法です。思考過程を明確にし、最初は理解したと思っていたけれど、まだ曖昧な部分を見つけさせてくれます
最後のこの一文も良かったです。「この記事を書いている間、GPT-3.5 と GPT-4 とかなりたくさん会話しました。たくさん嘘をつき、情報の大半は役に立ちませんでしたが、問題を解いていくうえで、ときどき大いに助けになりました。LLM の限界を理解し、言うことすべてを極度に疑うなら、助けの総量はプラスになり得ます。ただし文章を書くのはひどいです。代筆させてはいけません。」素晴らしいプロジェクトです
たとえば「CPU はすべての計算を担当します。大兄貴です。シャザム・アラカブラムです……」のような文脈では、ふざけた文を抜いて「CPU はすべての計算を担当します。コンピューターの電源を入れた瞬間から、命令を 1 つずつ実行し始めます」のように書くほうがずっと読みやすくなります
技術的にものすごく深い人間ではありませんが、文章でお金をもらっている立場からはそう見えます。作業そのものは素晴らしいので、続けてください
こうしたテーマは通常、学部レベルのコンピューターアーキテクチャと OS の授業でよく扱われます。最近では流行が過ぎて、ほとんど選択科目になっていますが
複数の大学が無料講義を公開していますし、この分野の教授が書いた本もあります。より最近の流れに近いものを見たいなら、関連する技術カンファレンスの発表もかなり有益です
とはいえ、教えることは過小評価されがちな芸術であり、情報をよりアクセスしやすくしたり、より楽しくインタラクティブにしたりすることには、間違いなく大きな価値があります
以前は研究エンジニアとして働いていました。私の場合は、大学の研究室でコンピューターセキュリティ研究をするソフトウェアエンジニアでした。OS の講義が選択科目だという別のコメントにもあるように、大学院生の中にもこの程度の OS 理解を持っていない人がいます
良い情報を見つけるのは難しいですが、確かに存在します。見つけにくい情報をまとめ、より良い形にしたという点がその証拠です。私の学位は数学ですが、コンピューティングの知識は独学しました。このように学ぶ方法と、高度に技術的な情報をアクセスしやすく伝える能力は本当に重要で、過小評価すべきではありません
リンクは 2 つだけ共有します。そうしないと際限なく続いてしまうので。1 つ目は https://git.lain.faith/sys64738/airs-notes.git と、リンカー部分の目次 https://lwn.net/Articles/276782/ です。ELF とリンクについて表面を少しなぞった程度なら、Ian Lance Taylor の 20 本からなるブログシリーズと追加トピックには、ELF について知りたかったことすべてに加え、コマンドがいったいどう動いているのか疑いたくなる内容まで含まれています。C++ 例外が発生するたびに使われる仮想マシンでもある、ELF の相棒 DWARF についても短く触れられています
2 つ目に、https://0xax.gitbooks.io/linux-insides/content/ も素晴らしいプロジェクトです。Linux カーネルがさまざまなことをどのように行うのかを、人間が読みやすい形で追っています。HN にはほぼ間違いなくすでに共有されたことがあるはずです
とてもよく書けていますし、こうしたテーマを深く掘り下げたことを祝福します
今どきの17歳なら、理解していないものをつなぎ合わせて「プログラミング」してもある程度は通用するかもしれませんが、いずれ限界にぶつかると思います。だから、今やっていることは本人だけでなく、この資料で学ぶすべての人にとって本当に価値があります
よくやりました :) まだなら、次はエミュレータを使ってみてください。ものすごく面白いです
「いつか限界にぶつかる」というなら、それがもうすぐ起こるのか気になりますね
MVCフレームワークを一から作り、インタプリタやコンパイラも作り、うっかり機械学習と自然言語処理を一から再発明しようともしました。いろいろな格好よくて楽しいことをやりました
その後、お金と先行技術の存在に気づきました。他の人たちが「これを使えばいいだけ」と教えてくれるものを受け入れると、はるかに早く作れるのだと分かりました。フレームワークもそうです。jQueryがここまで人生を楽にしてくれるとは驚きでした
数年たった今、昔は「ただつなぎ合わせているだけ」に見えたものが、今では「かなり低レベルな高度作業」と見なされるようになっています。その抽象化の上に、さらに新しい抽象化が積み重なったからです
今の初心者が「それなりにやれる」ことは、次の世代には低レベルの要注意領域になるでしょう。プログラミングはそういう意味で素晴らしいです
むしろ学問的にプログラミングへ取り組んだ人のほうが、複数の技術を基本レベルで理解したうえで先に進まなければならない仕事に出会うと、完全に圧倒される可能性が高いです
巨大企業でプロジェクトマネージャーとデザイナーが仕様を絞り込んでくれて、実装だけに集中できるなら別ですが、ほとんどの人にとってはまれな状況です
表紙の恐竜だけ覚えていて、タイトルは調べ直す必要がありました
このガイドを完成させたこと、おめでとうございます
大学に行かない場合、包括的なシステム資料は多くなく、品質がまちまちで、ときには互いに矛盾する資料を大量に探し回らなければならなかった、というくだりが見えます
見つけられる最高の資料は、Charles Petzoldの Code: The Hidden Language of Computer Hardware and Software です。第2版が出たばかりです
https://codehiddenlanguage.com/
https://mitpress.mit.edu/9780262539807/the-elements-of-compu...
https://www.nand2tetris.org/
NANDゲートから関数呼び出しまで見事に導いてくれて、とても楽しいインタラクティブな形で進みます。読んで頭の中でどう動くかを想像する代わりに、実際に作らせてくれます
私は自分のCPUアセンブリと、プログラマブルシェーダ言語でLEDマトリクスを駆動する小さなSIMD/GPUまで作りました
15年前に買ったときはCPUアーキテクチャの部分で目が滑りましたが、今なら準備ができているかもしれません。最近、第2版も買いました
読むリストに入れてある記事です。以前、この小さなディテールひとつに心をつかまれました
「すべてのページ下部に余白を入れ、読者が一貫した視線の高さを保てるようにしました。」
本当に小さく、振り返ってみれば当然のディテールです。けれど意外なほど快適です。それに気づいたとき、これは情熱プロジェクトだと分かりました
Webで本をどう表現するかをかなり考え、新しい世代に期待できそうな新しい慣習を作り出したように思います。たとえば上部の章ナビゲーションウィジェットで、前後の章が少し不透明に見える方式は初めて見ました
もうすぐ40歳ですが、私はこういうことを成し遂げたことがありません。ちょうどインポスター症候群をなだめようとしていたところだったのに、もっとなだめる必要がありそうです
本当によくやりました :p
まだ時間は十分にありますし、急ぐ理由もあまりありません。刺激をくれるアイデアをひとつ選び、捻出できる小さな空き時間にゆっくり進めればいいのです
大事なのは、それをやっている自分を誇らしく感じることだと思います。最終的な成果物は、いずれついてくるでしょう
OP、年齢を前面に出して自分の仕事を言い訳しないでください。この文章は、ほとんどの人が一生かけてもできるものより優れています。見事な仕事です
newで埋もれていく例はいくらでもあります。年齢をマーケティング要素として使うことにしたのでしょうし、明らかに効果がありました17歳でこういうコンテンツを作れるなら、この分野を職業に選んだとき、これからどんな驚くようなことを成し遂げるのか想像もつきません。本当にすごいです
些細な管理業務、さらに些細な企業目標、意味のないキャリア成長に魂を押しつぶされないでほしい。今でも素晴らしいことをしているのだから、技術業界のハムスターホイールで魂をすり減らすことなく続けさせてくれるフェローシップのようなものがあればいいのにと思います
OPはCasey Muratoriのcomputerenhance.comの講義を一度見てみるとよいと思います
講義の最初の課題では、1978年のIntel 8086シミュレータを作ります。現代のx86_64アセンブリも、今なおそれにかなり似ています。他では本当に見つけにくいコンピュータの知識をたくさん学べます
私もほぼ17歳の立場として、よくやりました! :^)
ほんの20分前には16ビット整数の最初のバイトを取り出す方法を調べていて、エンディアンを知ったところなのに、あなたはCPUについての本を1冊書いているんですね
Crafting Interpretersを読み終えたら必ず読んでみます。ただ、ほかの多くのプロジェクトと同じように進行速度が確実に落ちているので、少し時間がかかるかもしれません lol
とても良い記事で、スタイルも気に入りました。文章とイラスト/ミームの組み合わせが本当に楽しかったです
RISC/CISCという用語については少し留保がありますが、それは各自の好みの問題かもしれません >.>
カーネルの一部がどう動くのかを突き止めるのに時間を費やした者として、この記事を作る過程がどれほど大変だったかは共感できます。それでも、記事を見れば十分に価値がありました
NT方面はWindows Internalsが知りたい内容を多く扱っていて、Microsoftのドキュメントも悪くありません。私の基準ではLinuxカーネルのドキュメントより明らかに良く、とても良い出発点です
Windowsについてもっと知りたいなら、ゲームハッキングのフォーラム/資料もおすすめです。取捨選択すべきものは多いですが、ニッチなトピックではかなり良い情報源になることがあります
最後に、スマートフォンで見ると一部のコードブロックのフォントがかなり大きく、読みづらかったです。たとえば第6章の
main.cがそうですそれにしても、「コンピュータが好きな10代で、まだHack Club Slackにいないなら今すぐ参加しましょう」という文は、自分が年を取っていることをあまりにもよく思い出させてくれますね lol