
コンピュータプログラムとは、コンピュータが実行するためのプログラミング言語による一連の命令または命令セットのことです。これはソフトウェアの構成要素の一つであり、ソフトウェアにはドキュメントやその他の無形の構成要素も含まれます。[ 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桁の10進数値を1,000個保持できるメモリからなるストアがあった。 [ 12 ]ストアからの数値は処理のために紡績工場へ転送された。エンジンは2組の穴あきカードを使用してプログラムされた。1組は操作を指示し、もう1組は変数を入力する。[ 11 ] [ 13 ]しかし、何千もの歯車とギアが完全に連携して動作することはなかった。[ 14 ]
エイダ・ラブレスはチャールズ・バベッジのために解析機関の記述を作成した(1843年)。[ 15 ]この記述には、解析機関を使用してベルヌーイ数を計算する方法を完全に詳述した注釈Gが含まれていた。この注釈は、一部の歴史家によって世界初のコンピュータプログラムとして認識されている。[ 14 ]

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

電子数値積分計算機(ENIAC) は、1943 年 7 月から 1945 年秋にかけて製造されました。チューリング完全な汎用コンピュータで、回路の作成に17,468 本の真空管が使用されていました。その中核は、配線で接続された一連のパスカルでした。 [ 19 ] 40 台のユニットは 30 トンの重さがあり、1,800 平方フィート (167 m 2 )を占め、アイドル時には1 時間あたり 650 ドル ( 1940 年代の通貨) の電気を消費しました。 [ 19] 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 ]を特徴としており、メモリに複数のプロセスを同時に保持することができました。あるプロセスが入出力待ちをしている間、別のプロセスが計算を実行できました。
IBMは各モデルをPL/Iでプログラミングすることを計画した。[ 28 ] COBOL、FORTRAN、ALGOLのプログラマーを含む委員会が結成された。その目的は、包括的で使いやすく、拡張可能で、COBOLとFORTRANに取って代わる言語を開発することだった。[ 28 ]その結果、コンパイルに長い時間を要する大規模で複雑な言語が生まれた。[ 29 ]

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

ソフトウェア開発における重要な節目の一つは、超大規模集積回路(VLSI)の発明(1964年)であった。
フェアチャイルド・セミコンダクター(1957年)とインテル(1968年)の共同創設者であるロバート・ノイスは、電界効果トランジスタの製造を改良する技術革新を達成しました(1963年)。[ 31 ]目標は、半導体接合の電気抵抗率と導電率を変化させることです。まず、天然のケイ酸塩鉱物をシーメンス法を用いて多結晶シリコン棒に変換します。[ 32 ]次に、チョクラルスキー法によって棒を単結晶シリコンのブール結晶に変換します。[ 33 ]その後、結晶を薄くスライスしてウェーハ基板を形成します。次に、フォトリソグラフィーの平面プロセスによって、単極トランジスタ、コンデンサ、ダイオード、抵抗器[ 34 ]をウェーハ上に集積し、金属酸化物半導体(MOS)トランジスタのマトリックスを構築します。MOSトランジスタは、集積回路チップの主要コンポーネントです。[ 31 ]
当初、集積回路チップの機能は製造時に設定されていた。1960年代になると、電流の流れを制御する方法は、読み出し専用メモリ(ROM)のマトリックスをプログラムする方式へと移行した。このマトリックスは、ヒューズの2次元配列に似ていた。マトリックスに命令を書き込むプロセスは、不要な接続を焼き切ることだった。
1969年、日本の電卓メーカーであるブシコムは、インテルと契約を結び、それぞれ特定の電卓機能のための12個の集積回路チップを製造しました。この任務を任されたエンジニアのテッド・ホフは、12個の電卓機能を実行するコンピュータプログラムを実行できる1つのチップを作れることに気づきました。[ 35 ]その結果できたチップは、インテル4004マイクロプロセッサ と呼ばれました。

マイクロプロセッサと中央処理装置(CPU)という用語は現在では同義語として使われている。しかし、CPUはマイクロプロセッサよりも先に存在していた。例えば、IBM System/360 (1964年)には、セラミック基板上に個別の部品を搭載した回路基板で作られたCPUが搭載されていた。[ 36 ]

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

VLSI回路の登場により、プログラミング環境は(1990年代までは)コンピュータ端末からグラフィカルユーザーインターフェース(GUI)コンピュータへと進化しました。コンピュータ端末では、プログラマはコマンドライン環境で実行される単一のシェルしか使用できませんでした。1970年代には、テキストベースのユーザーインターフェースによって、全画面でのソースコード編集が可能になりました。利用可能な技術に関わらず、目標はプログラミング言語でプログラミングすることです。
プログラミング言語の機能は、プログラミングの理想を表現するために組み合わせる構成要素を提供するために存在します。[ 38 ]理想的には、プログラミング言語は次のようであるべきです。[ 38 ]
これらの構成要素を提供するプログラミング言語のプログラミングスタイルは、プログラミングパラダイムに分類される可能性があります。[ 39 ]例えば、異なるパラダイムでは、次のような違いが生じる可能性があります。[ 39 ]
これらのプログラミングスタイルはそれぞれ、さまざまなプログラミング言語の合成に貢献してきた。[ 39 ]
プログラミング言語とは、プログラマがコンピュータに指示を伝えるためのキーワード、記号、識別子、および規則の集合です。 [ 40 ]それらは構文と呼ばれる一連の規則に従います。[ 40 ]
プログラミング言語は形式言語を基礎としている。[ 41 ]形式言語を用いて解を定義する目的は、根本的な問題を解決するためのアルゴリズムを生成することである。[ 41 ]アルゴリズムとは、問題を解決する一連の単純な命令である。[ 42 ]

プログラミング言語の進化は、EDSAC (1949年)がフォン・ノイマン・アーキテクチャで最初の内蔵コンピュータプログラムを使用したときに始まった。[ 43 ] EDSACのプログラミングは、プログラミング言語の第一世代であった。[ 44 ]

命令型言語は、宣言、式、およびステートメントを使用して、順次アルゴリズムを指定します。[ 52 ]
var x: integer;2 + 24 を返します。x := 2 + 2; if x = 4 then do_something();FORTRAN(1958年)は「IBM数式翻訳システム」として発表されました。文字列処理機能を持たない科学計算用に設計されました。宣言、式、ステートメントに加えて、以下の機能をサポートしていました。
成功した理由は以下のとおりです。
しかし、IBM以外のベンダーもFortranコンパイラを作成しましたが、その構文はIBMのコンパイラではおそらくエラーになるものでした。[ 54 ]米国規格協会(ANSI)は1966年に最初のFortran規格を開発しました。1978年にはFortran 77が標準となり、1991年まで使用されました。Fortran 90は以下をサポートしています。
COBOL (1959) は「共通ビジネス指向言語」の略です。Fortran はシンボルを操作していました。シンボルは数値である必要がないことがすぐに認識され、文字列が導入されました。[ 55 ]米国国防総省はCOBOL の開発に影響を与え、グレース・ホッパーが主要な貢献者でした。ステートメントは英語に似ていて冗長でした。目標は、管理者がプログラムを読める言語を設計することでした。しかし、構造化されたステートメントの欠如がこの目標を妨げました。[ 56 ]
COBOLの開発は厳密に管理されていたため、ANSI規格を必要とする方言は出現しなかった。その結果、1974年まで15年間変更されなかった。1990年代のバージョンでは、オブジェクト指向プログラミングなどの重要な変更が加えられた。[ 56 ]
ALGOL(1960年)は「ALGOrithmic Language」の略です。プログラミング言語設計に大きな影響を与えました。[ 57 ]ヨーロッパとアメリカのプログラミング言語専門家からなる委員会から生まれたALGOLは、標準的な数学的記法を使用し、読みやすく構造化された設計を採用していました。ALGOLは、バッカス・ナウア記法を用いて構文を定義した最初の言語でした。[ 57 ]これにより、構文指向コンパイラが誕生しました。ALGOLは次のような機能を追加しました。
Algolの直系の子孫には、 1つの系統にPascal、Modula-2、Ada、Delphi、Oberonが含まれる。別の系統には、C、C++、Javaが含まれる。[ 57 ]
BASIC (1964) は「Beginner's All-Purpose Symbolic Instruction Code」の略です。ダートマス大学で、全学生が学習できるように開発されました。[ 9 ]学生がより強力な言語に進まなくても、BASIC は覚えておくことができます。[ 9 ] 1970 年代後半に製造されたマイクロコンピュータには、BASIC インタプリタがインストールされました。マイクロコンピュータ産業が成長するにつれて、BASIC も成長しました。[ 9 ]
Basicは対話型セッションの先駆けとなった。[ 9 ]その環境内でオペレーティングシステムのコマンドを提供した。
しかし、Basic の構文は大規模なプログラムには単純すぎました。[ 9 ]最近のダイアレクトでは、構造とオブジェクト指向の拡張機能が追加されました。MicrosoftのVisual Basicは今でも広く使用されており、グラフィカル ユーザー インターフェイスを生成します。[ 8 ]
C言語(1973年)は、 BCPL言語がB言語に置き換えられた際に、AT&Tベル研究所が次のバージョンを「C」と名付けたことからその名が付けられました。その目的はUNIXオペレーティングシステムを開発することでした。[ 50 ] C言語は比較的小規模な言語であるため、コンパイラの作成が容易です。その成長は1980年代のハードウェアの成長と軌を一にしていました。[ 50 ]また、アセンブリ言語の機能を備えながらも高水準構文を使用していることも、その成長の要因の一つです。C言語は以下のような高度な機能を追加しました。

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

コンピュータ プログラムの構文は、その文法を構成する生成規則のリストです。[ 96 ]プログラミング言語の文法は、宣言、式、およびステートメントを正しく配置します。[ 97 ]言語の構文を補完するのが意味論です。意味論は、さまざまな構文構造に付随する意味を記述します。[ 98 ]生成規則が無効な解釈を持つ可能性があるため、構文構造には意味論的記述が必要になる場合があります。[ 99 ]また、異なる言語が同じ構文を持つ場合もありますが、その動作は異なる場合があります。
言語の構文は、生成規則を列挙することによって形式的に記述されます。自然言語の構文は非常に複雑ですが、英語のサブセットでは、次のような生成規則のリストを持つことができます。[ 100 ]
太字で示されている単語は非終端記号と呼ばれます。シングルクォーテーションで囲まれた単語は終端記号と呼ばれます。[ 101 ]
この生成規則リストから、一連の置換を用いて完全な文を形成できます。[ 102 ]このプロセスは、非終端記号を有効な非終端記号または有効な終端記号のいずれかに置き換えることです。置換プロセスは、終端記号のみが残るまで繰り返されます。有効な文の例は次のとおりです。
しかし、別の組み合わせでは無効な文になってしまう。
したがって、食べるという行為の意味を正しく記述するためには、意味論が必要となる。
生成規則リスト化手法の一つに、バッカス・ナウア記法(BNF)と呼ばれるものがある。[ 103 ] BNFは言語の構文を記述し、それ自体が構文を持つ。この再帰的な定義はメタ言語の一例である。[ 98 ] BNFの構文には以下が含まれる。
::=これは、右に非終端記号がある場合は[n]で構成されます。右に終端記号がある場合はです。|これは、またはに翻訳されます。<そして非終端記号>を取り囲むもの。BNFを用いると、英語のサブセットには次のような生成規則リストが存在する。
<文> ::= <名詞句><動詞句> <名詞句> ::= <冠詞><形容詞> <名詞> <動詞句> ::= <動詞><名詞句> <冠詞> ::= the <形容詞> ::= big | small <名詞> ::= cat | mouse <動詞> ::= eats BNF を使用すると、符号付き整数の生成規則リストは次のようになります。[ 104 ]
<符号付き整数> ::= <符号><整数> <符号> ::= + | - <整数> ::= <数字> | <数字><整数> <数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 再帰的な生成規則に注目してください。
<整数> ::= <数字> | <数字><整数>これは無限の可能性を許容する。したがって、桁数の制限を記述するための意味論が必要となる。
生成規則において、先頭にゼロが存在する可能性に注目してください。
<整数> ::= <数字> | <数字><整数> <数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 したがって、先頭のゼロを無視する必要があることを記述するための意味論が必要となる。

ソフトウェアエンジニアリングとは、高品質のコンピュータプログラムを作成するためのさまざまな技術のことです。[ 106 ]コンピュータプログラミングとは、ソースコードを記述または編集するプロセスです。正式な環境では、システムアナリストは、自動化する組織のすべてのプロセスについてマネージャーから情報を収集します。この専門家は、新しいシステムまたは変更されたシステムの詳細な計画を作成します。[ 107 ]この計画は、建築家の設計図に似ています。[ 107 ]
システムアナリストの目的は、適切な情報を適切な人に適切なタイミングで提供することです。[ 108 ]この目的を達成するための重要な要素は次のとおりです。[ 108 ]
パフォーマンス目標の達成は、以下を含むすべてのコストとバランスを取る必要があります。[ 109 ]
システム開発プロセスを適用することで、プロセスの後半でエラーが検出されるほど修正コストが高くなるという公理を軽減できます。[ 110 ]
ウォーターフォールモデルは、システム開発プロセスの実装です。[ 111 ]ウォーターフォールというラベルが示すように、基本的なフェーズは互いに重なり合っています。[ 112 ]
コンピュータプログラマーは、詳細な計画を実行するためにソースコードを記述または修正する責任を負う専門家です。[ 107 ]ほとんどのシステムは、1人のプログラマーで完成させるには大きすぎるため、プログラミングチームが必要になる可能性が高いです。[ 114 ]しかし、プロジェクトにプログラマーを追加しても、完了時間が短縮されるとは限りません。むしろ、システムの品質が低下する可能性があります。[ 114 ]効果的にするためには、プログラムモジュールを定義し、チームメンバーに配布する必要があります。[ 114 ]また、チームメンバーは、有意義かつ効果的な方法で互いにやり取りする必要があります。[ 114 ]
コンピュータプログラマーは、小さなレベルでプログラミングを行うことがあります。つまり、単一のモジュール内でプログラミングを行うのです。 [ 115 ]モジュールは、他のソースコードファイルにあるモジュールを実行する可能性が高いです。そのため、コンピュータプログラマーは、モジュールが互いに効果的に結合するようにプログラミングを行う、大きなレベルでプログラミングを行うこともあります。[ 115 ]大きなレベルでのプログラミングには、アプリケーションプログラミングインターフェース(API)への貢献が含まれます。
モジュール型プログラミングは、命令型言語プログラムを洗練する手法です。洗練されたプログラムは、ソフトウェアのサイズを縮小し、責任を分離し、それによってソフトウェアの老朽化を軽減することができます。プログラムモジュールは、ブロック内に収まり、名前で識別される一連のステートメントです。[ 116 ]モジュールには、機能、コンテキスト、およびロジックがあります。[ 117 ]
モジュール名は、まずその機能によって、次にそのコンテキストによって決定されるべきです。そのロジックは名前の一部であってはなりません。[ 117 ]例えば、function compute_square_root( x )やは適切なモジュール名です。しかし、は適切ではありません。function compute_square_root_integer( i : integer )function compute_square_root_by_division( x )
モジュール内の相互作用の度合いは、その凝集度です。[ 117 ]凝集度は、モジュールの名前とその機能の関係性を判断するものです。モジュール間の相互作用の度合いは、結合度です。[ 118 ]結合度は、モジュールのコンテキストと、実行対象要素の関係性を判断するものです。
結束レベルを最悪から最高まで順に並べると次のようになります。[ 119 ]
function read_sales_record_print_next_line_convert_to_float()。偶然の凝集性は、管理側がばかげた規則を強制する場合に実際に発生する。たとえば、「すべてのモジュールは35から50の実行可能なステートメントを持つものとする。」[ 119 ]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()。結合レベルは最悪から最高まで次の通りです。[ 118 ]
perform_arithmetic( perform_addition, a, b )。代わりに、制御は返されるオブジェクトの構成に向けられるべきです。
データフロー分析は、機能的凝集性とデータ結合性を備えたモジュールを実現するために使用される設計手法です。[ 120 ]この手法への入力はデータフロー図です。データフロー図は、モジュールを表す楕円の集合です。各モジュールの名前は、その楕円内に表示されます。モジュールは、実行レベルまたは関数レベルにある場合があります。
図には、モジュール同士を接続する矢印も含まれています。モジュールに向かう矢印は、入力のセットを表します。各モジュールからは、単一の出力オブジェクトを表す矢印が1つだけ出ている必要があります。(オプションで、例外を示す矢印を追加することもできます。)楕円をデイジーチェーン状に並べると、アルゴリズム全体が表現されます。入力モジュールが図の先頭に来る必要があります。入力モジュールは変換モジュールに接続する必要があります。変換モジュールは出力モジュールに接続する必要があります。[ 121 ]

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

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

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

元々、オペレーティングシステムはアセンブリ言語でプログラミングされていましたが、現代のオペレーティングシステムは通常、 C、Objective-C、Swiftなどの高水準言語で記述されています。[ m ]
ユーティリティとは、システム管理やソフトウェアの実行を支援するプログラムのことです。オペレーティングシステムは通常、ストレージ、メモリ、スピーカー、プリンタなどのハードウェアをチェックするユーティリティを提供します。[ 140 ]ユーティリティはストレージデバイスのパフォーマンスを最適化する場合があります。システムユーティリティはハードウェアとネットワークのパフォーマンスを監視し、メトリックが公称範囲外になった場合にアラートをトリガーする場合があります。[ 141 ]ユーティリティは、ストレージ容量とネットワーク伝送時間を削減するためにファイルを圧縮する場合があります。[ 140 ]ユーティリティはデータセットをソートしてマージしたり[ 141 ] 、コンピュータウイルスを検出したりする場合があります。[ 141 ]





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

算術演算を実行するための命令は、算術論理演算ユニット(ALU)を介して渡されます。 [ 150 ] ALUには、整数の加算、シフト、比較などの基本演算を実行する回路があります。CPUは、基本演算をALUを通して組み合わせ、ループさせることで、複雑な算術演算を実行します。
マイクロコード命令は、CPUとメモリコントローラ間でデータを転送します。メモリコントローラのマイクロコード命令は、2つのレジスタを操作します。メモリアドレスレジスタは、各メモリセルのアドレスにアクセスするために使用されます。メモリデータレジスタは、各セルの内容を設定および読み取るために使用されます。[ 151 ]
x++は通常、単一の命令にコンパイルされます。int increment_counter(){ static int counter; return ++counter;}。 1) 静的変数は自動的にゼロに初期化されます。 2)++counterは前置インクリメント演算子です。calloc()を作成できる。2) 各メモリセルをゼロに設定する。strdup()[ソフトウェアには]情報処理システムのプログラム、手順、規則、および関連文書の全部または一部が含まれます。
ソースプログラムをコンパイルする代わりに、インタプリタを使用する方法があります。インタプリタはソースプログラムを直接実行できます。
カーネルは新しいプログラムをメモリにロードすることができる。
非公式には、プロセスとは実行中のプログラムのことである。
学生が非常に簡単に学べる言語を作り出すことだった。
その考えは、学生が単なるカジュアルユーザーになるか、Basicからより高度で強力な言語へと進むか、どちらかを選択できるというものだった。
計算機上で実行可能なすべての計算をモデル化することができる。
一般的な数学関数は、どんなに複雑であっても、チューリング計算可能です。
強力なメモリチップと組み合わせ、様々な種類のソフトウェアでプログラムされた標準化されたロジックチップを設計する方が、すぐに安価になり、様々な計算が可能になるだろうと賭けた。
第三世代以上の高水準プログラミング言語では、言語内の各文が機械語の複数の命令に変換されます。
関数呼び出しが行われると、レジスタ値(変数名に対応)や戻りアドレス(プログラムカウンタから取得可能)など、重要な情報をすべて保存する必要があります。関数が戻りたいときは、すべてのレジスタを復元します。そして、戻りジャンプを実行します。明らかに、このすべての処理はスタックを使用して実行でき、再帰を実装するほぼすべてのプログラミング言語で実際に行われています。
SimulaはAlgol 60をベースに、非常に重要なクラス概念を追加したものであった。…基本的な考え方は、データ(またはデータ構造)とそれに対して実行される操作は一体であるということである。
オブジェクト指向プログラミングと関数型プログラミングを組み合わせたものを含む、多数の実験的なプログラミング言語が設計された。
、OODの大きなサブセットは使用できます。
プログラムを記述する正しい形式を規定する。
命令型言語の主な構成要素は、宣言、式、および文である。
あらゆるコンピュータシステムの潜在能力を引き出す鍵は、アプリケーションソフトウェアである。
サードパーティのソフトウェア企業(付加価値ソフトウェアベンダーと呼ばれることが多い)は、特定の業界や企業のニーズを満たすためにソフトウェアプログラムを開発または変更することがあります。
: 独自開発ソフトウェア; 小見出し: 利点; 引用: 機能、レポートなどに関して、必要なものを正確に入手できます。
独自開発ソフトウェア; 小見出し: 利点; 引用: 開発に関与することで、結果に対するコントロールのレベルがさらに高まります。
独自開発ソフトウェア; 小見出し: 利点; 引用: 競合他社の新たな取り組みに対抗するため、または新たなサプライヤーや顧客の要求を満たすために必要となる変更を行う際の柔軟性が高まります。