yagibrary

あだ名のやぎと図書館のlibraryを組み合わせてyagibraryです。本から学んだことをみなさんに紹介します。

【和訳】【Computer Systems - A Programmer's Perspective 3rd edition】2.1.1 Hexadecimal Notation

第2章 情報の表現と操作

現代のコンピュータは、2値の信号として表された情報を格納および処理します。これらの質素な2進数、またはビットは、デジタル革命の基礎を形成しています。馴染みのある10進数、または基数10の表現は、1,000年以上前から使用されており、インドで開発され、12世紀にアラブの数学者によって改良され、13世紀にはイタリアの数学者レオナルド・ピサーノ(約1170年から約1250年)によって西洋にもたらされました。フィボナッチとして知られています。10本の指を持つ人間にとって10進数表記を使用するのは自然ですが、情報を格納および処理する機械を構築する際には2進数がより効果的です。2値信号は簡単に表現、格納、および転送できます。たとえば、パンチカードの穴の有無、ワイヤ上の高いまたは低い電圧、または時計回りまたは反時計回りに向いた磁区などです。2値信号上での情報の格納および計算を行う電子回路は非常にシンプルで信頼性があり、製造業者はこれらの回路を単一のシリコンチップ上に数百万、あるいは数十億個も統合できます。


単独では、1ビットはあまり有用ではありません。ただし、ビットをグループ化し、さまざまな可能なビットパターンに意味を与える解釈を適用すると、任意の有限集合の要素を表すことができます。たとえば、2進数を使用して、ビットのグループを使用して非負の数をエンコードできます。標準の文字コードを使用することで、ドキュメント内の文字や記号をエンコードできます。この章では、これらのエンコーディングとともに、負の数を表すためのエンコーディングや実数を近似するためのエンコーディングについても説明します。


私たちは数字の3つの最も重要な表現を考えます。符号なしエンコーディングは、従来の2進数表記に基づいており、0以上の数を表します。2の補数エンコーディングは、符号付き整数、つまり正または負である可能性がある数を表す最も一般的な方法です。浮動小数エンコーディングは、実数を表現するための科学的な表記の2進数版です。コンピュータは、これらの異なる表現に対して、整数や実数に対する対応する操作と同様に、加算や乗算などの算術演算を実装します。


コンピュータの表現は、数をエンコードするために限られたビット数を使用しており、したがって、一部の操作は結果が表現できる範囲を超えるとオーバーフローする可能性があります。これは予想外の結果を引き起こすことがあります。たとえば、今日のほとんどのコンピュータ(int型のデータに32ビットの表現を使用しているもの)では、次の式

200 * 300 * 400 * 500

を計算すると、結果は -884,901,888 になります。これは整数演算の特性とは逆に、一連の正の数の積を計算すると負の結果が得られることを示しています。


一方で、整数のコンピュータ演算は真の整数演算の多くの一般的な性質を満たします。たとえば、乗算は結合法則と交換法則を満たすため、次のいずれかのC式を計算すると、結果は-884,901,888になります:

コンピュータは期待される結果を生成しないかもしれませんが、少なくとも一貫性があります!


浮動小数点演算にはまったく異なる数学的な性質があります。一連の正の数の積は常に正であり、ただしオーバーフローが特別な値+∞を生成します。有限精度の表現のため、浮動小数点演算は結合法則を持っていません。例えば、Cの式 (3.14+1e20)-1e20 はほとんどのマシンで 0.0 に評価されますが、3.14+(1e20-1e20) は 3.14 に評価されます。整数演算と浮動小数点演算の異なる数学的性質は、それらの表現の有限性の扱いの違いから生じています。整数の表現は比較的小さな値の範囲を正確にエンコードできますが、浮動小数点の表現は広範囲の値をおおよそしかエンコードできません。


実際の数値表現を学ぶことで、表現できる値の範囲と異なる算術演算の性質を理解できます。この理解は、数値の全範囲で正確に動作し、異なる機械、オペレーティングシステムコンパイラの組み合わせにわたって移植可能なプログラムを書く上で重要です。説明するように、コンピュータの算術の微妙な点のためにいくつかのセキュリティの脆弱性が生じています。以前の時代では、プログラムのバグはトリガーされたときにだけ人々に不便をかけるものでしたが、今ではハッカーが見つけたバグを悪用して他の人のシステムに不正アクセスを試みる軍団がいます。これにより、プログラマにはプログラムがどのように動作し、望ましくない方法で振る舞うようにできるかを理解する責任が高まっています。


コンピュータは、数値をエンコードするために複数の異なるバイナリ表現を使用しています。第3章で機械レベルのプログラミングに進む際に、これらの表現に精通している必要があります。この章ではこれらのエンコーディングを説明し、数値表現についての推論方法を示します。


私たちは数値のビットレベル表現を直接操作することによって算術演算を行ういくつかの方法を導出します。これらのテクニックを理解することは、コンパイラが算術式の評価のパフォーマンスを最適化しようとする際に生成される機械レベルのコードを理解する上で重要です。


この教材の取り扱いは、数学の基本的な原則の中核に基づいています。エンコーディングの基本的な定義から始め、表現可能な数値の範囲、ビットレベルの表現、および算術演算の性質などのプロパティを導出します。より抽象的な観点からこの教材を検討することは重要だと考えています。なぜなら、プログラマはコンピュータの算術がより馴染み深い整数および実数の算術と関連している方法を明確に理解している必要があるからです。


C++プログラミング言語は、同じ数値表現と操作を使用してCに基づいて構築されています。この章で述べられているCに関するすべてのことは、C++にも当てはまります。一方で、Java言語定義は、数値表現と操作の新しい標準セットを作成しました。Cの標準はさまざまな実装を許容するように設計されていますが、Javaの標準はデータのフォーマットとエンコーディングについて非常に具体的です。この章では、Javaがサポートする表現と操作をいくつかの場所で強調します。


余談 この章の読み方
この章では、コンピュータ上で数値や他の形式のデータがどのように表現され、コンピュータがこれらのデータに対して行う操作の基本的な特性を検討します。これには数学の言葉に入り、数式や方程式を書き、重要な特性の導出を示す必要があります。


この説明を理解するのに役立つように、プレゼンテーションを構造化して、まず数学的な表記で原則を述べます。その後、例と非形式的な議論でこの原則を説明します。原則の説明と例との間を行ったり来たりすることをお勧めします。より複雑な特性に対しては、数学的な証明のように構造化された導出も提供しています。これらの導出を最終的に理解しようとする努力が必要ですが、最初の読み取り時にはスキップしても構いません。


また、プレゼンテーションを進める中で練習問題に取り組むことをお勧めします。練習問題に取り組むことで、アクティブな学習が促進され、考えを実践に移すのに役立ちます。これらが背景となっていれば、導出の追跡がはるかに容易になるでしょう。また、この素材を理解するために必要な数学のスキルは、高校の代数をしっかり理解している人にとっては手の届く範囲にあります。

2.1 情報の記憶

メモリ内の個々のビットにアクセスする代わりに、ほとんどのコンピュータはメモリの最小のアドレス指定可能な単位として8ビット、またはバイトを使用しています。マシンレベルのプログラムでは、メモリを非常に大きなバイトの配列として表示し、これを仮想メモリと呼んでいます。メモリの各バイトは、そのアドレスとして知られる一意の番号で識別され、すべての可能なアドレスの集合は仮想アドレス空間として知られています。その名前が示すように、この仮想アドレス空間は単なる概念的なイメージであり、実際の実装(第9章で説明)では、動的ランダムアクセスメモリ(DRAM)、フラッシュメモリ、ディスクストレージ、特別なハードウェア、およびオペレーティングシステムソフトウェアの組み合わせを使用して、プログラムに見えるのは一枚のモノリシックな*1バイトの配列です。


次の章では、コンパイラとランタイムシステムがこのメモリスペースをより管理しやすい単位に分割して、プログラムの異なるオブジェクト、つまりプログラムデータ、命令、および制御情報を保存するかを説明します。さまざまなメカニズムがプログラムの異なる部分に対するストレージの割り当てと管理に使用されます。この管理はすべて仮想アドレススペース内で実行されます。たとえば、C言語のポインタの値は、整数、構造体、または他のプログラムオブジェクトを指しているかにかかわらず、あるブロックの最初のバイトの仮想アドレスです。Cコンパイラはまた、各ポインタに型情報を関連付けているため、その値の型に応じてポインタが指定する場所の値にアクセスするための異なる機械レベルのコードを生成できます。Cコンパイラはこの型情報を維持していますが、実際の機械レベルのプログラムはデータ型に関する情報を持っていません。それは単に各プログラムオブジェクトをバイトのブロックとして、プログラム自体をバイトのシーケンスとして扱います。


余談 C言語の進化

P40の余談に記述されている通り、Cプログラミング言語は最初、Unixオペレーティングシステム(同じくベル研究所で開発された)向けに、ベル研究所デニス・リッチーによって開発されました。当時、ほとんどのシステムプログラム(オペレーティングシステムなど)は、さまざまなデータ型の低レベル表現にアクセスするために、主にアセンブリコードで書かれなければなりませんでした。例えば、当時の他の高級言語では、mallocライブラリ関数で提供されているようなメモリアロケータを書くことは実現不可能でした。


Cの元となるベル研究所版は、Brian KernighanとDennis Ritchieによる最初の版で文書化されました[60]。その後、Cはいくつかの標準化グループの努力を経て進化しました。元のベル研究所Cの大きな改訂は、1989年にアメリカ国家規格協会(ANSI)の傘下で作業していたグループによってANSI C標準につながりました。ANSI Cはベル研究所Cから大きく進化しており、特に関数が宣言される方法が異なります。ANSI Cについては、KernighanとRitchieの書籍の第2版[61]で説明されており、今でもCに関する最高の参照資料の一つと見なされています。


国際標準化機構(ISO)は、C言語の標準化の責任を引き継ぎ、1990年にANSI Cとほぼ同じバージョンを採用したため、「ISO C90」と呼ばれています。


この同じ組織は、1999年に言語を更新し、「ISO C99」となりました。このバージョンでは、新しいデータ型が導入され、英語にはない文字が必要なテキスト文字列をサポートしました。2011年に承認された最新の標準は「ISO C11」と呼ばれ、再びさらなるデータ型や機能が追加されました。これらの最近の追加のほとんどは後方互換性があり、以前の標準に従って書かれたプログラム(少なくともISO C90まで)は、新しい標準に従ってコンパイルされた場合に同じ動作をします。



GNU Compiler Collection(gcc)は、異なるコマンドラインオプションに基づいて、C言語のいくつかの異なるバージョンの規約に従ってプログラムをコンパイルできます(図2.1を参照)。たとえば、プログラムprog.cをISO C11に従ってコンパイルするには、次のコマンドラインを使用できます。

linux> gcc -std=c11 prog.c

オプション-ansiおよび-std=c89は同じ効果を持っています。コードはANSIまたはISO C90規格に従ってコンパイルされます(C90はその標準化の試みが1989年に始まったため、「C89」とも呼ばれます)。オプション-std=c99は、コンパイラにISO C99の規約に従うように指示します。


この本の執筆時点では、オプションが指定されていない場合、プログラムはISO C90に基づくCのバージョンに従ってコンパイルされますが、一部はC99、一部はC11、一部はC++、およびgcc固有の他の機能も含まれています。GNUプロジェクトは、ISO C11に他の機能を組み合わせたバージョンを開発しており、これはコマンドラインオプション-std=gnu11で指定できます(現時点では、この実装は未完成です)。これがデフォルトのバージョンになります。

図2.1 gccに異なるCのバージョンを指定する方法


Cは初めてですか? Cでのポインタの役割

ポインタはC言語の中核的な特徴です。これらは、データ構造や配列の要素への参照を可能にします。変数と同様に、ポインタには2つの側面があります:その値とその型です。値はあるオブジェクトの場所を示し、その型はその場所に格納されているオブジェクトの種類を示します(たとえば、整数または浮動小数点数など)。


ポインタを真に理解するには、その表現と機械レベルでの実装を調査する必要があります。これは第3章での主要な焦点となり、3.10.1節で詳細に説明されます。

2.1.1 十六進法表記

1 バイトは 8 ビットから成り立っています。2 進法表記では、その値は 00000000(2 進法)から 11111111(2 進法)までの範囲を持ちます。10 進法の整数として見ると、その値は 0 から 255 までの範囲を持ちます。どちらの表記もビットパターンを記述するのにはあまり適していません。2 進法表記は冗長すぎますし、10 進法表記ではビットパターンへの変換とビットパターンからの変換が煩雑です。その代わりに、ビットパターンを 16 進法(または単に「hex」と呼びます)の数字として書きます。16 進法は、‘0’ から ‘9’ までの数字と、‘A’ から ‘F’ までの文字を使用して、16 の可能な値を表します。図 2.2 は、16 進法の 16 の数字に関連する 10 進法と 2 進法の値を示しています。16 進法で書かれた場合、1 バイトの値は 00 から FF までの範囲を持ちます。

図2.2 16進法表記。各16進数の桁が16の値のうちの1つをエンコードします。

C言語では、0xまたは0Xで始まる数値定数は16進法と解釈されます。文字'A'から'F'は大文字でも小文字でも書くことができます。例えば、数字16進数のFA1D37Bは、0xFA1D37B、0xfa1d37b、または大文字と小文字を混在させて書くこともできます(例: 0xFa1D37b)。本書では16進法の値を表すためにCの表記法を使用します。



マシンレベルのプログラムでよく行われるタスクの一つは、ビットパターンの10進法、2進法、および16進法の表現を手動で変換することです。2進法と16進法の変換は比較的簡単で、1つの16進数の桁ずつ変換できます。図2.2に示されているようなチャートを参照して桁を変換できます。変換を頭で行うための簡単なテクニックとして、16進数の桁A、C、およびFの10進法の対応を覚えておくことがあります。16進法の値B、D、およびEは、最初の3つとの相対的な値を計算して10進法に変換できます。


例えば、数値が0x173A4Cと与えられた場合、各16進数の桁を拡張して2進数形式に変換できます。以下がその例です:

これにより、2進数の表現が000101110011101001001100となります。


逆に、2進数の1111001010110110110011を16進数に変換するには、まず4ビットごとにグループに分割します。ただし、合計ビット数が4の倍数でない場合は、左端のグループが4ビット未満となるようにし、効果的に先頭にゼロを埋め込みます。次に、各ビットグループを対応する16進数の数字に変換します:



値 x が 2 の冪であるとき、つまり x = 2^n(ここで n は非負整数)の場合、x を16進数形式で簡単に書くことができます。なぜなら、x のバイナリ表現は単に 1 の後に n 個のゼロが続くだけだからです。16進数の桁 0 は、4 つのバイナリゼロを表します。したがって、n を i + 4j の形で書くと(ここで 0 ≤ i ≤ 3)、x は、先頭に 1(i = 0)、2(i = 1)、4(i = 2)、または 8(i = 3)を付けた後に j 個の16進数の 0 が続く形で書くことができます。例として、x = 2,048 = 2^11 では、n = 11 = 3 + 4 . 2 となり、16進数表現は 0x800 です。




10進数と16進数の表現との変換は、一般的なケースを処理するために乗除算を使用する必要があります。10進数の数 x を16進数に変換するには、x を16で繰り返し割り、商 q と余り r を得ます(x = q . 16 + r)。そして、r を表す16進数の桁を最下位桁として使用し、q に対して同じプロセスを繰り返して残りの桁を生成します。例として、10進数の 314,156 を変換する場合を考えてみましょう。

この結果から、16進数の表現は0x4CB2Cと読み取ることができます。


逆に、16進数を10進数に変換するためには、各々の16進数の桁を16の適切な累乗で掛け算します。例えば、数字が0x7AFの場合、その10進数の等価値は、7 * 16^2 + 10 * 16^1 + 15 = 7 * 256 + 10 * 16 + 15 = 1,792 + 160 + 15 = 1,967 と計算できます。




余談 10進数と16進数の変換

10進数と16進数の間で大きな値を変換する際は、コンピュータや電卓に作業を任せるのが最善です。これを行うための多くのツールがあります。標準の検索エンジンを使用する一つの簡単な方法は、以下のようなクエリを入力することです。

「Convert 0xabcd to decimal」
または
「123 in hex」


*1: monolithic:一枚岩のような

【「40歳の壁」をスルッと超える人生戦略】第2章 40歳からの幸せをつくる「自分業」

第2章 40歳からの幸せをつくる「自分業」

幸せな人生の土台となる3つの要素

まず、「幸せな人生には、どんな要素が必要か?」を分解してみたら、次の3つの要素が見えてきました。

  • お金(収入・資産)
  • つながり(家族・友人・知人)
  • 健康(体力・認知力)
① お金

多くの人は、金銭的な不安から解放されて、自由な人生を歩むために「お金がほしい」と思っています。つまり、本当はお金がほしいのではなく、自由な選択ができる状態がほしいということです。


私たちは、自分の時間や能力(人的資本)を労働力として提供することで、お金を得ています。しかし、労働力だけでお金を得ている場合、定年や加齢によって、入ってくるお金はいつかなくなってしまいます。


ということは、労働力だけで得ている「お金」はいつか消えると考えて、お金と向き合う必要があるのです。

  • 生涯現役で働く。
  • お金が入る仕組みを持つ。


40歳以降は、この2つの方法でお金が入る経路をつくることを考えていきます。

② つながり

『幸福の資本論』(橘玲著、ダイヤモンド社刊)という本に、つながりとは社会資本(家族や友人を含む人間関係)であり、幸福を考えるうえで一番重要であるといったことが書いてあります。


頭の中に、すぐに連絡が取れる10人を思い浮かべてみてください。ここ数年で知り合った人が2人以下という人は、人間関係が固定化されやすいタイプ。年を取ると、減ることはあっても、増えにくい可能性大です。そんな人は、いろいろな人に会う機会を意識的につくることが大切です。

③ 健康
  • カラダ元気
  • ココロ(アタマ)元気


健康とは、この2つを満たしているということです。


決まった時間に出かける、人と会う、思考力を使うことをルーチンとして日々に組み込んでおくことは、40歳以降の人生を幸せに生きるために大切です。

「定年を迎えない人生」を送るには

私たちが今後も継続できて、長期スパンで人生に関わり、お金、つながり、健康を維持できることは何でしょうか?


そう!仕事です。仕事をやめず、生涯現役で働くことを視野に入れるのです。


ちなみに、ここでいう「仕事をやめない」とは、「会社を辞めない」という意味ではありません。会社員の看板を外しても継続して仕事ができるように、40代から少しずつ行動をしていくのです。「定年を迎えない人生」をキャリアとして描く。

40代からは自分でキャリアをデザインする

アラフォーからのキャリアは、仕事に合わせて人生を変えるのではなく(望まない転勤や単身赴任など)、人生に合わせて仕事をデザインする(転勤したくないなら、その準備をしておく)。これが大事です。

仕事をやめない人生を設計する

  1. お金
  2. つながり
  3. 健康


あなたの今の①お金、②つながり、③健康について書き込んでみてください。

40歳からの「自分業」を始めてみる

40歳からは、健康は減っていくこと、つながりはメンテナンスが必要であること、この2つを常に意識していくことが大事です。


「お金」「つながり」「健康」の3つの要素を満たすことができ、かつやりがいを持って取り組める「仕事」のことを、この本では「自分業」と呼びます。


【自分業の定義】

  • お金・つながり・健康の3つの要素を満たす仕事。
  • やりがいが持てる仕事。
  • 自分が裁量権(コントロール権)を持てる仕事。


まず、自分がこれまでにやってきた仕事を書き出して、「お金」「つながり」「健康」を満たしていたのか?を振り返ってみるのです。


○△×をつけるだけで、今後、自分がどこを強化する必要があるのか気づくことができます。


そして、気づいたらやることは、「お金」「つながり」「健康」の3つが重なるところに「仕事の種」をまくための、小さな試行錯誤をしてみることです。

もう1つ仕事を持つことのメリット

本業以外に「自分業」を持つと、2つの効果があります。


1つ目は人生のリスクヘッジになる点です。


2つ目は、将来への種まきになる点です。

【「40歳の壁」をスルッと超える人生戦略】第1章 「40歳の壁」の正体

第1章 「40歳の壁」の正体

みんな「四十にして惑う」

中年期の危機「ミッドライフクライシス」

人は40歳くらいまでは、新しい感覚や知識を得ることを軸に発達していきます。だいたい40歳で成長のピークを迎えます。


それ以降は発達の流れが変わります。人生の終着点に向かった発達に変化し、次世代を担う人たちに、持っているものを渡し始めるのです。


「得る」から「減らす」へと変わる時期。今までとは、発達の潮目が変わる時期。

人生100年時代、誰もが壁にぶつかる

人生100年時代は、人生が長い分、多くの人がさまざまな壁にぶち当たります。


「まだ、これからの道を選び直すことができるかも」という期待と、「選んで失敗すると積み上げてきたものが消えてしまうのでは」という不安が入り交じる分岐点。そこに立ちはだかるのが「40歳の壁」です。

「40歳の壁」は早くぶつかるが勝ち

人によっては、30代で早めの転職を選択する人もいれば、40代後半で転機を迎える人もいると思います。ただ、共通していえるのが、キャリアの転機のタイミングが65歳(定年)で来るより、アラフォー(「40歳の壁」にぶつかる時期)で来るほうが格段に良いということです。


「体力がある」「知力がある」「うまくいかなくてもやり直せる」、この3点がそろうのは「40歳 \pm5歳」ではないでしょうか。


自分の不安・不満や、足りないところを見ずにやり過ごそうと思えば、いろいろな言い訳ができます。


しかし、そこで「40歳の壁」の存在に気づき、立ち止まったり、登ったり、すり抜けたりして、自分の価値観と対峙した人は強いものです。

第二の職業人生をどう歩むか

人生100年時代の今は、誰もが必ず「40歳の壁」にぶつかります。そして、その「40歳の壁」と向かい合うとき、「第二の職業人生を考える」という課題も一緒についてきます。

「40歳の壁」にぶつかるもう1つの理由

ケインズという有名な経済学者がいます。彼は、論文でこんなことを書いています。


将来、技術の発展によって、人のほしい物はすべてつくられ、人の仕事がなくなる時代が来る。しかし、社会システムによって、人間は長年仕事をするようにしつけられてきている。そのため、凡人ほど「暇な時間をどう使うか」に困るようになる。


多くのモノやコトも、0を1にする時代は、ほぼ終わりが来ている。こねくり回して、100を101にすることに労力が使われています。


現在、多くの人が「40歳の壁」を感じてる理由は、「人生100年時代」だけではありません。もう1つの理由は、私たちの働き方に限界が来ているから、ともいえます。


著者は、人生の後半戦こそ、主体的に幸せを感じることを追求してみる、やりがいを感じる仕事を選んでいくことが大切だと考えています。

「40歳の壁」に潜む「子育ての壁」と「夫婦関係の壁」

人によっては、「40歳の壁」の中に「子育ての壁」と「夫婦関係の壁」も潜んでいて、問題が複雑化していることが多くあります。

「子育ての壁」—保育園児と小1の違い—

小学校の学業にまつわるフォローは、子どもがどこまでできているかを大人が継続的に観察する必要があり、外注やルーチン化が困難になってきます。

「夫婦関係の壁」—モラトリアムを意識する—

「40歳の壁」にぶつかるのは、結婚してから10年前後。いろいろな悩みが小さな「石」となり、積み重なってできてくるのが「夫婦関係の壁」です。


小さな「石」とは、価値観のすれ違い、子育ての方針の違い、家事育児分担の不満、それらを解決せずに放置した違和感やズレなどです。


各家庭によって石の種類、壁の高さや厚さも違いますが、アラフォーともなれば一緒に過ごした時間に比例して、石が積み重なって壁となり、存在感も増してきているはずです。


特に子どもがいる家庭は、石の発生確率が、夫婦2人の時期と比べて圧倒的に多いです。


夫婦で、石の発生にどう対峙したかは、その後の夫婦関係にも大きく響いてきます。


仕事、子育て、日々の生活に追われ、オムツを替えながら、宿題を見ながら、生ゴミを捨てる生活を送りながら、現在進行形で「緊急でない重要なこと」を「今」考えて話すのがつらいのよ。


それなら「今」は、石を細かく取り除き「夫婦関係の壁」の巨大化を防ぎながら、夫婦関係の方向性を見つけるための情報収集期間(モラトリアム)にしたらいいのではないでしょうか。

【「40歳の壁」をスルッと超える人生戦略】はじめに 残りの人生も今の積み重ねでいい?

はじめに

40代になり、家族もいて、今さら大きな変化は起こせない。家事・育児・仕事をしていると、毎日があっという間に過ぎていく。でも、どこか不安で自分の人生の意味を問い直さずにはいられなくなる。


著者が母と同じアラフォーになって実感したのは、40歳の母が感じていたであろう「えもいわれぬモヤモヤした気持ち」が、自分の中にもあるという事実だったそう。


「残りの人生も今の積み重ねでいい?満足している?」


この本は、40歳前後で多くの人が感じるこの「モヤモヤ感」、つまり「40歳の壁」の正体を分解しながら、自分らしく生きるために「人生の後半戦をどうデザインしていくか?」を考えるためのものです。


大事なのは「主体的に」「どうやって」「人生の後半戦を生きるか」という点です。


【サピエンス全史 上下合本版 文明の構造と人類の幸福】第2章 虚構が協力を可能にした その2 ゲノムを迂回する

言葉を使って想像上の現実を生み出す能力のおかげで、大勢の見知らぬ人どうしが効果的に協力できるようになった。だが、その恩恵はそれにとどまらなかった。人間どうしの大規模な協力は神話に基づいているので、人々の協力の仕方は、その神話を変えること、つまり別の物語を語ることによって、変更可能なのだ。


このように、認知革命以降、ホモ・サピエンスは必要性の変化に応じて迅速に振る舞いを改めることが可能になった。これにより、文化の進化に追い越し車線ができ、遺伝進化の交通渋滞を迂回する道が開けた。


他の社会的な動物の行動は、遺伝子によっておおむね決まっている。一般に、遺伝子の突然変異なしには、社会的行動の重大な変化は起こりえない。


それと同じような理由で、太古の人類は革命はいっさい起きなかった。私たちの知るかぎりでは、社会的パターンにおける変化や、新しい技術の発明、馴染みのない生息環境への移住は、文化に主導されてではなく、遺伝子の突然変異や環境の圧力によって起こった。


それとは対照的に、サピエンスは認知革命以降、自らの振る舞いを素早く変えられるようになり、遺伝子や環境の変化をまったく必要とせずに、新しい行動を後の世代へと伝えていった。


言い換えれば、太古の人類の行動パターンが何万年間も不変だったのに対して、サピエンスは社会構造、対人関係の性質、経済活動、その他多くの行動を10年あるいは20年のうちに一変させることができた。


これこそがサピエンスの成功のカギだった。


私たちはネアンデルタール人の頭の中に入り込んで彼らの思考方法を理解することはできないものの、ライバルのサピエンスと比べたときに、彼らの認知的能力の限界を示す間接的な証拠はある。


交易は、虚構の基盤を必要としない、とても実際的な活動に見える。ところが、交易を行なう動物は、じつはサピエンス以外にはなく、詳しい証拠が得られているサピエンスの交易ネットワークはすべて虚構に基づいていた。


もしそのような虚構を信じている太古のサピエンスが貝殻と黒曜石を交換していたとしたら、情報も交換して、ネアンデルタール人ら、他の太古の人類のものよりも格段に濃密で広範なネットワークを生み出せたと考えるのは理に適っている。

狩猟の技術も、こうした違いを浮かび上がらせてくれる。ネアンデルタール人はたいてい単独で、あるいは小さな集団で狩りをした。一方サピエンスは、何十人もの協力、ことによると異なる生活集団間の協力にさえ頼る技術を開発した。


そして、サピエンスはたとえ初戦を落としても、たちまち新しい戦略を編み出し、次の戦いに勝利を収めることができた。

【サピエンス全史 上下合本版 文明の構造と人類の幸福】第2章 虚構が協力を可能にした その1 プジョー伝説

プジョー伝説

私たちの近縁であるチンパンジーはたいてい、数十頭で小さな群れを成して暮らしている。最も有力なチンパンジー(ほぼ確実にオス)は「アルファオス」と呼ばれる。


アルファの座をめぐって二頭のオスが争っているときにはたいてい、集団の中のオスとメスの両方の支持者を集めて広範な連合を形成して競い合う。アルファオスはたいてい、競争相手よりも身体的に強いからではなく、大きくて安定した連合を率いているから、その地位を勝ち取れる。こうした連合は、アルファの地位をめぐる表立った争いの間だけでなく、日常のほぼすべての活動でも主要な役割を果たす。


このような形で組織し、維持できる集団の大きさには明確な限界がある。一つの集団がうまく機能するには、成員全員が互いを親しく知らなければならない。


同様のパターンが、太古のホモ・サピエンスも含めた初期の人類の社会生活にも、おそらく浸透していただろう。人類の社会的本能も、小さくて親密な集団にしか適応していなかった。


認知革命の結果、ホモ・サピエンスは噂話の助けを得て、より大きくて安定した集団を形成した。だが、噂話にも自ずと限界がある。社会学の研究からは、噂話によってまとまっている集団の「自然な」大きさの上限がおよそ150人であることがわかっている。


今日でさえ、人間の組織の規模には、150人という魔法の数字がおおよその限度として当てはまる。この限界値以下であれば、コミュニティや企業、社会的ネットワーク、軍の部隊は、互いに親密に知り合い、噂話をするという関係に主に基づいて、組織を維持できる。


だが、いったん150人という限界値を超えると、もう物事はそのようには進まなくなる。


では、ホモ・サピエンスはどうやってこの重大な限界を乗り越え、何万もの住民から成る都市や、何億もの民を支配する帝国を最終的に築いたのだろう?その秘密はおそらく、虚構の登場にある。厖大な数の見知らぬ人どうしも、共通の神話を信じることによって、首尾良く協力できるのだ。


近代国家にせよ、中世の教会組織にせよ、古代の都市にせよ、太古の部族にせよ、人間の大規模な協力体制は何であれ、人々の集合的想像の中にのみ存在する共通の神話に根差している。


とはいえこれらのうち、人々が創作して語り合う物語の外に存在しているものは一つとしてない。宇宙に神は一人もおらず、人類の共通の想像の中以外には、国民も、お金も、人権も、法律も、正義も存在しない。


「原始的な人々」は死者の霊や精霊の存在を信じるなどして、社会的秩序を強固にしていることを、私たちは簡単に理解できる。だが、現代の制度がそれとまったく同じ基盤に依って機能していることを、私たちは十分理解できない。企業の世界の格好の例がプジョーの伝説だろう。


プジョーはシュターデル洞窟からわずか300キロメートルほどの所にあるヴァランティニェの村で、小さな家族経営事業として始まった。同社は今日、世界中で約20万の従業員を雇っているが、そのほとんどは、互いにまったく面識がない。だが、彼らはじつに効果的に協力する。


私たちはどういう意味でプジョーSA(同社の正式名称)が存在していると言えるのだろうか?


ここでさまざまな例が登場するが、要するに、プジョーSAは物理的世界とは本質的に結び付いてはいないようだ。それでは、同社は本当に存在しているのだろうか?


プジョーは私たちの集合的想像の生み出した虚構だ。法律家はこれを「法的虚構(法的擬制)」と呼ぶ。


プジョーは法的虚構のうちでも、「有限責任会社」という特定の部類に入る。このような会社の背景にある考え方は、人類による独創的発明のうちでも指折りのものだ。有史時代のほとんどの期間、資産を所有できるのは生身の人間に限られていた。もしプジョーの創業者一族のジャンが13世紀のフランスで荷馬車製造工場を開設していたら、いわば彼自身が事業だった。


もしあなたが当時生きていたらおそらく、自分の事業を始めるのに二の足を踏んだだろう。そして、このような法律上の状況のせいで、起業家精神が現に抑え込まれていた。


だからこそ、人々は有限責任会社の存在を集団的に想像し始めた。そのような会社は、それを起こしたり、それに投資したり、それを経営したりする人々から法的に独立していた。アメリカでは、有限責任会社のことを、専門用語では「法人」と呼ぶ。アメリカでは法人を、まるで血の通った人間であるかのように、法律上は人として扱う。


アルマン・プジョーが、金属加工工場を親から相続し、自動車製造業に手を染める決断を下した1896年当時のフランスの法制度も、同様だった。彼はこの新事業を始めるにあたり、有限責任会社を設立した。


では、人間のアルマン・プジョーは、いったいどうやって会社のプジョーを生み出したのだろう?すべては、物語を語ることと、人々を説得してその物語を信じさせることにかかっていた。


プジョーSAの場合、決定的に重要な物語は、フランスの議会によって定められたフランスの法典だった。


効力を持つような物語を語るのは楽ではない。難しいのは、物語を語ること自体ではなく、あらゆる人を納得させ、誰からも信じてもらうことだ。


人々は長い年月をかけて、信じられないほど複雑な物語のネットワークを織り上げてきた。この物語のネットワークを通して人々が生み出す種類のものは、学究の世界では「虚構」「社会的構成概念」「想像上の現実」などとして知られている。


想像上の現実は嘘とは違い、誰もがその存在を信じているもので、この共有信念が存続するかぎり、その想像上の現実は社会の中で力を振るい続ける。


サピエンスはこのように、認知革命以降ずっと二重の現実の中に暮らしてきた。一方には、川や木やライオンといった客観的現実が存在し、もう一方には、神や国民や法人といった想像上の現実が存在する。