QurioWork

日常思ったことと好奇心の追求

Nand2Tetris 11章までの感想

「Nand2Tetris」について、最後に記事を書いてから4ヵ月も経過してしまった。

決して怠けていたわけではなく、この間に「Nand2Tetris」の11章の「コンパイラ作成」までクリアした。

おさらいになるが、Nand2Tetrisは「ハードウェア」と「ソフトウェア」2つのパートから構成されている。 ハードウェアまでは1章ごとに、感想を書きながら進められたのだが、ソフトウェアパートからの演習は非常に手応えがあり(ありすぎて)、感想を書く余裕がなかった。

というわけで、今回は「Nand2Tetris」の感想をまとめて記事にした。

5章 : コンピュータアーキテクチャ

ハードウェアの総仕上げ:CPU構築

このパートでは1章~3章で作成した論理ユニットを組み合わせて、Hackコンピュータと呼ばれるNand2Tetris専用のコンピュータを作成する。

この章の山場はなんといっても「CPU構築」だ。

HackCPUはとても単純なアーキテクチャなので、レジスタも2つしか用意されていない。そのうちの1つのはAレジスタと呼ばれ、メモリアドレスを指定するモード、値として仕様するモードがあるため、概念理解に苦戦した。

ちなみに本書には答えは載ってないものの、大まかな素案が提示されているので、それを参考にしてCPUを作成した。

N2T05_HackCPU.png

そしてCPUの肝は、デコーダー(decode)だ。デコーダーはCPUの命令セットを解釈するためのユニットで、CPUの命令セットデコードには、機械語の理解が必要不可欠だ。本書ではデコーダーの部分だけは自分で考えて、実装することになっている。5章までは丁度いい難易度だと感じた。(6章から大変なことを意味する)

作成したCPUは下記。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/05/CPU.hdl

CPUの単体テストをクリアすることを優先したため、ロジックの最適化は2周目の楽しみに取っておく。(言い訳) あとは、「メモリ」を組み上げ、先に述べたCPUとつなぎ合わせ「Hackコンピュータ」を作るところまでが5章の内容だ。

6章 : アセンブラ

6章からソフトウェアパートになる。 正直「CPU」作成したら、残りのソフトウェアパートは楽勝だろうと思っていたが、大間違いだった。

ソフトウェアパートでは最初に、HackCPU用のアセンブラを作成する。 "好きなプログラム言語を使ってアセンブラを作成せよ" というのが本書の方針なので、勉強も兼ねてPythonを選んだ。この辺は本当に好みだが、Pythonで作っている方が多いかな。

※結果的にPythonを選択したのは正解だった。  Pythonが持っている組み込み関数の力が大いに発揮された。

ちなみにアセンブラとは、アセンブリ言語で記載された原始的なソースコード機械語に変換するプログラムのことだ。 アセンブリソースコードの1行=機械語の1行に対応している。アセンブラの動きは入力されたソースコードを1行ずつ機械語に変換していくという単純なものになる。Python学習も兼ねるには丁度良い難易度だ。

この章で学ぶ最初の重要な概念は「シンボルテーブル」かと。 …と言っても難しいものではなく、入力されたソースコードに登場するシンボル(変数)を管理するテーブルだ。 「シンボルテーブル」の登録/参照がアセンブラの肝だった。アセンブラ開発は考える部分も少なく、1週間ぐらいで作成できた。

成果物

作成したアセンブラは下記。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/06/n2t_hack_assenbler_byPy/n2t_hack_assembler.py

7章~8章 : バーチャルマシン言語

7章~8章の目的は、バーチャルマシンと呼ばれるスタックベースの仮想コンピュータの言語を学び、バーチャルマシン言語(以下VM言語)をアセンブリに変換するVMトランスレータを作成することだ。

この章から、1章ごとの演習ボリュームが多くなり苦戦した。

7章8章の肝はスタックマシン。 スタックマシンの働きはとても単純なのに複雑な演算ができてしまうのは本当に良く考えられている。 バーチャルマシンで、以下概念をしっかり理解すれば先に進めるはずだ。

  • バーチャルマシンのメリット
  • スタックマシン
  • メモリセグメント

7章 : 前半パート

下記機能を記した中間コードをアセンブリ言語に変換するプログラムを作成する。

  • 算術演算
  • メモリアクセス

算術演算でスタックマシンの働きを学び、メモリアクセスではHackコンピュータのメモリセグメントの働きを学ぶ。 メモリセグメントは後々の高水準言語で変数のスコープを実現するために必要な概念となる。 この章の時点だと、自分はメモリセグメントの重要性に気づけなかった。

8章 : 後半パート

7章で作成したプログラムを拡張し下記機能を追加する。 8章の演習を全てクリアした暁には、VM言語をアセンブリに変換できる完全なVMトランスレータが完成しているはずだ。

  • プログラムフロー
  • サブルーチン呼び出し

サブルーチン呼び出しの仕組みは非常に面白く感じた。 スタックマシンのシンプルでエレガントな働きによってサブルーチンが見事なまでに実現されていた。

成果物

作成したVMトランスレータは下記。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/08/n2t_hack_vm_translator.py

9章 : Jack言語

9章では、Jack言語という高水準言語を学ぶ。 Jack言語は、JavaC#に似た文法を持つ、本書専用の学習用オブジェクト指向言語だ。 コンパイラ作成がしやすいようにかなり上手く設計された言語で、本章でJack言語の文法習得を通して、コンパイラ作成の基礎を固めることになる。

この章は、他の章と違ってJack言語の文法を学ぶためだけの章なので少し毛色が違う。自分は1回読んだだけで、次に進んだ。

しかしながら、次章のコンパイラ作成の段階になってから、9章は何度も読み返した。 基本的に大切な仕様がさらっと書かれていることが多く、見落とすことが多々あった。

10章~11章 : Jackコンパイラ

いよいよコンパイラだ。 コンパイラは10章~11章の2章に分けて開発する。

N2T_JackCompiler.png

Jackコンパイラは、Jack言語のソースコードを読み込みVM言語を出力する働きをもつ。実際のコンパイラと違って出力結果はテキストファイル形式のVMファイルなので、出力結果の確認は容易な部類になる。

自分はコンパイラ理論など全くの無学だったため、コンパイラ作成が一番苦労した。 人によっては1週間で出来る人もいるらしいが、私は2ヵ月弱ぐらい要した。 とはいえ、ステップを踏みながら、1歩1歩進めば、必ずコンパイラを作成できるようになっているから安心してほしい。

ファーストステップ

コンパイラ作成にあたり、いくつか重要な概念を学ぶ。 解説したいところだが余白がたりないため、説明は他者様に委ねる。

10章 : 前半パート

10章では、まずソースコードトークナイザーでトークンと呼ばれる最小構成要素に分解する。 次にパーサーでJack言語の文法に従ってツリー構造のXMLファイルを生成する。

この章の演習をクリアしないと11章に進めないので、この章は非常に重要だ。

11章 : 後半パート

10章をクリアできれば、あとはパース内容をコードに変換する「コードライター」を作成するだけだ…。 自分の場合「コードライター」が本書の中で一番苦戦した。 ちなみに多くの人は、前章の「パーサー」で苦戦や挫折するようだ。

開発の流れ的には本書の構成どおり、下記を順番に作るのが良いだろう。

  • シンボルテーブル作成
  • データ変換
  • コードライター

コードライターでは、パース結果に応じたVM言語を出力する。 ここで、「コンストラクタ」や「インスタンス」といったオブジェクト指向言語の重要な概念をVMレベルでどのよう実現するかを通して、オブジェクト指向の真の意味を学べた気がした。(あくまで個人の感想です)

その他、シンボルテーブルだが、似たような概念を既に学習済みだ。そう、アセンブラだ。 アセンブラでは機械語生成のためにソースを2度読みする必要があったが、コンパイラは最初の1回の読み込みで解析が完了するところだろうか。

データ変換はシンボルテーブルに基づいて、Jack言語内の変数をインデックスに変換する処理だ。この辺りは、特に苦戦する箇所はなかった。実際のコンパイラでは、実用的なシンボルテーブルはハッシュテーブルがチェインした構造になるようだ、Jackは単純な仕様のため2つのシンボルテーブルだけで済む。

コンパイラ作成方針

コンパイラは無学者が取り組むには非常に手ごわい。 そこで、以下方針でコンパイラを作成した。

  1. 公式サイトに用意している講義形式PDFをちゃんと読む

    公式サイトの講義形式PDFは、本書の内容の詳細について説明がある。 本書の内容を一通り読んだあとに講義資料を読むと、より深く理解できる。 何よりも、講義資料にはコンパイラ作成のヒントが満遍なく書かれているので必読だ。

  2. VM出力時もXML出力を抑止しない

    本書ではXML出力からVM出力に切り替えていたが、私はXML出力を止めずに追加でVM出力をするようにした。 理由は簡単で、XML構文解析結果が「コードライター」のデバッグに役立ったからだ。

  3. 公式サイトのJackコンパイラの出力結果を解析した

    自作コンパイルだけだとデバッグはとても難しいものとなる。 そこでちょっとズルいけど、お手本のコンパイル結果と比較解析する手法を採った。 しかし、おかげで自身のコンパイラの間違っている箇所を効率的に見つけることができた。

成果物

P 作成したコンパイラは下記。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/11/n2t_jack_analyzer.py

コンパイラに関しては、他の方々が作成したコンパイラを大いに参考にした。

総括と今後の課題

本書の醍醐味は、ハードウェアからソフトウェアまでの知識が一直線に繋がったときの達成感かと思う。 コンピュータサイエンスに興味がある方は、取り組む価値があるはずだ。

突っ込みどころは、Nand2Tetris と謳いながら、Tetris が登場しないでPong と呼ばれるピンポンゲームで終わったことだろうか。

実はまだ12章(オペレーティングシステム作成)は未着手だ。 「コンパイラまでやりきる」と決めて取り組んだので、いったん一区切りつけることにした。

11章まで終わった段階だと自作コンパイラができていて、OSはビルトインのVMライブラリを使っている状態だ。 この状態では、「コンパイラを自作してプログラムを動かせた」とは言えないので、時間と心の準備が整い次第、12章に取り組む所存だ。

その他の課題としては、「各章の成果物の最適化」、「テトリス開発」、「FPGAへの実装」などを考えたい。 やるべきことが沢山ありすぎて、どれから手をつけていいか…こういう状態を楽しみたい。

進展があり次第、また報告するのでよろしくです!

Nand2tetris 4章の感想

「Nand2tetris」について、4章の感想を書く。ちなみに執筆次点で6章まで完了している。 当初の目標通り、5章までは4月中に完遂できた。

下記図の赤枠で囲った該当箇所だ。(5章は次回に書く)

N2T_Map_04-05.png

4章 : 機械語

4章では、HackCPUの機械語仕様を学ぶ。 機械語はコンピュータアーキテクチャの上位にあたる概念だが、理解を深めるため本書では先に学ぶようだ。

先に機械語の仕様を学ぶことで、5章で作成するCPUがどのようにプログラムを処理するのかイメージしやすくなった。

Hack機械語はA命令、C命令の2種類からなる。 A命令は、Aレジスタに値をセットする命令で、C命令はALUによる演算指示コマンドだ。 今回は概略と感想がメインなので詳しくは延べないが、Hack機械語の仕様は下記サイトで確認できる。 https://www.nand2tetris.org/project04

本章のお題目としてHack仕様に基づいたアセンブリ言語でプログラムを作成することになる。

日頃、高水準言語(C言語)しか使ったことが無かったので、FOR文やIF文のありがたみを痛感した。これからはもっとC言語を敬いたい。(合掌)

N2T04_AssemblySample.png

Hackアセンブリ言語の鍵は、AコマンドとAレジスタを使いこなすことだろう。 ちなみに唐突に"Hack"という言葉が出てきたが、Hack とは本書で作成するコンピュータのアーキテクチャ名のことだ。

Hack仕様のAコマンドは、"@xxxx" の形式から成るコマンドで、用途はシンボル(変数)を表現、Aレジスタに値をセット、メモリアドレスの表現とHackアセンブリの肝となるコマンドだ。

演習

2つのプログラムをHackアセンブリ言語で作成することになった。

  • 乗算プログラム 指示されたメモリに格納された2つの数値を掛け算し、結果を指定されたメモリに格納するプログラム。HackCPUではCPU命令セットとして乗算が用意されていないので、プログラムで実装する必要がある。乗算はこのあと実装する高水準な言語の前哨戦といったところだろうか。 慣れないAコマンドの使い方はこの演習で学べる。 作成したプログラムは下記を参照してほしい。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/04/mult/Mult.asm

  • 入出力確認プログラム Hackにはキーボードとディスプレイという2つの仮想的なデバイスが接続されている。 キーボードから入力した文字をディスプレイに表示するプログラムを作成した。 この演習で「メモリマップ」という概念を学んだ。メモリアドレス空間の一部をデバイスに割り当てることで、デバイスとのやり取りを実現する仕組みだ。「メモリマップ」の概念を学んだことで、コンピュータに接続できるデバイス種類が自由自在に設計できる点と、デバイスドライバの仕組みが少し理解できた。 https://github.com/i-net-singularity/nand2tetris_projects/blob/main/04/fill/Fill.asm

Nand2tetris 3章までの感想

先日書いた「Nand2tetris」について、3章まで終わったので感想を書く。

ちなみに本書は大きく2つのパートで分かれている。1章~5章までのハードウェア構築と6章~12章のソフトウェア構築だ。

下記図の赤枠で囲った箇所が1章~3章だ。

N2T_Map_01-03.png

Nand2tetris 3章まで終えて

一言でいえば「面白い」だ。 今までの教科書は何だったのだろう…と思ったほど楽しく取り組めたし、理解が深まった。 シンプルかつ本質を追求した構成が功を奏していると思った。

模範解答が載っていないというのも良い点だ。 演習問題で試行錯誤を繰り返していくうちに、論理回路の動きを明瞭に捉えることができるようになった。

次章からは章ごとの要点や感想を書いていく。

1章 : ブール論理

猪木風に言えば、NANDがあればなんでもできる 誇張ではなく実際にそうなのだ。

NAND回路を出発点とし、AND/OR/NOT回路を構築し、それらを元に更に複雑な回路を作成してゆく。レゴブロックのように回路を積み上げていく感覚が堪らなく良い。

ここで作成した基本回路は、次章以降で繰り返し使うので重要だ。 「何に使うのだろう」という回路も、あとで使う。 その謎が解けたときは、まだ本書の序盤だというのに点が線になったようで感動した。

本書で取り上げられていない話題といえば、「NANDはどうやって作るのか」だ。 その疑問については、本サイトで以前取り上げた「NandGame」をやってみると何となくわかるはず。

NandGame https://nandgame.com/

2章 : ブール演算 と ALU作成

2章の要は "ALU" だ。 前章で作成した基本回路を使って、最終成果物として "ALU" を作成する。 "ALU" は、NandGameでも作っていたため、躓くことなく進められた。

ただし、序盤では "ALU" の真価を測り知ることができない。 「この演算にはどのような意味があるのか」という疑問が解けてゆくのは、4章以降なのだろう。今後が楽しみだ。

3章 : 順序回路と メモリ

順序回路とは、出力が過去の入力に依存する論理回路のことだ。ちなみに対義語として出力が過去の入力に依存しない論理回路のことを「組み合わせ回路」という。

順序回路ではDFF(D-フリップフロップ)をNAND回路に次ぐ2つ目の基本ユニットとしてレジスタやメモリの構築を進める。(ちなみに当然 DFF も NAND回路から作れる)

本書が画期的だと思った点(または欠点)は、DFF を基本ユニットとした点だ。そのおかげで、レジスタやメモリの仕組みに集中できた。

反面、DFF を基本ユニットとしたため、DFF の内部構造は本書では知ることができない。

DFF の内部動作については下記書籍の解説が詳しくてオススメ。

そして、3章で意外と苦戦したのはカウンターだ。 しかし、一度作ってしまえば、何でこれで苦戦していたのか分からないほど単純だった。素直にIF条件の順番で採用される信号を考えてマルチプレクサを繋げてゆくだけだった。

NandGame の CustomComponents を使って、本書と同様のカウンターを作成したので、何となく苦戦した雰囲気を感じてほしい。

N2T_pc.png

今後の予定

今後は、4章~5章の演習に取り組み、ハードウェア編を4月中に終わらせたい。 そしたら、ハードウェア編の総括を書きたい。

Nand2tetrisの紹介

Nand2tetris

最近巷では ChatGPT というAIが話題になっている。 これは、人間の会話を学習して人間のように会話をするAIである。 そして、実はここまでChatGPTが生成した文章である。

ここからは私(人間)がバトンタッチしよう。

私は最近 「もっと純粋にコンピュータサイエンスを楽しみたい」 と思った。

AIに対して、脅威やら何やら怯え過ぎだ。 新しい技術は今後も沢山でてくる。 であれば純粋に興味を持って楽しむのが良い生き方かと。

というわけで、最近興味を持ったのが、タイトルにある「Nand2tetris」だ。 これは『Nand回路を基本構成要素として最終的にテトリスを作ろう』、というコンセプトのオライリー本だ。 本のタイトルは「コンピュータシステムの理論と実装」

本の紹介文にはこんなことが書いてある。

コンピュータを理解するための最善の方法はゼロからコンピュータを作ることです。コンピュータの構成要素は、ハードウェア、ソフトウェア、コンパイラ、OSに大別できます。本書では、これらコンピュータの構成要素をひとつずつ組み立てます。 具体的には、NANDという電子素子からスタートし、論理ゲート、加算器、CPUを設計します。 そして、オペレーティングシステムコンパイラ、バーチャルマシンなどを実装しコンピュータを完成させて、最後にその上でアプリケーション(テトリスなど)を動作させます。

そんなことが400ページちょっとの本で解説可能なのかッ …というのが最初に抱いた感想。 試しに「Nand2tetris」で他の人の感想を調べてみると、とても手ごたえがある内容なようだ。なによりも自分の手でゼロから全てを作っていくというコンセプトが面白そうだ。

なぜ、「Nand2tetris」なのか

「Nand2tetris」を選んだ理由は、以下の通りだ。

  • NandGame や TruingComplete が元々大好き
  • コンピュータの低レイヤー部分をもっと理解したいという欲望
  • 純粋に好奇心

早速購入した

第1章では基本部品をNANDから作成する。 最近「NandGame」で遊んでいたので違和感なく取り組めた。 なによりも、テトリスを作るために使う基礎となるとモチベーションが高まる。

ちなみにこの記事を書いている時点で第1章を読み終えて課題も完遂したところだ。

演習問題

この本には章毎にプロジェクト(演習問題)が設定されている。 演習の問題の答えは載っていないので、用意されたツールを用い自分で考えて実装する必要がある。 「Nand2tetris」で検索すると、他の人の実装例もすぐに見つかる。 ただし、自分で理解し設計し実装できるようになるまでは他人の実装は見ないように心掛けたい。

内容については今後詳しく書いていくつもりだ。

NandGameのALUについて

概要

NandGame(https://nandgame.com/)の補足説明です。

NandGameは、最初に電気式リレー(現実世界はMOSトランジスタ)でNANDゲートを作り、NANDゲートを基礎として徐々に複雑なコンピュータを作るパズルゲームで、デジタルロジックとコンピュータアーキテクチャの基本を学べる。 そんな、NandGameがいつの間にかリニューアルされてたので、自分が気になるところをまとめた。

ALUについて

ALU(Arithmetic Logic Unit)とは

ALUは、コンピュータ(CPU)の演算を担う中心的なコンポーネント。 これまでの章で作ったセレクタや各種ユニットを組み合わせ様々な演算を実行できる。 よく出来た仕組みでとても面白いと思う。

NandGameのALU

NandGameのALUでは、5bitの命令を使って全部で32通りの演算が実行できる。 大まかに分類すると算術演算、論理演算、オペランド操作が実行できる。 とりあえず作ったALUの回路 ↓↓

nandgame/NandGame_ALU.png

ALUの入力信号

u

"u" は "unit" の略で、ALUが算術演算を実行するか(u=1)、論理演算を実行するか(u=0)を決定する制御信号。

op1,op2

"op1" と "op2" は、ALUに与えられる実行する演算を判別するビットフラグとして機能する。op1,op2 を使って4通りの演算が実行できる。

zx

"zx" は "zero extension" の略(多分)で、zx=1の場合、ALUはop1をゼロにセットする。zx=0の場合、op1 はそのまま使用される。

sw(swap): 入力操作数の入れ替え制御

"sw" は "swap" の略で、sw=1の場合、X と Y を入れ替える。 sw=0の場合、X と Y は入力値の通り使用される。"sw" があることでより柔軟な演算ができる。

ALUで実行できる演算

論理演算

表記 演算名 説明
X and Y 論理積 ビットごとのAND演算
X or Y 論理和 ビットごとのOR演算
X xor Y 排他的論理和 ビットごとのXOR演算
invert X 否定 ビットごとのNOT(否定)演算

算術演算

表記 演算名 説明
X + Y 加算 2つの操作数(op1とop2)の加算
X - Y 減算 2つの操作数(op1とop2)の減算
減算は、2の補数表現を利用して、引き算を加算で計算する
X + 1 インクリメント op1 + 1 を実行する
X - 1 デクリメント op1 -1 を実行する

ALUの出力

Output

実行された演算結果(16bit)が出力される。 加算、減算、論理演算、シフト演算など、入力信号とオペランドの値に基づいて計算された値が出力される。

ALUの回路構成

リニューアルに伴いALUの内部構成がユニットごとに分かりやすくなった。 NandGameでのALU回路構成は、下記要素から成り立っている。

オペランド入れ替え

「sw」の入力値に応じて、オペランド「X」「Y」の値が切り替わるようにする

ゼロ置換

「zx」の入力値に応じて、「0」と オペランド(X,Y 入れ替え後の結果)が切り替わるように作成

算術演算ユニット(Arithmetic Unit)

このユニットは前問題で作成したユニットを利用する。 入力値は「zx」「sw」の効果を反映したオペランドを使う

論理演算ユニット(Logic unit)

このユニットは前問題で作成したユニットを利用する。 入力値は「zx」「sw」の効果を反映したオペランドを使う

最後のセレクタ

「u」の値に応じて、求められている演算が採用されるように配線する。

まとめ

NandGameのALUはとても単純だけど、基本的な仕組みを学ぶのに丁度良い。ALUのオペランドのデータ型やパラメータ入力bitを増やせば、より複雑な演算が実現できることが容易に想像できる。また ALU を理解しないと、後々のProcessor構築で確実に行き詰まるので確実に理解したい。

対数の微分

自然対数の微分

自然対数の微分TeX記法 の練習がてらブログにメモります。
またこの記事は、VisualStudioCodeで作成&投稿しました。
思ったより使いやすく気に入りました。

問題

f(x)=log_ex微分し、f'(x) を求めよ。

解答

 \displaystyle{
f'(x) = \frac{1}{x}
}

上記公式に見覚えはありますか?
学生時代は公式だけ覚えて終わりましたが、今回は証明という形で過程を追いました。

証明

証明は幾つかありますが、自分が一番好きな奴で。

STEP.1 : 導関数の公式に当てはめる

 \displaystyle{
\begin{alignedat}{2}
f'(x) &= \lim_{h\to0}\frac{log_e(x+h)-log_ex}{h}
\end{alignedat}
}
  • 解説:hが限りなく0に近づいた場合の、f(x+h)とf(x)の2点間の傾きを求めている。

STEP.2 : 対数の公式を駆使して\logを変形する

 \displaystyle{
\begin{alignedat}{2}
f'(x) &= \lim_{h\to0}\frac{1}{h}(log_e(x+h)-log_ex)\\
      &= \lim_{h\to0}\frac{1}{h}log_e\frac{x+h}{x} & \cdots(1)\\
      &= \lim_{h\to0}log_e(\frac{x+h}{x})^\frac{1}{h} & \cdots(2)\\
      &= \lim_{h\to0}log_e(\frac{x}{x}+\frac{h}{x})^\frac{1}{h}\\
      &= \lim_{h\to0}log_e(1+\frac{h}{x})^\frac{1}{h}\\
\end{alignedat}
}

(1)について

対数の公式を利用

 \displaystyle{
\log_aX-\log_aY = \log_a\frac{X}{Y}
}

(2)について

対数の公式を利用

 \displaystyle{
Y\cdot\log_aX = \log_aX^Y
}

STEP.3 : 更なる式整形のため x に活躍いただく

 \displaystyle{
\begin{alignedat}{2}
 f'(x) &= \lim_{h\to0}x\cdot\frac{1}{x}\cdot\log_e(1+\frac{h}{x})^\frac{1}{h} & \cdots(3)\\
       &= \lim_{h\to0}\frac{1}{x}\cdot\log_e(1+\frac{h}{x})^\frac{x}{h}
\end{alignedat}
}

(3)について

ネイピア数の定義式に変形するための操作。
x\cdot\frac{1}{x}=1 なので等式は成り立つ。
自分が一番好きな過程です。

STEP.4 : ネイピア数eの定義に当てはめる

ネイピア数eの定義が下記であることを利用する。

 \displaystyle{
\begin{alignedat}{2}
e &= \lim_{t\to0}(1+t)^\frac{1}{t}
\end{alignedat}
}

ここで、 \frac{h}{x}=t とおくと変形中の式は下記になる。

 \displaystyle{
\begin{alignedat}{2}
f'(x) &= \lim_{t\to0}\frac{1}{x}\cdot\log_e(1+t)^\frac{1}{t}\\
      &= \frac{1}{x}\cdot\log_ee\\
      &= \frac{1}{x}\cdot1\\
      &= \frac{1}{x}
\end{alignedat}
}

\therefore f(x)=\log_ex の場合は、f'(x) = \frac{1}{x} となる。

めでたし、めでたし

【本の紹介】最近読んだお勧めの本

こんにちは、こんばんは。

Qtum です。

久々の更新です。
日常がバタバタしていて更新できませんでした。

今日は最近読んだお勧めの本を紹介します。
これから何を考えてどのように生きるべきか道しるべとなりました。

LIFE 3.0

マックス・テグマーク著

まず LIFE3.0 とは何か?から始まります。

この本では、年々着実に進化する A.I が我々人類にどのように関係していくか語られています。 著者は物理学者なので、A.Iは遅かれ早かれ人類の知能を超えて、やがて物理学が許容する限界に行きつくだろうと言っています。

そしてここが一番重要なところですが、人類の知能を超える A.I が現れた際、A.Iが脅威的な存在とならぬように我々は今すぐ準備を始めるべきだと軽快な語り口で問いかけています。

今後生命のたどる運命について考える切っ掛けになりました。

21Lessons 21世紀の人類の為の21の思考

ユヴァル・ノア・ハラリ著

鬼才ハラリ氏によるサピエンス全史、ホモデウスにつづく待望の第3作目です。

この本は、「今」「何が問題で」「どのように解釈し」「どのように対処していくべきか」について、21の章で語られています。 ハリル氏ならではの深い考察がなされ読み進めるたびに鳥肌が立ちます。

いきなりこの本を読んでも良いですが、サピエンス全史ホモデウスを読んでおくと、より深く受け入れられると思います。 未来に漠然と不安を抱いている方にこそお勧めしたい本です。