ホームページ  >  記事  >  バックエンド開発  >  golangでブートストラップを実装するにはどうすればよいですか?

golangでブートストラップを実装するにはどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-07-18 15:25:107109ブラウズ

Golang はブートストラップを実装しています。最初に [Go 1.4] 以降をインストールし、次に既存の Go ツール チェーンを使用して [Go 1.5] ツール チェーンの基本バージョンを作成し、最後にそれを使用して [ go_bootstrap] をビルドし、残りの標準ライブラリと標準コンポーネント。

golangでブートストラップを実装するにはどうすればよいですか?

Golang のブートストラップ実装方法:

Bootstrapping (ブートストラップ) これがプロセスです「コンパイル対象のターゲット プログラミング言語用のコンパイラ (またはアセンブラ) を作成する」ということです。一般に、ブートストラップには次のようないくつかの利点があります:

  • はブートストラップされる言語をテストするために使用されます;

  • は通常、より多くの言語の使用をサポートしますより高度な抽象化を提供する高級言語用のコンパイラを作成します。

  • コンパイラは、言語レベルでの改善からも恩恵を受けることができます。

前述したように、Google は 1 年前に Go ソース ツリーから C コードを削除する取り組みを開始しました。変換計画は 5 つのステップに分かれています:

  • フェーズ 1 - C 言語から Go 言語へのトランスレーターを開発し、既存の C コンパイラーを Go 言語に翻訳します。この段階では、元のコンパイラーが、マクロ、共用体、ポインター演算など、Go 言語への移植が難しい一部の機能を広範囲に使用していないという事実を利用します。

  • フェーズ 2 - コンパイラーのソース ツリーを変換して Go 言語コンパイラーを取得しますが、これは比較的原始的で C スタイルです。

  • フェーズ 3 - 主にパッケージを特定し、ドキュメントと単体テストを追加することにより、以前に取得したコンパイラーを Go 言語の習慣に準拠したプログラムに変換します。

  • ステージ 4 - コンパイラを最適化し、コンパイラと CPU メモリ使用量の問題を解決し、場合によっては並列化を導入します。さらに、アーキテクチャに依存しない順序付けされていないツリー (Node*) と、現在使用されているアーキテクチャに依存する順序付きリスト (Prog*) の間に新しい中間表現を導入する試みが行われています。これは、コンパイラのエラーを排除する能力を向上させることを目的としています。 nil チェックや境界チェックなどの状況における冗長な最適化機能。

  • フェーズ 5 - フロントエンドを go/parser および go/types の最新バージョンに置き換えます。

Russ 氏は、いくつかの代替案も検討したが、さまざまな要因に基づいて除外されたと述べました。これらの案は、1 年前のこの文書で説明されています。

Go のブートストラップ

コンパイラのブートストラップは通常、「鶏が先か卵が先か」問題を引き起こすため、言語をコンパイルする方法を提供する必要があります。作成する。

Go の場合、Go 1.5 をビルドするには、まず Go 1.4 以降をインストールし、次に既存の Go ツールチェーンを使用して Go 1.5 ツールチェーンの基本バージョンを作成する必要があります。 Go 1.5 ツールチェーンをコンパイルしたら (Go 1.4)、それを使用してそれ自体をビルドでき、さらにそれを使用して go_bootstrap と残りの標準ライブラリおよび標準コンポーネントをビルドできます。このプロセスでは中間ステップが追加されます。結果として得られるツールチェーンは、その後、それ自体を構築するために使用され、将来の Go バージョンに適用できます。

Go のブートストラップ実装計画について詳しく知るために、InfoQ は Russ にインタビューしました。

ブートストラップの実現は、Go 言語にとって大きなマイルストーンのようです。言語の進化において、なぜこの段階でこれをやろうと思ったのでしょうか?詳しく説明してもらえますか?

Go は優れた汎用言語ですが、Google のサーバーで実行されるような、大規模で同時実行性の高いサーバー側ソフトウェアを作成するときに使用するように設計されました。ブートストラップが早期に実装されると、Go コンパイラが最初の大規模な Go 言語プログラムとなり、言語設計に悪影響を及ぼし、本当の目的から遠ざかってしまいます。

ブートストラップを早期に実装しない技術的な理由もいくつかあります。移植性、ソース コードからのコンパイルがブートストラップよりも簡単、また、できるだけ早く安定したコンパイラを実装できるなどです。

Go を使用して Go を構築すると、C を使用する場合と比較して、特定のどの領域に明らかな改善があると思いますか?

Ken Thompson はかつて私に、Go でプログラムを書くのは C を使うより簡単だと言いました。その理由の 1 つは、Go によって、ダングリング ポインタ、メモリ リーク、バッファ オーバーフロー、深い再帰中のスタック オーバーフロー、void* の誤用、予期しない数値変換など、いくつかの一般的なタイプの C バグが排除されるためです。

標準の Go ツールチェーンは、標準の C ツールチェーンよりもモジュール性、単体テスト、パフォーマンス分析をサポートしていますが、私が最も興奮するのは、内部 API を変更したりリファクタリングするときです。自動化されたプログラムの書き換え (gofix など) を適用できる見込みです。 。

「Go 1.3 コンパイラのオーバーホール」ドキュメントでは、既存のコンパイラを C から Go に移行するための 5 段階のプロセスについて説明しています。これまでにどのような手順が完了しましたか?残りのステップはいつ完了する予定ですか?

Go プロジェクトの場合、言語のランタイムを C から Go に変換することがより重要なので、これを最初に実行しました。さて、コンパイラに戻ります。

ドキュメントの観点から見ると、現在はフェーズ 2 にあります。トランスレータは完成しており、ランタイムの変換に役立ちました。これをコンパイラに適用しています。 Go 1.5 コンパイラーへの移行を完了したいと考えています。クリーンアップ作業は Go 1.5 以降のプロジェクトで実行されます。

関連する学習に関する推奨事項: Go 言語チュートリアル

以上がgolangでブートストラップを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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