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

放送局は - ...コンパイラの種類です。 変換し、放送番組

ある言語から別の言語翻訳するプログラムだけでなく、人々は通訳や翻訳者を必要としています。

基本的な概念

プログラムは、計算の言語表現である:私はP→P(i)を→。 インタプリタは、入力プログラムPと、いくつかの入力xに供給されるプログラムです。 これは、P xで行う:I(P、X)= P(X)。 唯一の翻訳者が(正式なシステムで表現できる)可能なすべてのプログラムを実行することができるがあるという事実は、非常に深いと重要な発見チューリングです。

プロセッサは機械語でプログラムのインタプリタです。 彼らは解釈しやすい形式に変換するので、高レベル言語の通訳を書くことが一般的には高価すぎます。

翻訳者のいくつかの種類が非常に奇妙な名前を持っています:

  • アセンブラは、機械語にアセンブリ言語プログラムを変換します。
  • コンパイラは、下の言語に高レベルの言語を翻訳します。

、∀xであるP→X→Q.: - 放送局は、いくつかの言語Sに入力データとしてプログラムを取り、彼らの両方が同じ意味を持っているようにTプログラムを生成するプログラムです。 P(X)= Q(x)です。

解釈可能なものの中に、プログラム全体を放送している場合、それが実行、またはAOTコンパイルする前にコンパイルと呼ばれています。 AOTコンパイラを直列に使用することができ、後者は、多くの場合、例えば、アセンブラ、です。

ソースコードコンパイラ→(翻訳)→→アセンブリコードアセンブラ(コンパイラ)→→CPU機械コード(インタプリタ)。

他の以前にコンパイルされた部分によって実行されたとき、プログラムは、放送されている場合、動作または動的コンパイルが発生します。 JITコンパイラは、何度も何度もソースコードを繰り返さないように、彼らはすでにやっていることを覚えておいてください。 彼らはプログラム実行環境の行動に基づく適応コンパイルと再コンパイルを生成することができます。

多くの言語は、コンパイル時にコードを実行し、実行時に新しいコードをコンパイルすることができます。

移動ステージ

放送は、分析し、合成の工程を含みます:

目標符号→→→→概念的な表現生成器(シンセサイザ)ソースコードアナライザ。

これは、これらの理由によるものです。

  • 他の方法は適切ではありません。 単語の翻訳は、単に動作しません。
  • グッドエンジニアリング・ソリューション:あなたはMとNソース言語用の翻訳を書きたい場合は目標ではなく、M×Nコンプレックス(翻訳者の合計)よりも唯一のM + N単純なプログラム(polukompilyatorov)を書く必要があります。

しかし、実際には、十分めったに表現力と十分に強力の概念図は、考えられるすべてのソースとターゲット言語をカバーします。 いくつかは、この近くに来ることができましたが。

本当のコンパイラは、多くの段階を通過します。 独自のコンパイラを作成するとき、人々は表現とジェネレータを作成するために行っているすべてのハードワークを繰り返す必要はありません。 あなたはJavaScriptやCで直接あなたの言語を翻訳し、残りを行うには、既存のJavaScriptエンジンとCコンパイラを利用することができます。 また、既存の中間表現して使用することができます仮想マシンを。

レコード翻訳者

ソース、宛先及び基地: - 放送者は、3つの言語を含んだプログラムまたはハードウェアです。 これらは、以下オリジナル左、右及びターゲット基地を置くこと、T字状に書き込むことができます。

コンパイラの3つのタイプがあります。

  • ブロード - それは、基本的なソース言語に対応している場合samokompilyatorです。
  • 言語をターゲットコンパイラはsamorezidentnymと呼ばれる、ベースラインです。
  • ブロードキャスター - クロスコンパイラ、彼が目標ならば、基本的な様々な言語。

なぜこれが重要なのですか?

この目的のために使用される概念は、例えば、広く使用されているので、あなたは、本当のコンパイラ、その作成の技術の十分な知識を作ることはありません場合でも、

  • 書式設定テキスト;
  • 言語クエリ データベースへ。
  • 高度なコンピュータアーキテクチャ。
  • 一般最適化問題。
  • GUI;
  • スクリプト言語。
  • コントローラ;
  • 仮想マシン;
  • 機械翻訳。

あなたはプリプロセッサ、リンカー、ローダ、デバッガやプロファイラを書きたい場合はまた、あなたはコンパイラを書くときと同じ手順を経る必要があります。

また、言語の翻訳者の作成は、その複雑さと曖昧さのより良い理解を意味するので、より良いプログラムを書く方法を学ぶことができます。 放送の一般原則の研究はまた、あなたは良いデザイナーの言語になることができます。 それが効果的に実施することができませんどのように急な言語のであれば、それは問題ではありませんか?

総合的な技術

コンパイラ技術は、コンピュータ科学のさまざまな分野をカバー:

  • 言語の正式な理論:文法、構文解析、計算可能。
  • コンピュータアーキテクチャ:命令セット、RISC又はCISC、パイプライン処理コア・クロック・サイクルなど。
  • プログラミング言語の概念、例えば、シーケンス制御を行う、条件付き実行、反復、再帰、機能的分解、モジュール性、同期、メタプログラミング、スコープ、一定のサブタイプ、テンプレート、出力タイプ、プロトタイプ、注釈、流れ、モナド、メールボックスは、続行しますその上で、ワイルドカード、正規表現、トランザクショナルメモリ、継承、多態性、モードの設定、およびなど。。。
  • 抽象的言語と仮想マシン。
  • アルゴリズムとデータ構造:正規表現構文解析アルゴリズム、グラフィックスアルゴリズム、 動的計画、訓練;
  • プログラミング言語:構文、(静的および動的)セマンティクス、支持パラダイム(構造、OOP、機能的、論理的、スタック、並列、メタプログラミング)。
  • 作成ソフトウェア(通常、大規模で複雑なコンパイラ):ローカライズ、キャッシング、コンポーネント化、API-インタフェース、再使用、同期。

コンパイラの設計

実際の翻訳者の開発で遭遇する問題のいくつか:

  • ソース言語の問題。 それはそれをコンパイルするのは簡単ですか? プリプロセッサはありますか? どのようなタイプは? ライブラリはありますか?
  • コンパイラのパスをグループ化:シングルまたはマルチウェイ?
  • 最適化の程度が希望します。 ほとんど、あるいはまったく最適化による高速かつ汚れた放送番組は正常であることができます。 以上の最適化コンパイラが遅くなりますが、実行時に、より良いコードは価値があるかもしれません。
  • エラー検出の必要度。 翻訳者は、ちょうど最初のエラーで停止することはできますか? それは停止すべきですか? コンパイラエラー訂正を信頼するかどうか?
  • ツールの可用性。 元の言語は非常に小さくない場合には、スキャナや発電機のアナライザが必要とされています。 そこジェネレータ、コードジェネレータもありますが、それらはそれほど一般的ではありません。
  • ターゲットコードの種類が生成されます。 純粋補充または仮想マシンコードから選択すること。 それともそのようなLLVM、RTL、またはJVMなどの一般的中間表現を生成する入口部分を書き込みます。 またはCまたはJavaScriptソースコードに元の翻訳を行います。
  • ターゲットコードの形式。 あなたは選ぶことができ 、アセンブリ言語、 ポータブルマシンコード、マシンコードのメモリイメージを。
  • リターゲット。 発電機のセットが良好な場合、共通の入口部分を持っています。 この理由は、多くの部品の入力のための1つの発電機を持っていることが最善です。

コンパイラアーキテクチャ:コンポーネント

これらは、ネイティブコードを生成するコンパイラの主要機能コンポーネント(出力プログラムは、Cまたは仮想マシン内のプログラムであれば、あなたは非常に多くの段階を必要はありません)、次のとおりです。

  • 入力プログラム(フローマーク)は、トークンのストリームに変換するスキャナ(字句解析)に供給されます。
  • 1本の抽象構文木を構築するパーサ(パーサ)。
  • 意味解析器は、意味情報を分解し、エラーのツリーノードをチェックします。 追加のプロパティと設立のリンクを持つ抽象構文木 - その結果、セマンティックグラフを構築しました。
  • 中間コード生成器は、(タプルがメインブロックにグループ化される)フローグラフを構築します。
  • マシンに依存しないコードオプティマイザは、基本的ルーチン内の残りの(ベースユニット内の)ローカルおよびグローバル(全ブロックに)最適化の両方を行います。 冗長コードを減らし、計算を簡略化します。 結果は、修正フローグラフです。
  • ジェネレータは、アセンブラ仮想レジスタ(おそらく無効)オブジェクト・ファイルを作成し、直線送信制御コードにターゲット・コード基本ブロックに結合します。
  • 機種依存オプティマイザ、リンカはレジスタ間でメモリを割り当てて、チームを計画します。 これは、パイプラインをうまく利用して、このアセンブリでは、アセンブリ言語で変換プログラムを実行します。

また、エラー検出サブシステムマネージャとシンボルテーブルを使用します。

字句解析(スキャン)

スキャナは空白、コメントや拡大マクロを削除し、トークンのストリームにストリームソースの文字に変換します。

スキャナは、多くの場合、このような考慮場合、余白、改行と埋め込まれたコメントを取るかどうかなどの問題に遭遇します。

スキャン中に発生するエラーは、字句と呼ばれ、次のとおりです。

  • アルファベットでない文字。
  • 単語や行の文字数を超えます。
  • ない、閉じた記号や文字列リテラル。
  • コメント内のファイルの終わり。

パース(構文解析)

パーサは、抽象構文木にトークンのシーケンスに変換します。 ツリーの各ノードは、ツリーノード自体であるその多くの名前付きフィールドを持つオブジェクトとして格納されます。 この段階では何のサイクルはありません。 あなたはパーサを作成すると、文法の複雑さのレベル(LLまたはLR)に注意を払うと、任意のルールの曖昧さ回避があるかどうかを知ることが必要です。 一部の言語では意味解析を必要とします。

この段階で見つかったエラーは、構文と呼ばれています。 例えば:

  • K = 5 *(7 - Y。
  • J = / 5;
  • 56 = X * 4。

意味解析

意味解析構文解析ツリーのルールと関連付ける部品の可否を確認する(暗黙的型変換のための演算を挿入する参照名を許可など。D.)セマンティック・グラフを形成するため。

もちろん、さまざまな異なる言語でのルールの許容のセット。 あなたはJavaのような言語をコンパイルする場合、コンパイラは見つけることがあります。

  • その範囲内の複数の変数の宣言。
  • その宣言の前に変数への参照。
  • 宣言されていないの名前への参照。
  • 特許権の侵害。
  • メソッド呼び出しの引数の過不足数。
  • 型の不一致。

世代

中間コード生成は、基本ブロックに分類タプルからなるフローグラフを生成します。

コード生成は、実際のマシンコードを生成します。 最初のステップ上のRISC-マシンのための伝統的なコンパイラでは、仮想レジスタの数が無限でアセンブラを作成します。 CISC-マシンではおそらく発生しません。

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 ja.delachieve.com. Theme powered by WordPress.