高水準プログラミング言語

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

コンピュータサイエンスでは高級プログラミング言語は、コンピュータの詳細から強力に抽象化されたプログラミング言語です。低水準プログラミング言語とは対照的に、自然言語要素を使用したり、使いやすくしたり、コンピューティングシステムの重要な領域(メモリ管理など)を自動化(または完全に非表示)したりして、プログラムの開発プロセスを簡素化し、低水準言語を使用する場合よりも理解しやすくなります。提供される抽象化の量は、プログラミング言語がどの程度「高レベル」であるかを定義します。[1]

1960年代には、コンパイラを使用した高級プログラミング言語は一般にオートコードと呼ばれていました[2] 自動コードの例はCOBOLFortranです。[3]

コンピューター用に設計された最初の高級プログラミング言語は、 KonradZuseによって作成されたPlankalkülでした。[4]しかし、それは彼の時代には実行されておらず、彼の当初の貢献は、ハインツ・ルティスハウザーによる「スーパープラン」言語への影響とある程度のALGOLを除いて、第二次世界大戦による他の開発からほとんど孤立していました。最初の非常に普及した高級言語は、IBMの初期のAutocodeシステムのマシンに依存しない開発であるFortranでした。1958年に定義されたALGOL58とALGOL60備えたALGOLファミリー1960年にヨーロッパとアメリカのコンピューター科学者の委員会によって定義され、再帰入れ子関数が字句スコープの下に導入されましたALGOL 60は、値名前のパラメーターとそれに対応するセマンティクスを明確に区別する最初の言語でもありました[5] ALGOLは、 and構文など、いくつかの構造化プログラミングの概念も導入しました。その構文は、正式な表記法– Backus–Naur形式(BNF)で最初に記述されました。ほぼ同じ期間に、COBOLはレコードを導入しましたwhile-doif-then-else(構造体とも呼ばれます)そしてLispはプログラミング言語で初めて 完全に一般的なラムダ抽象化を導入しました。

機能

「高級言語」とは、機械語からのより高いレベルの抽象化を指します。高水準言語は、レジスタ、メモリアドレス、および呼び出しスタックを処理するのではなく、変数、配列、オブジェクト、複雑な算術式またはブール式、サブルーチンと関数、ループ、スレッド、ロック、およびその他の抽象的なコンピュータサイエンスの概念を処理します。最適なプログラム効率よりも使いやすさに焦点を当てます。低水準アセンブリ言語とは異なり、高水準言語には、マシンのネイティブオペコードに直接変換される言語要素があったとしてもごくわずかです。文字列処理ルーチン、オブジェクト指向言語機能、ファイル入出力などの他の機能も存在する場合があります。高水準プログラミング言語について注意すべきことの1つは、これらの言語を使用すると、プログラマーをマシンから切り離して分離できることです。つまり、アセンブリ言語や機械語などの低水準言語とは異なり、高水準プログラミングはプログラマーの指示を増幅し、知らないうちにバックグラウンドで多くのデータ移動をトリガーする可能性があります。命令を実行する責任と力は、プログラマーからマシンに引き継がれています。

抽象化ペナルティ

高水準言語は、一般的なタスクを標準化し、豊富なデバッグを可能にし、アーキテクチャにとらわれない機能を提供することを目的としています。一方、低水準言語は、特定のシステムアーキテクチャの最適化を通じて、より効率的なコードを生成することがよくあります。抽象化のペナルティは、特定の低レベルのアーキテクチャリソースを利用しないために、パフォーマンスを最適化したり、特定のハードウェアを使用したりできないために高レベルのプログラミング手法が支払うコストです。高水準プログラミングは、より一般的なデータ構造と操作、実行時の解釈、中間コードファイルなどの機能を示します。多くの場合、必要以上に多くの操作が実行され、メモリ消費量が多くなり、バイナリプログラムのサイズが大きくなります。[6] [7][8]このため、特に高速かつ効率的に実行する必要があるコードでは、高水準言語を使用するとコーディングが容易になる場合でも、低水準言語を使用する必要があります。多くの場合、主に高級言語で書かれたプログラムの重要な部分は、アセンブリ言語で手動でコーディングできるため、はるかに高速、効率的、または単に確実に機能する最適化されたプログラムになります。

ただし、最新のマイクロプロセッサアーキテクチャの複雑さが増すにつれて、高水準言語用に適切に設計されたコンパイラは、ほとんどの低水準プログラマが手作業で生成できるものと同等の効率でコードを生成することがよくあります。特定の設定での低レベルの対応物よりも全体的な結果。[9] 高級言語は、特定のコンピューティングシステムアーキテクチャから独立して設計されています。これにより、InterpretedまたはJITの互換性のあるサポートを備えたコンピューティングシステムで、このような言語で記述されたプログラムの実行が容易になります。プログラム。設計者が改善を開発するにつれて、高級言語を改善することができます。その他の場合、新しい高級言語は、最も人気のある構成を新しい機能または改善された機能で集約することを目的として、1つ以上の他の言語から進化します。この例は、Javaとの下位互換性を維持するScalaです。これはプログラミングショップがScalaに切り替えても、Javaで記述されたプログラムとライブラリが引き続き使用できることを意味します。これにより、移行が容易になり、そのような高レベルのコーディングの寿命が無期限になります。対照的に、低レベルのプログラムは、大幅な改訂なしに作成されたシステムアーキテクチャを超えて存続することはめったにありません。これは、「抽象化ペナルティ」のエンジニアリングの「トレードオフ」です。

相対的な意味

現在活発に使用されている高級プログラミング言語の例には、PythonVisual BasicDelphiPerlPHPECMAScriptRubyC#Javaなどがあります。

高レベルレベルという用語は本質的に相対的なものです。数十年前、C言語および同様の言語は、式の評価、パラメーター化された再帰関数、データ型および構造などの概念をサポートし、アセンブリ言語は「低レベル」と見なされていたため、ほとんどの場合「高レベル」と見なされていました。 "。今日、多くのプログラマーはCを低レベルと呼ぶかもしれません。これは、Cが大規模なランタイムシステム(ガベージコレクションなどなし)を欠き、基本的にスカラー演算のみをサポートし、直接メモリアドレス指定を提供するためです。したがって、アセンブリ言語やCPUおよびマイクロコントローラのマシンレベルと容易に融合します。

アセンブリ言語自体は、定数や(制限された)式、場合によっては変数、プロシージャ、データなどの概念をサポートするため、マシンコードのより高いレベル(ただし、マクロなしで使用する場合は1対1 )の表現と見なすことができます。構造マシンコードは、本質的に、多くのプロセッサで内部的に使用されているマイクロコードまたはマイクロオペレーションよりもわずかに高いレベルにあります。[10]

実行モード

最新の高級言語の実行には、次の3つの一般的なモードがあります。

通訳
言語で書かれたコードが解釈されると、その構文が読み取られ、コンパイル段階なしで直接実行されます。インタプリタと呼ばれるプログラムは、プログラムフローに従って各プログラムステートメントを読み取り、実行する内容を決定して実行します。インタプリタとコンパイラのハイブリッドは、ステートメントをマシンコードにコンパイルし、それを実行します。その後、マシンコードは破棄され、行が再度実行された場合に新たに解釈されます。インタプリタは、ここにリストされている他の2つのバリアントと比較して、一般的に言語の動作の最も単純な実装です。
編集済み
言語で記述されたコードがコンパイルされると、その構文は実行前に実行可能形式に変換されます。コンパイルには2つのタイプがあります。
マシンコード生成
一部のコンパイラは、ソースコードを直接マシンコードにコンパイルします。これは元のコンパイルモードであり、この方法で直接かつ完全にマシンネイティブコードに変換される言語は、真にコンパイルされた言語と呼ばれる場合があります。アセンブリ言語を参照してください
中間表現
言語で記述されたコードが中間表現にコンパイルされると、その表現は、ソースファイルを再度読み取る必要なしに、後で実行するために最適化または保存できます。中間表現が保存されるとき、それはバイトコードのような形式であるかもしれません。次に、中間表現を解釈するか、さらにコンパイルして実行する必要があります。バイトコードを直接実行するか、それをさらにマシンコードに変換する仮想マシンは、中間表現と真にコンパイルされた言語との間のかつての明確な区別を曖昧にしました。
ソースからソースへの翻訳またはトランスコンパイル
言語で書かれたコードは、ネイティブコードコンパイラがすでに一般的である低レベル言語の用語に翻訳される場合があります。JavaScriptと言語Cは、そのような翻訳者の一般的なターゲットです。例として、 CoffeeScriptChicken Scheme、およびEiffelを参照してください具体的には、生成されたCおよびC ++コードは、コンパイルされたEiffelプロジェクトのEIFGENsディレクトリに(EiffelStudio IDEを使用するときにEiffel言語から生成されたものとして)表示されます。Eiffelでは、変換されたプロセスはトランスコンパイルまたはトランスコンパイルと呼ばれ、Eiffelコンパイラはトランスコンパイラまたはソースツーソースコンパイラと呼ばれます。

言語は厳密に解釈された言語またはコンパイルされた言語ではないことに注意してください。むしろ、言語動作の実装は、解釈またはコンパイルを使用します。たとえば、ALGOL 60Fortranは両方とも解釈されています(より一般的にはコンパイルされていますが)。同様に、Javaは、これらのラベルを実装ではなく言語に適用しようとすることの難しさを示しています。Javaはバイトコードにコンパイルされ、その後、インタープリター(Java仮想マシン(JVM)内)またはコンパイル(通常はHotSpotなどのジャストインタイムコンパイラーを使用)のいずれかによって実行されます。、再びJVMで)。さらに、コンパイル、トランスコンパイル、および解釈は、コンパイラアーティファクト(バイナリ実行可能ファイルまたはILアセンブリ)の記述のみに厳密に限定されません。

高水準言語のコンピュータアーキテクチャ

あるいは、高級言語をコンピューターで直接実装することも可能です。コンピューターはHLLコードを直接実行します。これは、高級言語のコンピュータアーキテクチャとして知られています。コンピュータアーキテクチャ自体は、特定の高級言語の対象となるように設計されています。たとえば、バロース大型システムはALGOL60のターゲットマシンでした。[11]

も参照してください

メモ

参考文献

  1. ^ HThreads-RD用語集
  2. ^ ロンドン、キース(1968)。「4、プログラミング」。コンピュータ入門24ラッセルスクエアロンドンWC1:フェイバーアンドフェイバーリミテッド。p。184. ISBN 0571085938「高級」プログラミング言語は、しばしばオートコードおよびプロセッサプログラム、コンパイラと呼ばれます。{{cite book}}:CS1 maint:場所(リンク
  3. ^ ロンドン、キース(1968)。「4、プログラミング」。コンピュータ入門24ラッセルスクエアロンドンWC1:フェイバーアンドフェイバーリミテッド。p。186. ISBN 0571085938Autocodeの構造と目的を説明するための例としてここで使用できる2つの高級プログラミング言語は、COBOL(Common Business Oriented Language)とFORTRAN(Formular Translation)です。{{cite book}}:CS1 maint:場所(リンク
  4. ^ Giloi、Wolfgang、K。(1997)。「コンラート・ツーゼのプランカルキュール:最初の高レベルの「非フォン・ノイマン」プログラミング言語」。コンピューティングの歴史のIEEE年報、vol。19、いいえ。2、pp。17–24、1997年4月– 6月。(要約)
  5. ^ 参照パラメータの概念が欠けていましたが、状況によっては問題になる可能性があります。したがって、 ALGOL W ALGOL 68 Simula Pascal Modula Adaを含むいくつかの後継者は、参照パラメーターを含めました(関連するC言語ファミリーは代わりに-パラメーターとしてアドレスを許可しました)。value
  6. ^ Surana P(2006)。「言語抽象化のメタコンパイル」(PDF)2015-02-17のオリジナルからアーカイブ(PDF)2008年3月17日取得 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です
  7. ^ クケタイエフ。「Javaの小さなオブジェクトに対するデータ抽象化ペナルティ(DAP)ベンチマーク」2009年1月11日にオリジナルからアーカイブされまし2008年3月17日取得
  8. ^ Chatzigeorgiou; ステファニデス(2002)。「オブジェクト指向プログラミング言語と手続き型プログラミング言語のパフォーマンスとパワーの評価」。ブリーバーガーでは; ストロメイエ(編)。議事録-信頼できるソフトウェア技術に関する第7回国際会議-Ada-Europe'2002スプリンガー。p。367。
  9. ^ マヌエルキャロ; ホセF.モラレス; ヘンク・L・ミュラー; G.プエブラ; M. Hermenegildo(2006)。「小型デバイス向けの高級言語:ケーススタディ」(PDF)組み込みシステムのコンパイラ、アーキテクチャ、および合成に関する2006年国際会議の議事録ACM。
  10. ^ ハイド、ランドール。(2010)。アセンブリ言語の芸術(第2版)。サンフランシスコ:ノースターチプレス。ISBN 9781593273019OCLC635507601 _
  11. ^ Chu、Yaohan(1975)、 "Concepts of High-Level Language Computer Architecture"、High-Level Language Computer Architecture、Elsevier、 pp。1–14、 doi10.1016 / b978-0-12-174150-1.50007-0ISBN 9780121741501

外部リンク