Go 言語は、1. インポート参照管理メソッドの使用、2. テンプレートのコンパイル負担がない、3. バージョン 1.5 以降のブートストラップ コンパイラの最適化、4. キーの数が少ない、合計 25 個のキーワードがあるため、コンパイルが高速です。 Go 言語で作成すると、コンパイル プロセス中のコード分析が簡素化されます。
このチュートリアルの動作環境: Windows 10 システム、GO 1.11.2、Dell G3 コンピューター。
Go の主な機能は、コンパイル速度、実行速度、メモリ管理、同時プログラミングです。
もちろん、Go 言語の設計は完全にゼロから始まるわけではありません。当初、Go チームはコンパイルを設計して実装しようとしました。 Go 言語のフロントエンド。C ベースの gcc コンパイラはマシン コードにコンパイルされます。この gcc のフロントエンド コンパイラは、現在の Go コンパイラの 1 つである gccgo です。
Go のコンパイルが速い理由について話すのではなく、まず C のコンパイルが遅い理由について話しましょう。C は gcc を使用してコンパイルすることもできます。コンパイル速度の違いのほとんどは、言語設計自体に起因すると考えられます。
この問題について説明する前に、説明する必要があるのは、ここで比較したコンパイル速度はすべて静的コンパイル下でのものであるということです。
静的コンパイル: コンパイラーは実行可能ファイルをコンパイルするときに、使用されるリンク ライブラリを抽出する必要があります。は実行可能ファイルにパッケージ化されており、コンパイル結果は 1 つの実行可能ファイルのみになります。
動的コンパイル: 実行可能ファイルには独立したライブラリ ファイルが必要です。実行可能ファイルのサイズを減らすためにライブラリを実行可能ファイルにパッケージ化しないでください。実行中にライブラリを呼び出すだけです。
2 つの方法には、それぞれ長所と短所があります。前者では、ライブラリの異なるバージョンの互換性の問題を管理する必要がありませんが、後者では、メモリとストレージの使用量を削減できます (異なるプログラムが共有できるため)同じライブラリ). 2 つの方法のどちらが優れているか、それとも弱いかは、特定のエンジニアリング上の問題によって決まります。Go のデフォルトのコンパイル方法は静的コンパイルです。
議論したい質問に戻ります。なぜ C のコンパイルは遅いのでしょうか?
C コンパイルが遅い理由は主に 2 つあります:
1. ヘッダー ファイルのインクルード メソッド
2. テンプレートのコンパイル
C include メソッドを使用してヘッダー ファイルを参照すると、乗算器レベルでコンパイルする必要があるコードが増加します。たとえば、同じヘッダー ファイルが同じプロジェクト内の N 個のファイルにインクルードされている場合、コンパイラはヘッダー ファイルをコードのすべての部分に導入するため、同じヘッダー ファイルが N 回コンパイルされることになります (これはほとんどの場合不要です);
C で使用されるテンプレートは、汎用プログラミングをサポートするためのものです。さまざまな Type ジェネリック関数を作成する場合、非常に便利ですが、コンパイラに多くの不必要なコンパイル負荷が追加されます。
もちろん、C にはこれら 2 つの問題に対して後続の最適化手法が多数ありますが、多くの開発者は、これにあまり多くの時間とエネルギーを費やしたくありません。
最近のプログラミング言語のほとんどは、ファイルの導入方法に include
ヘッダー ファイルの代わりに import モジュールを使用していました。Import はコンパイルの繰り返しの問題を解決しました。もちろん Go もそれを使用しています. import メソッド; テンプレートのコンパイルの問題については、Go はその設計思想においてシンプルなアプローチに従っており、関数型プログラミングを設計フレームワークに組み込んでいないため、当然のことながら、テンプレートのコンパイルによって生じる時間のオーバーヘッドはありません (これもまた大きなオーバーヘッドです)。汎用サポートなし)、人々が Go 言語に不満を抱く理由)。つまり、私の意見では、Go は主に 4 つの理由でコンパイルが速くなります:
1. インポート参照管理メソッドが使用されている;
2. いいえテンプレートのコンパイル負荷;
3. バージョン 1.5 以降のブートストラップ コンパイラの最適化;
4. キーワードの減少。
Go 言語には 25 のキーワードがあります:
break default func インターフェース select case defer go map struct chan else goto package switch const fallthrough if range type Continue for import return var Go 言語のキーワードを意図的に少なくする理由は、コンパイル プロセス中のコード分析を簡素化するためです。他の言語と同様、キーワードを識別子として使用することはできません。
したがって、コンパイルを高速化し、C をあきらめて Go に切り替えるには、汎用プログラミングの利点を放棄するかどうかも検討する必要があります。
注: ジェネリックは Go 2 バージョンでサポートされる場合があります。
注:
Go はまだ C の究極のパフォーマンスを達成することはできませんが、ほとんどの場合、それに非常に近づいています;
Go と Java の間のアルゴリズムの時間オーバーヘッドは次のとおりです。違いを見分けるのは難しいですが、メモリ オーバーヘッドの点では Java の方がはるかに高くなります。
上記のほとんどの場合、少なくとも時間とメモリ オーバーヘッドの点では Go の方が Python よりはるかに優れています。
推奨される学習: Golang チュートリアル
以上がGo 言語のコンパイルは速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。