コンピュータープログラム

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

命令型プログラミングではコンピュータープログラムは、コンピューターが実行または解釈できるプログラミング言語の一連の命令です。[1]宣言型プログラミングではコンピュータープログラム一連の命令です。

人間が読める形式のコンピュータプログラムは、ソースコードと呼ばれます。コンピュータはネイティブのマシン命令しか実行できないため、ソースコードを実行するには別のコンピュータプログラムが必要です。したがって、ソースコードは、言語のコンパイラを使用してマシン命令に変換できます。機械語プログラムはアセンブラーを使用して翻訳されます。)結果のファイルは実行可能ファイルと呼ばれます。または、ソースコードを言語のインタープリター内で実行することもできますプログラミング言語Javaは中間形式にコンパイルされ、中間形式で実行されます。Javaインタプリタ[2]

実行可能ファイルの実行が要求された場合、オペレーティングシステムは実行可能ファイルを メモリにロードし、プロセスを開始します[3]中央処理装置はまもなくこのプロセスに切り替わり、各マシン命令をフェッチ、デコード、および実行できるようになります。[4]

ソースコードの実行が要求された場合、オペレーティングシステムは対応するインタプリタをメモリにロードし、プロセスを開始します。次に、インタプリタはソースコードをメモリにロードして、各ステートメントを変換して実行します。[2]ソースコードの実行は、実行可能ファイルの実行よりも遅くなります。さらに、インタープリターがコンピューターにインストールされている必要があります。

歴史

ソフトウェア開発の改善は、コンピュータハードウェアの改善の結果ですハードウェアの歴史の各段階で、コンピュータープログラミングのタスクは劇的に変化しました。

分析エンジン

ノートGからのラブレースの説明。

1837年、チャールズバベッジは、分析エンジンの構築を試みるジャカード織機に触発されました[5] 計算装置のコンポーネントの名前は、繊維産業から借用されました。繊維産業では、糸は店から運ばれて製粉されました。デバイスには、それぞれ10進数の50桁の数字を1,000個保持するためのメモリである「ストア」がありました。[6]「店舗」からの番号は、処理のために「工場」に転送されました。2セットの穴あきカードを使用してプログラムされました。1つは操作を指示するためのセットで、もう1つは入力変数用です。[5] [7] しかし、17,000ポンドを超える英国政府の資金の後、何千もの歯車と歯車が完全に連携することはありませんでした。[8]

エイダ・ラブレスはチャールズ・バベッジのために分析エンジン(1843)の説明を作成しました。[9]説明には、分析エンジンを使用してベルヌーイ数を計算する方法を完全に詳述した注記Gが含まれていました。このメモは、世界初のコンピュータプログラムとして一部の歴史家に認められています。[8]

万能チューリング機械

万能チューリング機械.svg

1936年、アランチューリングユニバーサルチューリングマシンを発表しました。これは、チューリング完全コンピューティングマシンで実行できるすべての計算をモデル化できる理論上のデバイスです。[10] これは、読み取り/書き込みテープが無限に長い有限状態マシンです。マシンは、アルゴリズムを実行するときにテープの内容を変更して、テープを前後に移動できますマシンは初期状態で起動し、一連の手順を実行し、停止状態になると停止します。[11]

リレーベースのコンピュータ

ミュンヘンのドイツ博物館展示されているZuseZ3レプリカ

Konrad Zuse (1941)によって発明されたZ3コンピューターは、デジタルでプログラム可能なコンピューターでした。[12] Zuseは、1939年にドイツの特許を申請しようとしたときに、「バベッジエンジン」に気づきました[12]分析エンジン10進数で、理解しやすかったです。Zuseは、バイナリマシンの構築が簡単であることを認識しました。電話リレーは、オープンまたはクローズの2ポジションスイッチです。Z3には約2,600個のリレーがありました。メモリ用に1,800個、演算用に600個、パンチテープリーダー、キーボード、およびディスプレイ用に200個です。[12]提供された回路は 浮動小数点、9命令コンピューター。Z3のプログラミングは、特別に設計されたキーボードとパンチテープを使用して行われました。手動入力は、10進数を受け入れる電卓スタイルのキーボードを介して行われました。マシンは入力をバイナリに変換し、一連の計算モジュールに渡しました。[8]結果は10進数に変換され、出力パネルに表示されました。[12]

同時に開発されたのは、その後継であるZ4コンピューターです。(1945年4月6日の空襲でZ3が破壊されました。)1950年、Z4はチューリッヒの連邦技術研究所で生産されました。

IBM (1944)によって発明されたハーバードマークIも、デジタルでプログラム可能なコンピューターでした。[13]コンピューターは23の符号付き整数をサポートし、7つの主要な単位を持っていました:[14]

  • 1つのユニットには、アプリケーション定数を設定するために使用される60セットのダイヤルスイッチがありました。
  • 1台のユニットが機械の操作を指示するために使用されました。
  • 1つのユニットは加算と減算を実行し、中間結果を格納するために72個のレジスタが使用されていました。
  • 1つのユニットを使用して乗算と除算を実行しました。
  • 1つのユニットは、補間を使用して三角 関数を計算するために使用されました。
  • 1つの単位は、補間を使用して対数関数を計算するために使用されました。
  • タイプライタープリンターまたはパンチカードプリンターのいずれかで、1台のユニットを使用してマシンの出力メディアを送信しました。

ハーバードマークIには3,304のリレーと530マイルのワイヤーがありました。[15] 2つのパンチテープリーダーが入力を提供しました。[13] 1人の読者が指示を入力しました。利用可能なアルゴリズムのインデックスを作成したコードブックは、ハワードH.エイケンによって作成されました。この本から、プログラマーはコード化された命令をテープに打ち抜きました。もう一方のリーダーは、処理するデータを入力しました。

ハーバードマークIは、IBMの他の2台のリレーベースのコンピューターに引き継がれました。

ENIAC

グレンA.ベックはENIACでチューブを交換しています。

Electronic Numerical Integrator And Computer (ENIAC)は、1943年7月から1945年秋にかけて製造されました。これは、 17,468本の真空管を使用して回路を作成したチューリング完全な汎用コンピューターでしたその核となるのは、一緒に配線された一連のパスカリンでした。[16]その40ユニットの重量は30トンで、1,800平方フィート(167 m 2 )を占め、アイドル状態のときに1時間あたり650ドル(1940年代の通貨)の電力を消費しました。[16] 20の基数10のアキュムレータがありました。ENIACのプログラミングには最大2か月かかりました。[16] 3つの機能テーブルが車輪の上にあり、固定機能パネルにロールする必要がありました。機能テーブルは、太い黒いケーブルを使用して機能パネルに接続されました。各機能テーブルには、728個の回転ノブがありました。ENIACのプログラミングには、3,000個のスイッチのいくつかの設定も含まれていました。プログラムのデバッグには1週間かかりました。[17] 1947年から1955年までアバディーン性能試験場で実行され、水素爆弾のパラメーターを計算し、気象パターンを予測し、大砲を狙うための発射台を作成しました。[18]

ストアドプログラムコンピュータ

コードを接続してスイッチを回す代わりに、ストアドプログラムコンピュータは、データをメモリにロードするのと同じように、命令をメモリにロードします。[19]その結果、コンピューターを迅速にプログラムし、非常に高速で計算を実行することができました。[20] PresperEckertJohnMauchlyがENIACを構築しました。2人のエンジニアは、1944年2月付けの3ページのメモでストアドプログラムの概念を紹介しました。 [21]その後、1944年9月、ジョンフォンノイマン博士はENIACプロジェクトに取り組み始めました。1945年6月30日、フォンノイマンはEDVACに関する報告書の最初の草案を発表しました。これは、コンピューターの構造を人間の脳の構造と同一視しました。[20]この設計はフォンノイマンアーキテクチャとして知られるようになりましたこのアーキテクチャは、1949年にEDVACおよびEDSACコンピュータの構築に同時に展開されました。 [22]

1961年、Burroughs B5000は、 Algol60言語でプログラムするために特別に構築されましたハードウェアは、コンパイルフェーズを容易にする回路を備えていました。[23]

1964年、IBM System / 360は、それぞれが同じ命令セットアーキテクチャーを備えた6台のコンピューターのラインでしたモデル30は最小で、最も安価でしたお客様は、同じアプリケーションソフトウェアをアップグレードして保持できます[24]モデル75が最もプレミアムでした。各System / 360モデルは、マルチプログラミング[24]を特徴としており、一度に複数のプロセスメモリに格納します。1つのプロセスが入出力を待機しているときに、別のプロセスが計算できます。

IBMは、各モデルがPL / 1を使用してプログラムされることを計画しました。[25] COBOLFortranALGOLのプログラマーを含む委員会が結成されました。目的は、包括的で使いやすく、拡張可能で、CobolとFortranに取って代わる言語を開発することでした。[25]その結果、コンパイルに長い時間がかかる大きくて複雑な言語になりました[26]

1970年代半ばに製造されたDataGeneral Nova3の手動入力用スイッチ

1970年代までに製造されたコンピューターには、手動プログラミング用のフロントパネルスイッチがありました。[27]コンピュータプログラムは参考のために紙に書かれた。命令は、オン/オフ設定の構成によって表されました。設定後、実行ボタンを押しました。その後、このプロセスが繰り返されました。コンピュータプログラムも、紙テープパンチカードを介して自動的に入力されました。メディアがロードされた後、開始アドレスがスイッチを介して設定され、実行ボタンが押されました。[27]

超大規模集積回路

VLSI集積回路ダイ

ソフトウェア開発の主要なマイルストーンは、超大規模集積回路(VLSI)回路の発明(1964年)でした。[28]第二次世界大戦後、チューブベースの技術は、回路基板に取り付けられた点接触トランジスタ(1947)およびバイポーラ接合トランジスタ(1950年代後半)に置き換えられました[28] 1960年代に、航空宇宙産業は回路基板を集積回路チップに置き換えました[28]

Fairchild Semiconductor(1957)とIntel (1968)の共同創設者であるRobert Noyceは、電界効果トランジスタの製造を改良するための技術的改善を達成しました(1963)。[29]目標は半導体接合の電気抵抗率と導電率を変更することです。まず、天然に存在するケイ酸塩鉱物は、シーメンスプロセスを使用してポリシリコンロッドに変換されます[30]次に、チョクラルスキー法により、ロッドが単結晶シリコンブール結晶に変換されます。[31]次に、結晶を薄くスライスしてウェーハ 基板を形成します。次に、フォトリソグラフィーのプレーナープロセスは、ユニポーラトランジスタ、コンデンサ、および抵抗をウェーハ上に統合して、金属-酸化物-半導体(MOS)トランジスタのマトリックスを構築します。[32] MOSトランジスタは、集積回路チップの主要コンポーネントです。[29]

もともと、集積回路チップは製造中に機能が設定されていました。1960年代に、電気の流れの制御は、読み取り専用メモリ(ROM)のマトリックスのプログラミングに移行しました。マトリックスは、ヒューズの2次元配列に似ていました。[28]マトリックスに命令を埋め込むプロセスは、不要な接続を焼き尽くすことでした。[28]非常に多くの接続があったため、ファームウェアプログラマーは、書き込みを監視するために別のチップ上にコンピュータープログラムを作成しました。[28]この技術はプログラマブルROMとして知られるようになりました。1971年、Intelはコンピュータプログラムをチップにインストールし、名前を付けました。Intel4004 マイクロプロセッサ[33]

IBMのSystem / 360(1964)CPUはマイクロプロセッサーではありませんでした。

マイクロプロセッサ中央処理装置(CPU)という用語は、現在、同じ意味で使用されています。ただし、CPUはマイクロプロセッサよりも前のものです。たとえば、IBM System / 360(1964)には、セラミック基板上にディスクリートコンポーネントを含む回路基板で作られたCPUが搭載されていました。[34]

サックステート8008

サクラメント州立大学のIntel8008マイクロコンピューター(1972年)の芸術家による描写。

Intel 4004は4ビットマイクロプロセッサであり、 Busicom計算機を実行するように機能しました。リリースから5か月後、Intelは8ビットマイクロプロセッサであるIntel8008をリリースしました。Bill Pentzは、サクラメント州のチームを率いて、Intel8008を使用した最初のマイクロコンピューターであるSacState 8008(1972)を構築しました。[35]その目的は、患者の医療記録を保存することでした。コンピュータは、 Memorex、3メガバイトハードディスクドライブを実行するためのディスクオペレーティングシステムをサポートしていました[28]カラーディスプレイとキーボードが1つのコンソールにパッケージ化されていました。ディスクオペレーティングシステムは、IBMの基本アセンブリ言語(BAL)を使用してプログラムされました。医療記録アプリケーションは、BASICインタープリターを使用してプログラムされました。[28]しかし、コンピューターは非常に高価だったため、進化の行き止まりでした。また、それは特定の目的のために公立大学の研究室で建てられました。[35]それにもかかわらず、このプロジェクトはIntel 8080(1974)命令セットの開発に貢献しました[28]

x86シリーズ

オリジナルのIBMパーソナルコンピュータ(1981)は、Intel8088マイクロプロセッサを使用していました。

1978年、IntelがIntel8080をIntel8086にアップグレードしたときに、最新のソフトウェア開発環境が始まりましIntelは、Intel 8086を簡素化して、より安価なIntel8088を製造しまし[36] IBMは、パーソナルコンピュータ市場に参入したとき(1981年)にIntel8088を採用しました。パーソナルコンピュータに対する消費者の需要が高まるにつれ、Intelのマイクロプロセッサ開発も増えました。一連の開発は、x86シリーズとして知られています。x86アセンブリ言語は、下位互換性のあるマシン命令のファミリです 以前のマイクロプロセッサで作成されたマシン命令は、マイクロプロセッサのアップグレードを通じて保持されました。これにより、消費者は新しいアプリケーションソフトウェアを購入しなくても新しいコンピュータを購入できるようになりました指示の主なカテゴリは次のとおりです。

プログラミング環境

DEC VT100(1978)は、広く使用されているコンピュータ端末でした

VLSI回路により、プログラミング環境をコンピューター端末(1990年代まで)からグラフィカルユーザーインターフェイス(GUI)コンピューターに進化させることができました。コンピューター端末は、プログラマーをコマンドライン環境で実行される単一のシェルに制限していました。1970年代に、テキストベースのユーザーインターフェイスを介してフルスクリーンのソースコード編集が可能になりました利用可能なテクノロジーに関係なく、目標はプログラミング言語でプログラミングすることです。

プログラミング言語

コンピュータプログラミング(ソフトウェア開発およびソフトウェアエンジニアリングとも呼ばれます)は、ソースコードを記述または編集するプロセスです正式な環境では、システムアナリストは、自動化する組織のすべてのプロセスに関する情報をマネージャーから収集します。次に、この専門家は、新しいシステムまたは変更されたシステムの詳細な計画を作成します。[37]計画は、建築家の青写真に類似しています。[37]コンピュータープログラマーは、詳細な計画を実装するためのソースコードの作成または変更を担当するスペシャリストです。[37]

Helloworldプログラム

"こんにちは世界!" ブライアン・カーニハンによるコンピュータプログラム(1978)

Hello、World!」programは、プログラミング言語の基本的な出力規則を説明するために使用されるいくつかの命令です

プログラミング言語は、プログラマーがコンピューターに命令を伝達するためのキーワード記号識別子、および規則のセットです。[38]それらは構文と呼ばれる一連の規則に従います[38]

プログラミング言語は、形式言語に基づいています[39]形式言語の観点からソリューションを定義する目的は、下線を引く問題を解決するためのアルゴリズムを生成することです。[39]アルゴリズムは、問題を解決する一連の単純な命令です[40]

プログラミング言語の生成

プログラミング言語の進化は、EDSAC(1949)がフォンノイマンアーキテクチャで最初のストアドコンピュータプログラムを使用したときに始まりました。[41] EDSACのプログラミングは、第1世代のプログラミング言語でした。

  • プログラミング言語の第一世代機械語です。[42] 機械語では、プログラマーは機械語と呼ばれる命令番号を使用して命令を入力する必要がありますたとえば、PDP-11のADD操作の命令番号は24576です。[43]
  • アセンブリ言語ステートメントの基本構造は、ラベル、操作、オペランド、およびコメントです。[44]
  • ラベルを使用すると、プログラマーは変数名を操作できます。アセンブラは後でラベルを物理メモリアドレスに変換します
  • 操作により、プログラマーはニーモニックを操作できます。アセンブラは後でニーモニックを命令番号に変換します。
  • オペランドは、操作が処理するデータをアセンブラーに通知します。
  • コメントだけでは、指示だけが曖昧であるため、プログラマーは物語を明確にすることができます。
アセンブリ言語プログラムの主な特徴は、対応する機械語ターゲットへの1対1のマッピングを形成することです。[45]
  • 4世代のプログラミング言語は、プログラミングステートメントの作成方法ではなく、必要な出力結果を強調しています。[42] 宣言型言語は、副作用を制限し、プログラマーが比較的少ないエラーでコードを記述できるようにします。[42]人気のある第4世代言語の1つは、構造化照会言語(SQL)と呼ばれます。[42] データベース開発者は、各データベースレコードを一度に1つずつ処理する必要がなくなりました。また、簡単な命令で、取得方法を理解しなくても出力レコードを生成できます。

命令型言語

命令型言語で書かれたコンピュータープログラム

命令型言語は、宣言、式、およびステートメントを使用して順次アルゴリズムを指定します。 [50]

Fortran

FORTRAN(1958)は、「IBM Mathematical FORmulaTRANslatingsystem」として発表されました。それは1958年に最初に正しくコンパイルされました。[52]それは文字列処理機能なしで科学計算のために設計されました。宣言ステートメントに加えて、以下をサポートしました。

成功した理由:

  • プログラミングとデバッグのコストは、コンピューターのランニングコストを下回りました。
  • それはIBMによってサポートされていました。
  • 当時のアプリケーションは科学的でした。[52]

ただし、IBM以外のベンダーもFortranコンパイラーを作成しましたが、IBMのコンパイラーに失敗する可能性のある構文を使用しています。[52]米国規格協会(ANSI)は、1966年に最初のFortran標準を開発しました。1978年に、Fortran77が1991年まで標準になりました。Fortran90は以下をサポートします。

COBOL

COBOL(1959)は、「COmmon BusinessOrientedLanguage」の略です。Fortranで操作されたシンボル。記号は数字である必要がないことがすぐにわかり、文字列が導入されました。[53]米国国防総省は、 COBOLの開発に影響を与え、GraceHopperが主要な貢献者でした。文は英語のようで冗長でした。目標は、マネージャーがプログラムを読めるように言語を設計することでした。ただし、構造化されたステートメントの欠如がこの目標を妨げました。[54]

COBOLの開発は厳密に管理されていたため、方言がANSI標準を必要とするようにはなりませんでした。結果として、1974年まで25年間変更されませんでした。1990年代のバージョンでは、オブジェクト指向プログラミングのような結果的な変更が行われました。[54]

アルゴル

ALGOL(1960)は、「ALGOrithmicLanguage」の略です。それはプログラミング言語の設計に大きな影響を及ぼしました。[55]ヨーロッパとアメリカのプログラミング言語の専門家の委員会から生まれたもので、標準的な数学表記を使用し、読みやすい構造化されたデザインを備えていました。Algolは、 Backus–Naur形式を使用して構文を最初に定義しました。[55]これは構文指向のコンパイラにつながりました。次のような機能が追加されました。

Algolの直系の子孫には、PascalModula-2AdaDelphiOberonが1つのブランチに含まれています。別のブランチには、 CC ++、およびJavaがあります。[55]

基本

BASIC(1964)は、「Beginner's All Purpose SymbolicInstructionCode」の略です。これは、ダートマス大学ですべての学生が学ぶために開発されました。[56]生徒がより強力な言語に進まなかったとしても、生徒は基本を覚えているでしょう。[56]基本的なインタプリタは、1970年代後半に製造されたマイクロコンピュータにインストールされました。マイクロコンピューター産業が成長するにつれて、言語も成長しました。[56]

Basicはインタラクティブセッションのパイオニアです。[56]環境内で オペレーティングシステムコマンドを提供しました。

  • 'new'コマンドは、空のスレートを作成しました。
  • ステートメントはすぐに評価されました。
  • ステートメントは、行番号を前に付けることでプログラムできます。
  • 'list'コマンドはプログラムを表示しました。
  • 'run'コマンドがプログラムを実行しました。

ただし、基本的な構文は、大規模なプログラムには単純すぎました。[56]最近の方言は、構造とオブジェクト指向の拡張機能を追加しました。Microsoftの VisualBasicは今でも広く使用されており、グラフィカルユーザーインターフェイスを生成します。[57]

C

Cプログラミング言語(1973)は、言語BCPLがBに置き換えられAT&T BellLabsが次のバージョンを「C」と呼んだことからその名前が付けられました。その目的は、UNIX オペレーティングシステムを作成することでした。[47] Cは比較的小さな言語であり、コンパイラーの作成を容易にします。その成長は、1980年代のハードウェアの成長を反映しています。[47]その成長は、アセンブリ言語の機能を備えているが、高レベルの構文を使用しているためでもあります次のような高度な機能が追加されました。

コンピュータメモリマップ

Cを使用すると、プログラマはメモリデータのどの領域に格納するかを制御できます。グローバル変数静的変数は、保存するのに必要なクロックサイクルが最も少なくなります。スタックは、標準の変数宣言に自動的に使用されます。ヒープメモリは、関数からポインタ変数malloc()に返されます。

  • グローバルおよび静的データ領域は、プログラム領域のすぐ上にあります。(プログラム領域は、技術的にはテキスト領域と呼ばれます。これは、マシン命令が格納される場所です。)
  • グローバルデータ領域と静的データ領域は、技術的には2つの領域です。[58] 1つの領域は初期化されたデータセグメントと呼ばれ、デフォルト値で宣言された変数が格納されます。もう1つの領域は、デフォルト値なしで宣言された変数が格納されるセグメントによって開始されるブロックと呼ばれます。
  • グローバルおよび静的データ領域に格納されている変数のアドレスは、コンパイル時に設定されます。それらは、プロセスの存続期間を通じてその価値を保持します。
  • グローバル領域と静的領域には、関数の上(外部)で宣言されたグローバル変数main()が格納されます。[59]グローバル変数はmain()、ソースコード内の他のすべての関数に表示されます。
一方、main()他の関数内、または{ } ブロック区切り文字内の変数宣言はローカル変数ですローカル変数には、仮パラメータ変数も含まれます。パラメータ変数は、関数定義の括弧で囲まれています。[60]それらは関数へのインターフェースを提供します。
  • staticプレフィックスを使用して宣言されたローカル変数も、グローバルおよび静的データ領域に格納されます。[58]グローバル変数とは異なり、静的変数は関数またはブロック内でのみ表示されます。静的変数は常にその値を保持します。使用例は関数ですint increment_counter(){ static int counter = 0; counter++; return counter;}
  • スタック領域は、最上位のメモリアドレスの近くにある連続したメモリブロックです。[61]皮肉なことに、スタックに配置された変数は上から下に入力されます。[61]スタックポインタは、最後に入力されたメモリアドレスを追跡する専用レジスタです。[61]変数は、アセンブリ言語のPUSH命令を介してスタックに配置されます。したがって、これらの変数のアドレスは実行時に設定されます。スタック変数がスコープを失う方法は、POP命令を使用することです。
  • static仮パラメータ変数[62]を含む、プレフィックスなしで宣言されたローカル変数は、自動変数[59]と呼ばれ、スタックに格納されます。[58]それらは関数またはブロック内に表示され、関数またはブロックを終了するとスコープを失います。
  • Cは、ヒープメモリを割り当てるmalloc()ためのライブラリ関数を提供します。[64]ヒープにデータを取り込むことは、追加のコピー機能です。ヒープに格納された変数は、ポインターを使用して関数に経済的に渡されます。ポインタがないと、データのブロック全体をスタックを介して関数に渡す必要があります。

C ++

1970年代、ソフトウェアエンジニアは、大規模なプロジェクトをモジュールに分割するための言語サポートを必要としていました。[65]明らかな機能の1つは、大きなプロジェクトを物理的に別々のファイルに分解することでした。あまり目立たない機能は、大規模なプロジェクトを論理的抽象 データ型に分解することでした。[65]当時、言語は整数浮動小数点数、文字などの具体的な(スカラー)データ型をサポートしていました具体的なデータ型には、名前の一部として表現があります。[66]抽象データ型は、具体的なデータ型の構造であり、新しい名前が割り当てられています。たとえば、整数のリストをと呼ぶことができますinteger_list

オブジェクト指向の専門用語では、抽象データ型はクラスと呼ばれます。ただし、クラスは単なる定義です。メモリは割り当てられていません。メモリがクラスに割り当てられるとき、それはオブジェクトと呼ばれます。[67]

クラスの必要性と安全な関数型プログラミングの必要性を組み合わせて開発されたオブジェクト指向の命令型言語[68]オブジェクト指向言語の関数は、クラスに割り当てられます。割り当てられた関数は、メソッドメンバー関数、または操作と呼ばれます。オブジェクト指向プログラミングは、オブジェクトに対して操作実行[69]

オブジェクト指向言語は、サブセット/スーパーセットの関係をモデル化するための構文をサポートしています。集合論では、サブセットの要素、スーパーセットに含まれるすべての属性を継承します。たとえば、学生は人です。したがって、学生のセットは、人のセットのサブセットです。その結果、学生はすべての人に共通するすべての属性を継承します。さらに、学生は他の人が持っていないユニークな属性を持っています。オブジェクト指向言語は、継承を使用してサブセット/スーパーセットの関係をモデル化します。[70]オブジェクト指向プログラミングは、1990年代後半までに主要な言語パラダイムになりました。[65]

C ++(1985)は、もともと「CwithClasses」と呼ばれていました。[71]これは、言語Simulaのオブジェクト指向機能を追加することによってCの機能を拡張するように設計されました[72]

オブジェクト指向モジュールは、2つのファイルで構成されています。定義ファイルはヘッダーファイルと呼ばれます。簡単な学校のアプリケーション のGRADEクラスのC ++ヘッダーファイルは次のとおりです。

// grade.h 
// -------


//複数のソースファイルに//複製エラーなしでこのヘッダーファイル
をインクルードできるようにするために使用されます。// ---------------------------------------------- 
#ifndef GRADE_H 
#define GRADE_H

クラス GRADE { 
パブリック
    //これはコンストラクター操作です。
// ---------------------------------- GRADE const char letter );    
         

    //これはクラス変数です。
// ------------------------- char文字;    
     

    //これはメンバー操作です。
// --------------------------- int grade_numeric const char letter );    
         

    //これはクラス変数です。
// ------------------------- int数値;    
     
};
#endif

コンストラクター操作は、クラス名と同じ名前の関数です[73]new呼び出し元の操作がステートメント を実行するときに実行されます。

モジュールの他のファイルはソースファイルです簡単な学校のアプリケーション のGRADEクラスのC ++ソースファイルは次のとおりです。

// grade.cpp 
// --------- 
#include "grade.h" 

GRADE :: GRADE const char letter     
{{
    //キーワード 'this'を使用してオブジェクトを参照します。
// ---------------------------------------------- this- >文字=文字;    
      

    //これは時間的凝集度です
// ------------------------- this- > nude = grade_numeric letter );    
        
}

int GRADE :: grade_numeric const char letter      
{{
    if 文字== 'A' ||文字== 'a'            
        4を返す; 
    そうしないと
    if 文字== 'B' ||文字== 'b'            
        3を返します; 
    そうしないと
    if letter == 'C' || letter == 'c'            
        2を返します; 
    そうしないと
    if 文字== 'D' ||文字== 'd'            
        1を返します; 
    そうしないと
    if 文字== 'F' ||文字== 'f'            
        0を返す; 
    そうしないと
        -1を返します; 
}

簡単な学校のアプリケーション のPERSONクラスのC ++ヘッダーファイルは次のとおりです。

// person.h 
// -------- 
#ifndef PERSON_H 
#define PERSON_H

クラス PERSON { 
パブリック
    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 {   
パブリック
    STUDENT const char * name );     
    グレード*グレード; 
};
#endif

簡単な学校のアプリケーション のSTUDENTクラスのC ++ソースコードは次のとおりです。

// student.cpp 
// ----------- 
#include "student.h" 
#include "person.h" 

STUDENT :: STUDENT const char * name      
    // PERSONスーパークラスのコンストラクターを実行します。
// ------------------------------------------------ --PERSON 名前_    
      
{{
    // ほかにすることがない。
// ------------------- }    

デモンストレーション用のドライバープログラムは次のとおりです。

// student_dvr.cpp 
// --------------- 
#include <iostream> 
#include "student.h" 

int main void    
{{
    STUDENT * student = new STUDENT "The Student" );      
    学生->成績=新しい成績'a' );     

    std :: cout //学生がPERSONの名前を継承していることに注意<< student- > name 
        
         
        << ":数値グレード=" 
        <<学生->学年->数値 
        << " \ n " ; 
	0を返す; 
}

これがすべてをコンパイルするため makefileです:

#makefile #
--------
すべて student_dvr

きれい
    rm student_dvr * .o

student_dvr  student_dvrcpp グレードo 学生o o
    c ++ student_dvr.cpp grade.o student.o person.o -o student_dvr

grade.o  gradecpp グレードh
    c ++ -c grade.cpp

student.o  学生cpp 学生h
    c ++ -c student.cpp

person.o  cpp h
    c ++ -c person.cpp

宣言型言語

命令型言語には1つの大きな批判があります。非ローカル変数に式を割り当てると、意図しない副作用が発生する可能性があります。[74] 宣言型言語は通常、代入ステートメントと制御フローを省略します。それらは、どのように計算するではなく、どの計算を実行する必要があるを説明します。宣言型言語の2つの広いカテゴリーは、関数型言語論理言語です。

関数型言語の背後にある原則は、明確に定義されたセマンティックのガイドとしてラムダ計算を使用することです。[75]数学では、関数は式からの範囲に要素をマップするルールです関数について考えてみましょう。

times_10(x) = 10 * x

は、関数によっての範囲に10 * xマップされます1つのはたまたま20です。これはxが2のときに発生します。したがって、関数のアプリケーションは数学的に次のように記述されます。 times_10()

times_10(2) = 20

関数型言語コンパイラーは、この値を変数に格納しません。代わりに、プログラムカウンターを呼び出し元の関数に戻す前に、値をコンピューターのスタックにプッシュします。次に、呼び出し元の関数がスタックから値をポップします。[76]

命令型言語は関数をサポートします。したがって、プログラマーが規律を使用すれば、関数型プログラミングは命令型言語で実現できます。ただし、関数型言語は、その構文を通じてこの分野をプログラマーに強制します。関数型言語には、何を強調するように調整された構文があります[77]

関数型プログラムは、一連のプリミティブ関数とそれに続く単一のドライバー関数を使用して開発されます。[74]スニペットを考えてみましょう

function max(a,b){ /* code omitted */}

function min(a,b){ /* code omitted */}

function difference_between_largest_and_smallest(a,b,c) {

return max(a,max(b,c)) - min(a, min(b,c));

}

プリミティブはとmax()ですmin()ドライバー関数はdifference_between_largest_and_smallest()です。実行中:

put(difference_between_largest_and_smallest(10,4,7));6を出力します。

関数型言語は、コンピューターサイエンスの研究で、新しい言語機能を探索するために使用されます。[78]さらに、副作用がないため、並列プログラミング並行プログラミングで人気があります。[79]ただし、アプリケーション開発者は、命令型言語のオブジェクト指向機能を好みます[79]

Lisp

Lisp(1958)は「LIStProcessor」の略です。[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はコンパイル時の要素のデータ型に関係していません。代わりに、実行時にデータ型を割り当てます。これにより、開発プロセスの早い段階でプログラミングエラーが検出されない可能性があります。

大きくて信頼性が高く、読みやすいLispプログラムを書くには、先見の明が必要です。適切に計画されている場合、プログラムは同等の命令型言語プログラムよりもはるかに短い可能性があります。[77] Lisp人工知能で広く使われています。ただし、その使用法は、命令型言語操作があり、意図しない副作用が発生する可能性があるという理由だけで受け入れられています。[79]

ML

ML(1973)[84]は「メタ言語」の略です。MLは、同じタイプのデータのみが相互に比較されていることを確認します。[85]たとえば、この関数には1つの入力パラメーター(整数)があり、整数を返します。

fun times_10(n : int) : int = 10 * n;

MLはLispのように括弧のように偏心していません以下はのアプリケーションですtimes_10()

times_10 2

「20:int」を返します。(結果とデータ型の両方が返されます。)

Lispと同様に、MLはリストを処理するように調整されています。Lispとは異なり、各要素は同じデータ型です。[86]

プロローグ

Prolog(1972)は、「PROgramminginLOgic」の略です。自然言語を処理するように設計されています[87] Prologプログラムの構成要素は、オブジェクトと他のオブジェクトとの関係です。オブジェクトは、それらについての本当の事実を述べることによって構築されます。[88]

集合論 の事実は、オブジェクトを集合に割り当てることによって形成されます。構文はsetName(object).

  • 猫は動物です。
animal(cat).
  • マウスは動物です。
animal(mouse).
  • トムは猫です。
cat(tom).
  • ジェリーはネズミです。
mouse(jerry).

形容詞 の事実は、adjective(object).

  • 猫は大きいです。
big(cat).
  • マウスは小さいです。
small(mouse).

関係は、括弧内の複数の項目を使用して形成されます。この例では、とがverb(object,object)ありverb(adjective,adjective)ます。

  • マウスはチーズを食べます。
eat(mouse,cheese).
  • 大きな動物は小さな動物を食べます。
eat(big,small).

すべての事実と関係が入力された後、質問をすることができます:

トムはジェリーを食べますか?
?- eat(tom,jerry).

Prologの使用法は、目標指向の言語に拡大しました。[89]目標指向のアプリケーションでは、目標はサブ目標のリストを提供することによって定義されます。次に、各サブゴールは、そのサブゴールのリストなどをさらに提供することによって定義されます。サブゴールのパスが解決策を見つけられない場合、そのサブゴールはバックトラックされ、別のパスが体系的に試行されます。[88]実用的なアプリケーションには、最短経路問題[87]の解決と、家系図の作成が含まれます。[90]

プログラムモジュール

モジュラープログラミングは、ソフトウェアの老朽化を緩和するために命令型言語プログラムを改良する手法です。プログラムモジュールは、ブロック内でバインドされ、名前で一緒に識別される一連のステートメントです。[91]モジュールには、関数コンテキスト、およびロジックがあります:[92]

  • モジュール機能はそれが行うことです。
  • モジュールのコンテキストは、実行される要素です。
  • モジュールのロジックは、モジュールが機能を実行する方法です。

モジュールの名前は、最初にその関数によって、次にそのコンテキストによって派生する必要があります。そのロジックは名前の一部であってはなりません。[92]たとえば、function compute_square_root( x )またはfunction compute_square_root_integer( i : integer )は適切なモジュール名です。ただし、そうでfunction compute_square_root_by_division( x )はありません。

モジュールの相互作用の程度は、その凝集度です。[92] 凝集度は、モジュールの名前とその機能の間の関係の判断ですモジュールの相互作用の程度は、結合のレベルです。[93] 結合は、モジュールのコンテキストと実行される要素と の間の関係の判断です。

結束

最悪から最高までの結束のレベルは次のとおりです。[94]

  • 偶発的凝集度:モジュールが複数の機能を実行する場合、モジュールは偶発的凝集度を持ち、機能は完全に無関係です。たとえば、function read_sales_record_print_next_line_convert_to_float()経営陣が愚かな規則を施行した場合、偶然の結束が実際に発生します。たとえば、「すべてのモジュールには35〜50の実行可能ステートメントがあります。」[94]
  • 論理的凝集度:一連の関数を使用できる場合、モジュールには論理的凝集度がありますが、実行されるのはそのうちの1つだけです。たとえば、function perform_arithmetic( perform_addition )
  • 時間的凝集度:モジュールが時間に関連する機能を実行する場合、モジュールは時間的凝集度を持ちます。一例、function initialize_variables_and_open_files()別の例stage_one()、、、stage_two()..。
  • 手続き型の凝集度:モジュールが複数の機能を実行する場合、モジュールは手続き型の凝集度を持ちますが、関連性は緩いだけです。たとえば、function read_part_number_update_employee_record()
  • コミュニケーションの凝集度:モジュールが複数の機能を実行する場合、モジュールはコミュニケーションの凝集度を持ちますが、密接に関連しています。たとえば、function read_part_number_update_sales_record()
  • 情報の凝集度:モジュールが複数の機能を実行する場合、モジュールには情報の凝集度がありますが、各関数には独自の入口点と出口点があります。さらに、関数は同じデータ構造を共有します。オブジェクト指向クラスはこのレベルで機能します。
  • 機能的凝集度:モジュールがローカル変数のみで機能する単一の目標を達成する場合、モジュールは機能的凝集度を持ちます。さらに、他のコンテキストで再利用できる場合があります。

カップリング

最悪から最高への結合のレベルは次のとおりです。[93]

  • コンテンツ結合:モジュールが別の関数のローカル変数を変更する場合、モジュールにはコンテンツ結合があります。COBOLは、alter動詞を使用してこれを行うために使用されていました。
  • 共通結合:モジュールがグローバル変数を変更する場合、モジュールには共通結合があります。
  • 制御結合:別のモジュールがその制御フローを変更できる場合、モジュールには制御結合があります。たとえば、perform_arithmetic( perform_addition )代わりに、返されたオブジェクトの構成を制御する必要があります。
  • スタンプ結合:パラメーターとして渡されたデータ構造の要素が変更された場合、モジュールにはスタンプ結合があります。オブジェクト指向クラスはこのレベルで機能します。
  • データ結合:モジュールのすべての入力パラメーターが必要であり、それらのいずれも変更されていない場合、モジュールにはデータ結合があります。さらに、関数の結果は単一のオブジェクトとして返されます。

データフロー分析

サンプルの関数レベルのデータフロー図。

データフロー分析は、機能的凝集度データ結合のモジュールを実現するために使用される設計手法です。[95]メソッドへの入力はデータフロー図です。データフロー図は、モジュールを表す楕円のセットです。各モジュールの名前は、その楕円の中に表示されます。モジュールは、実行可能レベルまたは機能レベルの場合があります。

この図には、モジュールを相互に接続する矢印もあります。モジュールを指す矢印は、一連の入力を表します。各モジュールには、単一の出力オブジェクトを表すために、モジュールから指す矢印が1つだけある必要があります。(オプションで、追加の例外矢印が示されます。)楕円のデイジーチェーンは、アルゴリズム全体を伝達します。入力モジュールは図を開始する必要があります。入力モジュールは、変換モジュールに接続する必要があります。変換モジュールは出力モジュールに接続する必要があります。[96]

オブジェクト指向プログラミング

オブジェクト指向プログラミングは、オブジェクト指向言語に限定される必要はありません[97] オブジェクト指向プログラミングは、オブジェクトに対して操作実行しています[69]オブジェクト指向言語では、クラスはオブジェクトです。非オブジェクト指向言語では、データ構造(レコードとも呼ばれます)もオブジェクトである可能性があります。データ構造をオブジェクトに変換するには、その構造専用の操作を作成する必要があります。結果の構造は抽象データ型と呼ばれます。[98]ただし、継承は失われます。それにもかかわらず、この欠点は克服することができます。

単純な学校のアプリケーションで GRADE抽象データ型Cプログラミング言語 ヘッダーファイルは次のとおりです。

/ * grade.h * /
/ * ------- * /

/ *複数のソースファイルに含めることができるようにするために使用されます* /
/ *複製エラーのないこのヘッダーファイル。* /
/ * ---------------------------------------------- * /
#ifndef GRADE_H 
#define GRADE_H

typedef struct { 

    文字; _ 
}グレード; 

/ *コンストラクター* /
/ * ----------- * /
GRADE * grade_new char文字);    

int grade_numeric char文字);    
#endif

この関数は、C ++コンストラクターgrade_new()操作と同じアルゴリズムを実行します。

単純な学校のアプリケーションで のGRADE抽象データ型のCプログラミング言語ソースファイルは次のとおりです。

/ * grade.c * /
/ * ------- * /
#include "grade.h" 

GRADE * grade_new char文字    
{{
    グレード*グレード; 

    / *ヒープメモリを割り当てます* /
    / * -------------------- * /
    if grade = calloc 1 sizeof GRADE              
    {{
        fprintf stderr 
                "%s /%s /%dのエラー:calloc()が空を返しました。\ n " 
                __FILE__ 
                __FUNCTION__ 
                __LINE__ ); 
        終了1 );  
    }

    グレード->文字=文字;  
    リターングレード; 
}

int grade_numeric char文字    
{{
    if 文字== 'A' ||文字== 'a'            
        4を返す; 
    そうしないと
    if 文字== 'B' ||文字== 'b'            
        3を返します; 
    そうしないと
    if letter == 'C' || letter == 'c'            
        2を返します; 
    そうしないと
    if 文字== 'D' ||文字== 'd'            
        1を返します; 
    そうしないと
    if 文字== 'F' ||文字== 'f'            
        0を返す; 
    そうしないと
        -1を返します; 
}

コンストラクターでは、各メモリセルがゼロに設定されるため、 calloc()代わりに関数が使用されます。malloc()

単純な学校のアプリケーションで PERSON抽象データ型のCプログラミング言語ヘッダーファイルは次のとおりです。

/ * person.h * /
/ * -------- * /
#ifndef PERSON_H 
#define PERSON_H

typedef struct { 

    char * name ; 
}; 

/ *コンストラクター* /
/ * ----------- * /
PERSON * person_new char * name );    
#endif

単純な学校のアプリケーションで のPERSON抽象データ型のCプログラミング言語のソースコードは次のとおりです。

/ * person.c * /
/ * -------- * /
#include "person.h" 

PERSON * person_new char * name     
{{
    PERSON *; 

    if person = calloc 1 sizeof PERSON              
    {{
        fprintf stderr 
                "%s /%s /%dのエラー:calloc()が空を返しました。\ n " 
                __FILE__ 
                __FUNCTION__ 
                __LINE__ ); 
        終了1 );  
    }

    ->名前=名前;  
    帰国; 
}

簡単な学校のアプリケーションで STUDENT抽象データ型のCプログラミング言語ヘッダーファイルは次のとおりです。

/ * student.h * /
/ * --------- * /
#ifndef STUDENT_H 
#define STUDENT_H

#include "person.h" 
#include "grade.h" 

typedef struct { 

    / * STUDENTはPERSONのサブセットです。* /
    / * -------------------------------- * /
    PERSON *; 

    グレード*グレード; 
}学生; 

/ *コンストラクター* /
/ * ----------- * /
STUDENT * student_new char * name );    
#endif

簡単な学校のアプリケーションで のSTUDENT抽象データ型のCプログラミング言語のソースコードは次のとおりです。

/ * student.c * /
/ * --------- * /
#include "student.h" 
#include "person.h" 

STUDENT * student_new char * name     
{{
    学生*学生; 

    if student = calloc 1 sizeof STUDENT              
    {{
        fprintf stderr 
                "%s /%s /%dのエラー:calloc()が空を返しました。\ n " 
                __FILE__ 
                __FUNCTION__ 
                __LINE__ ); 
        終了1 );  
    }

    / * PERSONスーパークラスのコンストラクターを実行します。* /
    / * ------------------------------------------------ -* /
    学生->= person_new 名前);    
    帰国; 
}

デモンストレーション用のドライバープログラムは次のとおりです。

/ * student_dvr.c * /
/ * ------------- * /
#include <stdio.h> 
#include "student.h" 

int main void    
{{
    STUDENT * student = student_new "The Student" );     
    学生->成績= grade_new 'a' );    

    printf "%s:数値グレード=%d \ n "  
            / *サブセットは存在しますが、継承は存在しません。* /
            学生->->名前
            / *関数型プログラミングは関数ジャストインタイム(JIT)を実行しています* /
            grade_numeric 学生->成績->手紙);   

	0を返す; 
}

これがすべてをコンパイルするため makefileです:

#makefile #
--------
すべて student_dvr

きれい
    rm student_dvr * .o

student_dvr  student_dvrc グレードo 学生o o
    gcc student_dvr.c grade.o student.o person.o -o student_dvr

grade.o  gradec グレードh
    gcc -c grade.c

student.o  学生c 学生h
    gcc -cstudent.c

person.o  c h
    gcc -c person.c

オブジェクト指向オブジェクトを構築するための正式な戦略は次のとおりです。[99]

  • オブジェクトを特定します。ほとんどの場合、これらは名詞になります。
  • 各オブジェクトの属性を特定します。オブジェクトを説明するのに何が役立ちますか?
  • 各オブジェクトのアクションを識別します。ほとんどの場合、これらは動詞になります。
  • オブジェクト間の関係を特定します。ほとんどの場合、これらは動詞になります。

例えば:

  • 人は名前で識別される人間です。
  • 成績は、文字で識別される成果です。
  • 学生とは、成績をとる人のことです。

機能カテゴリ

ユーザーアプリケーションソフトウェアを操作することを示す図アプリケーションソフトウェアは、ハードウェアと相互作用するオペレーティングシステムと相互作用します

コンピュータプログラムは、機能ラインに沿って分類することができます。主な機能カテゴリは、アプリケーションソフトウェアシステムソフトウェアです。システムソフトウェアには、コンピュータハードウェアとアプリケーションソフトウェアを結合するオペレーティングシステムが含まれます。[100]オペレーティングシステムの目的は、アプリケーションソフトウェアが便利で効率的な方法で実行される環境を提供することです。[100]オペレーティングシステムに加えて、システムソフトウェアには、組み込みプログラムブートプログラム、およびマイクロプログラムが含まれます。エンドユーザー向けに設計されたアプリケーションソフトウェアには、ユーザーインターフェイスがありますエンドユーザー向けに設計されていないアプリケーションソフトウェアには、あるアプリケーションを別のアプリケーションに結合するミドルウェアが含まれます。システムソフトウェアとアプリケーションソフトウェアの両方がユーティリティプログラムを実行します。

アプリケーションソフトウェア

アプリケーションソフトウェアは、コンピュータシステムの可能性を解き放つための鍵です。[101] エンタープライズアプリケーションソフトウェアは、経理、人事、顧客、およびベンダーのアプリケーションをバンドルしています。例としては、エンタープライズリソースプランニング顧客関係管理サプライチェーン管理ソフトウェアなどがあります。

エンタープライズアプリケーションは、独自のプロプライエタリソフトウェアとして社内で開発される場合があります[101]あるいは、既製のソフトウェアとして購入することもできます購入したソフトウェアは、カスタムソフトウェアを提供するように変更される場合があります。アプリケーションがカスタマイズされている場合は、会社のリソースが使用されるか、リソースが外部委託されます。アウトソーシングされたソフトウェア開発は、元のソフトウェアベンダーまたはサードパーティの開発者からのものである可能性があります。[101]

プロプライエタリソフトウェアの利点は機能であり、レポートは仕様どおりである可能性があります。[102]管理者も開発プロセスに関与し、一定レベルの管理を提供する場合があります。経営陣は、競合他社の新しいイニシアチブに対抗するか、顧客またはベンダーの要件を実装することを決定する場合があります。合併や買収には、エンタープライズソフトウェアの変更が必要になります。[102]プロプライエタリソフトウェアの欠点は、時間とリソースのコストが膨大になる可能性があることです。[102]さらに、機能とパフォーマンスに関するリスクが迫っている可能性があります。

既製のソフトウェアの利点は、識別可能な初期費用、基本的なニーズを満たす必要があること、およびそのパフォーマンスと信頼性に実績があることです。[102]既製のソフトウェアの欠点は、エンドユーザーを混乱させる不要な機能があり、企業が必要とする機能が不足している可能性があり、データフローが企業のワークプロセスと一致しない可能性があることです。[102]

カスタマイズされたエンタープライズアプリケーションを経済的に入手するための1つのアプローチは、アプリケーションサービスプロバイダーを介することです。[103]専門会社は、ハードウェア、カスタムソフトウェア、およびエンドユーザーサポートを提供します。彼らは熟練した情報システムスタッフを持っているので、新しいアプリケーションの開発をスピードアップするかもしれません。最大の利点は、社内のリソースを複雑なコンピュータープロジェクトの人員配置や管理から解放できることです。[103]多くのアプリケーションサービスプロバイダーは、情報システムリソースが限られている小規模で急成長している企業をターゲットにしています。[103]一方、主要なシステムを備えた大企業は、技術インフラストラクチャを整備している可能性があります。1つのリスクは、機密情報を持つ外部組織を信頼しなければならないことです。もう1つのリスクは、プロバイダーのインフラストラクチャの信頼性を信頼する必要があることです。[103]

オペレーティングシステム

オペレーティングシステムは、タスクのスケジューリングや周辺機器の制御など、コンピュータの基本機能をサポートする低レベルのソフトウェアです[100]

1950年代には、オペレーターでもあるプログラマーがプログラムを作成して実行していました。プログラムの実行が終了した後、出力が印刷されたか、後で処理するために紙テープまたはカードにパンチされた可能性があります。[27]多くの場合、プログラムは機能しませんでした。次に、プログラマーはコンソールライトを見て、コンソールスイッチをいじりました。運が悪ければ、さらなる研究のためにメモリのプリントアウトが行われました。1960年代、プログラマーはオペレーターの仕事を自動化することで無駄な時間を削減しました。オペレーティングシステムと呼ばれるプログラムが常にコンピュータに保存されていました。[104]

オペレーティングシステムという用語は、2つのレベルのソフトウェアを指す場合があります。[105]オペレーティングシステムは、プロセスメモリ、およびデバイスを管理するカーネルプログラムを参照する場合があります。より広義には、オペレーティングシステムは中央ソフトウェアのパッケージ全体を指す場合があります。パッケージには、カーネルプログラム、コマンドラインインタープリターグラフィカルユーザーインターフェイスユーティリティプログラム、およびエディターが含まれています。[105]

カーネルプログラム

カーネルは、アプリケーションソフトウェアをコンピューターのハードウェアに接続します。

カーネルの主な目的は、コンピューターの限られたリソースを管理することです。

物理メモリはRAMとハードディスクの周りに散らばっています。仮想メモリは1つの連続したブロックです。
  • カーネルプログラムはメモリ管理を実行する必要があります。
  • カーネルが最初に実行可能ファイルをメモリにロードするとき、カーネルはアドレス空間を論理的に領域に分割します[107]カーネルは、マスターリージョンテーブルと多くのプロセスリージョンごと(pregion)テーブルを維持します—実行中のプロセスごとに1つ。[107]これらのテーブルは仮想アドレス空間を構成します。master-regionテーブルは、その内容が物理メモリのどこにあるかを判別するために使用されます。pregionテーブルを使用すると、各プロセスに独自のプログラム(テキスト)pregion、データpregion、およびスタックpregionを含めることができます。プログラムpregionは、マシン命令を格納します。マシン命令は変更されないため、プログラムpregionは、同じ実行可能ファイルの多くのプロセス(インスタンス)で共有される場合があります。[107]カーネルは、仮想アドレスを物理アドレスに変換する役割を果たしますカーネルはメモリコントローラにデータを要求し、代わりにページフォールトを受け取る場合があります。[108]その場合、カーネルはメモリ管理ユニットにアクセスして、物理データ領域にデータを入力し、アドレスを変換します。[109]
  • 時間とメモリを節約するために、カーネルは実行ファイル全体ではなく、ディスクドライブから実行命令のブロックのみをロードする場合があります。[106]
  • カーネルは、プロセスからの要求に応じてヒープからメモリを割り当てます。[110]プロセスがメモリを使用して終了すると、プロセスはメモリの解放を要求する場合があります。割り当てられたすべてのメモリの解放を要求せずにプロセスが終了した場合、カーネルはガベージコレクションを実行してメモリを解放します。
  • カーネルは、プロセスが自身のメモリにのみアクセスし、カーネルや他のプロセスのメモリにはアクセスしないことも保証します。[106]
  • カーネルプログラムはファイルシステム管理を実行する必要があります。[106]カーネルには、ファイルを作成、取得、更新、および削除するための命令があります。
  • カーネルプログラムはデバイス管理を実行する必要があります。[106]カーネルは、マウス、キーボード、ディスクドライブ、プリンター、およびその他のデバイスへのインターフェイスを標準化および簡素化するためのプログラムを提供します。さらに、2つのプロセスが同時にデバイスを要求した場合、カーネルはデバイスへのアクセスを調停する必要があります。
  • カーネルプログラムはネットワーク管理を実行する必要があります。[111]カーネルは、プロセスに代わってパケットを送受信します。重要なサービスの1つは、ターゲットシステムへの効率的なルートを見つけることです。
  • カーネルプログラムは、プログラマーが使用できるシステムレベルの関数を提供する必要があります。[112]
    • プログラマーは、比較的単純なインターフェースを介してファイルにアクセスし、次に、比較的複雑な低レベルI / Oインターフェースを実行します。低レベルのインターフェイスには、ファイルの作成、ファイル記述子、ファイルの検索、物理的な読み取り、および物理的な書き込みが含まれます。
    • プログラマーは、比較的単純なインターフェースを介してプロセスを作成し、次に、比較的複雑な低レベルのインターフェースを実行します。
    • プログラマーは、比較的単純なインターフェースを介して日付/時刻演算を実行し、次に、比較的複雑な低レベルの時刻インターフェースを実行します。[113]
  • カーネルプログラムは、実行中のプロセス間の通信チャネルを提供する必要があります。[114]大規模なソフトウェアシステムの場合、システムをより小さなプロセスに設計することが望ましい場合があります。プロセスは、信号を送受信することによって相互に通信することができます

もともと、オペレーティングシステムはアセンブリでプログラムされていました。ただし、最新のオペレーティングシステムは通常、 CC ++Objective-CSwiftなどの高級言語で記述されています

割り込み

割り込みにより、中央処理装置(CPU)は、現在実行中のプロセスから制御フローを変更します。[115]入出力(I / O)デバイスは、CPUのクロック信号よりも低速です。したがって、CPUが各I / Oの終了を待たなければならない場合、コンピューターの速度が低下します。代わりに、コンピュータはダイレクトメモリアクセス(DMA)I / Oを実装する場合があります。[116]

ダイレクトメモリアクセスチップ[117]を備えたコンピュータの コンピュータプログラムがシステムコールを実行してDMAI / O書き込み操作を実行する場合、システムコールは次の命令を実行します。

書き込みが行われている間、オペレーティングシステムは通常どおり他のプロセスにコンテキストスイッチします。デバイスが書き込みを終了すると、デバイスは割り込み要求をアサートすることにより、現在実行中のプロセスを中断します。デバイスは、デバイスのデータバスにも整数を配置します[120]割り込み要求を受け入れると、CPUは次のことを行います。

オペレーティングシステムは次のようになります。

  • デバイスステータステーブルにアクセスします。
  • プロセス制御ブロックを抽出します。
  • 書き込みプロセスに戻るコンテキストスイッチを実行します。

書き込みプロセスのタイムスライスが期限切れになると、CPUは次のことを行います。

  • コールスタックからプログラムステータスワードをポップし、レジスタに戻します。
  • コールスタックから、中断されたプロセスの次の命令のアドレスをポップし、プログラムカウンターに戻します。

中断されたプロセスは、タイムスライスを再開します。[121]

ユーティリティプログラム

ユーティリティプログラムは、システム管理とソフトウェアの実行を支援するように設計されていますオペレーティングシステムは、ハードウェアユーティリティプログラムを実行して、ディスクドライブ、メモリ、スピーカー、およびプリンタのステータスを確認します。[122]ユーティリティプログラムは、混雑したディスク上のファイルの配置を最適化する場合があります。システムユーティリティプログラムは、ハードウェアとネットワークのパフォーマンスを監視します。メトリックが許容範囲外の場合、トリガーアラートが生成されます。[123]

ユーティリティプログラムには圧縮プログラムが含まれているため、データファイルはより少ないディスク容量で保存されます。[122]圧縮されたプログラムは、データファイルがネットワークを介して送信されるときにも時間を節約します。[122]ユーティリティプログラムは、データセットをソートおよびマージできます。[123]ユーティリティプログラムはコンピュータウイルスを検出します。

ブートプログラム

ストアドプログラムコンピュータを起動するには、読み取り専用メモリ格納されている初期ブートプログラムが必要です。プロセッサレジスタからデバイスコントローラメモリの内容まで、システムのすべての側面を識別して初期化する必要があります。[124]初期化プロセスに続いて、ブートプログラムはオペレーティングシステムをロードし、通常の操作を開始するよう にプログラムカウンタを設定します。

組み込みプログラム

このUSBフラッシュドライブの右側にあるマイクロコントローラーは、組み込みファームウェアで制御されます。

ホストコンピューターとは関係なく、ハードウェアデバイスには、その動作を制御するためのファームウェアが組み込まれている場合があります。ファームウェアは、コンピュータプログラムがほとんどまたはまったく変更されない場合、または電源がオフのときに失われてはならない場合に使用されます。[104]

より大規模な場合、組み込みマイクロコントローラーは、より大規模なシステムの一部を制御するために使用されます。[68]例には、航空機のコンポーネントや生命維持システムが含まれます。これらのシステムで実行されるアプリケーションは大きく複雑です。さらに、それらはリアルタイムで実行され、堅牢である必要があります[68]米国国防総省は、 CII Honeywell Bullと契約して、リアルタイムプログラミング言語としてAda (1983)を開発しました。[125]

リアルタイムシステムの中心となるのは、並列処理を可能にするタスク機能です。割り込み制御も重要です。[125]

マイクロコードプログラム

ゲートではありません。
NANDゲート。
NORゲート。
ANDゲート。
ORゲート。

マイクロコードプログラムは、ソフトウェア駆動型コンピューターのデータパスを制御する最下位レベルのインタープリターです。[126] (ハードウェアの 進歩により、これらの操作はハードウェア実行回路に移行しました。)[126]マイクロコード命令により、プログラマーはコンピューターの実際のハードウェアであるデジタル論理レベル[127]をより簡単に実装できます。デジタル論理レベルは、コンピュータサイエンスコンピュータエンジニアリングの境界です。[128]

論理ゲートは、オンまたはオフの2つの信号のいずれかを返すことができる小さなトランジスタです。[129]

  • トランジスタが1つあると、NOTゲートが形成されます。
  • 2つのトランジスタを直列に接続すると、NANDゲートが形成されます。
  • 2つのトランジスタを並列に接続すると、NORゲートが形成されます。
  • NOTゲートをNANDゲートに接続すると、ANDゲートが形成されます。
  • NOTゲートをNORゲートに接続すると、ORゲートが形成されます。

これらの5つのゲートは、コンピューターのデジタル論理関数である 2進代数の構成要素を形成します。

マイクロコード命令は、プログラマーがバイナリ代数で形成する代わりにデジタル論理関数を実行するために使用できるニーモニックです。これらは、中央処理装置(CPU)の制御ストアに保管されます。[130] これらのハードウェアレベルの命令は、データパス全体でデータを移動します。

マイクロコード命令は、CPUのレジスタ間およびマザーボード全体にデータを移動しますマイクロ命令サイクルは、マイクロシーケンサーがマイクロプログラムカウンターを使用して、ランダムアクセスメモリから次のマシン命令をフェッチするときに始まります。[131]次のステップは、ハードウェアモジュールへの適切な出力ラインを選択することによって機械命令をデコードすることです。[132] 最後のステップは、ハードウェアモジュールのゲートセットを使用して命令を 実行することです。

ALUのシンボリック表現。

算術演算を実行するための命令は、算術論理演算装置(ALU)を介して渡されます。[133] ALUには、整数を加算、シフト、および比較するための基本演算を実行する回路があります。ALUを介して基本操作を組み合わせてループすることにより、CPUは複雑な演算を実行します。

マイクロコード命令は、CPUとメモリコントローラ間でデータを移動します。メモリコントローラのマイクロコード命令は、2つのレジスタを操作します。メモリアドレスレジスタは、各メモリセルのアドレスにアクセスするために使用されます。メモリデータレジスタは、各セルの内容を設定および読み取るために使用されます。[134]

マイクロコード命令は、CPUと多くのコンピュータバスの間でデータを移動します。ディスクコントローラバスは、ハードディスクドライブへの書き込みとハードディスクドライブからの読み取りを行いますデータは、ペリフェラルコンポーネントインターコネクトエクスプレスバスを介してCPUと他の機能ユニット間でも移動されます。[135]

も参照してください

参考文献

  1. ^ 「無料の辞書:コンピュータプログラム」Farlex 2021年11月14日取得
  2. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。7. ISBN 0-201-71012-9
  3. ^ シルバーシャッツ、アブラハム(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。98. ISBN 978-0-201-50480-4
  4. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 32ISBN 978-0-13-854662-5
  5. ^ a b マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 16ISBN 978-0-8027-1348-3
  6. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 14ISBN 978-0-13-854662-5
  7. ^ Bromley、Allan G.(1998)。「チャールズバベッジの分析エンジン、1838年」(PDF)コンピューティングの歴史のIEEE年報20(4):29–45。土井10.1109 /85.728228S2CID2285332_  
  8. ^ a b c タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 15ISBN 978-0-13-854662-5
  9. ^ J。フエギ; J.フランシス(2003年10月〜12月)、「ラブレース&バベッジと1843年の「ノート」の作成"、コンピューティングの歴史の年報25(4):16、19、25、doi10.1109 / MAHC.2003.1253887
  10. ^ ローゼン、ケネスH.(1991)。離散数学とその応用McGraw-Hill、Inc.p。 654ISBN 978-0-07-053744-6
  11. ^ リンツ、ピーター(1990)。形式言語とオートマタの紹介DCヒースアンドカンパニー。p。234. ISBN 978-0-669-17342-0
  12. ^ a b cd 「ドイツの コンピューター アメリカ情報処理学会2021年11月26日取得
  13. ^ a b "IBM Archives-Mark IDescription"国際ビジネスマシン。2003年1月23日2022年1月1日取得
  14. ^ 「IBMアーカイブ-MarkI仕様」国際ビジネスマシン。2003年1月23日2022年1月1日取得
  15. ^ 「IBMアーカイブ-MarkI仕様」国際ビジネスマシン。2003年1月23日2022年1月1日取得
  16. ^ a b c マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 102ISBN 978-0-8027-1348-3
  17. ^ マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 94ISBN 978-0-8027-1348-3
  18. ^ マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 107ISBN 978-0-8027-1348-3
  19. ^ マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 120ISBN 978-0-8027-1348-3
  20. ^ a b マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 118ISBN 978-0-8027-1348-3
  21. ^ マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 119ISBN 978-0-8027-1348-3
  22. ^ マッカートニー、スコット(1999)。ENIAC –世界初のコンピューターの勝利と悲劇ウォーカーアンドカンパニー。p。 123ISBN 978-0-8027-1348-3
  23. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 20ISBN 978-0-13-854662-5
  24. ^ a b タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 21ISBN 978-0-13-854662-5
  25. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。27. ISBN 0-201-71012-9
  26. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。29. ISBN 0-201-71012-9
  27. ^ a b c Silberschatz、Abraham(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。6. ISBN 978-0-201-50480-4
  28. ^ a b c d e f g h i "Bill Pentz —ちょっとした背景:戦後のVLSIへの行進"Digibarnコンピューター博物館。2008年8月2022年1月31日取得
  29. ^ a b 「デジタル時代へ:研究所、新興企業、そしてMOSの台頭」ジョンホプキンス大学プレス。2002 2022年2月3日取得
  30. ^ 「マイクロエレクトロニクスおよび太陽光発電用のシリコン材料の製造」サンディア国立研究所。2017 2022年2月8日取得
  31. ^ 「ベースウェーハを作るICの製造」ブリタニカ2022年2月8日取得
  32. ^ 「NMOSおよびPMOSトランジスタの紹介」Anysilicon 2022年2月5日取得
  33. ^ 「チップホールオブフェイム:Intel4004マイクロプロセッサ」電気電子技術者協会。2018年7月2日2022年1月31日取得
  34. ^ 「360革命」(PDF)父、息子&Co。1990 2022年2月5日取得
  35. ^ ab 「世界で長く失われた最初のマイクロコンピューター 内部」c / net。2010年1月8日2022年1月31日取得
  36. ^ 「ビルゲイツ、マイクロソフトおよびIBMパーソナルコンピュータ」InfoWorld。1982年8月23日2022年2月1日取得
  37. ^ a b c 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。507. ISBN 0-619-06489-7
  38. ^ a b 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。159. ISBN 0-619-06489-7
  39. ^ a b Linz、Peter(1990)。形式言語とオートマタの紹介DCヒースアンドカンパニー。p。2. ISBN 978-0-669-17342-0
  40. ^ ワイス、マークアレン(1994)。C ++でのデータ構造とアルゴリズム分析ベンジャミン/カミングス出版社p。29. ISBN 0-8053-5443-3
  41. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 17ISBN 978-0-13-854662-5
  42. ^ a b c d e f g Stair、Ralph M.(2003)。情報システムの原則、第6版トムソン。p。160. ISBN 0-619-06489-7
  43. ^ a b c タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 399ISBN 978-0-13-854662-5
  44. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 400ISBN 978-0-13-854662-5
  45. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 398ISBN 978-0-13-854662-5
  46. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。26. ISBN 0-201-71012-9
  47. ^ a b c d Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。37. ISBN 0-201-71012-9
  48. ^ 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。161. ISBN 0-619-06489-7
  49. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。321. ISBN 0-201-71012-9
  50. ^ Wilson、Leslie B.(1993)。比較プログラミング言語、第2版アディソン-ウェスリー。p。75. ISBN 978-0-201-56885-1
  51. ^ Stroustrup、Bjarne(2013)。C ++プログラミング言語、第4版アディソン-ウェスリー。p。40. ISBN 978-0-321-56384-2
  52. ^ a b c Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。16. ISBN 0-201-71012-9
  53. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。24. ISBN 0-201-71012-9
  54. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。25. ISBN 0-201-71012-9
  55. ^ a b c d Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。19. ISBN 0-201-71012-9
  56. ^ a b c d e Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。30. ISBN 0-201-71012-9
  57. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。31. ISBN 0-201-71012-9
  58. ^ a b cd 「Cプログラムのメモリ レイアウト 2011年9月12日。
  59. ^ a b Kernighan、Brian W。; リッチー、デニスM.(1988)。Cプログラミング言語第2版プレンティスホール。p。31. ISBN 0-13-110362-8
  60. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。128. ISBN 0-201-71012-9
  61. ^ a b c ケリスク、マイケル(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。121. ISBN 978-1-59327-220-3
  62. ^ ケリスク、マイケル(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。122. ISBN 978-1-59327-220-3
  63. ^ Kernighan、Brian W。; リッチー、デニスM.(1988)。Cプログラミング言語第2版プレンティスホール。p。185. ISBN 0-13-110362-8
  64. ^ Kernighan、Brian W。; リッチー、デニスM.(1988)。Cプログラミング言語第2版プレンティスホール。p。187. ISBN 0-13-110362-8
  65. ^ a b c Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。38. ISBN 0-201-71012-9
  66. ^ Stroustrup、Bjarne(2013)。C ++プログラミング言語、第4版アディソン-ウェスリー。p。65. ISBN 978-0-321-56384-2
  67. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。193. ISBN 0-201-71012-9
  68. ^ a b c Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。39. ISBN 0-201-71012-9
  69. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。35. ISBN 0-201-71012-9
  70. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。192. ISBN 0-201-71012-9
  71. ^ Stroustrup、Bjarne(2013)。C ++プログラミング言語、第4版アディソン-ウェスリー。p。22. ISBN 978-0-321-56384-2
  72. ^ Stroustrup、Bjarne(2013)。C ++プログラミング言語、第4版アディソン-ウェスリー。p。21. ISBN 978-0-321-56384-2
  73. ^ Stroustrup、Bjarne(2013)。C ++プログラミング言語、第4版アディソン-ウェスリー。p。49. ISBN 978-0-321-56384-2
  74. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。218. ISBN 0-201-71012-9
  75. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。217. ISBN 0-201-71012-9
  76. ^ ワイス、マークアレン(1994)。C ++でのデータ構造とアルゴリズム分析ベンジャミン/カミングス出版社p。103. ISBN 0-8053-5443-3
  77. ^ a b c Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。230. ISBN 0-201-71012-9
  78. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。240. ISBN 0-201-71012-9
  79. ^ a b c Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。241. ISBN 0-201-71012-9
  80. ^ ジョーンズ、ロビン; メイナード、クライヴ; スチュワート、イアン(2012年12月6日)。Lispプログラミングの芸術シュプリンガーサイエンス&ビジネスメディア。p。2. ISBN 9781447117193
  81. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。220. ISBN 0-201-71012-9
  82. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。221. ISBN 0-201-71012-9
  83. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。229. ISBN 0-201-71012-9
  84. ^ ゴードン、マイケルJC(1996)。「LCFからHOLへ:短い歴史」2021-10-30を取得しました。
  85. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。233. ISBN 0-201-71012-9
  86. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。235. ISBN 0-201-71012-9
  87. ^ a b 「プロローグの誕生」(PDF)1992年11月。
  88. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。246. ISBN 0-201-71012-9
  89. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。245. ISBN 0-201-71012-9
  90. ^ Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。247. ISBN 0-201-71012-9
  91. ^ Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。216. ISBN 0-256-08515-3
  92. ^ a b c Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。219. ISBN 0-256-08515-3
  93. ^ a b Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。226. ISBN 0-256-08515-3
  94. ^ a b Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。220. ISBN 0-256-08515-3
  95. ^ Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。258. ISBN 0-256-08515-3
  96. ^ Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。259. ISBN 0-256-08515-3
  97. ^ Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。284. ISBN 0-256-08515-3
  98. ^ ワイス、マークアレン(1994)。C ++でのデータ構造とアルゴリズム分析ベンジャミン/カミングス出版社p。57. ISBN 0-8053-5443-3
  99. ^ Schach、Stephen R.(1990)。ソフトウェア工学Aksen AssociatesIncorporatedPublishers。p。285. ISBN 0-256-08515-3
  100. ^ a b c Silberschatz、Abraham(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。1.ISBN _ 978-0-201-50480-4
  101. ^ a b c 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。147. ISBN 0-619-06489-7
  102. ^ a b c d e 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。148. ISBN 0-619-06489-7
  103. ^ a b c d 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。149. ISBN 0-619-06489-7
  104. ^ a b タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 11ISBN 978-0-13-854662-5
  105. ^ a b ケリスク、マイケル(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。21. ISBN 978-1-59327-220-3
  106. ^ a b c d e Kerrisk、Michael(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。22. ISBN 978-1-59327-220-3
  107. ^ a b c バッハ、モーリスJ.(1986)。UNIXオペレーティングシステムの設計Prentice-Hall、Inc.p。152. ISBN 0-13-201799-7
  108. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。443. ISBN 978-0-13-291652-3
  109. ^ Lacamera、Daniele(2018)。組み込みシステムアーキテクチャパック。p。8. ISBN 978-1-78883-250-2
  110. ^ Kernighan、Brian W。; リッチー、デニスM.(1988)。Cプログラミング言語第2版プレンティスホール。p。187. ISBN 0-13-110362-8
  111. ^ ケリスク、マイケル(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。23. ISBN 978-1-59327-220-3
  112. ^ Kernighan、Brian W.(1984)。Unixプログラミング環境プレンティスホール。p。201. ISBN 0-13-937699-2
  113. ^ ケリスク、マイケル(2010)。Linuxプログラミングインターフェイススターチプレスはありません。p。187. ISBN 978-1-59327-220-3
  114. ^ Haviland、Keith(1987)。Unixシステムプログラミングアディソン-ウェスリー出版社。p。121. ISBN 0-201-12919-1
  115. ^ a b タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 308ISBN 978-0-13-854662-5
  116. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 292ISBN 978-0-13-854662-5
  117. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 294ISBN 978-0-13-854662-5
  118. ^ シルバーシャッツ、アブラハム(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。34. ISBN 978-0-201-50480-4
  119. ^ a b タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 295ISBN 978-0-13-854662-5
  120. ^ タネンバウム、アンドリューS.(1990)。構造化されたコンピュータ組織、第3版プレンティスホール。p。 309ISBN 978-0-13-854662-5
  121. ^ a b Silberschatz、Abraham(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。31. ISBN 978-0-201-50480-4
  122. ^ a b c 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。145. ISBN 0-619-06489-7
  123. ^ a b 階段、ラルフM.(2003)。情報システムの原則、第6版トムソン。p。146. ISBN 0-619-06489-7
  124. ^ シルバーシャッツ、アブラハム(1994)。オペレーティングシステムの概念、第4版アディソン-ウェスリー。p。30. ISBN 978-0-201-50480-4
  125. ^ a b Wilson、Leslie B.(2001)。比較プログラミング言語、第3版アディソン-ウェスリー。p。40. ISBN 0-201-71012-9
  126. ^ a b タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。6. ISBN 978-0-13-291652-3
  127. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。243. ISBN 978-0-13-291652-3
  128. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。147. ISBN 978-0-13-291652-3
  129. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。148. ISBN 978-0-13-291652-3
  130. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。253. ISBN 978-0-13-291652-3
  131. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。255. ISBN 978-0-13-291652-3
  132. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。161. ISBN 978-0-13-291652-3
  133. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。166. ISBN 978-0-13-291652-3
  134. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。249. ISBN 978-0-13-291652-3
  135. ^ タネンバウム、アンドリューS.(2013)。構造化コンピュータ組織、第6版ピアソン。p。111. ISBN 978-0-13-291652-3