IDEとしてのUnix:コンパイル

Unixには多くのコンパイラとインタプリタがありますが、ここではCコードをコンパイルする手段としてgccについてのみ説明し、インタプリタの例としてperlの使用について簡単に触れます。

Gcc



GCCは非常に立派な年齢のコンパイラのセットであり、GPLの下で配布されています。 CおよびC ++プログラムを操作するためのツールとして知られています。 Clangなど、LLVMインフラストラクチャを使用するより新しい代替手段がありますが、Unixライクなシステムでの無料ライセンスと遍在性はその継続的な人気を確約しています。

メインのgcc実行可能ファイルは、通常の意味ではコンパイラとしてではなく、コードの解析、コンパイル、リンク、その他のアクションを実行する多くの個別のプログラミングツールの抽象レイヤーとして表現する方が適切です。 これは、Cコードから作業バイナリを取得するだけでなく、この複雑なプロセスのすべてのステップを詳細に調べ、必要に応じてニーズに合わせて調整できることを意味します。

ここでは、メイクファイルの使用については説明しませんが、1つのファイルよりもプロジェクトで必要になる可能性があります。 ビルド自動化ツールに関する次の記事でメイクファイルについて触れます。

オブジェクトコードのコンパイルとビルド



オブジェクトコードは次のコマンドでコンパイルされます。

$ gcc -c example.c -o example.o 


コードが正しい場合、リンクされていないバイナリオブジェクトファイルが現在のフォルダーにexample.oという名前で作成されるか、問題が表示されます。 結果のファイル内を見て、その内容をアセンブリ言語で次のように見ることができます。

 $ objdump -D example.o 


または、 -Sオプションを使用して、結果のアセンブラコードをすぐに表示するようにgccに要求できます。

 $ gcc -c -S example.c -o example.s 


アセンブラコードの出力は、ソース自体の出力と組み合わせるのに役立ちます。これは、次のように入力することで実現できます。

 $ gcc -c -g -Wa,-a,-ad example.c > example.lst 


プリプロセッサ



Cプリプロセッサ( cpp )は、ヘッダーファイルをインクルードし、マクロを定義するために一般的に使用されます。 これはgccコンパイルプロセスの標準的な部分ですが、 cppを直接呼び出すことで生成されるコードを表示できます。

 $ cpp example.c 


ソースコードは最終的な形式で出力され、コンパイルの準備ができ、マクロが置き換えられ、外部ファイルが含まれます。

オブジェクトのリンク



1つ以上のオブジェクトファイルを対応する実行可能ファイルにリンクできます。

 $ gcc example.o -o example 


この例では、 gccは単にGNUリンカーであるldを呼び出します。 このコマンドは、 exampleという実行可能ファイルを作成します。

コンパイル、アセンブリ、リンク



上記のすべては、次のコマンドを使用して1ステップで実行できます。

 $ gcc example.c -o example 


この方法は簡単ですが、オブジェクトを個別にコンパイルするとパフォーマンスが向上します。変更されていないコードをコンパイルする必要はありませんが、これについては次の記事で説明します。

外部ファイルとリンクを含める



Cファイルとヘッダーファイルは、 -lオプションを使用してコンパイルに明示的に含めることができます。

 $ gcc -I/usr/include/somelib.h example.c -o example 


同様に、システムフォルダー( /libまたは/usr/lib )のいずれかで使用可能な、既にコンパイルされたシステムライブラリにコードを動的にリンクする必要がある場合、たとえばncurses 、これは-lスイッチを使用して実現できます。

 $ gcc -lncurses example.c -o example 


外部リレーションを大量にコンパイルする過程で、それらを環境変数に追加するのが理にかなっています:

 $ export CFLAGS=-I/usr/include/somelib.h $ export CLIBS=-lncurses $ gcc $CFLAGS $CLIBS example.c -o example 


ところで、Makefileは、そのような些細なことを心配することから私たちを救うために作成されました。

編集計画



gcc内部キッチンの詳細を表示するには、 -vスイッチを追加すると、コンパイルプランが標準エラー出力ストリームに出力されます。

 $ gcc -v -c example.c -o example.o 


オブジェクトまたは実行可能ファイルを生成する必要がない場合は、正確にするために-###を使用できます。

 $ gcc -### -c example.c -o example.o 


知らないうちにgccが実行するアクションを確認することは非常に便利です。さらに、この方法でコンパイル中に不要なステップを特定できます。

拡張エラー報告



-Wallおよび/または-pedanticキーを追加して、gccが必ずしもエラーではないが次のようなケースを警告するようにすることができます。

 $ gcc -Wall -pedantic -c example.c -o example.o 


これらのオプションは、 MakefileまたはVimmakeprg定義に含めると便利です。Quickfixウィンドウでうまく機能し、読みやすく、互換性があり、エラーのないコードを作成できるためです。

コンパイルプロセスのプロファイリング



-timeオプションを有効にして、 gccが出力テキストに各ステップの実行時間を表示するようにすることができます。

 $ gcc -time -c example.c -o example.o 


最適化



Gccには最適化キーがあり、コンパイル時間を長くすることで、より効率的なオブジェクトコードと関連バイナリを作成するように要求できます。 -O2は、リリースされたコードの中間点だと考えています。

 gcc -O1 gcc -O2 gcc -O3 


他のBashコマンドと同様に、これらはすべてVimから直接呼び出すことができます。

 :!gcc % -o example 


通訳者



Unixシステムで解釈されるコードへのアプローチは異なります。 私の例では、Perlを使用しますが、たとえばPythonやRubyのコードにも同じ原則が適用されます。

インラインコード



Perlコードの行は、インタプリタによって次のいずれかの方法で直接実行できます。最初の方法は、おそらくPerlを使用する最も簡単で最も一般的な方法です。 2番目はheredoc構文を使用し、3番目は古典的なUnixパイプラインです。

 $ perl -e 'print "Hello world.\n";' $ perl <<<'print "Hello world.\n";' $ echo 'print "Hello world.\n";' | perl 


もちろん、日常生活では、次のように呼び出すことができるファイルにコードを保存します。

 $ perl hello.pl 


-cスイッチを使用して、コードを実行せずにコードの構文を確認できます。

 $ perl -c hello.pl 


実行可能なバイナリのようなスクリプトを、それが何であるかを心配することなく使用したい場合があります。 これを行うために、いわゆる「 シェバン 」が最初の行としてスクリプトに追加され、このファイルが実行のために転送されるインタープリターへのパスを示します。

 #!/usr/bin/env perl print "Hello, world.\n"; 


その後、 chmodを呼び出すことにより、スクリプトを実行可能ファイルの属性に設定できます。 拡張子を削除してファイルの名前を変更することもお勧めです。これは、ファイルがほぼ実際の実行可能ファイルと見なされるようになったためです。

 $ mv hello{.pl,} $ chmod +x hello 


次に、インタープリターを指定せずに、ファイルを直接呼び出すことができます。

 $ ./hello 


このキッチン全体が非常にうまく機能するため、 adduserなどの多くの標準Linuxシステムユーティリティは、実際にはPerlまたはPythonスクリプトです。

次の出版物では、通常のIDEに匹敵するプロジェクトをビルドするためにmakeを使用する方法について説明します。

続行するには...

IDEとしてのUnix:はじめに
IDEとしてのUnix:ファイル
IDEとしてのUnix:テキストの操作
IDEとしてのUnix:コンパイル

Source: https://habr.com/ru/post/J151314/


All Articles