
コンピュータプログラムとは、コンピュータが実行するためのプログラミング言語による一連の命令またはセットです。これはソフトウェアの1つの構成要素であり、ドキュメントやその他の無形の構成要素も含まれます。[1]
人間が読める形式のコンピュータプログラムは、ソースコードと呼ばれます。コンピュータはネイティブのマシン命令しか実行できないため、ソースコードを実行するには別のコンピュータプログラムが必要です。したがって、ソースコードは、その言語用に書かれたコンパイラを使用してマシン命令に変換されます。(アセンブリ言語プログラムは、アセンブラを使用して変換されます。)結果として得られるファイルは実行可能ファイルと呼ばれます。または、ソースコードは、その言語用に書かれたインタープリタ内で実行されることもあります。[2]
実行可能ファイルの実行が要求されると、オペレーティングシステムはそれを メモリにロードし、プロセスを開始します。[3]中央処理装置はすぐにこのプロセスに切り替えて、各マシン命令をフェッチ、デコードし、実行できるようになります。[4]
ソースコードの実行が要求されると、オペレーティングシステムは対応するインタープリタをメモリにロードし、プロセスを開始します。次に、インタープリタはソースコードをメモリにロードし、各ステートメントを翻訳して実行します。ソースコードの実行は、実行可能ファイルの実行よりも遅くなります。[5] [b]さらに、インタープリタをコンピュータにインストールする必要があります。
コンピュータプログラムの例
「Hello, World!」プログラムは、言語の基本構文を説明するために使用されます。BASIC (1964) 言語の構文は、言語を習得しやすくするために意図的に制限されています。[ 6 ]たとえば、変数は使用前に宣言されません。 [7]また、変数は自動的にゼロに初期化されます。[7]以下は、Basic で数値リストの平均を計算するコンピュータ プログラムの例です。 [8]
10 INPUT "平均を取る数値はいくつですか?" , A 20 FOR I = 1 TO A 30 INPUT "数値を入力してください:" , B 40 LET C = C + B 50 NEXT I 60 LET D = C / A 70 PRINT "平均は" , D 80 END
基本的なコンピュータプログラミングの仕組みを習得すると、より洗練された強力な言語を使って大規模なコンピュータシステムを構築できるようになります。[9]
歴史
ソフトウェア開発の改善は、コンピュータ ハードウェアの改善の結果です。ハードウェアの歴史の各段階で、コンピュータ プログラミングのタスクは劇的に変化しました。
解析エンジン

1837年、ジャカードの織機に触発されてチャールズ・バベッジは解析機関を作ろうとした。[10] 計算機の部品の名前は繊維産業から借りたものである。繊維産業では、糸は倉庫から運ばれ、製糸される。計算機には、それぞれ50桁の1000の数字を記憶する記憶装置があった。 [ 11]記憶装置の数字は処理のために工場に転送された。プログラミングは2組の穴あきカードを使って行われた。1組は操作を指示し、もう1組は変数を入力した。[10] [12]しかし、何千もの歯車とギアが完全に連携することはなかった。[13]
エイダ・ラブレスはチャールズ・バベッジの協力を得て、解析機関の解説書を作成した(1843年)。 [ 14]この解説書には、解析機関を使用してベルヌーイ数を計算する方法の詳細を記した注釈Gが含まれていた。この注釈は、歴史家によって世界初のコンピュータプログラムと認識されている。[13]
ユニバーサルチューリングマシン

1936年、アラン・チューリングは、あらゆる計算をモデル化できる理論上の装置である万能チューリングマシンを発表しました。 [15] これは、無限に長い読み取り/書き込みテープを持つ有限状態機械です。マシンはテープを前後に動かし、アルゴリズムを実行するときにその内容を変更します。マシンは初期状態から開始し、一連のステップを実行し、停止状態に遭遇すると停止します。[16]現在のすべてのコンピューターはチューリング完全です。[17]
エニアック

電子数値積分器およびコンピュータ(ENIAC)は、1943年7月から1945年秋にかけて構築されました。これはチューリング完全な汎用コンピュータで、回路を作成するために17,468本の真空管を使用しました。その中核は、一連のパスカリーンを配線したものです。[18] 40台のユニットの重量は30トン、占有面積は1,800平方フィート(167 m 2 )で、アイドル時の電力消費は1940年代の通貨で1時間あたり650ドルでした。 [18] 10進数のアキュムレータが20個ありました。ENIACのプログラミングには最大2か月かかりました。[18] 3つの機能テーブルは車輪付きで、固定された機能パネルまで転がす必要がありました。機能テーブルは、太い黒いケーブルをプラグボードに差し込むことで機能パネルに接続されました。各機能テーブルには728個の回転ノブがありました。 ENIACのプログラミングには、3,000個のスイッチのいくつかを設定することも含まれていました。プログラムのデバッグには1週間かかりました。[19] ENIACは1947年から1955年までアバディーン実験場で稼働し、水素爆弾のパラメータを計算し、気象パターンを予測し、大砲の照準を合わせるための射撃表を作成しました。[20]
プログラム内蔵型コンピュータ
プログラム内蔵型コンピュータは、コードを差し込んでスイッチを入れるのではなく、データをメモリにロードするのと同じように命令をメモリにロードします。 [21]その結果、コンピュータはすばやくプログラムでき、非常に高速に計算を実行できました。[22] プレスパー・エッカートとジョン・モークリーがENIACを製作しました。2人のエンジニアは、1944年2月付けの3ページのメモでプログラム内蔵型の概念を紹介しました。 [23]その後、1944年9月に、ジョン・フォン・ノイマンがENIACプロジェクトに取り組み始めました。 1945年6月30日、フォン・ノイマンはEDVACに関する報告書の第一稿を発表し、コンピュータの構造を人間の脳の構造と同一視しました。[22]この設計はフォン・ノイマン・アーキテクチャとして知られるようになりました。このアーキテクチャは、1949年にEDVACとEDSACコンピュータの構築に同時に採用されました。[24]
IBM System/360 (1964年)は、それぞれが同じ命令セットアーキテクチャを持つコンピュータのファミリーでした。モデル20は最も小型で最も安価でした。顧客は同じアプリケーションソフトウェアをアップグレードして保持することができました。[25]モデル195は最も高級でした。各System/360モデルは、マルチプログラミング[25] (メモリ内に複数のプロセスを同時に持つ)を特徴としていました。1つのプロセスが入出力を待っている間に、別のプロセスが計算を行うことができました。
IBMは各モデルをPL/1でプログラムすることを計画した。[26] COBOL、Fortran、ALGOLプログラマーを含む委員会が結成された。その目的は、包括的で使いやすく、拡張可能で、CobolとFortranに代わる言語を開発することだった。[26]その結果、コンパイルに長い時間を要する大規模で複雑な言語が生まれた。[27]

1970年代までに製造されたコンピュータには、手動でプログラミングするためのフロントパネルスイッチがありました。[28]コンピュータプログラムは参照用に紙に書かれていました。命令はオン/オフ設定の構成で表されていました。構成を設定した後、実行ボタンを押しました。このプロセスが繰り返されました。コンピュータプログラムは、紙テープ、パンチカード、または磁気テープを介して自動的に入力されました。媒体がロードされた後、開始アドレスがスイッチで設定され、実行ボタンが押されました。[28]
超大規模統合

ソフトウェア開発における大きなマイルストーンは、超大規模集積回路(VLSI)回路の発明(1964年)でした。 [29]第二次世界大戦後、真空管ベースの技術は、回路基板に搭載された点接触トランジスタ(1947年)とバイポーラ接合トランジスタ(1950年代後半)に置き換えられました。[ 29 ] 1960年代には、航空宇宙産業が回路基板を集積回路チップに置き換えました。[29]
フェアチャイルドセミコンダクター(1957年)とインテル(1968年)の共同創設者であるロバート・ノイスは、電界効果トランジスタの製造を改良する技術的改善を達成した(1963年)。[30]目標は、半導体接合部の電気抵抗率と伝導率を変更することです。まず、天然のケイ酸塩鉱物をシーメンス法を使用してポリシリコンロッドに変換します。[31]次に、チョクラルスキー法でロッドを単結晶シリコン、ブール結晶に変換します。[32]次に、結晶を薄くスライスしてウェハー基板を形成します。次に、フォトリソグラフィーのプレーナープロセスで、ユニポーラトランジスタ、コンデンサ、ダイオード、抵抗器をウェハー上に統合して、金属酸化物半導体(MOS)トランジスタのマトリックスを構築します。[33] [34] MOSトランジスタは、集積回路チップの主要コンポーネントです。[30]
もともと、集積回路チップは製造時に機能が設定されていました。1960年代には、電気の流れを制御することは、読み取り専用メモリ(ROM)のマトリックスをプログラミングすることに移行しました。マトリックスは、2次元のヒューズ配列に似ていました。[29]マトリックスに命令を埋め込むプロセスは、不要な接続を焼き切ることでした。[29]接続が非常に多かったため、ファームウェアプログラマーは、焼き切りを監視するために別のチップにコンピュータプログラムを書きました。 [29]この技術は、プログラマブルROMとして知られるようになりました。1971年、インテルはコンピュータプログラムをチップにインストールし、インテル4004マイクロプロセッサと名付けました。[35]

マイクロプロセッサと中央処理装置(CPU)という用語は現在では同じ意味で使用されています。しかし、CPUはマイクロプロセッサよりも古いものです。たとえば、IBM System/360 (1964年)には、セラミック基板上に個別の部品を搭載した回路基板で作られたCPUがありました。[36]
サクラメント州立大学 8008

Intel 4004(1971)は、ビジコン電卓を動作させるために設計された4ビットのマイクロプロセッサでした。発売から5か月後、Intelは8ビットのマイクロプロセッサであるIntel 8008を発売しました。ビル・ペンツはサクラメント州立大学のチームを率いて、 Intel 8008を使用した最初のマイクロコンピュータであるSac State 8008(1972)を構築しました。[37]その目的は、患者の医療記録を保存することでした。このコンピュータは、3メガバイトのハードディスクドライブであるMemorexを実行するためにディスクオペレーティングシステムをサポートしていました。[29]カラーディスプレイとキーボードが1つのコンソールにパッケージ化されていました。ディスクオペレーティングシステムは、IBMのBasic Assembly Language(BAL)を使用してプログラムされていました。医療記録アプリケーションは、BASICインタープリタを使用してプログラムされていました。[29]しかし、このコンピュータは非常に高価であったため、進化の行き止まりでした。また、特定の目的のために公立大学の研究室で構築されました。[37]それにもかかわらず、このプロジェクトはIntel 8080(1974)命令セットの開発に貢献しました。[29]
x86 シリーズ
.png/500px-IBM_PC-IMG_7271_(transparent).png)
1978年、インテルがインテル8080をインテル8086にアップグレードした時、現代のソフトウェア開発環境が始まりました。インテルはインテル8086を簡素化して、より安価なインテル8088を製造しました。[38] IBMは、パーソナルコンピュータ市場に参入した時(1981年)、インテル8088を採用しました。パーソナルコンピュータに対する消費者の需要が高まるにつれて、インテルのマイクロプロセッサ開発も増加しました。開発の連続はx86シリーズとして知られています。x86アセンブリ言語は、下位互換性のある機械命令のファミリーです。以前のマイクロプロセッサで作成された機械命令は、マイクロプロセッサのアップグレードを通じて保持されました。これにより、消費者は新しいアプリケーションソフトウェアを購入することなく、新しいコンピュータを購入することができました。命令の主なカテゴリは次のとおりです。[c]
- ランダム アクセス メモリ内の数値と文字列を設定およびアクセスするためのメモリ命令。
- 整数に対して基本的な算術演算を実行する整数算術論理ユニット(ALU) 命令。
- 実数に対して基本的な算術演算を実行する浮動小数点 ALU 命令。
- メモリを割り当て、関数とインターフェースするために必要なワードをプッシュおよびポップするためのスタック命令を呼び出します。
- 単一命令複数データ(SIMD)命令[d]は、複数のプロセッサがデータの配列に対して同じアルゴリズムを実行する場合に速度を向上させます。
プログラミング環境の変化

VLSI 回路により、プログラミング環境はコンピュータ端末(1990 年代まで)からグラフィカル ユーザー インターフェイス(GUI) コンピュータへと進化しました。コンピュータ端末では、プログラマーはコマンド ライン環境で実行される1 つのシェルしか使用できませんでした。1970 年代には、テキスト ベースのユーザー インターフェイスを通じて、フルスクリーンのソース コード編集が可能になりました。使用可能なテクノロジに関係なく、目標はプログラミング言語でプログラムすることです。
プログラミングパラダイムと言語
プログラミング言語の機能は、プログラミングの理想を表現するために組み合わせられる構成要素を提供するために存在します。[39]理想的には、プログラミング言語は次のようになります。[39]
- アイデアをコード内で直接表現します。
- 独立した考えを独立して表現する。
- アイデア間の関係をコード内で直接表現します。
- アイデアを自由に組み合わせます。
- 組み合わせが意味を成す場合にのみアイデアを組み合わせます。
- 単純な考えを単純に表現する。
これらの構成要素を提供するプログラミング言語のプログラミングスタイルは、プログラミングパラダイムに分類することができます。[ 40 ]例えば、異なるパラダイムは次のような違いを生む可能性があります。[40]
これらのプログラミングスタイルはそれぞれ異なるプログラミング言語の統合に貢献してきました。[40]
プログラミング言語は、プログラマがコンピュータに指示を伝えるためのキーワード、シンボル、識別子、ルールの集合です。 [41]これらは構文と呼ばれる一連のルールに従います。[41]
- キーワードは宣言や文を形成するための予約語です。
- シンボルは、演算、代入、制御フロー、および区切り文字を形成する文字です。
- 識別子は、定数、変数名、構造体名、関数名を形成するためにプログラマーによって作成される単語です。
- 構文規則はバッカス・ナウア形式で定義されます。
プログラミング言語は形式言語から基礎を得ています。[42]形式言語でソリューションを定義する目的は、根本的な問題を解決するためのアルゴリズムを生成することです。[42]アルゴリズムは、問題を解決するための一連の単純な命令です。[43]
プログラミング言語の世代

プログラミング言語の進化は、EDSAC (1949)がフォン・ノイマン・アーキテクチャで最初のコンピュータプログラム格納装置を使用したときに始まりました。[44] EDSACのプログラミングは、プログラミング言語の第一世代でした。
- プログラミング言語の第一世代は機械語である。[45] 機械語では、プログラマーは機械コードと呼ばれる命令番号を使用して命令を入力する必要がある。例えば、PDP -11のADD演算の命令番号は24576である。[46]
- プログラミング言語の第2世代はアセンブリ言語です。[45] アセンブリ言語を使用すると、プログラマは命令番号を覚える代わりにニーモニック 命令を使用できます。アセンブラは、各アセンブリ言語ニーモニックをそのマシン語番号に変換します。たとえば、PDP-11では、演算24576はソースコード内でADDとして参照できます。[46] 4つの基本的な算術演算には、ADD、SUB、MUL、DIVなどのアセンブリ命令があります。[46]コンピューターには、メモリセルを予約するためのDW(Define Word)などの命令もあります。次に、MOV命令を使用して、レジスタとメモリ間で整数をコピーできます。
- 第三世代のプログラミング言語では、コンパイラとインタープリタを使用してコンピュータプログラムを実行します。第三世代言語の特徴は、特定のハードウェアに依存しないことです。[49]初期の言語には、 Fortran(1958)、COBOL(1959)、ALGOL(1960)、BASIC(1964)などがあります。[45] 1973年に、効率的な機械語命令を生成する高級言語としてCプログラミング言語が登場しました。 [50]第三世代言語は歴史的にステートメントごとに多くの機械語命令を生成しましたが、 [51] Cには単一の機械語命令を生成するステートメントがあります。[e]さらに、最適化コンパイラはプログラマーの指示を無視して、ステートメントよりも少ない機械語命令を生成する場合があります。今日、命令型の第三世代の範囲には、言語のパラダイム全体が広がっています。
- 第4世代のプログラミング言語は、プログラミング文をどのように構築するかではなく、どのような出力結果が望まれるかに重点を置いています。 [45] 宣言型言語は副作用を制限し、プログラマが比較的エラーの少ないコードを書けるようにしています。[45]人気のある第4世代言語の1つは、構造化照会言語(SQL)と呼ばれています。[45] データベース開発者は、データベースレコードを1つずつ処理する必要がなくなりました。また、単純な文で、どのように取得されるかを理解することなく、出力レコードを生成できます。
命令型言語

命令型言語は宣言、式、文を使って順次アルゴリズムを指定する。[52]
- 宣言はコンピュータプログラムに変数名を導入し、それをデータ型に割り当てます[53] – 例えば:
var x: integer; - 式は値を生成します。例:
2 + 24 を生成します - ステートメントは、変数に式を割り当てたり、変数の値を使用してプログラムの制御フローを変更したりすることがあります。たとえば、次のようになります。
x := 2 + 2; if x = 4 then do_something();
フォートラン
FORTRAN (1958) は、「IBM 数学式変換システム」として発表されました。文字列処理機能のない科学計算用に設計されました。宣言、式、ステートメントとともに、次の機能をサポートしました。
成功した理由は次のとおりです。
- プログラミングとデバッグのコストはコンピュータのランニングコストを下回りました。
- IBM によってサポートされました。
- 当時の応用は科学的なものでした。[54]
しかし、IBM以外のベンダーもFortranコンパイラを作成したが、その構文はIBMのコンパイラではおそらく失敗するものであった。[54]米国規格協会( ANSI )は1966年に最初のFortran標準を策定した。1978年にFortran 77が標準となり、1991年まで使用された。Fortran 90は以下をサポートする。
コボル
COBOL (1959) は「COmmon Business Oriented Language」の略です。Fortran はシンボルを操作しました。シンボルは数字である必要がないことがすぐに認識されたため、文字列が導入されました。[55]米国国防総省はCOBOL の開発に影響を与え、グレース・ホッパーが主な貢献者でした。ステートメントは英語に似ており、冗長でした。目標は、管理者がプログラムを読めるような言語を設計することでした。しかし、構造化されたステートメントが不足していたため、この目標は達成できませんでした。[56]
COBOLの開発は厳しく管理されていたため、ANSI標準を必要とする方言は出現しませんでした。その結果、1974年まで15年間変更されませんでした。1990年代のバージョンでは、オブジェクト指向プログラミングなどの重要な変更が行われました。[56]
アルゴル
ALGOL (1960) は「ALGOrithmic Language」の略です。プログラミング言語の設計に大きな影響を与えました。[57]ヨーロッパとアメリカのプログラミング言語の専門家の委員会から生まれたこの言語は、標準的な数学表記法を使用し、読みやすく構造化された設計でした。Algol は、Backus-Naur 形式を使用して構文を定義した最初の言語でした。[57]これにより、構文指向のコンパイラが生まれました。次のような機能が追加されました。
Algolの直接の子孫には、ある系統ではPascal、Modula-2、Ada、Delphi、Oberonが含まれます。別の系統では、子孫にはC、C++、Javaが含まれます。[57]
基本
BASIC (1964) は「初心者向け汎用シンボリック命令コード」の略です。ダートマス大学ですべての学生が学習できるように開発されました。[8]学生がより強力な言語に進まなかったとしても、Basic は記憶に残ります。[8] Basic インタープリタは、1970 年代後半に製造されたマイクロコンピュータにインストールされました。マイクロコンピュータ産業が成長するにつれて、言語も成長しました。[8]
Basicは対話型セッションの先駆者でした。[8]その環境内でオペレーティングシステムのコマンドを提供しました。
- 「new」コマンドにより空のスレートが作成されました。
- ステートメントはすぐに評価されます。
- 文の前に行番号を付けることでプログラムすることができます。[f]
- 「list」コマンドはプログラムを表示しました。
- 「run」コマンドはプログラムを実行しました。
しかし、Basicの構文は大規模なプログラムには単純すぎました。[8]最近の言語方言では、構造とオブジェクト指向の拡張機能が追加されました。Microsoftの Visual Basicは現在でも広く使用されており、グラフィカルユーザーインターフェイスを生成します。[7]
C
C プログラミング言語(1973) は、 BCPL言語がBに置き換えられ、AT&T ベル研究所が次のバージョンを「C」と呼んだことからその名前が付けられました。その目的は、UNIX オペレーティングシステムを作成することでした。[50] C は比較的小さな言語であるため、コンパイラの作成が容易です。その成長は、1980 年代のハードウェアの成長を反映しています。[50]また、アセンブリ言語の機能を備えながら、高水準の構文を使用しているため、成長しました。次のような高度な機能が追加されました。
- インラインアセンブラ。
- ポインタ上の演算。
- 関数へのポインタ。
- ビット操作。
- 複雑な演算子を自由に組み合わせる。[50]

C では、プログラマーがメモリ データのどの領域を格納するかを制御できます。グローバル変数と静的変数は、格納に必要なクロック サイクルが最も少なくなります。標準変数宣言にはスタックが自動的に使用されます。ヒープメモリは、関数からポインター変数に返されます。
malloc()
- グローバルおよび静的データ領域は、プログラム領域のすぐ上にあります。(プログラム領域は技術的にはテキスト領域と呼ばれます。マシン命令が格納される場所です。)
- グローバルデータ領域と静的データ領域は、技術的には2つの領域です。[58] 1つの領域は初期化データセグメントと呼ばれ、デフォルト値で宣言された変数が格納されます。もう1つの領域はセグメントによって開始されるブロックと呼ばれ、デフォルト値なしで宣言された変数が格納されます。
- グローバルおよび静的データ領域に格納される変数のアドレスはコンパイル時に設定されます。その値はプロセスの存続期間中保持されます。
- グローバルおよび静的領域には、関数の上(外部)で宣言されたグローバル変数
main()が格納されます。[59]main()グローバル変数は、ソースコード内の他のすべての関数から参照できます。
- グローバルおよび静的領域には、関数の上(外部)で宣言されたグローバル変数
- 一方、関数内
main()、他の関数内、または{}ブロック区切り文字内の変数宣言はローカル変数です。ローカル変数には、仮パラメータ変数も含まれます。パラメータ変数は関数定義の括弧内に囲まれます。[60]パラメータは関数へのインターフェースを提供します。
- プレフィックスを使用して宣言されたローカル変数も、グローバルおよび静的データ
static領域に格納されます。[58]グローバル変数とは異なり、静的変数は関数またはブロック内でのみ可視です。静的変数は常に値を保持します。使用例としては、関数[g]があります。int increment_counter(){static int counter = 0; counter++; return counter;}
- プレフィックスを使用して宣言されたローカル変数も、グローバルおよび静的データ
- スタック領域は、最上位のメモリアドレスの近くにある連続したメモリブロックです。[61]スタックに配置された変数は、上から下に向かって設定されます。[h] [61]スタックポインタは、最後に設定されたメモリアドレスを追跡する特別な目的のレジスタです。 [61]変数は、アセンブリ言語のPUSH命令によってスタックに配置されます。したがって、これらの変数のアドレスは実行時に設定されます。スタック変数のスコープが失われる方法は、POP命令を使用することです。
- プレフィックスなしで宣言されたローカル変数
static(仮パラメータ変数を含む)[62]は自動変数[59]と呼ばれ、スタックに格納されます。[58]これらは関数またはブロック内で可視であり、関数またはブロックを終了するとスコープを失います。
- プレフィックスなしで宣言されたローカル変数
- ヒープ領域はスタックの下にあります。[58]下から上に向かってデータが配置されます。オペレーティングシステムは、ヒープポインタと割り当てられたメモリブロックのリストを使用してヒープを管理します。 [63]スタックと同様に、ヒープ変数のアドレスは実行時に設定されます。ヒープポインタとスタックポインタが出会うと、メモリ不足エラーが発生します。
- Cはヒープメモリを割り当てる
malloc()ためのライブラリ関数を提供します。[i] [64]ヒープにデータを格納するのは追加のコピー関数です。[j]ヒープに格納された変数は、ポインタを使用して関数に効率的に渡されます。ポインタがなければ、データブロック全体をスタック経由で関数に渡す必要があります。
- Cはヒープメモリを割り当てる
C++
1970 年代、ソフトウェア エンジニアは、大規模なプロジェクトをモジュールに分割するための言語サポートを必要としていました。[65] 1 つの明らかな機能は、大規模なプロジェクトを物理的に個別のファイルに分解することでした。あまり明らかではない機能は、大規模なプロジェクトを論理的に抽象データ型に分解することでした。 [65]当時、言語は整数、浮動小数点数、文字列などの具体的な (スカラー)データ型をサポートしていました。抽象データ型は、具体的なデータ型の構造であり、新しい名前が付けられています。たとえば、整数のリストは と呼ばれます。
integer_list
オブジェクト指向の専門用語では、抽象データ型はクラスと呼ばれます。しかし、クラスは定義に過ぎず、メモリは割り当てられません。クラスにメモリが割り当てられ、識別子にバインドされると、それはオブジェクトと呼ばれます。[66]
オブジェクト指向命令型言語は、クラスの必要性と安全な関数型プログラミングの必要性を組み合わせて開発されました。[67]オブジェクト指向言語では、関数はクラスに割り当てられます。割り当てられた関数は、メソッド、メンバー関数、または操作と呼ばれます。オブジェクト指向プログラミングは、オブジェクトに対して操作を実行します。[68]
オブジェクト指向言語は、サブセット/スーパーセット関係をモデル化する構文をサポートしています。集合論では、サブセットの要素はスーパーセットに含まれるすべての属性を継承します。たとえば、学生は人です。したがって、学生の集合は人の集合のサブセットです。結果として、学生はすべての人に共通するすべての属性を継承します。さらに、学生は他の人にはない独自の属性を持っています。オブジェクト指向言語は、継承を使用してサブセット/スーパーセット関係をモデル化します。[69]オブジェクト指向プログラミングは、 1990年代後半までに主要な言語パラダイムになりました。[65]
C++(1985)はもともと「C with Classes」と呼ばれていました。[70] Simula言語のオブジェクト指向機能を追加することでCの機能を拡張するように設計されました。[71]
オブジェクト指向モジュールは 2 つのファイルで構成されます。定義ファイルはヘッダー ファイルと呼ばれます。以下は、単純な学校アプリケーションの GRADE クラスのC++ヘッダー ファイルです。
// グレード.h
// -------
// 複数のソース ファイルが重複エラーなしでこのヘッダー ファイル
をインクルードできるようにするために使用されます。 // ----------------------------------------------
#ifndef GRADE_H
#define GRADE_H
class GRADE { public : // これはコンストラクター操作です。// ---------------------------------- GRADE ( const char letter );
// これはクラス変数です。
// ------------------------- char letter ;
// これはメンバー操作です。
// --------------------------- int grade_numeric ( const char letter );
// これはクラス変数です。
// ------------------------- int numeric ; }; #endif
コンストラクタ操作はクラス名と同じ名前を持つ関数です。[72]呼び出し操作がnewステートメントを実行するときに実行されます。
モジュールのもう 1 つのファイルはソース ファイルです。以下は、単純な学校アプリケーションの GRADE クラスの C++ ソース ファイルです。
// grade.cpp
// ---------
#include "grade.h"
GRADE :: GRADE ( const char letter ) { // キーワード 'this' を使用してオブジェクトを参照します。// ------------------------------------------------ this -> letter = letter ;
// これは時間的凝集性です
// ------------------------- this -> numeric = grade_numeric ( letter ); }
int GRADE :: grade_numeric ( const char letter ) { if ( ( letter == 'A' || letter == 'a' ) ) 4を返します。else if ( ( letter == 'B' || letter == 'b' ) ) 3を返します。else if ( ( letter == 'C' || letter == ' c' ) ) 2を返します。else if ( ( letter == 'D' || letter == 'd' ) ) 1を返します。else if ( ( letter == 'F' || letter == ' f' ) ) 0を返します。else -1を返します。}
以下は、単純な学校アプリケーションの PERSON クラスのC++ヘッダー ファイルです。
// person.h
// --------
#ifndef PERSON_H
#define PERSON_H
クラスPERSON { public : PERSON ( const char * name ); const char * name ; }; #endif
以下は、簡単な学校アプリケーションの PERSON クラスのC++ソース ファイルです。
// person.cpp
// ----------
#include "person.h"
PERSON :: PERSON ( const char * name ) { this -> name = name ; }
以下は、単純な学校アプリケーションの STUDENT クラスのC++ヘッダー ファイルです。
// student.h
// ---------
#ifndef STUDENT_H
#define STUDENT_H
#include "person.h" #include "grade.h"
// STUDENT は PERSON のサブセットです。
// --------------------------------
class STUDENT : public PERSON { public : STUDENT ( const char * name ); GRADE * grade ; }; #endif
以下は、簡単な学校アプリケーションの STUDENT クラスのC++ソース ファイルです。
// student.cpp
// -----------
#include "student.h" #include "person.h"
STUDENT :: STUDENT ( const char * name ) : // PERSON スーパークラスのコンストラクタを実行します。// ------------------------------------------------- PERSON ( name ) { // 他に何もすることはありません。// ------------------- }
デモ用のドライバー プログラムは次のとおりです。
// student_dvr.cpp
// ---------------
#include <iostream> #include "student.h"
int main ( void ) { STUDENT * student = new STUDENT ( "The Student" ); student -> grade = new GRADE ( 'a' );
std :: cout
// 学生が PERSON の名前を継承していることに注意してください<< student -> name << ": Numeric grade = " << student -> grade -> numeric << " \n " ; return 0 ; }
すべてをコンパイルするためのmakefileは次のとおりです。
# メイクファイル
# --------
すべて: student_dvr
クリーン:
rm student_dvr *.o
student_dvr : student_dvr . cpp grade . o student . o person . o c++ student_dvr.cpp grade.o student.o person.o -o student_dvr
grade.o : grade.cpp grade.h c ++ -c grade.cpp
student.o :学生.cpp学生.h c ++ -c学生.cpp
person.o : person.cpp person.h c ++ -c person.cpp
宣言型言語
命令型言語には、非ローカル変数に式を代入すると、意図しない副作用が生じる可能性があるという大きな批判が1つあります。 [73] 宣言型言語では、通常、代入文と制御フローが省略されます。宣言型言語では、実行すべき計算が記述されますが、計算方法は記述されません。宣言型言語には、関数型言語と論理型言語という2つの大きなカテゴリがあります。
関数型言語の原理は、ラムダ計算を明確な意味のガイドとして使用することである。[74]数学において、関数とは式の要素を値の範囲にマッピングする規則である。次の関数を考えてみよう。
times_10(x) = 10 * x
式は 10 * x関数によって値times_10()の範囲にマッピングされます。 1 つの値は 20 です。 これは x が 2 のときに発生します。 したがって、関数の適用は数学的に次のように記述されます。
times_10(2) = 20
関数型言語コンパイラは、この値を変数に格納しません。代わりに、プログラムカウンタを呼び出し関数に戻す前に、値をコンピュータのスタックにプッシュします。その後、呼び出し関数はスタックから値をポップします。 [75]
命令型言語は関数をサポートしています。したがって、プログラマが規律を守れば、命令型言語でも関数型プログラミングを実現できます。しかし、関数型言語は構文を通じてプログラマにこの規律を強制します。関数型言語は、何をするかを強調するように調整された構文を持っています。[ 76]
関数型プログラムは、一連の基本関数とそれに続く単一のドライバー関数で開発されます。[73]次のスニペットを検討してください。
function max( a, b ){/* code omitted */}
function min( a, b ){/* code omitted */}
function range( a, b, c ) {
return max( a, max( b, c ) ) - min( a, min( b, c ) );
}
プリミティブはmax()とですmin()。ドライバ関数は ですrange()。実行中:
put( range( 10, 4, 7) );6 を出力します。
関数型言語は、コンピュータサイエンスの研究において、新しい言語機能を探求するために使用されています。 [77]さらに、副作用がないため、並列プログラミングや並行プログラミングで人気があります。[78]しかし、アプリケーション開発者は、命令型言語のオブジェクト指向機能を好みます。[78]
リスプ
Lisp (1958) は「LISt Processor」の略です。[79]リストを処理するために調整されています。リストのリストを構築することで、データの完全な構造が形成されます。メモリ内には、ツリーデータ構造が構築されます。内部的には、ツリー構造は再帰関数に適しています。[80]ツリーを構築するための構文は、スペースで区切られた要素を括弧で囲むことです。以下は、 3つの要素のリストです。最初の2つの要素は、それ自体が2つの要素のリストです。
((A B) (HELLO WORLD) 94)
Lispには要素を抽出して再構築する関数があります。[81]関数はhead()リストの最初の要素を含むリストを返します。 関数はtail()最初の要素以外のすべてを含むリストを返します。 関数はcons()他のリストを連結したリストを返します。したがって、次の式はリストを返しますx。
cons(head(x), tail(x))
Lispの欠点の1つは、多くの関数がネストされている場合、括弧がわかりにくくなることです。[76]現代のLisp環境では、括弧の一致が保証されます。余談ですが、Lispは代入文とgotoループの命令型言語操作をサポートしています。 [82]また、Lispはコンパイル時に要素のデータ型を気にしません。 [83]代わりに、実行時にデータ型を割り当てます(再割り当てする場合もあります) 。実行時にデータ型を割り当てることを動的バインディングと呼びます。[84]動的バインディングは言語の柔軟性を高めますが、プログラミングエラーがソフトウェア開発プロセスの後半まで残る可能性があります。[84]
大規模で信頼性が高く、読みやすいLispプログラムを書くには、事前の検討が必要です。適切に計画すれば、同等の命令型言語プログラムよりもはるかに短いプログラムを作成できます。[76] Lispは人工知能で広く使用されています。しかし、その使用が受け入れられているのは、命令型言語操作があり、意図しない副作用が発生する可能性があるためです。[78]
ML
ML(1973)[85]は「メタ言語」の略です。MLは、同じタイプのデータのみが互いに比較されることを確認します。[86]たとえば、この関数には1つの入力パラメータ(整数)があり、整数を返します。
楽しい times_10 ( n : int ) : int = 10 * n ;
ML はLispのように括弧にこだわりません。以下は の応用例ですtimes_10()。
10 2回
「20 : int」を返します。(結果とデータ型の両方が返されます。)
Lispと同様に、MLはリストを処理するように調整されています。Lispとは異なり、各要素は同じデータ型です。[87]さらに、MLはコンパイル時に要素のデータ型を割り当てます。コンパイル時にデータ型を割り当てることを静的バインディングと呼びます。静的バインディングでは、コンパイラが変数が使用される前にそのコンテキストをチェックするため、信頼性が向上します。[88]
プロローグ
Prolog (1972) は「PROgramming in LOGic」の略です。形式論理に基づいた論理プログラミング言語です。この言語はフランスのマルセイユでアラン・コルメローとフィリップ・ルーセルによって開発されました。これは、エディンバラ大学のロバート・コワルスキーらが開発した選択的線形定節解決の実装です。[89]
Prolog プログラムの構成要素は事実とルールです。簡単な例を次に示します。
猫(トム)。 % トムは猫です。
ネズミ(ジェリー)。 % ジェリーはネズミです。
動物( X ) :- 猫( X ). % それぞれの猫は動物です
動物( X ) :- ネズミ( X ). % それぞれのネズミは動物です
大きい( X ) :- 猫( X ). % それぞれの猫は大きい
小さい( X ) :- ネズミ( X ). % それぞれのネズミは小さい
eat ( X , Y ) :- マウス( X )、 チーズ( Y )。 % 各マウスは各チーズを食べます
eat ( X , Y ) :- 大きい( X )、 小さい( Y )。 % 各大きい動物は各小さい動物を食べます
すべての事実とルールを入力した後、次のような質問をすることができます。
- トムはジェリーを食べるでしょうか?
?- 食べる(トム、ジェリー)。
本当
次の例は、Prolog が文字の等級を数値に変換する方法を示しています。
numeric_grade ( 'A' , 4 )
。numeric_grade ( 'B' , 3 )
。numeric_grade ( 'C' , 2 )
。numeric_grade ( 'D' , 1 )
。numeric_grade ( 'F' , 0 )
。numeric_grade ( X , - 1 ) :- X = 'A'ではない 、X = 'B'ではない、X = 'C'ではない、X = 'D'ではない、X = 'F'ではない。grade ( 'The Student' , ' A' )。
?- grade ( '学生' , X )、 numeric_grade ( X , Y )。X
= ' A' 、
Y = 4
包括的な例を以下に示します。[90]
1) すべてのドラゴンは火を噴きます。あるいは、同じ意味で、物がドラゴンであれば火を噴きます。
billows_fire ( X ) :-
is_a_dragon ( X ) です。
2) 親の 1 体が火を噴く場合、クリーチャーも火を噴きます。
billows_fire ( X ) :-
is_a_creature ( X )、
is_a_parent_of ( Y 、X )、
billows_fire ( Y )。
3) X が Y の母であるか、X が Y の父である場合、X は Y の親です。
is_a_parent_of ( X , Y ):- is_the_mother_of ( X , Y )
。is_a_parent_of ( X , Y ):- is_the_father_of ( X , Y )。
4) あるものがドラゴンであれば、それは生き物です。
is_a_creature ( X ) :-
is_a_dragon ( X ) です。
5) ノルベルタはドラゴンで、パフは生き物です。ノルベルタはパフの母親です。
is_a_dragon ( norberta )
。is_a_creature ( puff )
。is_the_mother_of ( norberta 、 puff )。
ルール(2)は再帰的(帰納的)定義です。どのように実行されるかを理解する必要なく、宣言的に理解できます。
規則(3)は、関数が関係を使用してどのように表現されるかを示しています。ここでは、母関数と父関数により、すべての個体には母親と父親が1人ずつしか存在しないことが保証されます。
Prologは型付けされていない言語です。しかし、継承は述語を使って表現することができます。ルール(4)は、クリーチャーがドラゴンのスーパークラスであることを主張しています。
質問には逆推論を使用して回答します。次の質問が与えられます:
?- billows_fire ( X ) 。
Prolog は 2 つの回答を生成します。
X = ノルベルタ
X = パフ
Prolog の実用的な応用としては、人工知能における知識表現と問題解決があります。
オブジェクト指向プログラミング
オブジェクト指向プログラミングは、オブジェクトに対して操作(関数)を実行するプログラミング手法である。[91]基本的な考え方は、現象の特性をオブジェクトコンテナにグループ化し、コンテナに名前を付けることである。現象に対する操作もコンテナにグループ化される。[91]オブジェクト指向プログラミングは、コンテナの必要性と安全な関数型プログラミングの必要性を組み合わせて開発された。[92]このプログラミング手法は、オブジェクト指向言語に限定される必要はない。[93]オブジェクト指向言語では、オブジェクトコンテナはクラスと呼ばれる。非オブジェクト指向言語では、データ構造(レコードとも呼ばれる)がオブジェクトコンテナになることがある。データ構造をオブジェクトコンテナにするには、その構造専用の操作を記述する必要がある。結果として得られる構造は抽象データ型と呼ばれる。[94]ただし、継承は行われない。それでも、この欠点は克服できる。
以下は、単純な学校アプリケーションの GRADE 抽象データ型のC プログラミング言語 ヘッダー ファイルです。
/* グレード.h */
/* ------- */
/* 複数のソースファイルが
重複エラーなしでこのヘッダーファイルをインクルードできるようにするために使用されます。 */
/* ---------------------------------------------- */
#ifndef GRADE_H
#define GRADE_H
typedef struct { char letter ; } GRADE ;
/* コンストラクタ */
/* ----------- */
GRADE * grade_new ( char letter );
int grade_numeric ( char文字); #endif
この関数は、C++コンストラクターgrade_new()操作と同じアルゴリズムを実行します。
以下は、簡単な学校アプリケーションの GRADE 抽象データ型のC プログラミング言語ソース ファイルです。
/* grade.c */
/* ------- */
#include "grade.h"
GRADE * grade_new ( char letter ) { GRADE *グレード;
/* ヒープメモリを割り当てる */
/* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ERROR in %s/%s/%d: calloc() returned empty. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }
grade -> letter = letter ;グレードを返す; }
int grade_numeric ( char letter ) { if ( ( letter == 'A' || letter == ' a ' ) ) 4を返します。else if ( ( letter == 'B' || letter == ' b' ) ) 3を返します。else if ( ( letter == 'C' || letter == 'c' ) ) 2を返します。else if ( ( letter == 'D' || letter == 'd' ) ) 1を返します。else if ( ( letter == 'F' || letter == ' f' ) ) 0を返します。else -1を返します。}
コンストラクターでは、各メモリセルがゼロに設定されるため、 の
calloc()代わりに関数が使用されます。malloc()
以下は、単純な学校アプリケーションの PERSON 抽象データ型のC プログラミング言語ヘッダー ファイルです。
/* person.h */
/* -------- */
#ifndef PERSON_H
#define PERSON_H
typedef struct { char * name ; } PERSON ;
/* コンストラクタ */
/* ----------- */
PERSON * person_new ( char * name ); #endif
以下は、簡単な学校アプリケーションの PERSON 抽象データ型のC プログラミング言語ソース ファイルです。
/* person.c */
/* -------- */
#include "person.h"
PERSON * person_new ( char * name ) { PERSON * person ;
if ( ! ( person = calloc ( 1 , sizeof ( PERSON ) ) ) ) { fprintf ( stderr , "%s/%s/%d でエラー: calloc() が空を返しました。\n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }
person -> name = name ; personを返します; }
以下は、単純な学校アプリケーションの STUDENT 抽象データ型のC プログラミング言語ヘッダー ファイルです。
/* student.h */
/* --------- */
#ifndef STUDENT_H
#define STUDENT_H
#include "person.h" #include "grade.h"
typedef struct { /* STUDENT は PERSON のサブセットです。 */ /* -------------------------------- */ PERSON * person ;
GRADE *学年; }学生;
/* コンストラクタ */
/* ----------- */
STUDENT * student_new ( char * name ); #endif
以下は、簡単な学校アプリケーションの STUDENT 抽象データ型のC プログラミング言語ソース ファイルです。
/* student.c */
/* --------- */
#include "student.h" #include "person.h"
STUDENT * student_new ( char * name ) { STUDENT *学生;
if ( ! ( student = calloc ( 1 , sizeof ( STUDENT ) ) ) ) { fprintf ( stderr , "%s/%s/%d でエラー: calloc() が空を返しました。\n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }
/* PERSON スーパークラスのコンストラクタを実行します。 */
/* ------------------------------------------------- */ student -> person = person_new ( name ); return student ; }
デモ用のドライバー プログラムは次のとおりです。
/* student_dvr.c */
/* ------------- */
#include <stdio.h> #include "student.h"
int main ( void ) { STUDENT * student = student_new ( "The Student" ); student -> grade = grade_new ( 'a' );
printf ( "%s: 数値の成績 = %d \n " , /* サブセットは存在しますが、継承は存在しません。 */ student -> person -> name , /* 関数型プログラミングは、関数をジャストインタイム (JIT) で実行します */ grade_numeric ( student -> grade -> letter ) );
0 を返す; }
すべてをコンパイルするためのmakefileは次のとおりです。
# メイクファイル
# --------
すべて: student_dvr
クリーン:
rm student_dvr *.o
student_dvr : student_dvr .c grade .o student .o person .o gcc student_dvr.c grade.o student.o person.o -o student_dvr
grade.o : grade . c grade . h gcc -c grade.c
student.o : student.c student.h gcc -c student.c
person.o : person.c person.h gcc -c person.c
オブジェクト指向オブジェクトを構築するための正式な戦略は次のとおりです。[95]
- 目的語を特定します。おそらくこれらは名詞でしょう。
- 各オブジェクトの属性を特定します。オブジェクトを説明するのに役立つものは何ですか?
- 各オブジェクトの動作を特定します。これらはおそらく動詞になります。
- オブジェクト間の関係を特定します。これらはおそらく動詞になります。
例えば:
- 人とは名前によって識別される人間です。
- 成績は文字で識別される成績です。
- 学生とは成績を取得する人です。
構文と意味

コンピュータプログラムの構文は、そのプログラムの文法を形成する生成規則のリストです。[96]プログラミング言語の文法は、宣言、式、および文を正しく配置します。[97]言語の構文を補完するのが意味論です。意味論は、さまざまな構文構造に付随する意味を記述します。[98]生成規則の解釈が間違っている可能性があるため、構文構造には意味の記述が必要な場合があります。[99]また、異なる言語が同じ構文を持つ場合もありますが、動作は異なる場合があります。
言語の構文は、生成規則を列挙することによって正式に記述される。自然言語の構文は非常に複雑であるが、英語のサブセットでは、次のような生成規則を列挙することができる。[100]
- 文は名詞句とそれに続く動詞句で構成されます。
- 名詞句は、冠詞、形容詞、名詞の順で構成されます。
- 動詞句は動詞とそれに続く名詞句で構成されます。
- 冠詞は「the」です。
- 形容詞は「大きい」または
- 形容詞は「小さい」です。
- 名詞は「猫」または
- 名詞は「マウス」です。
- 動詞は「eats」です。
太字の単語は非終端記号と呼ばれます。一重引用符で囲まれた単語は終端記号と呼ばれます。[101]
この生成規則のリストから、一連の置き換えによって完全な文を形成することができる。[102]このプロセスは、非終端記号を有効な非終端記号または有効な終端記号に置き換えることである。この置き換えプロセスは、終端記号だけが残るまで繰り返される。有効な文の1つは次の通りである。
- 文
- 名詞句 動詞句
- 冠詞 形容詞 名詞 動詞句
- 形容詞 名詞 動詞 句
- 大きな 名詞 動詞 句
- 大きな 猫の動詞 句
- 大きな 猫の動詞 名詞句
- 大きな 猫は名詞 句を食べる
- 大きな 猫は冠詞 形容詞名詞を食べる
- 大きな 猫は 形容詞名詞を食べる
- 大きな 猫が 小さな名詞を食べる
- 大きな 猫が 小さなネズミを食べる
ただし、別の組み合わせでは無効な文になります。
- 小さな ネズミが 大きな猫を食べる
したがって、食べるアクティビティの意味を正しく記述するには、セマンティクスが必要です。
生成規則を列挙する方法の1つは、バッカス・ナウア記法(BNF)と呼ばれる。 [103] BNFは言語の構文を記述し、それ自体に構文がある。この再帰的な定義は、メタ言語の例である。[98] BNFの構文には以下が含まれる。
::=これは、非終端記号が右側にある場合は、a[n] で構成されていると解釈されます。終端記号が右側にある場合は、isと解釈されます。|これはまたはと翻訳されます。<非終端記号を>囲みます。
BNF を使用すると、英語のサブセットに次の生成規則のリストを含めることができます。
<文> ::= <名詞句><動詞句>
<名詞句> ::= <冠詞>< 形容詞 ><名詞> <動詞
句> :: = <動詞><名詞句>
<冠詞> ::= the
<形容詞> ::= big | small
<名詞> ::= cat | mouse
<動詞> ::= eats
BNFを使用すると、符号付き整数の生成規則は次のようになります。[104]
<符号付き整数> ::= <符号><整数>
<符号> ::= + | -
<整数> ::= <数字> | <数字><整数>
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
再帰的な生成規則に注目してください:
<整数> ::= <数字> | <数字><整数>
これにより、可能性は無限になります。したがって、桁数の制限を記述するための セマンティクスが必要になります。
生成規則の先頭にゼロが存在する可能性があることに注意してください。
<整数> ::= <数字> | <数字><整数>
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
したがって、先頭のゼロを無視する必要があることを記述する セマンティクスが必要です。
意味論を記述するためには2つの形式的手法が利用可能である。それは表示的意味論と公理的意味論である。[105]
ソフトウェアエンジニアリングとコンピュータプログラミング
.jpg/500px-Two_women_operating_ENIAC_(full_resolution).jpg)
ソフトウェアエンジニアリングは、高品質の コンピュータプログラムを作成するためのさまざまな技術です。[106] コンピュータプログラミングは、ソースコードを作成または編集するプロセスです。正式な環境では、システムアナリストは、自動化する組織のすべてのプロセスに関する情報を管理者から収集します。次に、この専門家は、新しいシステムまたは変更されたシステムの詳細な計画を準備します。 [107]この計画は、建築家の設計図に似ています。[107]
パフォーマンス目標
システムアナリストの目的は、適切な情報を適切な人に適切なタイミングで提供することです。[108]この目的を達成するための重要な要素は次のとおりです。[108]
- 出力の品質。出力は意思決定に役立ちますか?
- 出力の正確さ。実際の状況を反映していますか?
- 出力の形式。出力は簡単に理解できますか?
- 出力のスピード。リアルタイムで顧客とコミュニケーションをとる場合、時間に敏感な情報が重要です。
コスト目標
パフォーマンス目標を達成するには、以下のすべてのコストとバランスを取る必要がある。[109]
- 開発コスト。
- 独自性にはコストがかかります。再利用可能なシステムは高価になる可能性があります。ただし、限定的な使用のシステムよりも好まれる可能性があります。
- ハードウェアのコスト。
- 運営コスト。
システム開発プロセスを適用すると、プロセスの後半でエラーが検出されるほど、修正にかかるコストが高くなるという原則が緩和されます。[110]
ウォーターフォールモデル
ウォーターフォールモデルはシステム開発プロセスの実装である。[111]ウォーターフォールという名前が示すように、基本的なフェーズは互いに重なり合っている。[112]
- 調査段階では、根本的な問題を理解します。
- 分析フェーズでは、考えられる解決策を理解します。
- 設計フェーズでは、最適なソリューションを計画します。
- 実装フェーズでは、最適なソリューションをプログラムします。
- 保守フェーズはシステムの寿命を通じて継続します。システムを導入した後、システムの変更が必要になる場合があります。 [113]仕様上の欠陥、設計上の欠陥、コーディング上の欠陥などの欠陥が存在する可能性があります。改善が必要になる場合があります。変化する環境に対応するために適応が必要になる場合があります。
コンピュータプログラマー
コンピュータプログラマーは、詳細な計画を実行するためにソースコードの作成や修正を担当する専門家です。[107]ほとんどのシステムは1人のプログラマーでは完成できないほど大きいため、プログラミングチームが必要になる可能性があります。[114]ただし、プロジェクトにプログラマーを追加しても、完了までの時間が短縮されない可能性があります。むしろ、システムの品質が低下する可能性があります。[114]効果的にするには、プログラムモジュールを定義し、チームメンバーに配布する必要があります。[114]また、チームメンバーは有意義かつ効果的な方法で互いにやり取りする必要があります。[114]
コンピュータプログラマーは、小さな単位でプログラミングを行う場合があります。つまり、単一のモジュール内でプログラミングを行うのです。 [115]モジュールは、他のソースコードファイルにあるモジュールを実行する可能性があります。したがって、コンピュータプログラマーは、大きな単位でプログラミングを行う場合があります。つまり、モジュールをプログラミングして、それらが互いに効果的に結合するようにします。[115]大規模なプログラミングには、アプリケーションプログラミングインターフェイス(API) への貢献が含まれます。
プログラムモジュール
モジュラープログラミングは命令型言語プログラムを改良する技術である。改良されたプログラムはソフトウェアのサイズを縮小し、責任を分離し、それによってソフトウェアの老朽化を軽減することができる。プログラムモジュールは、ブロック内で境界が定められ、名前で識別される一連のステートメントである。 [116]モジュールには関数、コンテキスト、ロジックがある: [117]
- モジュールの機能とは、モジュールが実行する機能です。
- モジュールのコンテキストは、実行される要素です。
- モジュールのロジックとは、モジュールがどのように機能を実行するかということです。
モジュールの名前は、まずその機能によって決まり、次にそのコンテキストによって決まります。そのロジックは名前の一部であってはなりません。[117]たとえば、function compute_square_root( x )またははfunction compute_square_root_integer( i : integer )適切なモジュール名です。しかし、function compute_square_root_by_division( x )はそうではありません。
モジュール内の相互作用の度合いは、そのモジュールの凝集度合いと呼ばれます。[117] 凝集度は、モジュールの名前とその機能との関係を判断するものです。モジュール間の相互作用の度合いは、結合度合いと呼ばれます。 [118] 結合度は、モジュールのコンテキストと実行される要素 との関係を判断するものです。
凝集
結束力のレベルは最悪から最良まで以下の通りである。[119]
- 偶然の凝集性: モジュールが複数の機能を実行し、それらの機能がまったく無関係である場合、そのモジュールは偶然の凝集性
function read_sales_record_print_next_line_convert_to_float()を持ちます。たとえば、管理者がばかげたルールを強制すると、偶然の凝集性が実際に発生します。たとえば、「すべてのモジュールには、35〜50の実行可能なステートメントがあります。」[119] - 論理的凝集性: モジュールに一連の関数が用意されているが、そのうちの 1 つだけが実行される場合、そのモジュールには論理的凝集性があります。たとえば、次のようになります
function perform_arithmetic( perform_addition, a, b )。 - 時間的凝集性: モジュールが時間に関連する機能を実行する場合、そのモジュールには時間的凝集性があります。 1 つの例として、
function initialize_variables_and_open_files()。別の例として、stage_one()、、stage_two()... - 手続き的凝集性
function read_part_number_update_employee_record(): モジュールが複数の緩く関連する機能を実行する場合、そのモジュールには手続き的凝集性があります。たとえば、 - 通信の凝集性
function read_part_number_update_sales_record(): モジュールが複数の密接に関連した機能を実行する場合、そのモジュールには通信の凝集性があります。たとえば、 - 情報的凝集性: モジュールが複数の機能を実行する場合、モジュールには情報的凝集性があり、各機能には独自のエントリ ポイントと終了ポイントがあります。さらに、関数は同じデータ構造を共有します。オブジェクト指向クラスはこのレベルで動作します。
- 機能的凝集性: モジュールがローカル変数のみで単一の目標を達成する場合、そのモジュールは機能的凝集性を持ちます。さらに、他のコンテキストで再利用できる場合もあります。
カップリング
カップリングのレベルは最悪から最良まで以下の通りである。[118]
- コンテンツ結合: モジュールが別の関数のローカル変数を変更する場合、そのモジュールにはコンテンツ結合があります。COBOL では、以前はalter動詞を使用してこれを実行していました。
- 共通結合: モジュールがグローバル変数を変更する場合、そのモジュールには共通結合があります。
- 制御結合: 別のモジュールが制御フローを変更できる場合、モジュールには制御結合があります。 たとえば、
perform_arithmetic( perform_addition, a, b )。 代わりに、返されるオブジェクトの構成を制御する必要があります。 - スタンプ結合: パラメータとして渡されたデータ構造の要素が変更された場合、モジュールにはスタンプ結合が存在します。オブジェクト指向クラスはこのレベルで動作します。
- データ結合: モジュールのすべての入力パラメータが必要であり、いずれも変更されていない場合、モジュールはデータ結合を持ちます。さらに、関数の結果は単一のオブジェクトとして返されます。
データフロー分析

データフロー分析は、機能的凝集性とデータ結合性のモジュールを実現するために用いられる設計手法である。[120]この手法への入力はデータフロー図である。データフロー図はモジュールを表す楕円の集合である。各モジュールの名前は楕円内に表示される。モジュールは実行可能レベルまたは関数レベルにある場合がある。
この図には、モジュール同士を接続する矢印もあります。モジュールに向かう矢印は、入力のセットを表します。各モジュールからは、単一の出力オブジェクトを表す矢印が1つだけ出ます。(オプションで、追加の例外矢印が指し示します。)楕円のデイジーチェーンは、アルゴリズム全体を表します。入力モジュールが図の先頭になります。入力モジュールは変換モジュールに接続する必要があります。変換モジュールは出力モジュールに接続する必要があります。[121]
機能カテゴリ
.svg/500px-Operating_system_placement_(software).svg.png)
コンピュータプログラムは、機能別に分けられる。主な機能カテゴリは、アプリケーションソフトウェアとシステムソフトウェアである。システムソフトウェアには、コンピュータハードウェアとアプリケーションソフトウェアを結合するオペレーティングシステムが含まれる。 [122]オペレーティングシステムの目的は、アプリケーションソフトウェアが便利かつ効率的に実行される環境を提供することである。[122]アプリケーションソフトウェアとシステムソフトウェアはどちらもユーティリティプログラムを実行する。ハードウェアレベルでは、マイクロコードプログラムが中央処理装置全体の回路を制御します。
アプリケーションソフトウェア
アプリケーションソフトウェアは、コンピュータシステムの潜在能力を解き放つ鍵です。[123] エンタープライズアプリケーションソフトウェアは、会計、人事、顧客、ベンダーのアプリケーションをバンドルしたものです。例としては、エンタープライズリソースプランニング、顧客関係管理、サプライチェーン管理ソフトウェアなどがあります。
エンタープライズアプリケーションは、独自のソフトウェアとして社内で開発されることもあります。[124]あるいは、既製のソフトウェアとして購入されることもあります。購入したソフトウェアを変更してカスタムソフトウェアを提供することもできます。アプリケーションをカスタマイズする場合は、会社のリソースが使用されるか、リソースがアウトソーシングされます。アウトソーシングされたソフトウェア開発は、元のソフトウェアベンダーからの場合もあれば、サードパーティの開発者からである場合もあります。[125]
社内ソフトウェアの潜在的な利点は、機能とレポートが仕様通りに開発される可能性があることです。[126]経営陣も開発プロセスに関与し、ある程度の制御を提供する場合があります。[127]経営陣は、競合他社の新しい取り組みに対抗したり、顧客またはベンダーの要件を実装したりすることを決定する場合があります。[128] 合併や買収により、エンタープライズソフトウェアの変更が必要になる場合があります。社内ソフトウェアの潜在的な欠点は、時間とリソースのコストが膨大になる可能性があることです。[124]さらに、機能とパフォーマンスに関するリスクが迫っている可能性があります。
市販ソフトウェアの潜在的な利点は、初期費用が特定可能で、基本的なニーズが満たされ、パフォーマンスと信頼性に実績があることです。[124]市販ソフトウェアの潜在的な欠点は、エンドユーザーを混乱させる不要な機能があること、企業が必要とする機能が不足していること、データフローが企業の作業プロセスと一致しないことです。[124]
カスタマイズされたエンタープライズ アプリケーションを経済的に入手する 1 つの方法は、アプリケーション サービス プロバイダーを利用することです。[129]専門企業は、ハードウェア、カスタム ソフトウェア、およびエンド ユーザー サポートを提供します。これらの企業は、熟練した情報システム スタッフを抱えているため、新しいアプリケーションの開発を迅速化できます。最大の利点は、社内のリソースを人員配置や複雑なコンピューター プロジェクトの管理から解放できることです。[129]多くのアプリケーション サービス プロバイダーは、情報システム リソースが限られている小規模で急成長中の企業をターゲットにしています。[129]一方、大規模なシステムを持つ大企業では、独自の技術インフラストラクチャが整備されている可能性があります。1 つのリスクは、機密情報を外部組織に預けなければならないことです。もう 1 つのリスクは、プロバイダーのインフラストラクチャの信頼性を信頼しなければならないことです。[129]
オペレーティング·システム

スケジューリング、プリエンプション、コンテキスト スイッチング
オペレーティングシステムは、プロセスのスケジュール 設定や周辺機器の制御など、コンピュータの基本的な機能をサポートする低レベルのソフトウェアです。[122]
1950 年代には、プログラマーがオペレーターを兼ねてプログラムを書き、実行していました。プログラムの実行が終了すると、出力が印刷されるか、後で処理するために紙テープやカードにパンチされたりしていました。 [28]多くの場合、プログラムは動作しませんでした。プログラマーはコンソールのライトを見て、コンソールのスイッチをいじりました。運が悪ければ、メモリのプリントアウトが作成され、さらに調査されました。1960 年代には、プログラマーはオペレーターの仕事を自動化することで、無駄な時間を減らしました。オペレーティングシステムと呼ばれるプログラムが常にコンピューターに保持されていました。[130]
オペレーティングシステムという用語は、2つのレベルのソフトウェアを指す場合があります。[131]オペレーティングシステムは、プロセス、メモリ、およびデバイスを管理するカーネルプログラムを指す場合があります。より広義では、オペレーティングシステムは、中心となるソフトウェアのパッケージ全体を指す場合があります。パッケージには、カーネルプログラム、コマンドラインインタープリタ、グラフィカルユーザーインターフェイス、ユーティリティプログラム、およびエディタが含まれます。[131]
カーネルプログラム

カーネルの主な目的は、コンピューターの限られたリソースを管理することです。
- カーネルプログラムは、コンテキストスイッチとしても知られるプロセススケジューリング[132]を実行する必要があります。コンピュータプログラムが実行対象として選択されたときに、カーネルはプロセス制御ブロックを作成します。ただし、実行中のプログラムは、タイムスライスの間だけ中央処理装置に排他的にアクセスできます。各ユーザーに連続アクセスの外観を提供するために、カーネルは各プロセス制御ブロックをすばやくプリエンプトして、別のブロックを実行します。システム開発者の目標は、ディスパッチ待ち時間を最小限に抑えることです。

- カーネルプログラムはメモリ管理を実行する必要があります。
- カーネルが最初に実行可能ファイルをメモリにロードすると、アドレス空間が論理的に領域に分割されます。[133]カーネルは、マスター領域テーブルと、実行中のプロセスごとに1つずつ、多数のプロセスごとの領域 (pregion) テーブルを維持します。[133]これらのテーブルが仮想アドレス空間を構成します。マスター領域テーブルは、その内容が物理メモリのどこに配置されているかを判断するために使用されます。pregionテーブルにより、各プロセスは独自のプログラム (テキスト) pregion、データ pregion、スタック pregionを持つことができます。
- プログラムpregionは機械命令を格納する。機械命令は変化しないため、プログラムpregionは同じ実行ファイルの多くのプロセスによって共有される可能性がある。[133]
- 時間とメモリを節約するために、カーネルは実行ファイル全体を完全にロードするのではなく、実行命令のブロックのみをディスクドライブからロードする場合があります。[132]
- カーネルは仮想アドレスを物理アドレスに変換する役割を担っています。カーネルがメモリコントローラにデータを要求しても、ページフォールトが発生することがあります。[134]その場合、カーネルはメモリ管理ユニットにアクセスして物理データ領域にデータを入力し、アドレスを変換します。[135]
- カーネルはプロセスからの要求に応じてヒープからメモリを割り当てます。 [64]プロセスがメモリを使い終わったら、そのメモリの解放を要求することができます。プロセスが割り当てられたメモリの解放を要求せずに終了した場合、カーネルはガベージコレクションを実行してメモリを解放します。
- カーネルはまた、プロセスが自身のメモリにのみアクセスし、カーネルや他のプロセスのメモリにはアクセスしないようにします。[132]
- カーネルプログラムはファイルシステムの管理を実行する必要があります。[132]カーネルには、ファイルの作成、取得、更新、削除を行う命令があります。
- カーネルプログラムはデバイス管理を実行する必要があります。[132]カーネルは、マウス、キーボード、ディスクドライブ、プリンター、およびその他のデバイスへのインターフェイスを標準化および簡素化するためのプログラムを提供します。さらに、2つのプロセスが同時にデバイスへのアクセスを要求した場合、カーネルはデバイスへのアクセスを調停する必要があります。
- カーネルプログラムはネットワーク管理を実行する必要があります。[136]カーネルはプロセスに代わってパケットを送受信します。重要なサービスの1つは、ターゲットシステムへの効率的なルートを見つけることです。
- カーネルプログラムはプログラマーが使用できるシステムレベルの機能を提供する必要があります。 [137]
- プログラマーは、比較的単純なインターフェースを介してファイルにアクセスし、そのインターフェースは比較的複雑な低レベルの I/O インターフェースを実行します。低レベルのインターフェースには、ファイルの作成、ファイル記述子、ファイルの検索、物理的な読み取り、および物理的な書き込みが含まれます。
- プログラマーは、比較的単純なインターフェースを通じてプロセスを作成し、そのインターフェースは比較的複雑な低レベル インターフェースを実行します。
- プログラマーは比較的単純なインターフェースを介して日付/時刻の演算を実行し、そのインターフェースは比較的複雑な低レベルの時間インターフェースを実行します。[138]
- カーネルプログラムは、実行中のプロセス間の通信チャネルを提供する必要があります。[139]大規模なソフトウェアシステムの場合、システムをより小さなプロセスに分割することが望ましい場合があります。プロセスは、シグナルを送受信することで互いに通信できます。
もともと、オペレーティングシステムはアセンブリ言語でプログラムされていましたが、現代のオペレーティングシステムは通常、 C、Objective-C、Swiftなどの高級言語で書かれています。[k]
ユーティリティプログラム
ユーティリティプログラムは、システム管理とソフトウェア実行を支援するために設計されています。オペレーティングシステムは、ハードウェアユーティリティプログラムを実行して、ディスクドライブ、メモリ、スピーカー、プリンターの状態を確認します。[140]ユーティリティプログラムは、混雑したディスク上のファイルの配置を最適化する場合があります。システムユーティリティプログラムは、ハードウェアとネットワークのパフォーマンスを監視します。メトリックが許容範囲外になると、トリガーアラートが生成されます。[141]
ユーティリティプログラムには圧縮プログラムが含まれており、データファイルをより少ないディスクスペースに保存できます。[140]圧縮プログラムは、データファイルをネットワーク経由で転送する際の時間も節約します。[140]ユーティリティプログラムはデータセットを並べ替えたり結合したりできます。[141]ユーティリティプログラムはコンピュータウイルスを検出します。[141]
マイクロコードプログラム





マイクロコードプログラムは、ソフトウェア駆動型コンピュータのデータパスを制御する最下層のインタープリタです。 [142] (ハードウェアの進歩により、これらの操作はハードウェア実行回路に移行しました。)[142]マイクロコード命令により、プログラマはデジタルロジックレベル[143]、つまりコンピュータの実際のハードウェアをより簡単に実装できます。デジタルロジックレベルは、コンピュータサイエンスとコンピュータエンジニアリングの境界です。[144]
論理ゲートは、オンまたはオフの2つの信号のいずれかを返すことができる小さなトランジスタです。 [145]
- トランジスタを 1 つ使用するとNOT ゲートが形成されます。
- 2 つのトランジスタを直列に接続するとNAND ゲートが形成されます。
- 2 つのトランジスタを並列に接続するとNOR ゲートが形成されます。
- NOT ゲートを NAND ゲートに接続するとAND ゲートが形成されます。
- NOT ゲートを NOR ゲートに接続するとOR ゲートが形成されます。
これら 5 つのゲートは、バイナリ代数、つまりコンピューターのデジタル論理関数 の構成要素を形成します。
マイクロコード命令は、プログラマがデジタルロジック関数をバイナリ代数で形成する代わりに実行するために使用できるニーモニックです。これらは中央処理装置(CPU)の制御ストアに格納されます。[146] これらのハードウェアレベルの命令は、データパス全体でデータを移動します。
マイクロ命令サイクルは、マイクロシーケンサがマイクロプログラムカウンタを使用してランダムアクセスメモリから次のマシン命令をフェッチするときに始まります。[147]次のステップは、ハードウェアモジュールへの適切な出力ラインを選択してマシン命令をデコードすることです。 [148]最後のステップは、ハードウェアモジュールのゲートセットを使用して命令を 実行すること です。

算術演算を実行する命令は、算術論理ユニット(ALU)に渡されます。[149] ALUには、整数の加算、シフト、比較などの基本演算を実行する回路があります。CPUは、ALUを介して基本演算を組み合わせてループすることで、複雑な算術演算を実行します。
マイクロコード命令はCPUとメモリコントローラ間でデータを移動します。メモリコントローラのマイクロコード命令は2つのレジスタを操作します。メモリアドレスレジスタは各メモリセルのアドレスにアクセスするために使用されます。メモリデータレジスタは各セルの内容を設定および読み取るために使用されます。[150]
マイクロコード命令はCPUと多数のコンピュータバスの間でデータを移動します。ディスクコントローラバスはハードディスクドライブへの書き込みと読み取りを行います。データは周辺機器相互接続エクスプレスバスを介してCPUと他の機能ユニットの間でも移動されます。[151]
注記
- ^ Prolog言語では、事実とルールのデータベースを任意の順序で入力できます。ただし、データベースに関する質問は、必ず最後に置く必要があります。
- ^ 実行可能ファイルには、CPU用に準備された各マシン命令が含まれています。
- ^ 詳細については、X86 アセンブリ言語#命令タイプを参照してください。
- ^ 1999年に導入
- ^ のような演算子は
x++通常、単一の命令にコンパイルされます。 - ^ 後で追加のステートメントが追加された場合に備えて、行番号は通常 10 ずつ増加されます。
- ^ この関数は、より簡潔に と記述することもできます
int increment_counter(){ static int counter; return ++counter;}。 1) 静的変数は自動的にゼロに初期化されます。 2) は++counterプレフィックス増分演算子です。 - ^ これは、通常は下から上に向かって成長するスタックの比喩にもかかわらずです。
- ^ C はヒープ メモリを割り当てる関数も提供します
calloc()。この関数は 2 つの追加サービスを提供します: 1) プログラマーが任意のサイズの配列を作成できるようにします。2) 各メモリ セルをゼロに設定します。 - ^ 文字列変数の場合、 C は関数を提供します。割り当て関数とコピー関数の両方を実行します。
strdup() - ^ UNIXオペレーティングシステムは C で書かれていましたが、macOS はObjective -C で書かれており、Swift が Objective-C に取って代わりました。
参考文献
- ^ 「ISO/IEC 2382:2015」。ISO。2020年9月3日。2016年6月17日時点のオリジナルよりアーカイブ。 2022年5月26日閲覧。
[ソフトウェアには]情報処理システムのプログラム、手順、規則、および関連ドキュメントの全部または一部が含まれます。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 7。ISBN 0-201-71012-9ソースプログラムをコンパイルする代わりに、
インタープリタを使用することもできます。インタープリタはソースプログラムを直接実行できます。
- ^ Silberschatz, Abraham (1994).オペレーティングシステムの概念、第 4 版。Addison-Wesley。p. 98。ISBN 978-0-201-50480-4。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 32. ISBN 978-0-13-854662-5。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 7。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 30。ISBN 0-201-71012-9彼らの目的は、
学生が学ぶのに非常に簡単な言語を生み出すことでした。
- ^ abc Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 31。ISBN 0-201-71012-9。
- ^ abcdef Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 30。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 30。ISBN 0-201-71012-9
学生が単にたまに使うユーザーになることも、Basic からより洗練された強力な言語に進むこともできるという考えでした
。 - ^ ab マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 16。ISBN 978-0-8027-1348-3。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 14. ISBN 978-0-13-854662-5。
- ^ Bromley, Allan G. (1998). 「Charles Babbage's Analytical Engine, 1838」(PDF) . IEEE Annals of the History of Computing . 20 (4): 29–45. doi :10.1109/85.728228. S2CID 2285332. 2016年3月4日時点のオリジナルより アーカイブ(PDF) . 2015年10月30日閲覧。
- ^ ab Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 15. ISBN 978-0-13-854662-5。
- ^ J. Fuegi、J. Francis (2003年10月~12月)、「ラブレースとバベッジと1843年の「ノート」の作成」"、コンピューティングの歴史年報、25(4):16、19、25、doi:10.1109 / MAHC.2003.1253887
- ^ Rosen, Kenneth H. (1991). 離散数学とその応用. McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6チューリングマシン
は、コンピューティングマシンで実行できるすべての計算をモデル化できます。
- ^ リンツ、ピーター (1990)。形式言語とオートマトン入門。DC ヒース アンド カンパニー。p. 234。ISBN 978-0-669-17342-0。
- ^ リンツ、ピーター (1990)。形式言語とオートマトン入門。DC ヒース アンド カンパニー。p. 243。ISBN 978-0-669-17342-0一般的な数学関数は
、どれほど複雑であっても、チューリング計算可能です。
- ^ abc マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 102。ISBN 978-0-8027-1348-3。
- ^ マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 94。ISBN 978-0-8027-1348-3。
- ^ マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 107。ISBN 978-0-8027-1348-3。
- ^ マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 120。ISBN 978-0-8027-1348-3。
- ^ ab マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 118。ISBN 978-0-8027-1348-3。
- ^ マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 119。ISBN 978-0-8027-1348-3。
- ^ マッカートニー、スコット (1999)。ENIAC – 世界初のコンピュータの勝利と悲劇。ウォーカー・アンド・カンパニー。p. 123。ISBN 978-0-8027-1348-3。
- ^ ab Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition . Prentice Hall. p. 21. ISBN 978-0-13-854662-5。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 27。ISBN 0-201-71012-9。
- ^ Wilson , Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 29。ISBN 0-201-71012-9。
- ^ abc Silberschatz, Abraham (1994).オペレーティングシステムの概念、第 4 版。Addison-Wesley。p. 6。ISBN 978-0-201-50480-4。
- ^ abcdefghi 「ビル・ペンツ — ちょっとした背景: 戦後の VLSI への道」デジバーン・コンピュータ・ミュージアム。2008 年 8 月。2022 年 3 月 21 日時点のオリジナルよりアーカイブ。2022 年1 月 31 日閲覧。
- ^ ab デジタル時代へ:研究ラボ、スタートアップ企業、そしてMOSの台頭。ジョンズ・ホプキンス大学出版局。2002年。ISBN 9780801886393. 2023年2月2日時点のオリジナルよりアーカイブ。2022年2月3日閲覧。
- ^ Chalamala, Babu (2017). 「マイクロエレクトロニクスと太陽光発電用シリコン材料の製造」. サンディア国立研究所. 2023年3月23日時点のオリジナルよりアーカイブ。2022年2月8日閲覧。
- ^ “ICの製造 ベースウェーハの作成”. ブリタニカ. 2022年2月8日時点のオリジナルよりアーカイブ。2022年2月8日閲覧。
- ^ 「NMOSおよびPMOSトランジスタの紹介」。Anysilicon。2021年11月4日。2022年2月6日時点のオリジナルよりアーカイブ。 2022年2月5日閲覧。
- ^ 「マイクロプロセッサの定義」。ブリタニカ。2022年4月1日時点のオリジナルよりアーカイブ。 2022年4月1日閲覧。
- ^ 「チップの殿堂: Intel 4004 マイクロプロセッサ」。米国電気電子学会。2018年7月2日。2022年2月7日時点のオリジナルよりアーカイブ。2022年1月31日閲覧。
- ^ 「360 Revolution」(PDF)。Father, Son & Co. 1990年。2022年10月10日時点のオリジナルよりアーカイブ(PDF) 。 2022年2月5日閲覧。
- ^ ab 「世界で長く失われた最初のマイクロコンピュータの内部」 c/net. 2010年1月8日。2022年2月1日時点のオリジナルよりアーカイブ。2022年1月31日閲覧。
- ^ 「ビル・ゲイツ、マイクロソフト、そしてIBMパーソナルコンピュータ」。InfoWorld。1982年8月23日。2023年2月18日時点のオリジナルよりアーカイブ。2022年2月1日閲覧。
- ^ Stroustrup, Bjarne (2013). C++ プログラミング言語、第 4 版。Addison-Wesley。p. 10。ISBN 978-0-321-56384-2。
- ^ abc Stroustrup, Bjarne (2013). C++プログラミング言語、第4版。Addison-Wesley。p. 11。ISBN 978-0-321-56384-2。
- ^ ab Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 159。ISBN 0-619-06489-7。
- ^ ab リンツ、ピーター (1990)。形式言語とオートマトン入門。DC ヒース アンド カンパニー。p. 2。ISBN 978-0-669-17342-0。
- ^ Weiss, Mark Allen (1994). C++ におけるデータ構造とアルゴリズム分析. Benjamin/Cummings Publishing Company, Inc. p. 29. ISBN 0-8053-5443-3。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 17. ISBN 978-0-13-854662-5。
- ^ abcdef Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 160。ISBN 0-619-06489-7。
- ^ abc Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 399. ISBN 978-0-13-854662-5。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 400. ISBN 978-0-13-854662-5。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 398. ISBN 978-0-13-854662-5。
- ^ Wilson , Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 26。ISBN 0-201-71012-9。
- ^ abcd Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 37。ISBN 0-201-71012-9。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 160。ISBN 0-619-06489-7
第 3 世代以上のプログラミング言語では、言語内の各ステートメントが機械語の複数の命令に変換されます
。 - ^ Wilson, Leslie B. (1993).比較プログラミング言語、第 2 版。Addison-Wesley。p. 75。ISBN 978-0-201-56885-1。
- ^ Stroustrup, Bjarne (2013). C++ プログラミング言語、第 4 版。Addison-Wesley。p. 40。ISBN 978-0-321-56384-2。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 16。ISBN 0-201-71012-9。
- ^ Wilson , Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 24。ISBN 0-201-71012-9。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 25。ISBN 0-201-71012-9。
- ^ abcd Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 19。ISBN 0-201-71012-9。
- ^ abcd 「Cプログラムのメモリレイアウト」。2011年9月12日。2021年11月6日時点のオリジナルよりアーカイブ。2021年11月6日閲覧。
- ^ ab カーニハン、ブライアン W.、リッチー、デニス M. (1988)。プログラミング言語 C 第 2 版。プレンティス ホール。p. 31。ISBN 0-13-110362-8。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 128。ISBN 0-201-71012-9。
- ^ abc Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 121. ISBN 978-1-59327-220-3。
- ^ Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 122. ISBN 978-1-59327-220-3。
- ^ カーニハン、ブライアン W.、リッチー、デニス M. (1988)。プログラミング言語 C 第 2 版。プレンティス ホール。p. 185。ISBN 0-13-110362-8。
- ^ ab カーニハン、ブライアン W.、リッチー、デニス M. (1988)。プログラミング言語 C 第 2 版。プレンティス ホール。p. 187。ISBN 0-13-110362-8。
- ^ abc Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 38。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 193。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 39。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 35。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 192。ISBN 0-201-71012-9。
- ^ Stroustrup, Bjarne (2013). C++ プログラミング言語、第 4 版。Addison-Wesley。p. 22。ISBN 978-0-321-56384-2。
- ^ Stroustrup, Bjarne (2013). C++ プログラミング言語、第 4 版。Addison-Wesley。p. 21。ISBN 978-0-321-56384-2。
- ^ Stroustrup, Bjarne (2013). C++ プログラミング言語、第 4 版。Addison-Wesley。p. 49。ISBN 978-0-321-56384-2。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 218。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 217。ISBN 0-201-71012-9。
- ^ Weiss, Mark Allen (1994). C++ におけるデータ構造とアルゴリズム分析. Benjamin/Cummings Publishing Company, Inc. p. 103. ISBN 0-8053-5443-3関数呼び出しがある場合、レジスタ値(変数名に対応)や戻りアドレス(プログラム カウンターから取得可能)など、すべての重要な情報を保存する必要があります。
[.] ... 関数が戻る必要がある場合、すべてのレジスタを復元します。次に、戻りジャンプを実行します。明らかに、このすべての作業はスタックを使用して実行でき、これは再帰を実装するほぼすべてのプログラミング言語で実際に行われていることです。
- ^ abc Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 230。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 240。ISBN 0-201-71012-9。
- ^ abc Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 241。ISBN 0-201-71012-9。
- ^ ジョーンズ、ロビン、メイナード、クライヴ、スチュワート、イアン(2012年12月6日)。Lispプログラミングの芸術。シュプリンガーサイエンス&ビジネスメディア。p.2。ISBN 9781447117193。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 220。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 221。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 229。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 227。ISBN 0-201-71012-9。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 222。ISBN 0-201-71012-9。
- ^ Gordon, Michael JC (1996). 「LCFからHOLまで:短い歴史」。2016年9月5日時点のオリジナルよりアーカイブ。2021年10月30日閲覧。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 233。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 235。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 55。ISBN 0-201-71012-9。
- ^ Colmerauer, A.; Roussel, P. (1992). 「Prolog の誕生」(PDF) . ACM SIGPLAN 通知. 28 (3). Association for Computing Machinery: 5. doi :10.1145/155360.155362.
- ^ Kowalski, R., Dávila, J., Sartor, G. and Calejo, M., 2023. 法律と教育のための論理的英語。Prolog: The Next 50 Years (pp. 287-299) に掲載。Cham: Springer Nature Switzerland。
- ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 35。ISBN 0-201-71012-9Simula は Algol 60 をベースにしており、
クラスの概念という非常に重要な機能が追加されています。... 基本的な考え方は、データ (またはデータ構造) とそれに対して実行される操作は一緒に属するというものでした。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 39。ISBN 0-201-71012-9当初は、
多数の実験的な言語が設計され、その多くはオブジェクト指向プログラミングと関数型プログラミングを組み合わせたものでした。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 284. ISBN 0-256-08515-3
OOD(オブジェクト指向設計)自体は、一般的な言語の大部分ではサポートされていないのは事実ですが、OOD の大部分のサブセットは使用できます
。 - ^ Weiss, Mark Allen (1994). C++ におけるデータ構造とアルゴリズム分析. Benjamin/Cummings Publishing Company, Inc. p. 57. ISBN 0-8053-5443-3。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 285. ISBN 0-256-08515-3。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 290。ISBN 0-201-71012-9プログラミング言語の構文(または文法)は、
プログラムが記述される正しい形式を記述します。
- ^ Wilson , Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 78。ISBN 0-201-71012-9
命令型言語の主な構成要素は、宣言、式、およびステートメントです
。 - ^ ab Wilson, Leslie B. (2001).比較プログラミング言語、第3版。Addison-Wesley。p. 290。ISBN 0-201-71012-9。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 294。ISBN 0-201-71012-9。
- ^ Rosen, Kenneth H. (1991). 離散数学とその応用. McGraw-Hill, Inc. p. 615. ISBN 978-0-07-053744-6。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 291。ISBN 0-201-71012-9。
- ^ Rosen, Kenneth H. (1991). 離散数学とその応用. McGraw-Hill, Inc. p. 616. ISBN 978-0-07-053744-6。
- ^ Rosen, Kenneth H. (1991). 離散数学とその応用. McGraw-Hill, Inc. p. 623. ISBN 978-0-07-053744-6。
- ^ Rosen, Kenneth H. (1991). 離散数学とその応用. McGraw-Hill, Inc. p. 624. ISBN 978-0-07-053744-6。
- ^ Wilson, Leslie B. (2001).比較プログラミング言語、第 3 版。Addison-Wesley。p. 297。ISBN 0-201-71012-9。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 序文. ISBN 0-256-08515-3。
- ^ abc Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 507。ISBN 0-619-06489-7。
- ^ ab Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 513。ISBN 0-619-06489-7。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p.514。ISBN 0-619-06489-7。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p.516。ISBN 0-619-06489-7。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 8. ISBN 0-256-08515-3。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p.517。ISBN 0-619-06489-7。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 345. ISBN 0-256-08515-3。
- ^ abcd Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 319. ISBN 0-256-08515-3。
- ^ ab Schach、スティーブン R. (1990)。ソフトウェアエンジニアリング。アクセン・アソシエイツ社の出版社。 p. 331.ISBN 0-256-08515-3。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 216. ISBN 0-256-08515-3。
- ^ abc Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 219. ISBN 0-256-08515-3。
- ^ ab Schach、スティーブン R. (1990)。ソフトウェアエンジニアリング。アクセン・アソシエイツ社の出版社。 p. 226.ISBN 0-256-08515-3。
- ^ ab Schach、スティーブン R. (1990)。ソフトウェアエンジニアリング。アクセン・アソシエイツ社の出版社。 p. 220.ISBN 0-256-08515-3。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 258. ISBN 0-256-08515-3。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 259. ISBN 0-256-08515-3。
- ^ abc Silberschatz, Abraham (1994).オペレーティングシステムの概念、第 4 版。Addison-Wesley。p. 1。ISBN 978-0-201-50480-4。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 147。ISBN 0-619-06489-7
あらゆるコンピュータ システムの潜在能力を引き出す鍵は、アプリケーション ソフトウェアです
。 - ^ abcd Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 147。ISBN 0-619-06489-7。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 147。ISBN 0-619-06489-7
サードパーティのソフトウェア会社は、付加価値ソフトウェアベンダーとも呼ばれ、特定の業界や企業のニーズを満たすためにソフトウェアプログラムを開発または変更することがあります
。 - ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 148。ISBN 0-619-06489-7見出し:
独自のソフトウェア; サブ見出し: 利点; 引用: 機能、レポートなどに関して、必要なものを正確に取得できます。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 148。ISBN 0-619-06489-7見出し:
独自のソフトウェア; サブ見出し: 利点; 引用: 開発に関与することで、結果に対する制御のレベルがさらに高まります。
- ^ ステア、ラルフ・M. (2003)。情報システムの原則、第6版。トムソン。p. 147。ISBN 0-619-06489-7見出し:
独自のソフトウェア; サブ見出し: 利点; 引用: 競合他社の新しい取り組みに対抗するため、または新しいサプライヤーや顧客の要件を満たすために必要な変更を、より柔軟に行うことができます。
- ^ abcd Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 149。ISBN 0-619-06489-7。
- ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 11. ISBN 978-0-13-854662-5。
- ^ ab Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 21. ISBN 978-1-59327-220-3。
- ^ abcde Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 22. ISBN 978-1-59327-220-3。
- ^ abc Bach, Maurice J. (1986). UNIX オペレーティングシステムの設計. Prentice-Hall, Inc. p. 152. ISBN 0-13-201799-7。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 443. ISBN 978-0-13-291652-3。
- ^ ラカメラ、ダニエレ (2018).組み込みシステム アーキテクチャ。パックト。 p. 8.ISBN 978-1-78883-250-2。
- ^ Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 23. ISBN 978-1-59327-220-3。
- ^ カーニハン、ブライアン W. (1984)。Unixプログラミング環境。プレンティス ホール。p. 201。ISBN 0-13-937699-2。
- ^ Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 187. ISBN 978-1-59327-220-3。
- ^ Haviland, Keith (1987). Unix システムプログラミング. Addison-Wesley Publishing Company. p. 121. ISBN 0-201-12919-1。
- ^ abc Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 145。ISBN 0-619-06489-7。
- ^ abc Stair, Ralph M. (2003).情報システムの原則、第 6 版。トムソン。p. 146。ISBN 0-619-06489-7。
- ^ ab Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 6. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 243. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 147. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 148. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 253. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 255. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 161. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 166. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 249. ISBN 978-0-13-291652-3。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 111. ISBN 978-0-13-291652-3。
