コンピュータサイエンスにおいて、高水準プログラミング言語とは、コンピュータの詳細から高度に抽象化されたプログラミング言語のことである。低水準プログラミング言語とは対照的に、高水準プログラミング言語は自然言語要素を使用したり、使いやすくなったり、コンピューティングシステムの重要な領域(メモリ管理など)を自動化(または完全に隠蔽)したりして、低水準言語を使用する場合よりもプログラムの開発プロセスを単純化して理解しやすくする。提供される抽象化の程度によって、プログラミング言語がどの程度「高水準」であるかが決まる。[1]
1960年代には、コンパイラを使用する高級プログラミング言語は一般にオートコードと呼ばれていました。[2] オートコードの例としては、COBOLやFortranがあります。[3]
コンピュータ用に設計された最初の高級プログラミング言語は、コンラート・ツーゼが作成したプランカルキュルでした。[4]しかし、この言語はツーゼの時代には実装されず、ツーゼの貢献は第二次世界大戦の影響で、ハインツ・ルティスハウザーの「スーパープラン」言語や、ある程度のALGOL以外の他の開発から大きく切り離されていました。最初に大幅に普及した高級言語は、IBMの初期のAutocodeシステムをマシンに依存しない形で開発したFortranでした。ヨーロッパとアメリカのコンピュータ科学者の委員会によって1958年に定義されたALGOL 58と1960年に定義されたALGOL 60を含むALGOLファミリは、語彙スコープ内での再帰とネストされた関数を導入しました。ALGOL 60は、値パラメータと名前パラメータおよびそれらに対応するセマンティクスを明確に区別した最初の言語でもありました。[5] ALGOLは、構文や構造などの構造化プログラミングの概念もいくつか導入し、その構文は形式表記法であるバッカス・ナウア記法(BNF)で記述された最初のものでした。ほぼ同じ時期に、COBOLはレコード(構造体とも呼ばれる)を導入し、 Lispはプログラミング言語で初めて
完全に一般的なラムダ抽象化を導入しました。while-doif-then-else
特徴
「高級言語」とは、機械語よりも抽象度の高い言語を指します。高級言語は、レジスタ、メモリ アドレス、コール スタックを扱うのではなく、変数、配列、オブジェクト、複雑な算術式またはブール式、サブルーチンと関数、ループ、スレッド、ロック、およびその他の抽象的なコンピュータ サイエンスの概念を扱い、最適なプログラム効率よりも使いやすさを重視します。低レベルのアセンブリ言語とは異なり、高級言語には、マシンのネイティブオペコードに直接変換される言語要素がほとんどありません。文字列処理ルーチン、オブジェクト指向言語機能、ファイル入出力などの他の機能も存在する場合があります。高級プログラミング言語について注目すべき点の 1 つは、これらの言語ではプログラマーがマシンから切り離されて切り離されることです。つまり、アセンブリや機械語などの低レベルの言語とは異なり、高級プログラミングではプログラマーの指示を増幅し、プログラマーが知らないうちにバックグラウンドで大量のデータ移動をトリガーできます。命令を実行する責任と権限はプログラマーからマシンに引き渡されました。
抽象化ペナルティ
高水準言語は、共通タスクを標準化し、豊富なデバッグを可能にし、アーキテクチャに依存しない機能を提供することを意図している。一方、低水準言語は、特定のシステムアーキテクチャ向けに最適化することで、より効率的なコードを生成することが多い。抽象化ペナルティとは、高水準プログラミング手法では、特定の低水準アーキテクチャリソースを活用しないため、パフォーマンスを最適化できなかったり、特定のハードウェアを使用できなかったりするために支払うコストである。高水準プログラミングでは、より汎用的なデータ構造や操作、実行時解釈、中間コードファイルなどの機能が見られるが、その結果、必要以上に多くの操作が実行され、メモリ消費量が増加し、バイナリプログラムのサイズが大きくなることが多い。[6] [7] [8]このため、特に高速かつ効率的に実行する必要があるコードでは、高水準言語の方がコーディングが容易であっても、低水準言語の使用が必要になることがある。多くの場合、主に高水準言語で記述されたプログラムの重要な部分をアセンブリ言語で手作業で記述することができ、はるかに高速で効率的な、あるいは単純に確実に機能する最適化されたプログラムになる。
しかし、現代のマイクロプロセッサアーキテクチャの複雑さが増すにつれて、高級言語用の適切に設計されたコンパイラは、ほとんどの低レベルプログラマが手作業で生成できるものと効率の点で匹敵するコードを頻繁に生成し、抽象度が高いため、特定の設定では低レベルの対応物よりも全体的に優れた結果をもたらすより強力な手法が可能になる場合があります。[9] 高級言語は、特定のコンピューティングシステムアーキテクチャとは独立して設計されています。これにより、インタープリタまたはJITプログラムと互換性のあるサポートを備えた任意のコンピューティングシステムで、そのような言語で記述されたプログラムを実行できます。高級言語は、設計者が改良を加えるにつれて改善されます。他のケースでは、新しい高級言語は、最も人気のある構成要素を新しい機能や改良された機能に集約することを目的として、1つまたは複数の他の言語から進化します。その一例は、Javaとの下位互換性を維持しているScalaです。つまり、プログラミングショップがScalaに切り替えた場合でも、Javaで記述されたプログラムとライブラリは引き続き使用できます。これにより、移行が容易になり、そのような高級コーディングの寿命が無期限になります。対照的に、低レベルのプログラムは、大幅な修正なしには、それが書かれたシステム アーキテクチャを超えて存続することはほとんどありません。これが、「抽象化ペナルティ」に対するエンジニアリングの「トレードオフ」です。
相対的な意味
現在積極的に使用されている高水準プログラミング言語の例としては、Python、JavaScript、Visual Basic、Delphi、Perl、PHP、ECMAScript、Ruby、C#、Javaなどが挙げられます。
高レベルと低レベルという用語は、本質的に相対的なものである。数十年前[時期? ] 、 C言語や類似の言語は、式の評価、パラメータ化された再帰関数、データ型や構造などの概念をサポートしていたため、「高レベル」と見なされることが多かったが、アセンブリ言語は「低レベル」と見なされていた。今日、多くのプログラマーは、C言語を低レベルと呼ぶかもしれない。なぜなら、C言語には大規模なランタイムシステムがなく(ガベージコレクションなどがなく)、基本的にスカラー操作のみをサポートし、直接メモリアドレス指定を提供しているためである。そのため、アセンブリ言語やCPUやマイクロコントローラのマシンレベルと容易に融合できる。また、ブライアン・カーニハンとデニス・リッチーによる『プログラミング言語C』(第2版)の序章では、C言語は「それほど高レベルではない」言語であると説明されている。[10]
アセンブリ言語自体は、定数や(限定された)式、場合によっては変数、プロシージャ、データ構造などの概念をサポートしているため、マシンコードのより高レベルな(ただし、マクロなしで使用される場合は1対1であることが多い)表現と見なすことができます。マシンコードは、多くのプロセッサで内部的に使用されるマイクロコードやマイクロ操作よりも本質的にわずかに高いレベルにあります。[11]
実行モード
現代の高級言語には、一般的に 3 つの実行モードがあります。
- 通訳
- ある言語で書かれたコードが解釈されると、その構文が読み取られ、コンパイル段階なしで直接実行されます。インタープリタと呼ばれるプログラムは、プログラム フローに従って各プログラム ステートメントを読み取り、実行する内容を決定して実行します。インタープリタとコンパイラのハイブリッドは、ステートメントをマシン コードにコンパイルして実行します。その後、マシン コードは破棄され、その行が再度実行されるときに新たに解釈されます。インタープリタは、ここで挙げた他の 2 つのバリアントと比較して、一般的に言語の動作の最も単純な実装です。
- コンパイル
- ある言語で書かれたコードをコンパイルすると、その構文は実行前に実行可能な形式に変換されます。コンパイルには 2 つの種類があります。
- マシンコード生成
- 一部のコンパイラは、ソース コードを直接マシン コードにコンパイルします。これはコンパイルの本来のモードであり、このようにマシン固有のコードに直接かつ完全に変換される言語は、真にコンパイルされた言語と呼ばれることがあります。アセンブリ言語を参照してください。
- 中間表現
- ある言語で書かれたコードが中間表現にコンパイルされると、その表現は最適化されたり、後で実行するために保存されたりして、ソース ファイルを再度読み込む必要がなくなります。中間表現が保存されるとき、それはバイトコードのような形式である場合があります。中間表現は、実行するには解釈されるか、さらにコンパイルされる必要があります。バイトコードを直接実行したり、さらにマシン コードに変換したりする仮想マシンによって、中間表現と真にコンパイルされた言語とのかつては明確であった区別があいまいになっています。
- ソースからソースへの翻訳またはトランスコンパイル
- ある言語で書かれたコードは、ネイティブ コード コンパイラがすでに普及している低レベル言語の用語に変換できます。JavaScriptとC言語は、このようなトランスレータの一般的なターゲットです。例として、CoffeeScript、Chicken Scheme、Eiffel を参照してください。具体的には、生成された C および C++ コードは (EiffelStudio IDE を使用したときに Eiffel 言語から生成されたものとして)、コンパイルされた Eiffel プロジェクトの EIFGENs ディレクトリで確認できます。Eiffelでは、変換されたプロセスはトランスコンパイルまたはトランスコンパイル済みと呼ばれ、Eiffel コンパイラはトランスコンパイラまたはソースからソースへのコンパイラと呼ばれます。
言語は厳密には解釈言語でもコンパイル言語でもないことに注意してください。むしろ、言語の動作の実装では解釈またはコンパイルが使用されます。たとえば、ALGOL 60とFortran はどちらも解釈されています (通常はコンパイルされますが)。同様に、Java では、実装ではなく言語にこれらのラベルを適用しようとすることの難しさが示されています。Java はバイトコードにコンパイルされ、その後、解釈 ( Java 仮想マシン(JVM) 内) またはコンパイル (通常はHotSpotなどのジャストインタイム コンパイラを使用、これも JVM 内) によって実行されます。さらに、コンパイル、トランスコンパイル、解釈は、コンパイラ成果物 (バイナリ実行可能ファイルまたは IL アセンブリ) の記述のみに厳密に限定されません。
高級言語コンピュータアーキテクチャ
あるいは、高水準言語をコンピュータで直接実装することも可能であり、コンピュータがHLLコードを直接実行する。これは高水準言語コンピュータアーキテクチャと呼ばれ、コンピュータアーキテクチャ自体は特定の高水準言語をターゲットとして設計されている。例えば、バロウズの大規模システムはALGOL 60のターゲットマシンであった。 [12]
参照
参考文献
- ^ 「HThreads - RD 用語集」。2007 年 8 月 26 日時点のオリジナルよりアーカイブ。
- ^ ロンドン、キース (1968)。「4、プログラミング」。コンピュータ入門。24 ラッセル スクエア ロンドン WC1: フェイバー アンド フェイバー リミテッド。p. 184。ISBN 0571085938「高」レベルのプログラミング言語は、
多くの場合、オートコードと呼ばれ、プロセッサ プログラムはコンパイラと呼ばれます。
{{cite book}}: CS1 メンテナンス: 場所 (リンク) - ^ ロンドン、キース (1968)。「4、プログラミング」。コンピュータ入門。24 ラッセル スクエア ロンドン WC1: フェイバー アンド フェイバー リミテッド。p. 186。ISBN 0571085938ここ
でオートコードの構造と目的を説明する例として使用できる 2 つの高水準プログラミング言語は、COBOL (Common Business Oriented Language) と FORTRAN (Formular Translation) です。
{{cite book}}: CS1 メンテナンス: 場所 (リンク) - ^ Giloi, Wolfgang, K. (1997). 「Konrad Zuse の Plankalkül: 最初の高水準「非フォン ノイマン」プログラミング言語」IEEE Annals of the History of Computing、vol. 19、no. 2、pp. 17–24、1997 年 4 月~6 月。(要約)
- ^ただし、 参照パラメータの概念が欠けており、状況によっては問題になる場合があります。ALGOL W、ALGOL 68、Simula、Pascal、Modula、Adaなどの後継言語には参照パラメータが含まれています (関連する C 言語ファミリでは、代わりにアドレスを-parameters として許可していました)。
value - ^ Surana P (2006). 「Meta-Compilation of Language Abstractions」(PDF)。2015年2月17日時点のオリジナルよりアーカイブ(PDF) 。 2008年3月17日閲覧。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ Kuketayev. 「Java の小さなオブジェクトに対するデータ抽象化ペナルティ (DAP) ベンチマーク」。2009 年 1 月 11 日時点のオリジナルよりアーカイブ。2008年3 月 17 日閲覧。
- ^ Chatzigeorgiou、Stephanides (2002)。「オブジェクト指向プログラミング言語と手続き型プログラミング言語のパフォーマンスとパワーの評価」。Blieberger、Strohmeier (編)。Proceedings - 7th International Conference on Reliable Software Technologies - Ada-Europe'2002。Springer。p . 367。
- ^ Manuel Carro、José F. Morales、Henk L. Muller、G. Puebla、M. Hermenegildo (2006)。「小型デバイス向け高水準言語: ケーススタディ」(PDF)。2006年組み込みシステム向けコンパイラ、アーキテクチャ、合成に関する国際会議の議事録。ACM。
- ^ カーニハン、ブライアン W.、リッチー、デニス M. (1988)。プログラミング言語 C: 第 2 版。プレンティス ホール。ISBN 9780131103627. 2022年10月25日時点のオリジナルよりアーカイブ。2022年10月25日閲覧。
{{cite book}}: CS1 maint: bot: 元の URL ステータス不明 (リンク) - ^ ハイド、ランドール (2010)。アセンブリ言語の芸術 (第 2 版)。サンフランシスコ: No Starch Press。ISBN 9781593273019. OCLC 635507601.
- ^ チュー・ヤオハン (1975)、「高水準言語コンピュータアーキテクチャの概念」、高水準言語コンピュータアーキテクチャ、エルゼビア、pp. 1–14、doi :10.1016/b978-0-12-174150-1.50007-0、ISBN 9780121741501
外部リンク
- http://c2.com/cgi/wiki?HighLevelLanguage - WikiWikiWebの高水準プログラミング言語に関する記事
参照
- {{コンピュータ言語}}
- {{プログラミング言語}}
- {{プログラミングパラダイム navbox }}
