ホームページ よくある問題 高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

Aug 31, 2020 pm 03:44 PM
実行可能プログラム ソースプログラム 高級言語

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには、「コンパイルとリンク」が必要です。高級言語で書かれたソース プログラムはマシン上で直接実行できず、コンパイルしてリンクする必要があります。

高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?

#プログラムを実行するには、前処理、コンパイル、アセンブリ、リンクという 4 つの手順を実行する必要があります。次に、いくつかの簡単な例を通して、これらのプロセスを詳しく説明します。

上で使用したオプションのいくつかを説明する必要があります。

オプションを指定せずに gcc コマンドを使用すると、前処理、コンパイル、アセンブリ、およびリンクのプロセス全体がデフォルトで実行されます。プログラムが正しければ、実行可能ファイルが取得されます。 a.out

-E オプション: 前処理の実行後にコンパイラに停止を要求し、その後のコンパイル、アセンブル、およびリンクは実行されません。

-S オプション: コンパイル後に停止し、アセンブルとリンクを実行しないようにコンパイラに指示します。

-c オプション: アセンブリの実行後にコンパイラに停止を要求します。

したがって、これら 3 つのオプションは、特定のステップを個別に取り出して実行するのではなく、コンパイラの実行操作の停止時間を制限することに相当します。

#上記のプログラムの実行プロセスについては誰もがよく知っているはずなので、時間を無駄にすることはありません。

1. 前処理:

-E オプションを使用すると、プリコンパイルのみが実行され、それに応じて .i ファイルが生成されます。

前処理プロセス中に実行される操作:

    すべての「#define」を削除し、すべてのマクロ定義を展開します
  • すべての条件付きコンパイル命令を処理します。たとえば、「#」 if"、"#ifdef"、"#elif"、"#else"、"#endif"
  • "#include" プリコンパイル ディレクティブを処理し、インクルードされたヘッダー ファイルをコンパイルに挿入します。 命令の場所。 (インクルードされたファイルには他のファイルも含まれている可能性があるため、このプロセスは再帰的です)
  • すべてのコメント「//」と「/* */」を削除します。
  • 行番号とファイル名の識別子を追加すると、コンパイラはコンパイル中に後でデバッグできるように行番号のアイデアを生成しやすくなり、コンパイル中にコンパイル エラーや警告が発生したときに行番号を表示できるようになります。
  • コンパイラが必要とするすべての #pragma プラグマを保持します。
簡単なプログラムを使用して、事実が上記の通りであるかどうかを確認します。

簡単なプログラムを作成し、-E オプションを使用して前処理プロセスを実行し、生成された比較ファイルを開きます。 .i ファイルをソース ファイルと結合すると、結果が一目瞭然です

コードへの行番号の追加については、ここでは説明しません。手動では行いません。コードを記述するときに行番号を追加する場合、表示される行番号は使用する編集ツールによって自動的に追加され、コンパイル システムではこれらの行番号を確認できません。コードをコンパイルすると、コードのどの行に問題があるかを知らせるプロンプトが表示され、コンパイラが自動的に行番号を追加することがわかります。

2. コンパイル:

-S オプションを使用して、コンパイル操作が実行後に終了することを示します。それに応じて .s ファイルが生成されます。

コンパイル プロセスは、プログラム全体の構築の中核部分です。コンパイルが成功すると、ソース コードがテキスト形式から機械語に変換されます。コンパイル プロセスでは、一連の字句解析が実行され、構文解析、前処理されたファイルの意味解析、解析と最適化の後、対応するアセンブリ コード ファイルが生成されます。

    字句解析:
字句解析では、lex という名前のプログラムを使用して字句スキャンを実装し、ユーザーが以前に記述した字句ルールに従って入力文字列を分析します。それを個々のトークンに分割します。生成されたトークンは通常、キーワード、識別子、リテラル (数値、文字列などを含む)、および特殊記号 (演算子、等号など) に分類され、対応するテーブルに配置されます。

    文法分析: 文法アナライザーは、ユーザーが指定した文法規則に従って字句分析によって生成されたトークン シーケンスを解析し、それらから文法ツリーを形成します。言語が異なると、文法規則が異なるだけです。 yacc という構文分析用の既製ツールもあります。

  • 意味分析:

文法分析は式の構文レベルの分析を完了しますが、ステートメントが本当に意味があるかどうかは理解できません。一部のステートメントは、文法的には正当ですが、実際的な意味を持ちません。たとえば、2 つのポインターを乗算する場合、セマンティック分析が必要になります。ただし、コンパイラが分析できるセマンティックは静的セマンティックのみです。

静的セマンティクス: コンパイル時に決定できるセマンティクス。通常、宣言、型マッチング、型変換が含まれます。たとえば、浮動小数点式が整数式に代入される場合、それは浮動小数点から整数への変換を意味するため、セマンティック分析でこの変換を完了する必要があります。セマンティック解析中に 2 つの型が一致しないことが判明し、コンパイラはエラーを報告します。

動的セマンティクス: 実行時にのみ決定できるセマンティクス。例えば、2つの整数を除算する場合、構文に問題はなく、型も一致しているので何も問題がないように見えますが、除数が0の場合に問題が発生します。この問題は不明です。これは動的セマンティクスです。

  • 中間コード生成

コードは最適化できます。コンパイル中に決定できるいくつかの値については、2 6 と言えば最適化されます。上の例では、コンパイル中にその値が 8 であると判断できますが、構文を直接最適化することはより困難であり、この場合、オプティマイザーはまず構文ツリーを中間コードに変換します。中間コードは通常、ターゲット マシンや動作環境から独立しています。 (データサイズ、変数アドレス、レジスタ名等は含みません)。中間コードの形式はコンパイラごとに異なりますが、最も一般的なものは 3 アドレス コードと P コードです。

中間コードにより、コンパイラをフロントエンドとバックエンドに分割できます。コンパイラーのフロントエンドはマシンに依存しない中間コードの生成を担当し、コンパイラーのバックエンドは中間コードをマシンコードに変換します。

  • ターゲット コードの生成と最適化

コード ジェネレーターは、中間コードをマシン コードに変換します。マシンによってワード長が異なるため、このプロセスはターゲット マシンによって異なります。レジスタ、データ型など。

最後に、ターゲット コード オプティマイザーは、適切なアドレス指定メソッドの選択、乗算と除算の置き換えに固有のアドレス指定メソッドの使用、冗長な命令の削除など、ターゲット コードを最適化します。

3. アセンブリ

アセンブリ プロセスは、アセンブリ コードをマシンが実行できる命令に変換するために使用されるアセンブラを呼び出すことによって完了します。アセンブリ文 機械語命令に相当します。

コマンドを hello.s -o hello.o として使用するか、 gcc -c hello.s -o hello.o を使用してアセンブリ プロセスが終了するまで実行します。対応する生成ファイルは .o です。ファイル。

4. リンク

リンクの主な内容は、モジュール間で相互に参照する部分を正しく接続することです。その仕事は、他のシンボル アドレスへの一部の命令の参照を修正することです。リンク プロセスには、主にアドレスとスペースの割り当て、シンボル解決とリダイレクトが含まれます。

シンボル解決: シンボル バインディング、名前バインディング、名前解決、またはアドレス バインディングとも呼ばれ、実際にはシンボルの使用を指します。住所を特定するため。

たとえば、Int A = 6; このようなコードでは、A を使用して空間内の 4 バイト サイズの空間を識別し、その空間に格納されている内容は 4 です。各ターゲットに対処することを再配置と呼びます。

最も基本的なリンクは静的リンクと呼ばれ、各モジュールのソース コード ファイルをターゲット ファイル (Linux: .o Windows: .obj) にコンパイルし、ターゲット ファイルとライブラリを一緒にリンクします。最終的な実行可能ファイルを形成します。ライブラリは実際にはターゲット ファイルのセットのパッケージであり、最も一般的に使用されるコードの一部はターゲット ファイルに変換され、パッケージ化されて保存されます。最も一般的なライブラリはランタイム ライブラリで、プログラムの実行をサポートする基本関数のコレクションです。

関連知識の詳細については、

PHP 中国語 Web サイト

をご覧ください。

以上が高級言語で書かれたソースプログラムを実行可能プログラムに変換するには何が必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

機械語、アセンブリ言語、高級言語の特徴は何ですか? 機械語、アセンブリ言語、高級言語の特徴は何ですか? Apr 22, 2021 pm 04:00 PM

機械語の特徴: 学習、理解、理解が困難、汎用的ではない、手動でのメモリ割り当てが必要、実行速度が速い。アセンブリ言語の特徴は、プログラムの実行効率が非常に高く、記憶容量が少なく、実行速度が速いという点にありますが、汎用性に欠け、プログラムの移植が容易ではありません。高級言語の特徴: 簡単で、ある程度の汎用性があり、コンピュータによって直接認識して実行することができません。

高級言語で書かれたソースプログラムをターゲットプログラムに翻訳できるシステムソフトウェアとは何ですか? 高級言語で書かれたソースプログラムをターゲットプログラムに翻訳できるシステムソフトウェアとは何ですか? Jan 22, 2021 pm 05:36 PM

高級言語で書かれたソースプログラムをターゲットプログラムに翻訳できるシステムソフトウェアが「コンパイラ」です。コンパイラは、生成実装アプローチを使用して実装された変換プログラムであり、高級プログラミング言語で記述されたソース プログラムを入力として受け取り、アセンブリ言語または機械語で表現されたターゲット プログラムを出力として使用します。

アセンブリ言語は高級言語ですか? アセンブリ言語は高級言語ですか? Jan 30, 2023 pm 03:14 PM

アセンブリ言語は高級言語ではなく、機械語のような低級言語です。アセンブリ言語と高級言語の違い 1. アセンブリ言語のプログラミング効率は高くないが、高級言語のプログラミング効率はアセンブリ言語より高い; 2. 高級言語の可読性は高いアセンブリ言語よりも高度である; 3. アセンブリ言語は機械語であるのに対し、高級言語は簡略化され人間の自然言語に近いものです。

高級プログラミング言語で書かれたプログラムを同等の実行可能プログラムに変換するには何が必要ですか? 高級プログラミング言語で書かれたプログラムを同等の実行可能プログラムに変換するには何が必要ですか? Jan 12, 2021 pm 02:41 PM

高級プログラミング言語で書かれたプログラムを同等の実行可能プログラムに変換するには、コンパイルとリンクが必要です。高級プログラミング言語は、コンピューター命令システムと機械語ランダムマシンのさまざまな制約を取り除き、ソースプログラムをCPUが認識できるターゲットコードに変換できます。

機械語は高級言語ですか? 機械語は高級言語ですか? Aug 22, 2023 pm 05:13 PM

マシン語は高級言語ではありません。コンピュータ ハードウェアに使用される低レベル言語です。コンピュータの基盤となるハードウェアと直接対話します。マシン語はバイナリ エンコーディングを使用して命令とデータを表します。各命令は 1 つの操作に対応します, 高級言語は、人間の言語に近く、抽象化能力が高く、開発効率が高いプログラミング言語です。機械語と高級言語は、プログラミングにおいて異なる役割を果たし、それぞれに独自の利点と利点があります。適用可能なシナリオ。

JS/ArkTS高級言語をサポートする世界初のオープンソースHongmengベースの人型ロボットをリリース JS/ArkTS高級言語をサポートする世界初のオープンソースHongmengベースの人型ロボットをリリース Nov 17, 2023 pm 08:07 PM

Kuai Technologyは11月17日、深センKaihongが今朝、同社とLeju Robotが共同開発したオープンソースHongmengをベースにした初のKaihongOS人型ロボットが正式にリリースされたと発表したと報じた。公式の紹介によると、これは KaihongOS を搭載し、ロボットをキャリアとして使用し、産業やサービスなどの複数のシナリオをカバーするオールインテリジェント教育システムです。このロボットには、血中酸素心拍数センサー、温湿度センサー、赤外線温度センサー、人体誘導センサー、NFC、OLEDディスプレイ、LEDライトが装備されています。複数の関節センシングにより、意思決定をインテリジェントに実行できると同時に、ロボットは携帯電話、タブレット、コンピュータなどのデバイスとリアルタイムで相互接続できるため、従来のワイヤーハーネス接続方法が廃止され、教育効率が向上します。同時に、このロボットには 17 の機能もあります。

Cソースプログラムのmain関数はどこにあるのでしょうか? Cソースプログラムのmain関数はどこにあるのでしょうか? Nov 19, 2020 am 11:06 AM

C言語では、ソースプログラム中でのmain関数の位置は任意であると規定されており、C言語で書かれたプログラムを実行する場合、main関数がソースプログラム内のどの位置にあるかに関係なく、main関数は実行プログラムの入り口に相当します。プロセス全体において、C プログラムは常に mam 関数から実行を開始します。

Go 言語の機能分析: 高級言語ですか? Go 言語の機能分析: 高級言語ですか? Mar 23, 2024 pm 04:00 PM

Go 言語の機能分析: 高級言語ですか? Go 言語は、Google によって開発された静的に強く型付けされたプログラミング言語で、シンプルで読み書きしやすいように設計されており、効率的な同時実行機能を備えています。そこで、高級言語の定義に従って、Go 言語が高級言語であるかどうかを分析してみましょう。高級言語の定義 高級言語は、機械語よりも人間の言語に近いプログラミング言語です。簡潔な構文、読み書きが容易、および高度な抽象化という特徴があり、プログラマーは問題自体の解決に集中できます。