hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
C++ 特徴
その後、先祖であるC言語のANSIによる標準規格制定時には、関数のプロトタイプ宣言やconst修飾など、C++の機能がC言語に取り入れられることにもなった。C99の出現により、//コメントなどのC++で使われていた便利な機能が加わってCとC++の互換性が高まる一方、別々に審議し、別の時期に発行していることと、開発対象が必ずしも同じでないために利害関係者が異なることによる違いもある。
C++はCにクラスのサポートを追加しただけでなく、さらに次のような多種多様な機能を持っており、言語仕様は大変複雑である。言語処理系すなわちコンパイラの実装も、Cなどと比べて難易度が非常に高い。
ここから、よりオブジェクト指向を強化し、「なんでもあり」ではない代わりにシンプルで分かりやすくスマートな設計を目指した新たな言語（JavaやD言語など）が作られることとなった。
C++はC言語およびそのプリプロセッサの構文をほぼ継承している。以下のサンプルはビャーネ・ストロヴストルップの書籍「The C++ Programming Language, 4th Edition」(ISBN 978-0321563842) の「2.2.1 Hello, World!」に記載されている標準C++ライブラリのストリーム機能を用いて標準出力に出力するHello worldプログラムである。
C++ 特徴
書籍でも明記されているが、main()関数で意図的に返り値を返さない手法が使用されている。
C++には、四則演算、ビット演算、論理演算、比較演算、メンバーアクセスなどの30を超える演算子がある。メンバーアクセス演算子 (.と.*) のような一部の例外はあるが、大半の演算子はユーザー定義によるオーバーロードが可能である。オーバーロード可能な演算子が豊富に揃えられているため、C++を一種のドメイン固有言語として利用できる。またオーバーロード可能な演算子はスマートポインタや関数オブジェクトのような組み込み型の機能を模倣したユーザー定義クラスの実装や、テンプレートメタプログラミングのような先進的な実装テクニックに欠かせないものとなっている。演算子をオーバーロードしても演算の優先順位は変化せず、また演算子のオペランドの数も変化しない。ただし指定したオペランドが無視される可能性はある。
C++ 特徴
C++には、ジェネリックプログラミングを実現する機能としてテンプレートが存在する。テンプレートにできる対象は、関数とクラスである。C++14以降では変数もテンプレートの対象となった。テンプレートはコード中の型および定数をパラメータ化できる。テンプレートのパラメータ（テンプレート仮引数）に、型、コンパイル時定数またはその他のテンプレート（テンプレート実引数）を与えることで、テンプレートはコンパイル時にインスタンス化（実体化・具現化などとも）される。コンパイラは関数やクラスをインスタンス化するために、テンプレート仮引数をテンプレート実引数に置き換える。テンプレートはジェネリックプログラミング、テンプレートメタプログラミング、コード最適化などのために利用される強力なツールであるが、一定のコストを伴う。各テンプレートのインスタンスはテンプレート仮引数毎にテンプレートコードのコピーを生成するためコードサイズが肥大化する。これはコンパイル時に実型引数の情報を削除することで単一の型インスタンスを生成するランタイム型のジェネリクスを実装したJavaなどの言語とは対照的である。なお、C# (.NET Framework) は実行時コンパイラにより実型引数の情報を削除することなく複数の型インスタンスを生成する方式を採用しており、C++とJavaの中間的なアプローチとなっている。
C++ 特徴
テンプレートとプリプロセッサマクロはいずれもコンパイル時に処理される言語機能であり、静的な条件に基づいたコンパイルが行われるが、テンプレートは字句の置き換えに限定されない。テンプレートはC++の構文と型を解析し、厳密な型チェックに基づいた高度なプログラムの流れの制御ができる。マクロは条件コンパイルに利用できるが、新しい型の生成、再帰的定義、型の評価などは行えないため、コンパイル前のテキストの置き換えや追加・削除といった用途に限定される。つまりマクロは事前に定義されたシンボルに基づいてコンパイルの流れを制御できるものの、テンプレートとは異なり独立して新しいシンボルを生成することはできない。テンプレートは静的な多態（下記参照）とジェネリックプログラミングのためのツールである。
C++のテンプレートはコンパイル時におけるチューリング完全なメカニズムである。これはテンプレートメタプログラミングを用いて実行する前にコンピュータが計算可能なあらゆる処理を表現できることを意味している。
C++ 特徴
概略すれば、テンプレートはコードの記述に本来必要な型や定数を明確にすることなく抽象的な記述ができる、パラメータ化された関数またはクラスである。テンプレート仮引数に実引数を与えてインスタンス化した結果は、テンプレート仮引数に指定した型に特化した形で記述されたコードと全く等価になる。これによりテンプレートは、汎用的かつおおまかに記述された関数およびクラス（テンプレート）と、特定の型に特化した実装（インスタンス化されたテンプレート）の依存関係を解消し、パフォーマンスを犠牲にすることなく抽象化できる手段を提供する。
C++はC言語にオブジェクト指向プログラミングをサポートするための改良を加えたものといえる。C++のクラスには、オブジェクト指向言語で一般的な抽象化、カプセル化、継承、多態の4つの機能がある。オブジェクトは実行時に生成されるクラスの実体である。クラスは実行時に生成される様々なオブジェクトのひな形と考えることができる。
なお、C++はSmalltalkなどに見られるメッセージ転送の概念によるオブジェクト指向を採用していない。
C++ 特徴
カプセル化とは、データ構造を保証し、演算子が意図したとおりに動作し、クラスの利用者が直感的に使い方を理解できるようにするためにデータを隠蔽することである。クラスや関数はC++の基礎的なカプセル化のメカニズムである。クラスのメンバはpublic、protected、privateのいずれかとして宣言され明示的にカプセル化できる。publicなメンバはどの関数からでもアクセスできる。privateなメンバはクラスのメンバ関数から、またはクラスが明示的にアクセス権を与えたフレンド関数からアクセスできる。protectedなメンバはクラスのメンバおよびフレンド関数に加えてその派生クラスのメンバからもアクセスできる。
オブジェクト指向では原則としてクラスのメンバ変数にアクセスする全ての関数はクラスの中にカプセル化されなければならない。C++ではメンバ関数およびフレンド関数によりこれをサポートするが、強制はされない。プログラマはメンバ変数の一部または全体をpublicとして定義でき、型とは無関係な変数をpublicな要素として定義できる。このことからC++はオブジェクト指向だけでなく、モジュール化のような機能分割のパラダイムもサポートしているといえる。
C++ 特徴
一般的には、全てのデータをprivateまたはprotectedにして、クラスのユーザに必要最小限の関数のみをpublicとして公開することがよい習慣であると考えられている。このようにしてデータの実装の詳細を隠蔽することにより、設計者はインターフェイスを変更することなく後日実装を根本から変更できる
。
継承を使うと他のクラスの資産を流用できる。基底クラスからの継承はpublic、protected、privateのいずれかとして宣言する。このアクセス指定子により、派生クラスや全く無関係なクラスが基底クラスのpublicおよびprotectedメンバにアクセスできるかどうかを決定できる。普通はpublic継承のみがいわゆる派生に対応する。残りの二つの継承方法はあまり利用されない。アクセス指定子を省略した場合、構造体はpublic継承になるのに対し、クラスではprivate継承になる。基底クラスをvirtualとして宣言することもできる。これは仮想継承と呼ばれる。仮想継承は基底クラスのオブジェクトが一つだけ存在することを保証するものであり、多重継承の曖昧さの問題を避けることができる。
C++ 特徴
多重継承はC++の中でもしばしば問題になる機能である。多重継承では複数の基底クラスから一つのクラスを派生できる。これにより継承関係が複雑になる。例えばFlyingCatクラスはCatクラスとFlyingMammalクラスから派生できる。JavaやC#では、基底クラスの数を一つに制限する一方で、複数のインターフェイスを実装でき、これにより制約はあるものの多重継承に近い機能を実現できる（実装の多重継承ではなく型の多重継承）。インターフェイスはクラスと異なり抽象メソッド（純粋仮想関数）を宣言できるのみであり、関数の実装やフィールド（メンバ変数）は定義できない。JavaとC#のインターフェイスは、C++の抽象基底クラスと呼ばれる純粋仮想関数宣言のみを持つクラスに相当する。JavaやC#の継承モデルを好むプログラマは、C++において実装の多重継承は使わず、実装の継承は単一継承に絞り、抽象基底クラスによる型の多重継承のみを使うポリシーを採用することもできる。
多態 (ポリモーフィズム) は様々な場面で多用されている機能である。多態により、状況や文脈に応じてオブジェクトに異なる振る舞いをさせることができる。逆に言うと、オブジェクト自身が振る舞いを決定することができる。
C++ 特徴
C++は静的な多態と動的な多態の両方をサポートする。コンパイル時に解決される静的な多態は柔軟性に劣るもののパフォーマンス面で有利である。一方、実行時に解決される動的な多態は柔軟性に優れているもののパフォーマンス面で不利である。
関数のオーバーロードは名称が同じ複数の関数を宣言できる機能である。ただし引数は異なっていなければならない。個々の関数は引数の数や型の順序で区別される。同名の関数はコードの文脈によってどの関数が呼ばれるのかが決まる。関数の戻り値の型で区別することはできない。
関数を宣言する際にプログラマはデフォルト引数を指定できる。関数を呼び出すときに引数を省略した場合はデフォルト引数が適用される。関数を呼び出すときに宣言よりも引数の数が少ない場合は、左から右の順で引数の型が比較され、後半部分にデフォルト引数が適用される。たいていの場合は一つの関数にデフォルト引数を指定するよりも、引数の数が異なる関数をオーバーロードする方が望ましい。
C++ 特徴
C++のテンプレートでは、より洗練された汎用的な多態を実現できる。特にCuriously Recurring Template Patternにより仮想関数のオーバーライドをシミュレートした静的な多態を実装できる。C++のテンプレートは型安全かつチューリング完全であるため、テンプレートメタプログラミングによりコンパイラに条件文を再帰的に解決させて実行コードを生成させることにも利用できる。
基底クラスへのポインタおよび参照は、正確に型が一致するオブジェクトだけでなく、その派生クラスのオブジェクトを指すことができる（リスコフの置換原則）。これにより、複数の異なる派生型を、同一の基底型で統一的に扱うことが可能となる。また、基底型へのポインタの配列やコンテナは、複数の異なる派生型へのポインタを保持できる。派生オブジェクトから基底オブジェクトへの変換（アップキャスト）では、リスコフの置換原則により、明示的なキャストは必要ない。
C++ 特徴
dynamic_castは基底オブジェクトから派生オブジェクトへの変換（ダウンキャスト）を実行時に安全に行うための演算子である。この機能は実行時型情報 (RTTI) に依存している。あるオブジェクトが特定の派生型のオブジェクトであることがあらかじめ分かっている場合はstatic_cast演算子でキャストすることもできる。static_castは純粋にコンパイル時に解決されるため動作が速く、またRTTIを必要としない。また、static_castは従来のC言語形式のキャスト構文と違い継承階層のナビゲーションをサポートするため、多重継承した場合もメモリレイアウトを考慮したダウンキャストを実行することができる。ただし、static_castでは多重継承において継承関係を持たない基底型同士のキャスト（クロスキャスト）を実行することはできず、dynamic_castを用いる必要がある。とはいえ、ダウンキャストやクロスキャストが必要となる場合、通例そのプログラムの設計に問題があることが多く、本来は仮想関数のオーバーライドによる多態を用いるべきである。
C++ 特徴
クラスのメンバー関数をvirtualキーワードで修飾することにより、派生クラスでオーバーライド（再定義）することが可能な仮想関数 (virtual function) となる。仮想関数は「メソッド」と呼ばれることもある。派生クラスにて、基底クラスの仮想関数と名前および引数の数や型の順序が同じ関数を定義することでオーバーライドする（C++11以降では、overrideキーワードにより修飾することでオーバーライドを明示することもできる）。基底クラスの仮想関数を派生クラスでオーバーライドした場合、実際に呼び出される関数はオブジェクトの型によって決定される。基底クラスのポインタのみが与えられた場合、コンパイラはオブジェクトの型をコンパイル時に特定できず正しい関数を呼び出せないため、実行時にこれを特定する。これをダイナミックディスパッチと呼ぶ。仮想関数により、オブジェクトに割り当てられた実際の型に従って、最上位の派生クラスで実装した関数が呼び出される。一般的なC++コンパイラは仮想関数テーブルを用いる。オブジェクトの型が判明している場合はスコープ解決演算子を利用して仮想関数テーブルを使わないようにバイパスすることもできるが、一般的には実行時に仮想関数の呼び出しを解決するのが普通である。
通常のメンバー関数に加え、オーバーロードした演算子やデストラクタも仮想関数にできる。原則的にはクラスが仮想関数を持つ場合はデストラクタも仮想関数にすべきである。コンストラクタやその延長線上にあるコピーコンストラクタはコンパイルされた時点でオブジェクトの型が確定しないため仮想関数にできない。しかし、派生オブジェクトへのポインタが基底オブジェクトへのポインタとして渡された場合に、そのオブジェクトのコピーを作らなければならない場合は問題が生じる。このような場合はclone()関数(またはそれに準じる物)を仮想関数として作成するのが一般的な解決方法である。clone()は派生クラスのコピーを生成して返す。
= 0をメンバー関数宣言の末尾セミコロンの直前に挿入することにより、メンバー関数を純粋仮想関数 (pure virtual function) にできる。純粋仮想関数を持つクラスは純粋仮想クラスと呼ばれ、このクラスからオブジェクトを生成することはできない。このような純粋仮想クラスは基底クラスとしてのみ利用できる。派生クラスは純粋仮称関数を継承するため、派生クラスのオブジェクトを生成したい場合は全ての純粋仮想関数をオーバーライドして実装しなければならない。純粋仮想関数を持つクラスのオブジェクトを生成しようと試みるようなプログラムは行儀が悪い。
型消去 (type erasure) と呼ばれる、テンプレートを活用して動的な（プログラム実行時の）多態性を実現する手法が存在する。この手法はC++の標準ライブラリでもstd::functionやstd::shared_ptrの削除子で採用されている。いずれも、コンストラクタや代入演算子で（一定の条件を満たす）任意のオブジェクトを実引数として渡せるようにすることから多態性を実現している。
C99の制定前、C言語とC++との分かりやすい差異として、// で始まり改行で終わる、単一行コメントの有無があった。
単一行コメントはもともと、C言語の祖先にあたるBCPLに含まれていた仕様である。現在のC++のコンパイラの多くがC言語のコンパイラとしても使えるようになっているのと同様に、C言語が生まれて間もない頃は、C言語に加えB言語やBCPLのコンパイルができるコンパイラが用いられていた。それらコンパイラは、C言語のソースであってもBCPLと同様に単一行コメントが使用できるよう独自の拡張がなされていたため、BCPLの単一行コメントに慣れ親しんでいたプログラマ達は、C言語でも単一行コメントを使い続けた。その慣習がC++の誕生時まで生き残っていたため、C++では単一行コメントを「復活」させることになった。
そのためもあって、C言語での仕様外の単一行コメントの使用は半ば常習と化し、C99によって単一行コメントが正式に規格として組み入れられた。
C++ C++ソースコードの処理とパーサ
LALR(1)のような旧式のパースアルゴリズムを用いてC++のパーサを記述することは比較的難しい。その理由の一つはC++の文法がLALRではないことである。このため、コード分析ツールや、高度な修正を行うツール（リファクタリングツールなど）は非常に少ない。この問題を取り扱う方法としてLALR(1)でパースできるように改良されたC++の亜種(SPECS)を利用する方法がある。GLRパーサのようにより強力でシンプルなパーサもあるが処理が遅い。
パースはC++を処理するツールを作成する際の最も難しい問題ではない。このようなツールはコンパイラと同じように識別子の意味を理解しなければならない。従ってC++を処理する実用的なシステムはソースコードをパースするだけでなく、各識別子の定義を正確に適用し（つまりC++の複雑なスコープのルールを正確に取り扱い）、型を正しく特定できなければならない。
いずれにせよC++ソースコード処理ツールが実用的であるためには、GNU GCCやVisual C++で使われているような、様々なC++の方言を取り扱えなければならず、適切な分析処理やソース変換やソース出力などが実装できなければならない。GLRのような先進的なパースアルゴリズムとシンボルテーブルを組み合わせてソースコードを変換する方法を利用すればあらゆるC++ツールを開発できる。
C++ 互換性
その言語文法の複雑さゆえ、C++規格に準拠したコンパイラを開発するのは一般的に難しい。20世紀末から何年にも渡りC++に部分的に準拠した様々なコンパイラが作られ、テンプレートの部分特殊化などの部分で実装にばらつきがあった。中でも、テンプレートの宣言と実装を分離できるようにするためのexportは問題のキーワードの一つだった。exportを定義したC++98規格がリリースされてから5年後の2003年前半にComeau C/C++が初めてexportを実装した。2004年にBorland C++ Builder Xがexportを実装した。これらのコンパイラはいずれもEDGのフロントエンドをベースにしていた。大半のコンパイラで実装されていないexportは多くのC++関連書籍（例えば"Beginning ANSI C++", Ivor Horton著）にサンプルが記されているが、exportが記載されていることによる問題は特に指摘されていない。GCCをはじめとするその他のコンパイラでは全くサポートしていない。Herb SutterはC++の標準規格からexportを削除することを推奨していたが、C++98では最終的にこれを残す決定がなされた。結局、C++11では実装の少なさ・困難さを理由に削除された。
C++ 互換性
コンパイラ開発者の裁量で決められる範囲を確保するため、C++標準化委員会は名前修飾や例外処理などの実装に依存する機能の実装方法を決定しないことに決めた。この決定の問題は、コンパイラが異なるとオブジェクトファイルの互換性が保証されない点である。特定の機種やOSでコンパイラの互換性を持たせ、バイナリレベルでのコード再利用性を高めようとするABIのような非標準の規格もあり、一部のコンパイラではこうした準規格を採用している。
2019年現在のメジャーなC++コンパイラ（gcc, Clang, Intel C++ Compiler, Microsoft Visual C++など）の最新版はC++11およびC++14規格にほぼ準拠しており、特にClangは2013年4月時点でC++11の全機能を実装完了した。ただしマイナーアップデートとなるC++17を含めると、処理系間でのばらつきは依然として存在する。
C++は基本的にC言語の上位互換であるが、厳密には異なる。C言語で記述された大半のプログラムはC++でコンパイルできるように簡単に修正できるが、C言語では正当でもC++では不正になる部分や、C++とは動作が異なる部分が若干存在する。
C++ 互換性
例えば、C言語では汎用ポインタvoid*は他の型へのポインタに暗黙的に変換できるが、C++ではキャスト演算子によって変換を明示する必要がある。またC++ではnewやclassといった数多くの新しいキーワードが追加されたが、移植の際に元のC言語のプログラムでそれらが識別子（例えば変数名）として使われていると、問題になる。
C言語の標準規格であるC99やその後継C11ではこうした非互換性の一部が解決されており、//形式のコメントや宣言とコードの混在といったC++の機能がC言語でサポートされている。その一方でC99では、可変長配列、複素数型の組み込み変数、指示初期化子、複合リテラルといった、C++でサポートしていない数多くの新機能が追加された。C99で追加された新機能の一部はC++11に反映され、C++14に対してもC99やC11との互換性を向上される提案が行われた。また、可変長配列や複素数型などのC99に追加された機能の一部はC11でオプションとなった。
C++ 互換性
C++で書かれた関数をC言語で書かれたプログラムから呼び出す、あるいはその逆を行なう場合など、C言語のコードとC++のコードを混在させるためにはCリンケージを利用する必要があり、関数をextern "C"で個別に修飾するか、extern "C" { ... }のブロックの中で宣言しなければならない。また、関数引数や戻り値などのインターフェイスはC言語互換形式に合わせる必要がある。Cリンケージを利用した関数については、C++名前修飾がされず、名前修飾に依存している関数オーバーロード機能は利用できない。
C/C++の相互運用性が確保されていることで、慣れ親しんだC言語標準ライブラリ関数の大半をC++でもそのまま利用し続けることができるということはC++の大きなメリットのひとつである。
Simula
SIMULA（シミュラ; SIMUlation LAnguage）は、オルヨハン・ダールとクリステン・ニガードによってALGOL60を拡張する形で1960年代に開発が始められたシミュレーション用途のプログラミング言語である。
ALGOLのbegin ... endで囲まれた部分であるブロック（block）の概念を実体的な実例（instance）として扱うことを目的として、クラス（class）の構文と対象（object、オブジェクト）の概念を初めて導入した言語である。初期のオブジェクト指向プログラミング言語の一つである。
Simula 概要
オスロのノルウェー計算センターのクリステン・ニガードとオルヨハン・ダールが1962年から1967年にかけて、Simula の元となる Simula I と Simula67 を ALGOL 60 の拡張として設計/実装した。Simula は当初シミュレーションに用いられたが、のちに汎用言語となった。名前「Simula」は「シミュレーション言語」を意味する英語「simulation language」と「簡潔な汎用言語」を意味する英語「simple universal language」の二つに由来する。
主に北欧圏で使用されたこと、言語的な未成熟さもあって広く普及することはなかったが、後続言語に与えた影響は大きい。特にSmalltalk は Simula のオブジェクト概念を一般化したものだと言うことができる。C++ もまた、当初はC言語に Simula のクラスなどの仕組みを追加したものであった。
Simula 概要
開発の動機は、ある制限下におかれたモデル群の全体の挙動をどう記述するか、というものである。気体の分子運動を例にとると、システム全体を考えてその中の項として分子を扱うよりも、一つの一つの気体分子をモデル化し、それぞれの相互作用の結果をシステムとして捉える方が自然で取り扱いやすい。その為には小さなモデル、関連する法則、それらを一度に複数取り扱う能力が必要となる。こうして属性を備えたオブジェクト概念と、それに従属するメソッド概念が生まれたのである。
Simula 67 ではオブジェクト、 クラス、サブクラス、継承、動的束縛（仮想関数）、コルーチン、 ディスクリートイベントシミュレーション、ガベージコレクションの機能をもち、オブジェクト指向プログラミングの基本概念はすべてここで発案されているといえる。
Simula 概要
Simula はプログラミングパラダイムとして最初のオブジェクト指向言語であると考えられる。その名前が示すように Simula はシミュレーションを行うために設計され、その必要性から今日のオブジェクト指向言語で使われる多くの機能のためのフレームワークを提供した。なお、Simula 当時「オブジェクト指向」という言葉はまだない。この用語はアラン・ケイが Simula の概念として70年代ごろに使い出したのが始まりといわれている。従ってその意味では Simula が世界最初のオブジェクト指向言語であり、Simula は「オブジェクト指向として再認識が可能な最古の言語」ということができる。
VLSI設計、プロセス、プロトコル、アルゴリズムといったシミュレーションや、組版、コンピュータグラフィックス、教育といったアプリケーションソフトに Simula は利用された。Simula 形式のオブジェクトは C++、Java、C# で再実装されており、Simula の影響を受けていることが知られている。C++ の開発者であるビャーネ・ストロヴストルップはBCPLのような機械語を出力し高速に動作する低レベル言語に Simula が提供する開発効率を高める機能を導入するため、C++ 開発時に Simula 67 の影響を大きく受けていることを認めている。
Simula 歴史
クリステン・ニガードは1957年からコンピュータシミュレーションの開発を始めた。ニガードはコンピュータの動作とシミュレーションプログラムに要求されるものの不整合を適切に記述する方法が必要であると考えた。既存のコンピュータ言語で彼のアイデアを実現するにはプログラミングのスキル以外に何かが必要であると思われた。オルヨハン・ダールは1962年1月にニガードの業務に参加した。1962年3月までにはシミュレーション用プログラミング言語のメインコンセプトは固まっていた。ディクリートイベントシステムを持つシミュレーション専用のプログラミング言語 SIMULA I が開発された。
UNIVAC は UNIVAC 1107 を発売するにあたりニガードを1962年3月下旬に招待した。その際にニガードは UNIVAC のボブ・バーマーシステムプログラミング部長に Simula のアイデアを説明した。バーマーは ALGOL の熱烈なファンであり、Simula プロジェクトに説得力を感じた。IFIP（情報処理国際連合）が主催する情報処理の第2回国際会議の議長を務めていたバーマーは論文「SIMULA — An Extension of ALGOL to the Description of Discrete-Event Networks」を提出したニガードを会議に招待した。
Simula 歴史
ノルウェー計算機センターは UNIVAC との契約に基づいてダールがSIMULA Iを実装するため UNIVAC  1107 を1963年8月に特別価格で譲り受けた。これは UNIVAC 用 ALGOL 60コンパイラを元に実装された。1965年1月には UNIVAC 1107 上で完全な SIMULA I を利用できた。ダールとニガードはその後の2年間に渡り Simula を教えることに費やした。Simula は複数の国に広がり、SIMULA I は後に バロース B5000 やロシアの URAL-16 に移植された。
Simula 歴史
アントニー・ホーアは1966年にレコードクラスのコンストラクタの概念を導入し、ダールとニガードは一般的なプロセス概念という要求を満たすためプリフィックスの概念などを導入してこれを拡張した。ダールとニガードはクラスとサブクラスの宣言についての論文を1967年3月にオスロで開催された IFIP のシミュレーション用言語についてのワーキングカンファレンスで発表した。この論文は Simula 67 の最初の正式な定義となった。1967年6月に言語を規格化して複数の実装を始めるためのカンファレンスが開催された。ダールはデータ型とクラスの概念の統一化を提案した。これは激論を巻き起こし委員会から却下された。SIMULA 67 は SIMULA 標準化グループ (SSG) の最初の会議で1968年2月に正式に標準化された。
Simula は Smalltalk やその後のオブジェクト指向言語に影響を及ぼした。Simula だけがコルーチンをサポートした言語ではないし、真の並列性は持たないが、アクターモデルの概念を呼び起こすのに役立った。
60年代後期から70年代前期にかけて Simula の4つの主要な実装があった。
Simula 歴史
これらの実装は様々なプラットフォームに移植された。TOPS-10 用ではメンバ変数とメソッドの public、protected、private が実装され、後に Simula 87 に統合された。Simula 87 は最新の標準規格であり、下記の3つの実装があることが知られている。
2001年11月に米国電気電子学会 (IEEE) は、「SIMULA 67 の設計と実装によりオブジェクト指向の基礎概念を導きだした」ことを讃えフォン・ノイマンメダルをダールとニガードに授与した。2002年2月には「プログラミング言語 Simula I 及び Simula 67 の実装によりオブジェクト指向を出現させた基礎的アイデア」を表彰して2001年度チューリング賞をACMより受賞した。両名は6月と8月にそれぞれ死去したため、シアトルで開催される OOPSLA カンファレンス2002で行われる予定であったACMチューリング賞の講演に出席できなかった。
研究所はプログラミング言語 Simula にちなんで名付けられた研究所であり、ニガードはオープン時の2001年から非常勤職員として働いていた。
Simula サンプルコード
空のファイルはソースコードのサイズを基準とした場合で最も小さな Simula のプログラムである。これは1つのダミーのステートメントのみで構成される。
しかしながら合理的に考えれば最小のプログラムは空のブロックとして表現される。
これは起動してすぐに終了するプログラムである。Simula ではプログラム自身が値を返す return文 を持たない。
Simulaで記述された Hello world の例である。Simula は大文字と小文字を厳密に区別する。
クラス、サブクラス、仮想関数を用いた現実的な例を以下に示す。
上記の例には1つの親クラス（Glyph）と2つのサブクラス（Char, Line）があり、1つの仮想関数と2つの実装がある。メインプログラムから実行を開始する。Simula は純粋仮想関数を持つクラスをインスタンス化できるため抽象基底クラスの概念が無い。これは上記の例にある全てのクラスがインスタンス化できるということである。しかしながら純粋仮想関数を呼び出すとランタイムライブラリエラーを引き起こす。
Simula サンプルコード
Simula は名前呼び（call by name、評価戦略を参照）をサポートしているため Jensen's Device（en:Jensen's Device）を容易に実装できる。デフォルトはALGOLと異なり値呼び（call by value）であるため、Jensen's Deviceを実装する際には、名前呼びであることを明示する必要がある。
単純な例として総和関数の実装例を以下に示す。
上記のコードは値（l）と式（u）を制御するために名前呼びを用いている。これにより式で使用する値を制御できる。Simula の標準規格は for 文にある種の制約があるため上記の例では while 文を使用している。
以下の式は次のように実装できる。
Simula にはディスクリートイベントシミュレーションを行うためのシミュレーションパッケージが含まれている。このシミュレーションパッケージはSimulaのオブジェクト指向とコルーチンのコンセプトに基づいている。
下記の例で Sam、Sally、Andy は服を買おうとしている。彼らは1つの試着室を共有しなければならない。3人は正規分布によりランダムに約12分間店内を探索し、同様に試着室を約3分間占有する。以下は彼らが試着室をどのように使うのかをシミュレーションするものである。
Simula サンプルコード
メインブロックが Simulation でプレフィックスされることによりシミュレーションを実行できる。シミュレーションパッケージはどこのブロックからでも自由に利用でき、シミュレーションしているものそれ自体をシミュレーションするときにはシミュレーションを再帰的にネストできる。
試着室オブジェクトはキュー（door）により試着室にアクセスできる。誰かが使用中の試着室を使おうとしたときはこのキュー（Wait (door)）で待たなければならない。誰かが試着室を出るとき、列の先頭にいる者がキューからリリース（Activate door.first）されてドアキューから削除（door.First.Out）される。
Person は Process のサブクラスでありその動作は hold（店内を探索する時間と試着室で過ごす時間）を用いて記述され、試着室に出入りするために試着室オブジェクト内でメソッドを呼び出す。
メインプログラムは全てのオブジェクトを生成し、全ての Person オブジェクトをイベントキューに投入するためにアクティベートする。メインプログラムはシミュレーション時間で100分間待ってからプログラムを終了する。
IPアドレス
IPアドレス（アイピーアドレス、英: IP address）は、Internet Protocol（IP）で通信相手を識別するための番号である。インターネットアドレスとも呼ばれる。
IPアドレス 概要
IPアドレスは、IPネットワーク上の情報機器を識別するために指定するネットワーク層における識別用の番号である。データリンク層のMACアドレスを物理アドレスということに対応して、論理アドレスとも呼ばれる。IPのバージョン（IPv4とIPv6）に応じて、IPv4のIPアドレス（IPv4アドレス）とIPv6のIPアドレス（IPv6アドレス）がある。当初、RFC 791でIPを定義した際に、IPが現在のIPv4に当たるもののみであったことから、狭義では、単にIPアドレスと呼称した場合にIPv4のIPアドレスを意味する場合がある。
IPアドレスは、IPv4では32ビット、IPv6では128ビットの数値である。この数値のうち、最上位ビット（MSB）に近い側をネットワーク部、最下位ビット（LSB）に近い側をホスト部として区別する。ネットワーク部がネットワークを指定し、ホスト部がそのネットワーク内の機器を指定する。ネットワーク部とホスト部の区別にはサブネットマスクを用いることができる（ある）。
IPアドレス 表記
IPv4のIPアドレスの表記法には以下の規則がある。IPv6については「IPv6」および「IPv6アドレス」の記事で取り扱う。
gethostbyname() や inet_aton() など、IPアドレスを解釈する実装の一部では以下のような表記も許している。
これらの表記は、URL StandardでURLの一部分として定義されている。ただし、オペレーティングシステム（OS）やアプリケーション（例：ウェブブラウザソフト）、ネットワーク機器などによっては利用できないことがある。また悪意のある者がフィッシングサイトなどのURLを偽装するために用いる場合もあるので、注意が必要である。
IPアドレス アドレスクラス
IPアドレスは、次の5つのアドレスクラスに分かれている。
クラスAからクラスCまでは、ネットワーク部とホスト部の境界が8ビット単位で区分けされている。クラスAはネットワーク部が短く（8ビット）、ホスト部が長い（24ビット）。すなわち、多くの機器を保有する大組織や多くの顧客を有する大規模なインターネットサービスプロバイダ（ISP）に割り当てるのに適している。クラスCはその逆である。これは、日本の電話番号において東京などの人口が多い地域には03のような短い市外局番が割り当てられ、人口の少ない地域には長い市外局番が割り当てられているのと同じである。クラスAが約1,677万台、クラスBが65,534台、クラスCが254台のホストを接続できる。
クラスBの割り当てを受けたネットワークの中には65,534台のホスト（インターネットサービスプロバイダであれば接続ユーザー数）を同時にすべて接続することがまれであるネットワークも存在し、IPアドレスが無駄に消費されることになった。そこで現在ではアドレスクラスを使わず、ネットワーク部とホスト部の境界を8ビット単位に固定せずに細分化する可変長サブネットマスクやCIDR（Classless Inter-Domain Routing）の使用が一般化している。
IPアドレス アドレスクラス
IPアドレスの割り当て範囲を示すために、IPアドレスの末尾に「/」（スラッシュ）とともにネットワークアドレス長を付記して表すことも多い。IPv4の場合、MSB側からのビット数でネットワークアドレス長を表す。例えば192.168.0.0/24の表記の場合、ネットワーク部はMSBから24ビットで残り8ビットがホスト部となる。アドレスクラスでなく可変長サブネットマスクを使用した場合、ネットワークアドレス長の数字は必ずしも8の倍数にはならないことになる。
「CIDR」は、「サイダー」と読む。
Classless Inter-Domain Routingを用いることで、複数のIPアドレスを範囲指定して一つのアドレスブロックとして扱うことができる。例えば、192.168.1.0 - 192.168.1.255という範囲のIPアドレスは、192.168.1.0/24として表すことができる。CIDRを使うことでアドレスブロックの集約や分割が容易に行えることから、IPパケットのルーティングで主に活用されている。例えば、203.0.113.0/26、203.0.113.64/26、203.0.113.128/26、203.0.113.192/26の4つのアドレスブロックは、203.0.113.0/24として集約することができる。
例えば69.208.0.0を含むIPアドレス群の場合、CIDRと開始アドレスおよび終了アドレスの関係は以下のようになる。
IPアドレス スコープ
通信可能な範囲のことをスコープという。IPアドレスは、それぞれにスコープが決められている。（→一覧）
後述するプライベートIPアドレス、リンクローカルアドレス、特殊用途のIPアドレスなどを除いたIPアドレスは「グローバルIPアドレス」と呼び、インターネットの接続用に利用され、重複が発生しないように管理される。そのため、ICANNを頂点とした階層的な委譲関係によって、世界的な管理が行われている。
通常、パソコンやルーターなどをインターネットに接続すると、ISPに割り振られているグローバルIPアドレスの中の1つがパソコンなどに割り当てられる。
プライベートIPアドレス（ローカルIPアドレス）は、プライベートネットワーク（外部から利用できない社内LANなど）のアドレスとして使うことができる。異なるプライベートネットワークを相互接続してルーティングすることも可能である。
プライベートIPアドレスとして、次のアドレス空間が予約されている。ネットワークの規模に応じて、使い分ける必要がある。
IPアドレス スコープ
WindowsなどではIPアドレスが設定されておらず、DHCPサーバも見付からない場合には自動的に169.254で始まるクラスBのIPアドレスが振られる（APIPAという機能）。これはリンクローカルアドレスと呼ばれ単一のLAN内での通信に使うことができるが、ルーティングができないなどプライベートアドレスとは異なるものである。
プライベートIPアドレスとグローバルIPアドレスを相互変換することにより、インターネットに接続することができる。その方法として、NAPT（実装としてはIPマスカレードやipfwなど）やプロキシサーバがある。
インターネット接続サービスによってはインターネットに接続する機器にグローバルIPアドレスではなく、このプライベートIPアドレスを割り当てることもある。
プライベートIPアドレスとこれに関する仕組みによって、グローバルIPアドレスを多量に消費することなくインターネットに接続できる機器を増やすことができる。
2012年4月にRFC 6598として発行したインターネットサービスプロバイダ（ISP）が契約者に貸し出すIPアドレスで、範囲は100.64.0.0/10。
IPアドレス スコープ
ISP Shared Addressは、個々のISPのネットワーク内でのみ使用可能なIPアドレスで、キャリアグレードNAT（CGN）によりISP Shared AddressとグローバルIPアドレスを相互変換することにより、インターネットに接続することができる。
IPアドレス枯渇問題により、契約者が増加しても、ISPが契約者に貸し出すグローバルIPアドレスを新規に獲得できなくなった。
しかし、ISPが契約者にプライベートIPアドレスを割り当てると、該当するIPアドレスを契約者のローカルネットワーク内で使用できなくなる。例えば、NTTが提供するフレッツの地域IP網においてプライベートIPアドレス（10.0.0.0/8）を使用しているため、フレッツの利用者がプライベートIPアドレス（10.0.0.0/8）をローカルネットワーク内で使用できない。
そこで、ISP Shared Addressの導入により、ISPはISP Shared Addressを使用し、ISPの契約者は、任意のプライベートIPアドレスが使用できるようになる。
なお、/10というアドレス範囲は、東京地域を網羅するISPがISP Shared Addressを導入するには、/10程度のアドレス範囲が必要であるという、日本からの提案がベースになっている。
IPアドレス 特殊用途のIPアドレス
一部のアドレスおよびブロックは、特殊な用途に使われる。それぞれのスコープに応じて、通常、機器に割り振るべきではない。詳細はIPv4#特別用途のアドレスを参照のこと。
IPアドレス IPアドレスの付与
グローバルIPアドレスは、まずインターネットレジストリ（APNICやJPNICなど）からISPにまとまった単位で付与される。これを割り振り（allocation）という。ISPは末端の利用者（個人、法人など）に対して、利用契約に基づいてIPアドレスを払い出す。これを割り当て（assignment）という。かつて一部の大学やIT企業が非営利でインターネットを支えていた時代には、レジストリからこれらの組織に直接割り当てられる例が多かったが、今日では商用ISPが発達したため、新規の割り当てではそのような例は少ない。インターネットレジストリにもIANA（Internet Assigned Numbers Authority） →RIR（Regional Internet Registry）→NIR（National Internet Registry）→LIR（Local Internet Registry）といった階層構造が存在する。
IPアドレス IPアドレスの付与
個人契約者の場合、グローバルIPアドレス1個を動的に割り当てる（接続ごとにIPアドレスが変わることがある）ものがほとんどである。ただしISPや契約プランによってはプライベートIPアドレスやISP Shared Addressを割り当てるもの（CATV接続に多い）、グローバルIPアドレス1個を固定で割り当てるもの、複数のグローバルIPアドレスを固定で割り当てるものもある。割り当ての通信プロトコルはダイヤルアップ接続ではPPP、ADSL・FTTHなどではPPPoE、CATVや公衆無線LAN（ホットスポット）ではDHCPによることが一般的である。
法人契約の場合はDNSやメールなどの各種サーバを運用するケースが多いこと、VPN（仮想専用網）などによる取引先などとのデータのやりとりにおいて、IPアドレスによる認証やアクセス制限があることなどの理由により、複数（多いのは4個から16個程度）のグローバルIPアドレスを固定で割り当てる契約が一般的である。
なお、家庭内や組織内でのプライベートIPアドレスの割り当てはDHCP（専用サーバの他、一般向けのいわゆるブロードバンドルーターに実装されている）によることが一般的である。ただし、サーバやルーターのLAN側など固定IPアドレスを必要とするものや、割り当てを厳密に管理したい場合には固定IPアドレスの割り当てが行われる。
IPアドレス IPアドレス枯渇問題
2019年3月現在、特殊な用途のものを除く、すべてのIPv4のグローバルアドレスを誰かに割り当てた状態になりつつある。すなわちIPv4のグローバルアドレスに空きがなく、インターネット上に公開するIP機器の増設が不可能になるという問題が発生している。不動産に例えると、これまでは新規分譲で土地が提供されて建物を建築できていたが、分譲する土地がなくなったために、既存の建物が建っている土地を地上げして再開発しない限り新たな建物を建てられなくなった状態である。
2017年2月15日 LACNICのIPv4アドレス在庫が/11ブロック以下となり、AFRINICを除く4つのRIRでIPv4アドレス在庫枯渇の最終段階になった。
この枯渇問題の対策として、IPv6の普及が進められている。
戦争
戦争（せんそう、英: war）とは、なんらかの政治目的のために政治、経済、思想、軍事的などの力を利用して行われる政治集団間の闘争である。日本大百科事典でも、実質的意味で定義すれば戦争は政治集団の間、特に主権国家の間で相当の期間継続して相当の規模で行われる軍事力の行使を中心とする全面的闘争状態ということになるだろう、と定義されている。一方、国際法辞典によれば、兵力による国家間の闘争だと書かれている。広義には内戦や反乱も含む。
戦争 概説
最初の定義部で示したように、戦争の一般的な捉え方と、国際法での捉え方には若干のずれがある。
一般的な意味では戦争とは、国家もしくはそれに準ずる集団が、何らかの政治的目的、たとえば領土拡張による資源獲得などで国家的利益を得ることや、攻めてくる可能性がある仮想敵国を先制的に叩くことなど、を目的に武力を行使し、戦闘を起こすことである。軍事力の行使を中心とすることが多いが、政治闘争、経済闘争、思想闘争、情報的闘争（情報戦、諜報戦）などさまざまな闘争も並行して繰り広げられるので、実際的に言うと、戦争というのは軍事力の行使に限ったことではない。
20世紀から情報戦・経済戦争・貿易戦争は行われていたが、21世紀にインターネットが普及するとネット経由でITインフラや金融システムやライフラインに対する攻撃、すなわち大砲やミサイルなどによる攻撃を伴わない国家間の争いが始まりサイバー戦争と呼ばれるようになり、一般市民にはあまり知られていないが、実はサイバー空間では国家間の闘争が日々行われている。
戦争 概説
政治だけでなく、経済、地理、文化、技術など広範にわたる人間の活動が密接な関わりを持ち、その歴史的な影響は非常に大きいといわれる。近代以降の戦争は陸海空軍等の軍隊のみの武力戦だけでなく、一般国民を広く巻き込む総力戦の様相を呈することもあり、外交戦、宣伝戦、謀略戦、経済戦、貿易戦、補給戦、技術戦、精神戦などの闘争を本質的に包括しており、相互に関係している。そして結果的には、その規模にもよるが、国際関係や社会や経済など幅広い分野に破壊的な影響を与え、軍人や民間人の人的被害からインフラの破壊、経済活動の妨害・阻害など社会のあらゆる部分に被害を与えることが多くある。
戦争は太古から続く人類の営みの側面であり、最も原始的かつ暴力的な紛争解決手段であると言える。
戦争と対を為すのは国際紛争の平和的解決である。
銀行などが引受けた巨額の戦費は慢性的な租税負担となる。市民生活に対する制限と攻撃は個人の尊厳を蹂躙する。時代ごとの考え方によって、違法性が認定されてきた。
一方で、軍需景気により、生産設備に被害を受けなかった戦勝国や第三国では、経済が潤う場合もある（例：第一次世界大戦と第二次世界大戦後の米国や第一次世界大戦後と朝鮮戦争後の日本）。
戦争 概説
戦争の勝敗には原則的、法則的な事象が関連していると考えられており、軍事学において戦理や戦略・戦術理論の研究、戦闘教義の開発、兵器開発、定量的な作戦研究、戦史研究などが行われている。
戦争の近況
太古からの戦争の歴史については#歴史の節で説明する。
ここでは最近数世紀、特にここ100年ほどの状況について軽く触れる。
戦争 概説
16世紀 - 19世紀ころ、各帝国は帝国主義で周辺国を侵略し、領土を拡張してさらなる資源を獲得し周辺国の国民を酷使することで国力を増し、さらなる拡張のために侵略を行うということが行われた。この時代までは、将校などは美麗な軍服に身をつつみ馬上の人となり凛々しく戦っていたので、戦争は少年たちの憧れでもあった。だが20世紀始めの第一次世界大戦で、機関銃と大砲を搭載した戦車や爆撃機などの新しい兵器が登場したことや毒ガスという陰湿な兵器も使われるようになったことで戦術が変化し、しかも総力戦の様相を呈し各国が大量生産の技術を使い15億発もの砲弾が製造され発射され、兵士たちは周囲で砲弾が炸裂しつづけ、兵士たちは日々怯えるだけでなく、"壊れた"状態になる兵士、たとえば言葉が話せなくなったり同じ動作ばかり繰り返すなど異常な状態になる兵士が続出した（シェルショック）。また数ヶ月以上の塹壕戦を強いられ、泥だらけでみじめに死んでゆくようになり、戦争はそれまでと性質が変化し、陰湿でみじめで悲惨なものになった。第一次世界大戦の死者の数は総計で1600万人、負傷者は2000万人に及び（→第一次世界大戦の犠牲者）、多くの家庭で女性が夫を,子どもが父親を, 初老の夫婦が息子を失った。1928年のパリ不戦条約締結で、国際法的には自衛戦争以外の侵略戦争は禁止された。だが、その条約も虚しく、1939年には第二次世界大戦が勃発してしまい、死者数は総計で数千万人を超え（→第二次世界大戦の犠牲者）、人類史でも突出した大惨事となり、第二次世界大戦末期に原子爆弾が日本に対して使われ、一発の爆弾が引き起こす被害の大きさが桁違いに大きくなり、核兵器の登場により戦争の意味がさらに変化した。もし再度世界大戦を起こせば、すなわち第三次世界大戦を引き起こせば核戦争となり、勝利者がいない戦争、全員が敗者となる戦争になる、と各国のリーダーは感じるようになったのである。またヒトラーとナチスがアウシュビッツでこっそりやっていたことが戦後になって世界中の人々に知られるにつれ、人道主義の観点からも忌避される傾向となった。戦後、世界大戦の悲劇を繰り返さないために国際連合が設立され、国連憲章2条4項は戦争だけでなく武力の行使を一般的に禁止した（武力不行使原則）。
戦争 概説
だが、その後も戦争は続いている。第二次世界大戦直後から、アメリカ合衆国とソヴィエト連邦、自由主義と共産主義という相容れない主義を掲げた2つの大国は冷戦を開始。西側諸国はNATO（北大西洋条約機構）を、ソヴィエトと東欧諸国はワルシャワ条約機構という軍事同盟を結成し睨み合う状況になった。1955年から1975年にはベトナム戦争が起き、共産主義勢力（北ベトナム）と民主主義勢力（南ベトナムおよびアメリカ）の戦いとなった。1978年からはアフガニスタン戦争すなわち1978年から1989年にかけてのアフガニスタン紛争や2001年から2021年にかけてのアフガニスタン紛争も起きた。
戦争 概説
1991年のソビエト連邦崩壊後、一時的に世界は"アメリカ一強状態"になったように見え、自由主義諸国の人々はパクス・アメリカーナ（アメリカの世界支配による平和状態）になるかのように無邪気に思い描いていたが、残念ながらそうはならなかった。アメリカや自由主義諸国に抑圧されたと感じたイスラーム諸国の男たちはムジャーヒディーン（戦士）として彼らが言うジハードを行うため水面下で着々とアメリカ、イギリス、フランスなどに対する新しい形の戦争の準備を進め、2001年のアメリカ同時多発テロ事件を実行し、これは表面上は国家が戦争をしかけてきたのではないのでアメリカ側はそれをテロリズムと位置づけることになり、それ以降、アメリカはいわゆる "対テロ戦争" を行うことになった。圧倒的な強国と見えていた米国は、人々が気づかないうちに経済力が低下し世界各地の米軍を維持し軍事作戦を行うことがやや重荷になり、2013年にバラク・オバマ大統領は、自分の発言が世界規模ではどのような結果を産むか深く考えず、うかつにも「米国は世界の警察官ではない」と宣言してしまった。その宣言は報道で世界を駆け巡り、それまで米国と対立してきた諸国のリーダーらは、自分たちがやりたいようにやっても以前のようにアメリカに直接攻撃されずに済む、と理解した。
戦争 概説
ところで1932年～1933年にスターリンはウクライナから穀物を奪い大飢饉を引き起こし多くのウクライナ人が餓死に追い込まれた。これをホロドモールと言う。ホロドモールの間に400万人以上が餓死した。ソヴィエト連邦内では厳しい情報統制があり、ホロドモールをかろうじて生き延びたウクライナ人被害者らは、数十年間、ホロドモールについて公の場で語ることを許されず、それを飢饉と呼ぶことすらできなかった。飢饉について公言すれば "反ソビエトのプロパガンダを行った"として迫害に遭った。ソヴィエト連邦政府が組織的に行った事実隠蔽により、ソヴィエト連邦の一般市民の大多数は、スターリンが意図的に引き起こしたウクライナ国内の飢饉によりウクライナ人が400万人以上が餓死していた、という事実をまったく知らされていなかった。ソ連政府がこの大飢饉があったことを認めたのは、大飢饉発生から約50年後の1980年代のことである。そして1991年12月にソ連が崩壊してその情報統制が解かれ、ホロドモール被害者やその遺族がホロドモールについて語ることができるようになり、犠牲者や犠牲者遺族から証言の聞き取りや記録が行われ、犠牲者の共同墓地の場所の特定や発掘も行われ、証言や証拠によりホロドモールの実態が明らかになったことで、ウクライナの学校の歴史の授業でホロドモールについて教えられるようになった。こうしてソ連崩壊から10年から20年ほどの間に、ウクライナ人の圧倒的大多数は、ホロドモールの実態はロシア人がウクライナ人に対して行ったジェノサイド（大量殺戮）だと理解するようになったのである。自分たちの親や祖父母の世代を大量殺戮したロシア人とは一緒にやって行けない、とウクライナ人の圧倒的大多数は考えるようになった。