<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cs on Momori Nakano</title><link>https://momori.dev/tags/cs/</link><description>Recent content in Cs on Momori Nakano</description><generator>Hugo -- 0.147.0</generator><language>en-us</language><lastBuildDate>Thu, 20 Oct 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://momori.dev/tags/cs/index.xml" rel="self" type="application/rss+xml"/><item><title>『コンピュータの構成と設計 下』でプロセッサのこれからを考える</title><link>https://momori.dev/posts/computer-organization-and-desigin-2/</link><pubDate>Thu, 20 Oct 2022 00:00:00 +0000</pubDate><guid>https://momori.dev/posts/computer-organization-and-desigin-2/</guid><description>&lt;p>&lt;a href="https://bookplus.nikkei.com/atcl/catalog/21/S70100/">『コンピュータの構成と設計 MIPS Edition 第 6 版 下』&lt;/a> はコンピュータサイエンスの教科書です. ハードウェアを知り, ソフトウェアを適合させる方法が説明されます.&lt;/p>
&lt;p>上下巻に分かれていますが, 内容は完全に上巻の続きです. 各巻で相互に参照されている箇所もあるので, 両方を手元に置いて置くと理解しやすいでしょう. 下巻のメインはメモリ (キャッシュや仮想メモリなど) と並行処理で, アセンブラや論理回路についての付録も含まれています.&lt;/p>
&lt;p>キャッシュをどのように保存するか考える. キャッシュはメインメモリ中の値を保持するものだから, メモリアドレスに基づいてキャッシュを入れる場所を決定するのは自然だろう. アドレスによってキャッシュの場所を一箇所に定める方法をダイレクトマップ方式という.&lt;br>
アドレスが 4bit, キャッシュのブロック数が 4 個なのであれば, アドレス上位の 2bit をインデックスとして用いる. つまりアドレス 0000, 0001, 0010, 0011 は同じインデックスが割り当てられる. 残りの下位 2bit をタグとしてデータと合わせて保持して, 現在キャッシュにあるのがどのアドレスのデータなのか特定できるようにする.&lt;br>
もし 0000, 0010 を交互にアクセスするとどうなるだろうか. 両者とも同じインデックスに保存されているためキャッシュ位置が競合し, キャッシュミスが繰り返される.&lt;/p>
&lt;p>競合を減らす柔軟な方法はないだろうか.&lt;br>
一つのインデックスに二つのブロックを保存できるようにすればどうだろう. そうすれば二つのブロックを持つセット二つから成るキャッシュができる. 元々 &lt;code>4 * 1&lt;/code> だった構造が &lt;code>2 * 2&lt;/code> になったということだ.&lt;br>
キャッシュを格納するとき, 各セットにある二つのブロックどちらを使っても良い.もちろん空きがなければ追い出すしかなく, LRU(Least Recently Used) 法などに従って捨てるキャッシュを選び, 新たにキャッシュを入れる.&lt;br>
一般化して, 一つのインデックスに複数のブロックを保存する方法をセット・アソシエイティブ方式という. 究極はセットが一つしかないフル・アソシエイティブ方式だ. 一セット当たりのブロック数のこと指す連想度という用語を使えば, ダイレクトマップ方式からフル・アソシエイティブ方式に向けて連想度が上がると表現できる.&lt;/p></description></item><item><title>『コンピュータの構成と設計 上』でソフトとハードを股に掛ける</title><link>https://momori.dev/posts/computer-organization-and-desigin-1/</link><pubDate>Wed, 05 Oct 2022 00:00:00 +0000</pubDate><guid>https://momori.dev/posts/computer-organization-and-desigin-1/</guid><description>&lt;p>&lt;a href="https://bookplus.nikkei.com/atcl/catalog/21/S70090/">『コンピュータの構成と設計 MIPS Edition 第 6 版 上』&lt;/a> はコンピュータ・アーキテクチャの教科書です.&lt;br>
2 名の著者パターソン&amp;amp;ヘネシーの名前を取ってパタへネという愛称で知られています. ヘネパタという紛らわしい愛称が付けられている『コンピュータ・アーキテクチャ』はより上級者向けの内容です.&lt;/p>
&lt;p>本書はソフトウェアとハードウェアの境界付近についての本です. コンピュータの中核的な仕組みを説明し, プログラムを書く上でどうやってハードウェアを活用すればよいかという視点で語られます. コンピュータの中身を知りたい方におすすめです.&lt;/p>
&lt;h2 id="moore-の法則の終わり">Moore の法則の終わり&lt;/h2>
&lt;p>プロセッサは数百ものトランジスタが搭載された集積回路によって実現されている. トランジスタを始めとする半導体素子の材料になるのはシリコンという砂に含まれている物質だ. 円柱状のシリコン結晶を 0.1mm ほどに薄くスライスしたウェハ (wafer) を格子状にカットすると, 小さなチップができる.&lt;/p>
&lt;p>チップ一つ当たりのトランジスタ数が 2 年で倍増するという, Intel の創始者の一人である Gordon Moore の予想「Moore の法則」は 50 年間に渡って正しかった. しかしいつまでも指数的な成長が続くわけではない. 消費電力の増加とともに発熱が増え, ついには冷却性能の限界を迎えたのだ. ここに来てプロセッサ開発者は方針転換を余儀なくされた. 一つのプロセッサの性能が頭打ちとなったので, 一つの CPU に複数のプロセッサを搭載することにしたのである.&lt;br>
マルチコア CPU の性能を引き出すにはプログラムの努力が欠かせない. 現代は, ソフトウェアエンジニアもハードのことを考えなければならない時代なのである.&lt;/p>
&lt;h2 id="mips-について">MIPS について&lt;/h2>
&lt;p>本書で取り扱われる MIPS という命令セットは, 命令数を抑えシンプルさを重視して設計された. フォーマットが単純であれば規則性が保たれ, 回路の実装が容易となる. そして単純な回路は消費電力を抑えらる.&lt;br>
スマートフォンの時代 (ポスト PC 時代) において, 消費電力は命令セットの良し悪しを決める鍵となった. MIPS と同様の思想を持って設計された ARMv8 や RISC-V が脚光を浴びるのは自然な流れであった.&lt;/p></description></item><item><title>『コンピュータ・システム プログラマの視点から』で知識の糸を織りあげる</title><link>https://momori.dev/posts/csapp/</link><pubDate>Sun, 14 Aug 2022 00:00:00 +0000</pubDate><guid>https://momori.dev/posts/csapp/</guid><description>&lt;p>&lt;a href="https://www.maruzen-publishing.co.jp/item/?book_no=295109">『コンピュータ・システム プログラマの視点から』&lt;/a> はコンピュータ・サイエンスの教科書です.&lt;br>
コードを書いて, コンパイルして, プログラムを実行する一連の流れにおいて, コンピュータの中では実際のところ何が起きているのかを知りたい人のための本です.&lt;/p>
&lt;p>扱う範囲が幅広く&lt;/p>
&lt;ul>
&lt;li>CPU アーキテクチャ&lt;/li>
&lt;li>メモリ階層&lt;/li>
&lt;li>リンクの仕組み&lt;/li>
&lt;li>仮想メモリ&lt;/li>
&lt;li>並行プログラミング&lt;/li>
&lt;/ul>
&lt;p>など, 盛り沢山な内容となっています.&lt;/p>
&lt;p>非常に分厚い本で 900 ページ近くあるのですが, これでも内容は絞られています.&lt;br>
副題の「プログラマの視点から」というのは大事な指針です. 多岐に渡る本書の内容は, どれも「C 言語を書くときに知っておいたほうが良いかどうか」という基準で取捨選択されています.&lt;br>
例えばアセンブラを学びますが, アセンブラを自力で書けるようになることは目的としていません. そうではなく, コンパイラが出力したアセンブラを読んで挙動を追ったり性能を最適化したりすることができるようになることが目的です.&lt;/p>
&lt;p>ほぼ全てのものが順を追って説明されるので前提となる知識は少ないです (大学のコンピュータ・サイエンス入門コースを元にした本らしい). 例えば CPU のパイプライン制御の章では「論理ゲートとは」というところから話が始まります.&lt;/p>
&lt;p>個人的には, これまで学んできたことが関連付けられたり補強されたり, 知識や理解を整理する良い機会となりました.&lt;br>
以下印象に残った点をかいつまんでまとめます.&lt;/p>
&lt;h2 id="浮動小数点">浮動小数点&lt;/h2>
&lt;p>浮動小数点はなんとなく地味な存在だと思っていて, これまであまり深く考えたことがなかったのですが, 今更ながらよく考えられたフォーマットだなと思いました.&lt;br>
昇順に並べた時ビットが符号なし整数と同じになる, 非正規化数から最小の正規化数まで等間隔に滑らかにつながると言う事実を知って驚きました. かつては仕様が乱立していた時代もあったそうですが, 今の形に落ち着いたのも納得です.&lt;/p>
&lt;p>実用的には小数と整数の変換で誤差が出るかどうか, 丸めがどのように行われるのかといったことは把握しておくと役に立つかもしれないと思いました.&lt;/p>
&lt;h2 id="アセンブリ">アセンブリ&lt;/h2>
&lt;p>C 言語がどのようにアセンブリに変換されるのかが説明されています. 例えば if は条件ジャンプを使って実現されることをなどを学びます.&lt;br>
このあたりは昔 &lt;a href="https://momori-nakano.hashnode.dev/nand2tetris">『コンピュータシステムの理論と実装』で自力で考えたことがありました&lt;/a> が, 本書を先に読んでいれば楽だったかもしれないと思いました.&lt;/p>
&lt;p>多くは既知の内容でしたが, switch については認識を改めました. これまで if-else と同じようなものだろうと思っていたのですが, アセンブリのレベルで見ると実装方法が異なります. switch はジャンプテーブルを用いて対象の case に直接ジャンプするので効率が良いです. if-else の連続だとその回数分条件式が評価されますしね.&lt;br>
switch の case には定数しか書けないというような制約があったりして疑問に思っていたのですが, アセンブリを知れば納得です.&lt;/p></description></item><item><title>『コンピュータシステムの理論と実装』でハードとソフトをまたいでコンピュータを理解する</title><link>https://momori.dev/posts/nand2tetris/</link><pubDate>Sun, 18 Jul 2021 00:00:00 +0000</pubDate><guid>https://momori.dev/posts/nand2tetris/</guid><description>&lt;p>コンピュータを 0 から自分の手で作り上げるという意欲的な内容です.
論理ゲートから始まって高水準言語を実装し,その言語で OS を作成するという過程は旅という言葉がしっくりくるほど濃密なものでした.&lt;/p>
&lt;h2 id="内容">内容&lt;/h2>
&lt;p>コンピュータの構築を通じてコンピュータ・サイエンスにおける重要なテーマを学びます ( &lt;a href="https://www.oreilly.co.jp/books/9784873117126/">出版社のサイト&lt;/a> ).&lt;/p>
&lt;ul>
&lt;li>ハードウェア (論理演算, CPU, メモリ)&lt;/li>
&lt;li>ハードとソフト全体が協調するシステムのアーキテクチャ&lt;/li>
&lt;li>プログラミング言語 (コンパイラ, オブジェクト指向)&lt;/li>
&lt;li>OS (メモリ管理, 数学/幾何アルゴリズム, I/O など)&lt;/li>
&lt;li>ソフトウェアエンジニアリング (モジュール化, テスト, API デザインなど)&lt;/li>
&lt;/ul>
&lt;p>ハードウェア → ソフトウェアとボトムアップにコンピュータ構築を進めていきます.
ハードウェア編では論理ゲートから始まって CPU とメモリを実装し, 最終的にノイマン型アーキテクチャのコンピュータを作り上げます.
ソフトウェア編ではアセンブラ, バーチャルマシン, コンパイラと進んで高級言語を実装する過程がメインです. 最後に実装した高級言語で OS を作成します.&lt;/p>
&lt;p>自分の手で作るということが本書のテーマであり, 各章には説明と仕様だけがあり答えはありません.
ハードウェアの設計にはハードウェア記述言語 (HDL) を用い, シミュレータで実行するので実際に電子部品を組み立てる必要はありません. ソフトウェア編で作成するコンパイラは自分の好みの言語で実装します.&lt;/p>
&lt;h2 id="感想">感想&lt;/h2>
&lt;p>ハードウェアの設計は初体験だったのですが, パズルを解くような感覚で楽しめました. 多少苦労した箇所もありましたが, ハードウェア編でかかった時間は各章 2 時間程度でした.&lt;/p>
&lt;p>それよりも遥かに苦戦したのはコンパイラの実装です. 今でこそ各章の内容が秩序立って理解できますが, 当初はそもそも何をすれば良いのかわからず, 何度も説明を読んだり試しに実装をしたりしてなんとか進めてきました. ソフトウェア編全体でかかった時間は 100 時間近いと思います. 本書に取り組んでいて迷ったときのコツですが, アセンブラとコンパイラは完成品が提供されているのでその挙動を見ると良いと思います. 私は最初コンパイラが何をすればよいのかさっぱりつかめなかったのですが, 提供されているコンパイラを実行して理解できました.&lt;/p>
&lt;p>大変な苦労はしましたが, 全体を通じて有意義な学びが多く取り組んで良かったと思っています. コンピュータの仕組みを実際に作りながら学びたいという方には非常におすすめです.&lt;/p>
&lt;h2 id="印象に残ったこと">印象に残ったこと&lt;/h2>
&lt;p>特に印象に残ったこと, 考えたことをまとめます.&lt;/p></description></item></channel></rss>