高水準プログラミング言語とは、コンピュータの詳細から高度に抽象化されたプログラミング言語のことです。低水準プログラミング言語とは対照的に、自然言語の要素を使用したり、使いやすくしたり、コンピュータシステムの重要な領域(メモリ管理など)を自動化(あるいは完全に隠蔽)したりすることで、低水準言語を使用する場合よりもプログラム開発のプロセスを簡素化し、理解しやすくすることができます。提供される抽象化の度合いによって、プログラミング言語の「高水準性」が決まります。[ 1 ]
高水準言語とは、マシン語やアセンブリ語に内在するプロセッサのハードウェアの詳細から抽象化されたレベルのことを指します。レジスタ、メモリ アドレス、コール スタックを扱う代わりに、高水準言語は変数、配列、オブジェクト、算術式とブール式、関数、ループ、スレッド、ロック、その他のコンピュータ サイエンスの抽象化を扱い、正確性と保守性を容易にします。低水準のアセンブリ言語とは異なり、高水準言語には、マシンのネイティブオペ コードに直接変換される言語要素はほとんどありません。文字列処理、オブジェクト指向プログラミング機能、ファイル入出力などの他の機能も提供される場合があります。高水準言語では、マシンの詳細から切り離されたソース コードを作成できます。つまり、アセンブリ語やマシン語のような低水準言語とは異なり、高水準言語のコードでは、プログラマの知らないうちにデータ移動が発生する可能性があります。実行する命令の一部はコンパイラに委ねられます。
電子計算機の初期の数十年間は、プログラムは通常、特定のマシンの命令セットを忠実に反映したマシンコードまたはアセンブリ言語で記述されていました。高水準プログラミング言語は、アルゴリズムを数学、ビジネスルール、または人間が読みやすい手順に近い形式で表現する方法として開発され、コンパイラまたはインタプリタがプログラムを機械実行可能な命令に変換しました。1950年代と1960年代には、コンパイラベースの高水準言語に対してオートコードという用語がよく使用されました。例としては、初期のオートコードシステムや、FortranやCOBOLなどの言語が挙げられます。[ 2 ]
コンピュータ向けに設計された最初期の高水準言語は、一般的に1940年代にコンラート・ツーゼによって開発されたPlankalkülであるとされています。 [ 3 ]構造化データ、代入、条件付き実行、反復、サブルーチンなどの高度な機能が含まれていましたが、ツーゼの存命中に実装されることはありませんでした。ツーゼは戦時中および戦後のドイツで活動していたため、彼の研究は言語開発の主流から大きく孤立していましたが、ハインツ・ルティシャウザーのSuperplanや、程度は低いもののALGOLに関連する初期の研究に影響を与えました。[ 4 ]
広く実用化された最初の高水準言語は、1950年代にジョン・バッカスの下でIBMで開発されたFortranでした。[ 5 ] Fortranは科学計算と数値計算を目的としており、プログラマーがすべての機械語命令を手動で管理することなく、代数式やループを記述できるようにしました。その成功は、コンパイルされた高水準言語が効率的なプログラムを作成し、プログラミングの労力を大幅に削減できることを実証するのに役立ちました。[ 6 ]
同じ時期に、他にも影響力のある言語がいくつか登場しました。ジョン・マッカーシーによって作成されたLispは、記号リスト処理を導入し、ラムダ計算の考え方を実用的なプログラミング言語設計の中心に据えました。[ 7 ] COBOLはビジネスデータ処理用に設計され、英語のような構文、レコード、ファイル指向の商用アプリケーションと関連付けられるようになりました。[ 8 ] ALGOLファミリー、特にALGOL 60は、ブロック構造、ネストされたプロシージャ、再帰、字句スコープ、値渡しと名前渡しの区別、構文を形式的に定義するためのバッカス・ナウア記法の使用などを通じて、後の言語設計に影響を与えました。[ 9 ]
1960年代から1970年代にかけて、高水準言語はそれぞれ異なるプログラミングスタイルへと多様化しました。BASICはタイムシェアリングや教育環境で対話型プログラミングを可能にし、 Pascalは構造化プログラミングと教育を重視しました。Cは高水準の制御構造と比較的低水準のメモリおよびハードウェアへのアクセスを組み合わせたことで、オペレーティングシステムやシステムソフトウェアに大きな影響を与えました。Simulaはオブジェクト指向プログラミングの中心となるクラスとオブジェクトのモデルを導入し、Smalltalkは後にメッセージパッシングと高度に対話的なプログラミング環境を中心にオブジェクト指向プログラミングを発展させました。[ 10 ] [ 11 ]
1980年代から1990年代にかけて、高水準言語の開発は、大規模ソフトウェアエンジニアリング、グラフィカルコンピューティング、インターネットの成長をますます反映するようになった。Adaは、特に防衛や組み込みのコンテキストで、大規模で長寿命のシステム向けに設計された。C ++は、クラスやその他の抽象化メカニズムでCを拡張し、システムプログラミング機能を維持しながら、オブジェクト指向プログラミングと汎用プログラミングを可能にした。[ 12 ] Perl、Python、Ruby、PHPなどのスクリプト言語と高速アプリケーション言語は、プログラマの生産性とテキスト、Web、またはアプリケーションのスクリプト作成を重視した。Javaは、 Java仮想マシンを介して移植可能なバイトコード実行を促進し、JavaScriptはWebブラウザの標準的な高水準スクリプト言語となった。[ 13 ] [ 14 ] [ 15 ]
21 世紀には、新しい高水準言語は、より安全な抽象化、並行処理、大規模なコードベース、および既存のプラットフォームとの相互運用性に重点を置くことが多かった。C #は.NETプラットフォームと並行して開発され、ScalaとF#はオブジェクト指向プログラミングと関数型プログラミングを融合し、Kotlin はJava との相互運用性を目指しつつ、簡潔な構文と null 安全性機能を追加した。[ 16 ] Go は、シンプルな構文、高速コンパイル、組み込みの並行処理サポートのために設計された。[ 17 ] Rust は、ガベージ コレクタなしでメモリ安全性とスレッド安全性を強調し、Swift はApple プラットフォームのソフトウェア開発のための現代的な言語として導入された。[ 18 ] [ 19 ] TypeScript は、大規模な JavaScript アプリケーションのために、JavaScript を静的型付けで拡張した。[ 20 ]
高水準言語は、一般的なタスクを標準化し、高度なデバッグを可能にし、アーキテクチャに依存しない機能を提供します。一方、低水準言語では、コーダーはより低いレベルの抽象化で作業する必要があり、これは一般的に難しいですが、高水準言語では不可能な最適化が可能になります。低水準言語の代わりに高水準言語を使用することによるこの抽象化のペナルティは現実のものですが、実際には、低水準の最適化がユーザーエクスペリエンスレベルでパフォーマンスを向上させることはほとんどありません。[ 21 ] [ 22 ] [ 23 ]それにもかかわらず、高速かつ効率的に実行する必要のあるコードでは、高水準言語の方がコーディングの記述と保守が容易になる場合でも、低水準言語の使用が必要になる場合があります。多くの場合、高水準言語で記述されたプログラムの重要な部分は、厳しいタイミングやメモリの制約を満たすためにアセンブリ言語でコーディングされます。高級言語用の適切に設計されたコンパイラは、アセンブリ言語で手作業でコーディングできるコードと同等の効率のコードを生成でき、高レベルの抽象化により、手作業でコーディングされたアセンブリのパフォーマンスを上回る最適化が可能になる場合もあります。[ 24 ]高級言語は特定のコンピューティングシステム アーキテクチャとは独立して設計されているため、そのような言語で書かれたプログラムは、互換性のあるコンパイラまたはインタプリタを備えたあらゆるコンピューティング コンテキストで実行できます。
プロセッサハードウェアに本質的に依存する低レベル言語とは異なり、高レベル言語は改良が可能であり、最も人気のある構成要素を統合し、改良された機能を加えることを目的として、他の高レベル言語から新しい高レベル言語が進化することができます。例えば、ScalaはJavaとの後方互換性を維持しています。開発者がScalaに切り替えた場合でも、Javaで書かれたコードは引き続き使用できます。これにより、移行が容易になり、コードベースの寿命が延びます。対照的に、低レベルプログラムは、それが書かれたシステムアーキテクチャを超えて存続することはほとんどありません。
「高水準」と「低水準」という用語は本質的に相対的なものであり、言語同士を比較すると、それぞれが高水準か低水準かということになります。C言語も、見方によっては高水準言語とも低水準言語ともみなされます。しかし、ほとんどの人は、C言語はアセンブリ言語より高水準であり、他の多くの言語より低水準であるという点で意見が一致しています。
C 言語は、式評価、パラメータ付き関数や再帰関数、データ型や構造体など、アセンブリ言語やプロセッサでは一般的にサポートされていない構造をサポートしていますが、自動インクリメントやポインタ演算などの低レベル機能も提供しています。しかし、C言語には、ガベージコレクションや組み込み文字列型など、他の言語で一般的な多くの高レベル抽象化が欠けています。ブライアン・カーニハンとデニス・リッチーによる『C プログラミング言語』(第 2 版)の序文では、C 言語は「あまり高レベルではない」言語であると説明されています。[ 25 ]
アセンブリ言語は機械語よりも高水準ですが、プロセッサのハードウェアに大きく依存しています。しかし、アセンブリ言語はマクロ、比較的限定された式、定数、変数、プロシージャ、データ構造など、より高水準な機能を提供する場合があります。
マシンコードは、多くのプロセッサ内部で使用されるマイクロコードやマイクロオペレーションよりもわずかに高いレベルの抽象化である。 [ 26 ]
高水準言語のソースコードは、以下のような様々な方法で処理される可能性があります。
Note that a language is not strictly interpreted or compiled. Rather, an execution model involves a compiler or an interpreter and the same language might be used with different execution models. For example, ALGOL 60 and Fortran have both been interpreted even though they were more typically compiled. Similarly, Java shows the difficulty of trying to apply these labels to languages, rather than to implementations. Java is compiled to bytecode which is then executed by either interpreting in a Java virtual machine (JVM) or JIT compiled.
{{cite report}}: CS1 maint: bot: original URL status unknown (link){{cite book}}: CS1 maint: bot: 元の URL の状態が不明です (リンク){{cite conference}}: CS1 maint: 複数の名前: 著者リスト (リンク)