
| プログラム実行 |
|---|
| 一般的な概念 |
| コードの種類 |
| コンパイル戦略 |
| 注目すべきランタイム |
| 注目すべきコンパイラとツールチェーン |
|
コンピュータプログラムとは、コンピュータが実行するためのプログラミング言語で書かれた一連の命令のことです。これはソフトウェアの構成要素の1つであり、ソフトウェアにはドキュメントやその他の無形の構成要素も含まれます。[ 1 ]
人間が読める形式のコンピュータプログラムはソースコードと呼ばれます。コンピュータはネイティブの機械語命令しか実行できないため、ソースコードを実行するには別のコンピュータプログラムが必要です。そのため、ソースコードは、その言語用に書かれたコンパイラを用いて機械語命令に変換されます。(アセンブリ言語プログラムはアセンブラを用いて変換されます。)結果として得られるファイルは実行ファイルと呼ばれます。あるいは、ソースコードは、その言語用に書かれたインタープリタ内で実行されることもあります。 [ 2 ]
実行ファイルが実行要求されると、[ b ]オペレーティングシステムはそれをメモリにロードし[ 3 ]プロセスを開始します。[ 4 ]中央処理装置はすぐにこのプロセスに切り替え、各マシン命令をフェッチ、デコードし、実行できるようになります。[ 5 ]
ソースコードの実行が要求されると、オペレーティングシステムは対応するインタープリタをメモリに読み込み、プロセスを開始します。インタープリタはソースコードをメモリに読み込み、各文を翻訳して実行します。ソースコードの実行は、実行ファイルの実行よりも遅くなります。[ 6 ] [ c ]さらに、インタープリタはコンピュータにインストールされている必要があります。
コンピュータプログラムの
「Hello, World!」プログラムは、言語の基本構文を説明するために使用されます。BASIC(1964)言語の構文は、言語を学習しやすくするために意図的に制限されていました。[ 7 ]たとえば、変数は使用前に宣言されません。 [ 8 ]また、変数は自動的にゼロに初期化されます。[ 8 ]以下は、Basicで数値のリストの平均を計算するコンピュータプログラムの例です。[ 9 ]
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基本的なコンピュータプログラミングの仕組みを習得すれば、より洗練された強力な言語を使って大規模なコンピュータシステムを構築できるようになります。[ 10 ]
歴史
ソフトウェア開発の改善は、コンピュータハードウェアの改善の結果です。ハードウェアの歴史の各段階において、コンピュータプログラミングのタスクは劇的に変化しました
解析エンジン

1837年、ジャカードの織機に触発されてチャールズ・バベッジは解析機関の構築を試みた。[ 11 ] 計算機の部品名は繊維産業から借用された。繊維産業では、糸は倉庫から工場に運ばれ、そこで加工される。計算機には50桁の小数点以下の数字を1,000個保存できる記憶装置が搭載されていた。[ 12 ]記憶装置から送られた数字は工場に送られ、処理された。解析機関は2組の穴あきカードを使ってプログラムされた。1組は演算を指示し、もう1組は変数を入力した。[ 11 ] [ 13 ]しかし、何千もの歯車とギアが完全に連携することはなかった。[ 14 ]
エイダ・ラブレスはチャールズ・バベッジの助手として、解析機関(1843年)の解説書を作成しました。[ 15 ]この解説書には、解析機関を用いたベルヌーイ数の計算方法を詳細に記述した「注釈G」が含まれていました。この注釈は、一部の歴史家によって世界初のコンピュータプログラムと認識されています。[ 14 ]
万能チューリングマシン

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

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

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

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

マイクロプロセッサと中央処理装置(CPU)という用語は、現在ではほとんど同じ意味で使用されています。しかし、CPUはマイクロプロセッサよりも古くから存在していました。例えば、IBM System/360 (1964年)は、セラミック基板上に個別の部品を搭載した回路基板で構成されたCPUを搭載していました。[ 37 ]
x86シリーズ

1978年、IntelがIntel 8080をIntel 8086にアップグレードした時に、現代のソフトウェア開発環境が始まりました。IntelはIntel 8086を簡素化して、より安価なIntel 8088を製造しました。[ 38 ] IBMは、パーソナルコンピュータ市場に参入した(1981年)時にIntel 8088を採用しました。パーソナルコンピュータに対する消費者の需要が高まるにつれて、Intelのマイクロプロセッサ開発も拡大しました。開発の連続はx86シリーズとして知られています。x86アセンブリ言語は、下位互換性のある機械語命令のファミリーです。以前のマイクロプロセッサで作成された機械語命令は、マイクロプロセッサのアップグレードを通じて保持されました。これにより、消費者は新しいアプリケーションソフトウェアを購入することなく、新しいコンピュータを購入することができました。命令の主なカテゴリは次のとおりです。[ d ]
- ランダム アクセス メモリ内の数値と文字列を設定およびアクセスするためのメモリ命令。
- 整数に対する基本的な算術演算を実行する整数算術論理ユニット(ALU) 命令。
- 実数に対して基本的な算術演算を実行する浮動小数点 ALU 命令。
- メモリを割り当て、関数とインターフェースするために必要なワードをプッシュおよびポップするためのスタック命令を呼び出します。
- 単一命令複数データ(SIMD)命令[ e ]は、複数のプロセッサがデータの配列に対して同じアルゴリズムを実行する場合に速度を向上させます。
変化するプログラミング環境

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

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

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

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

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

データフロー分析は、機能的凝集性とデータ結合性を備えたモジュールを実現するために使用される設計手法です。[ 121 ]この手法への入力はデータフロー図です。データフロー図は、モジュールを表す楕円の集合です。各モジュールの名前は楕円内に表示されます。モジュールは、実行可能レベルまたは関数レベルにある場合があります
この図には、モジュール同士を接続する矢印も示されています。モジュールに向かう矢印は、入力の集合を表します。各モジュールからは、単一の出力オブジェクトを表す矢印が1つだけ出ている必要があります(オプションで、例外を示す矢印を追加することもできます)。楕円のデイジーチェーンは、アルゴリズム全体を表します。入力モジュールが図の先頭となります。入力モジュールは変換モジュールに接続します。変換モジュールは出力モジュールに接続します。[ 122 ]
機能カテゴリ

コンピュータプログラムは機能別に分類することができます。主な機能カテゴリは、アプリケーションソフトウェアとシステムソフトウェアです。システムソフトウェアには、コンピュータハードウェアとアプリケーションソフトウェアを結合するオペレーティングシステムが含まれます。[ 123 ]オペレーティングシステムの目的は、アプリケーションソフトウェアが便利かつ効率的に実行できる環境を提供することです。[ 123 ]アプリケーションソフトウェアとシステムソフトウェアはどちらもユーティリティプログラムを実行します。ハードウェアレベルでは、マイクロコードプログラムが中央処理装置全体の回路を制御します。
アプリケーションソフトウェア
アプリケーションソフトウェアは、コンピュータシステムの潜在能力を最大限に引き出す鍵です。[ 124 ]エンタープライズアプリケーションソフトウェアは、会計、人事、顧客、ベンダーアプリケーションを統合したものです。例としては、エンタープライズリソースプランニング、顧客関係管理、サプライチェーン管理ソフトウェアなどが挙げられます。
エンタープライズアプリケーションは、独自のソフトウェアとして社内で開発される場合もあります。[ 125 ]また、市販のソフトウェアとして購入される場合もあります。購入したソフトウェアは、カスタムソフトウェアとして変更される場合もあります。アプリケーションをカスタマイズする場合は、社内のリソースが使用されるか、リソースが外部委託されます。外部委託されたソフトウェア開発は、元のソフトウェアベンダーから行われる場合もあれば、サードパーティの開発会社から行われる場合もあります。[ 126 ]
自社開発ソフトウェアの潜在的な利点は、機能やレポートが仕様通りに開発できることです。[ 127 ]経営陣が開発プロセスに関与し、ある程度の管理権限を与えられる場合もあります。[ 128 ]経営陣は、競合他社の新たな取り組みに対抗したり、顧客やベンダーの要件を実装したりする決定を下す場合があります。[ 129 ] 合併や買収により、企業ソフトウェアの変更が必要になる場合もあります。自社開発ソフトウェアの潜在的な欠点は、時間とリソースのコストが膨大になる可能性があることです。[ 125 ]さらに、機能やパフォーマンスに関するリスクが迫っている可能性もあります。
市販ソフトウェアの潜在的な利点は、初期費用が明確であること、基本的なニーズが満たされていること、そしてそのパフォーマンスと信頼性に実績があることである。[ 125 ]市販ソフトウェアの潜在的な欠点は、エンドユーザーを混乱させる不要な機能が含まれている可能性があること、企業が必要とする機能が不足していること、そしてデータフローが企業の業務プロセスと一致しない可能性があることである。[ 125 ]
アプリケーションサービスプロバイダー
カスタマイズされたエンタープライズアプリケーションを経済的に入手する1つの方法は、アプリケーションサービスプロバイダーを利用することです。[ 130 ]専門企業は、ハードウェア、カスタムソフトウェア、エンドユーザーサポートを提供します。熟練した情報システムスタッフを擁しているため、新しいアプリケーションの開発を迅速化できます。最大の利点は、社内リソースを複雑なコンピュータプロジェクトの人員配置や管理から解放できることです。[ 130 ]多くのアプリケーションサービスプロバイダーは、情報システムリソースが限られている小規模で急成長中の企業をターゲットにしています。[ 130 ]一方、大規模なシステムを持つ大企業は、自社で技術インフラを整備している可能性があります。1つのリスクは、機密情報を外部組織に委託しなければならないことです。もう1つのリスクは、プロバイダーのインフラの信頼性を信頼しなければならないことです。[ 130 ]
オペレーティングシステム

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

カーネルの主な目的は、コンピューターの限られたリソースを管理することです。
- カーネルプログラムはプロセススケジューリング[ 133 ]を実行する必要があります。これはコンテキストスイッチとも呼ばれます。コンピュータプログラムが実行対象として選択されると、カーネルはプロセス制御ブロックを作成します。ただし、実行中のプログラムは、CPUへの排他的アクセスを限られた時間だけしか取得しません。各ユーザーに連続アクセスの印象を与えるため、カーネルは各プロセス制御ブロックを迅速にプリエンプトして、別のプロセス制御ブロックを実行します。システム開発者の目標は、ディスパッチレイテンシを最小限に抑えることです。

- カーネルプログラムはメモリ管理を実行する必要があります。
- カーネルは実行ファイルをメモリに最初にロードする際に、アドレス空間を論理的に領域に分割します。[ 134 ]カーネルは、マスター領域テーブルと、実行中のプロセスごとに1つずつ、多数のプロセス別領域(pregion)テーブルを管理します。[ 134 ]これらのテーブルが仮想アドレス空間を構成します。マスター領域テーブルは、その内容が物理メモリのどこに配置されているかを決定するために使用されます。pregionテーブルにより、各プロセスは独自のプログラム(テキスト)pregion、データpregion、スタックpregionを持つことができます。
- プログラムpregionは機械命令を格納します。機械命令は変更されないため、プログラムpregionは同じ実行ファイルの複数のプロセスで共有される可能性があります。[ 134 ]
- 時間とメモリを節約するために、カーネルはディスクドライブから実行ファイル全体を完全にロードするのではなく、実行命令のブロックのみをロードすることがあります。[ 133 ]
- カーネルは仮想アドレスを物理アドレスに変換する役割を担っています。カーネルはメモリコントローラにデータを要求しても、ページフォールトが発生することがあります。[ 135 ]その場合、カーネルはメモリ管理ユニットにアクセスして物理データ領域にデータを入力し、アドレスを変換します。[ 136 ]
- カーネルは、プロセスからの要求に応じてヒープからメモリを割り当てます。 [ 65 ]プロセスはメモリの使用を終えると、そのメモリの解放を要求することができます。プロセスが割り当てられたメモリの解放を要求せずに終了した場合、カーネルはガベージコレクションを実行してメモリを解放します。
- カーネルはまた、プロセスが自身のメモリにのみアクセスし、カーネルや他のプロセスのメモリにはアクセスしないようにします。[ 133 ]
- カーネルプログラムはファイルシステムの管理を実行する必要があります。[ 133 ]カーネルには、ファイルの作成、取得、更新、削除を行う命令があります。
- カーネルプログラムはデバイス管理を行うべきである。[ 133 ]カーネルは、マウス、キーボード、ディスクドライブ、プリンタ、その他のデバイスへのインターフェースを標準化し、簡素化するためのプログラムを提供する。さらに、2つのプロセスが同時にデバイスへのアクセスを要求した場合、カーネルはそれらのアクセスを調停するべきである。
- カーネルプログラムはネットワーク管理を行うべきである。[ 137 ]カーネルはプロセスに代わってパケットを送受信する。重要なサービスの一つは、ターゲットシステムへの効率的な経路を見つけることである。
- カーネルプログラムはプログラマが使用できるシステムレベルの機能を提供する必要がある。 [ 138 ]
- カーネルプログラムは、実行中のプロセス間の通信チャネルを提供する必要があります。[ 140 ]大規模なソフトウェアシステムでは、システムを小さなプロセスに分割することが望ましい場合があります。プロセスは、シグナルを送受信することで互いに通信します。
もともとオペレーティングシステムはアセンブリ言語でプログラムされていましたが、現代のオペレーティングシステムは通常、 C、Objective-C、Swiftなどの高級言語で書かれています。[ m ]
ユーティリティプログラム
ユーティリティとは、システム管理とソフトウェア実行を支援するプログラムです。オペレーティングシステムは通常、ストレージ、メモリ、スピーカー、プリンターなどのハードウェアをチェックするためのユーティリティを提供します。[ 141 ]ユーティリティは、ストレージデバイスのパフォーマンスを最適化することもあります。システムユーティリティは、ハードウェアとネットワークのパフォーマンスを監視し、測定値が公称範囲外になった場合に警告を発することがあります。[ 142 ]ユーティリティは、ファイルを圧縮してストレージ容量とネットワーク転送時間を削減することがあります。 [141]ユーティリティは、データセットのソートとマージを行うこともあります。[142] ユーティリティは、コンピュータウイルスを検出することもあります。[ 142 ]
マイクロコードプログラム





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

算術演算を実行する命令は、算術論理ユニット(ALU)に渡されます。[ 151 ] ALUには、整数の加算、シフト、比較といった基本演算を実行する回路があります。CPUは、これらの基本演算をALUで組み合わせてループ処理することで、複雑な演算を実行します。
マイクロコード命令は、CPUとメモリコントローラ間でデータを移動します。メモリコントローラのマイクロコード命令は、2つのレジスタを操作します。メモリアドレスレジスタは、各メモリセルのアドレスにアクセスするために使用されます。メモリデータレジスタは、各セルの内容の設定と読み出しに使用されます。[ 152 ]
注釈
- ^ Prolog言語では、事実と規則のデータベースを任意の順序で入力できます。ただし、データベースに関する質問は必ず最後に置く必要があります
- ^ユーザーまたは別のプログラムが要求を行います。
- ^実行可能ファイルには、 CPU用に準備された各マシン命令が含まれています。
- ^詳細については、 X86 アセンブリ言語#命令タイプを参照してください。
- ^ 1999年に導入
- ^これは 10 進数ですが、PDP-11 コードは常に8 進数で表現されます。
- ^のような演算子は
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 に取って代わりました。
- ^最下層のインタプリタは、技術的にはレベル1層と呼ばれます。レベル0層はデジタル論理層です。さらに3つの中間層があり、レベル5層は問題指向言語層です。 [ 143 ]
参考文献
- ^ 「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
ソースプログラムをコンパイルする代わりに、インタープリタを使用することもできます。インタープリタはソースプログラムを直接実行できます
- ^ Kerrisk, Michael (2010). Linuxプログラミングインターフェース. No Starch Press. p. 22. ISBN 978-1-59327-220-3
カーネルは新しいプログラムをメモリにロードすることができます
- ^シルバーシャッツ、アブラハム (1994). 『オペレーティングシステムの概念』第4版. アディソン・ウェスレー. 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。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 30. ISBN 0-201-71012-9彼らの目的は、
学生が簡単に学べる言語を作り出すことでした。
- ^ a b cウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 31. ISBN 0-201-71012-9。
- ^ a b c d e fウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 30. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 30. ISBN 0-201-71012-9
学生が単にたまに使うユーザーになることも、Basicからより洗練された強力な言語に進むこともできるという考えでした
。 - ^ a bマッカートニー、スコット (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). 「チャールズ・バベッジの解析エンジン、1838年」(PDF) . IEEE Annals of the History of Computing . 20 (4): 29– 45. Bibcode : 1998IAHC...20d..29B . doi : 10.1109/85.728228 . S2CID 2285332. 2016年3月4日時点のオリジナルからアーカイブ(PDF) . 2015年10月30日閲覧
- ^ a b 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月)、「Lovelace & Babbageと1843年の「ノート」の作成」", Annals of the History of Computing , 25 (4): 16, 19, 25, Bibcode : 2003IAHC...25d..16F , doi : 10.1109/MAHC.2003.1253887
- ^ Rosen, Kenneth H. (1991). 『離散数学とその応用』 McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6
チューリングマシンは、計算機で実行できるすべての計算をモデル化できます
- ^リンツ、ピーター (1990). 『形式言語とオートマトン入門』 DC Heath and Company. p. 234. ISBN 978-0-669-17342-0。
- ^リンツ、ピーター (1990). 『形式言語とオートマトン入門』 DC Heath and Company. p. 243. ISBN 978-0-669-17342-0
一般的な数学関数は、どれほど複雑であっても、チューリング計算可能です
。 - ^ a b cマッカートニー、スコット (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 – 世界初のコンピュータの勝利と悲劇. ウォーカー・アンド・カンパニー. 120ページ . ISBN 978-0-8027-1348-3。
- ^ a bマッカートニー、スコット (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。
- ^ Huskey, Harry D. (2003-01-01)、「EDVAC」、Encyclopedia of Computer Science、GBR: John Wiley and Sons Ltd.、pp. 626– 628、ISBN 978-0-470-86412-82025年4月25日取得
- ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition . Prentice Hall. p . 21. ISBN 978-0-13-854662-5。
- ^ a b Wilson, Leslie B. (2001).比較プログラミング言語 第3版. Addison-Wesley. p. 27. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 29. ISBN 0-201-71012-9。
- ^ a b cシルバーシャッツ、アブラハム (1994).オペレーティングシステムコンセプト、第4版. アディソン・ウェスレー. p. 6. ISBN 978-0-201-50480-4 。
- ^ a b『デジタル時代へ:研究所、スタートアップ企業、そして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日閲覧。
- ^ Anysilicon (2021年11月4日). 「NMOSトランジスタとPMOSトランジスタ入門」 . AnySilicon . 2022年2月6日時点のオリジナルよりアーカイブ。2022年2月5日閲覧。
- ^ 「マイクロプロセッサの定義」ブリタニカ。2022年4月1日時点のオリジナルよりアーカイブ。 2022年4月1日閲覧。
- ^ 「チップの殿堂:Intel 4004マイクロプロセッサ」。米国電気電子学会(IEICE)2018年7月2日。2022年2月7日時点のオリジナルよりアーカイブ。 2022年1月31日閲覧。
- ^ 「360 Revolution」(PDF) . Father, Son & Co. 1990. 2022年10月10日時点のオリジナルよりアーカイブ(PDF) . 2022年2月5日閲覧。
- ^ 「ビル・ゲイツ、マイクロソフト、そしてIBMパーソナルコンピュータ」 InfoWorld、1982年8月23日。2023年2月18日時点のオリジナルよりアーカイブ。 2022年2月1日閲覧。
- ^ a b Stroustrup, Bjarne (2013). 『C++プログラミング言語 第4版』Addison-Wesley. p. 10. ISBN 978-0-321-56384-2。
- ^ a b c Stroustrup, Bjarne (2013). C++プログラミング言語 第4版. Addison-Wesley. p. 11. ISBN 978-0-321-56384-2。
- ^ a bステア、ラルフ・M. (2003). 『情報システム原理』第6版. トムソン. p. 159. ISBN 0-619-06489-7。
- ^ a bリンツ、ピーター (1990). 『形式言語とオートマトン入門』 DC Heath and Company. p. 2. ISBN 978-0-669-17342-0。
- ^ワイス、マーク・アレン (1994). C++によるデータ構造とアルゴリズム分析. ベンジャミン/カミングス出版. 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。
- ^ Wilkes, MV; Renwick, W. (1982), Randell, Brian (ed.), "The EDSAC" , The Origins of Digital Computers: Selected Papers , Berlin, Heidelberg: Springer, pp. 417– 421, doi : 10.1007/978-3-642-61812-3_34 , ISBN 978-3-642-61812-32025年4月25日取得
{{citation}}: CS1 maint: ISBNによる作業パラメータ(リンク) - ^ a b c d e fステア、ラルフ・M. (2003).情報システム原理 第6版. トムソン. p. 160. ISBN 0-619-06489-7。
- ^ a b c Tanenbaum , Andrew S. (1990). Structured Computer Organization, Third Edition . Prentice Hall. p. 399. ISBN 978-0-13-854662-5。
- ^タネンバウム、アンドリュー・S. (1990).構造化コンピュータ組織、第3版. プレンティス・ホール. 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。
- ^ a b c dウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 37. ISBN 0-201-71012-9。
- ^ステア、ラルフ・M. (2003). 『情報システム原理』 第6版. トムソン. p. 160. ISBN 0-619-06489-7
第三世代以上のプログラミング言語では、言語内の各ステートメントが機械語の複数の命令に変換されます
。 - ^ウィルソン、レスリー・B. (1993).比較プログラミング言語 第2版. アディソン・ウェズレー. p. 75. ISBN 978-0-201-56885-1。
- ^ Stroustrup, Bjarne (2013). C++プログラミング言語 第4版. Addison-Wesley. p. 40. ISBN 978-0-321-56384-2。
- ^ a b 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。
- ^ a b Wilson, Leslie B. (2001).比較プログラミング言語 第3版. Addison-Wesley. p. 25. ISBN 0-201-71012-9。
- ^ a b c dウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 19. ISBN 0-201-71012-9。
- ^ a b c d「Cプログラムのメモリレイアウト」。2011年9月12日。2021年11月6日時点のオリジナルよりアーカイブ。2021年11月6日閲覧
- ^ a bカーニハン, ブライアン・W.; リッチー, デニス・M. (1988). 『プログラミング言語C』第2版. プレンティス・ホール. p. 31. ISBN 0-13-110362-8。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. 128ページ. ISBN 0-201-71012-9。
- ^ a b cケリスク、マイケル (2010). Linuxプログラミングインターフェース. No Starch Press. p. 121. ISBN 978-1-59327-220-3 。
- ^ケリスク、マイケル (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。
- ^ a bカーニハン, ブライアン・W.; リッチー, デニス・M. (1988). 『プログラミング言語C』第2版. プレンティス・ホール. p. 187. ISBN 0-13-110362-8。
- ^ a b cウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 38. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズリー. 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。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. 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。
- ^ a bウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. 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
関数呼び出しがある場合、レジスタ値(変数名に対応)や戻りアドレス(プログラムカウンタから取得可能)など、すべての重要な情報を保存する必要があります。…関数が戻る必要がある場合、…すべてのレジスタを復元します。次に、戻りジャンプを実行します。明らかに、このすべての作業はスタックを使用して実行でき、これは再帰を実装するほぼすべてのプログラミング言語で実際に行われていることです
- ^ a b cウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 230. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズリー. p. 240. ISBN 0-201-71012-9。
- ^ a b cウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 241. ISBN 0-201-71012-9。
- ^ジョーンズ、ロビン、メイナード、イアン・スチュワート(2012年12月6日)『Lispプログラミングの芸術』 Springer Science & Business Media、p. 2. ISBN 9781447117193。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 220. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 221. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 229. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 227. ISBN 0-201-71012-9。
- ^ a b 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日閲覧。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 233. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. p. 235. ISBN 0-201-71012-9。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 55. ISBN 0-201-71012-9。
- ^ Colmerauer, A.; Roussel, P. (1992). 「Prologの誕生」(PDF) . ACM SIGPLAN Notices . 28 (3). Association for Computing Machinery: 5. doi : 10.1145/155360.15536 2.
- ^ Kowalski, R., Dávila, J., Sartor, G. and Calejo, M., 2023. 法律と教育のための論理的英語. Prolog: The Next 50 Years (pp. 287–299). Cham: Springer Nature Switzerland.
- ^ a bウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 35. ISBN 0-201-71012-9
Simulaは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 。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 290. ISBN 0-201-71012-9
プログラミング言語の構文(または文法)は
、プログラムが記述される正しい形式を記述します。 - ^ Wilson, Leslie B. (2001).比較プログラミング言語 第3版. Addison-Wesley. p. 78. ISBN 0-201-71012-9
命令型言語の主な構成要素は、宣言、式、およびステートメントです
。 - ^ a bウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. 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。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェスレー. 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。
- ^ウィルソン、レスリー・B. (2001).比較プログラミング言語 第3版. アディソン・ウェズレー. p. 297. ISBN 0-201-71012-9。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 序文. ISBN 0-256-08515-3 。
- ^ a b cステア、ラルフ・M. (2003).情報システム原理 第6版. トムソン. p. 507. ISBN 0-619-06489-7。
- ^ a bステア、ラルフ・M. (2003). 『情報システム原理 第6版』トムソン社. 513ページ. ISBN 0-619-06489-7。
- ^ステア、ラルフ・M. (2003). 『情報システム原理』第6版. トムソン. 514ページ. ISBN 0-619-06489-7。
- ^ステア、ラルフ・M. (2003). 『情報システム原理』 第6版. トムソン. 516ページ. ISBN 0-619-06489-7。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 8. ISBN 0-256-08515-3 。
- ^ステア、ラルフ・M. (2003). 『情報システム原理』第6版. トムソン. 517ページ. ISBN 0-619-06489-7。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 345. ISBN 0-256-08515-3 。
- ^ a b c d Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 319. ISBN 0-256-08515-3 。
- ^ a b Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 331. ISBN 0-256-08515-3 。
- ^ Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 216. ISBN 0-256-08515-3 。
- ^ a b c Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 219. ISBN 0-256-08515-3 。
- ^ a b Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. p. 226. ISBN 0-256-08515-3 。
- ^ a b Schach, Stephen R. (1990).ソフトウェアエンジニアリング. Aksen Associates Incorporated Publishers. 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 。
- ^ a b cシルバーシャッツ、アブラハム (1994).オペレーティングシステムコンセプト、第4版. アディソン・ウェスレー. p. 1. ISBN 978-0-201-50480-4 。
- ^ステア、ラルフ・M. (2003). 『情報システム原理 第6版』トムソン社. 147ページ. ISBN 0-619-06489-7
あらゆるコンピュータシステムの潜在能力を引き出す鍵は、アプリケーションソフトウェアです
- ^ a b c dステア、ラルフ・M. (2003). 『情報システム原理』第6版. トムソン. p. 147. ISBN 0-619-06489-7。
- ^ステア、ラルフ・M. (2003). 『情報システム原理 第6版』トムソン社. 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版』トムソン社. 147ページ. ISBN 0-619-06489-7見出し:
独自のソフトウェア; サブ見出し: 利点; 引用: 競合他社の新しい取り組みに対抗するため、または新しいサプライヤーや顧客の要件を満たすために必要な変更を、より柔軟に行うことができます。
- ^ a b c dステア、ラルフ・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。
- ^ a bマイケル・ケリスク(2010年)『Linuxプログラミング・インターフェース』No Starch Press、21ページ。ISBN 978-1-59327-220-3 。
- ^ a b c d eマイケル・ケリスク (2010). Linuxプログラミングインターフェース. No Starch Press. p. 22. ISBN 978-1-59327-220-3 。
- ^ a b c 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).組み込みシステムアーキテクチャ. Packt. p. 8. ISBN 978-1-78883-250-2。
- ^ケリスク、マイケル (2010). Linuxプログラミングインターフェース. No Starch Press. p. 23. ISBN 978-1-59327-220-3 。
- ^カーニハン、ブライアン・W. (1984). Unixプログラミング環境. プレンティス・ホール. p. 201. ISBN 0-13-937699-2。
- ^ケリスク、マイケル (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。
- ^ a bステア、ラルフ・M. (2003).情報システム原理 第6版. トムソン. p. 145. ISBN 0-619-06489-7。
- ^ a b cステア、ラルフ・M. (2003). 『情報システム原理』第6版. トムソン. p. 146. ISBN 0-619-06489-7。
- ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition . Pearson. p. 5. ISBN 978-0-13-291652-3。
- ^ a b 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。