ホームページ  >  記事  >  バックエンド開発  >  囲碁は言語ですか?

囲碁は言語ですか?

青灯夜游
青灯夜游オリジナル
2022-12-19 13:49:436672ブラウズ

go は言語です。 Go (Golang とも呼ばれる) は、Google によって開発された、静的に強く型付けされ、コンパイルされ、同時実行され、ガベージ コレクションが可能なプログラミング言語です。 Go は、コンパイラを使用してコードをコンパイルするコンパイル言語です。コンパイラはソース コードをバイナリ (またはバイトコード) 形式にコンパイルします。コードをコンパイルするときに、コンパイラはエラーをチェックし、パフォーマンスを最適化し、さまざまなプラットフォームで実行できるバイナリを出力します。

囲碁は言語ですか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

go は言語です。

Go (Golang とも呼ばれる) は、Google の Robert Griesemer、Rob Pike、Ken Thompson によって開発された、静的に強く型付けされたコンパイル言語です。 Go 言語の構文は C に似ていますが、その機能には、メモリ安全性、GC (ガベージ コレクション)、構造形式、CSP スタイルの同時コンピューティングが含まれます。

Go 言語は、「C に似た言語」または「21 世紀の C 言語」と呼ばれることもあります。 Go は、同様の式構文、制御フロー構造、基本データ型、呼び出しパラメータ値の転送、ポインタ、その他多くのアイデアを C 言語から継承しており、C 言語が常に重視してきたコンパイルされたマシンコードの実行効率も備えており、既存の Seamless と一貫性があります。オペレーティングシステムへの適応。

Go 言語にはクラスや継承の概念がないため、Java や C と同じようには見えません。しかし、インターフェースの概念を通じてポリモーフィズムを実現します。 Go 言語には明確で理解しやすい軽量型システムがあり、型間に階層はありません。したがって、Go 言語はハイブリッド言語であると言えます。

Go はコンパイル済み言語です。

Go はコンパイラを使用してコードをコンパイルします。コンパイラはソース コードをバイナリ (またはバイトコード) 形式にコンパイルします。コードをコンパイルするときに、コンパイラはエラーをチェックし、パフォーマンスを最適化し、さまざまなプラットフォームで実行できるバイナリを出力します。 Go プログラムを作成して実行するには、プログラマは次の手順を実行する必要があります。

  • テキスト エディターを使用して Go プログラムを作成します。

  • ファイルを保存します。

  • プログラムをコンパイルします。

  • コンパイルされた実行可能ファイルを実行します。

これは、コンパイル手順を含まない Python、Ruby、JavaScript などの言語とは異なります。 Go にはコンパイラーが付属しているため、別のコンパイラーをインストールする必要はありません。

Go 言語を学ぶべき理由

システム プログラムやネットワーク ベースのプログラムを作成したい場合、Go 言語は非常に良い選択肢です。比較的新しい言語であるこの言語は、大規模な同時ネットワーク プログラムを作成する際の課題に対処するために、経験豊富で尊敬されているコンピューター科学者によって設計されました。

Go 言語が登場するまで、開発者は常に非常に難しい選択に直面していました。実行速度は速いがコンパイル速度が不十分な言語 (C など) を使用するか、それとも、コンパイル速度は速いですが、理想的なコンパイル速度ではありません。実行効率が悪い言語 (.NET、Java など)、または開発の難易度は低いが平均的な実行速度を持つ動的言語はどうでしょうか?明らかに、Go 言語は、高速なコンパイル、効率的な実行、容易な開発という 3 つの条件の間で最適なバランスを実現しています。

Go 言語はクロスコンパイルをサポートしているため、たとえば、Linux システムを実行しているコンピュータ上で Windows 上で実行できるアプリケーションを開発できます。これは、UTF-8 を完全にサポートする最初のプログラミング言語です。これは、UTF-8 でエンコードされた文字列を処理できるという事実にも反映されているだけでなく、そのソース コード ファイル形式も UTF-8 エンコードを使用しています。 Go 言語はまさにインターナショナルです!

Go 言語の特徴

  • シンプルな構文

構文スタイルは置いておいて、型とルールの点で、Go は C99 および C11 と多くの類似点を持っています。これが、Go 言語が「NextC」と名付けられている重要な理由でもあります。

Go 言語の文法は、単純さと複雑さの両極端にあります。 C 言語は非常にシンプルなので、コードを 1 行書くたびに、コンパイル後にどのようになるか、命令がどのように実行されるか、メモリがどのように割り当てられるかなどを頭の中で想像できます。 C の複雑さは、あいまいで無関係なルールが多すぎることであり、これが本当に頭の痛い問題です。それに比べて、囲碁はゼロからスタートし、歴史の重荷がなく、多くの経験と教訓を学んだ後、厳格なルールとシンプルな組織を備えた世界をゼロから計画することができます。

Go 言語の文法規則は厳格で、曖昧さはなく、黒魔術のバリエーションもありません。誰が書いても基本的に同じコードなので、Go 言語は習得しやすいです。保守性の向上と引き換えに、「柔軟性」と「自由」の一部を放棄する価値があると思います。

「 」と「--」を演算子からステートメントにダウングレードし、ポインターを保持しますが、デフォルトでポインター操作を防止します。その利点は明らかです。さらに、スライスと辞書を組み込み型として使用し、それらを実行時レベルから最適化することも「シンプル」であるとみなされます。

  • 同時実行モデル

現在、同時プログラミングはプログラマーの基本スキルとなっており、さまざまな技術コミュニティで関連するディスカッション トピックが数多く見られます。この場合、Go 言語は非常に大胆で、特徴的ではなく、基本的にすべてを同時実行することを実行しており、Goroutine を使用して実行時に main.main エントリ関数を含むすべてを実行します。

Goroutine は Go の最も重要な機能であると言えます。コルーチンのようなアプローチを使用して同時ユニットを処理しますが、ランタイム レベルでより詳細な最適化も実行します。これにより、構文的に並行プログラミングが非常に簡単になり、コールバックを処理する必要がなく、スレッドの切り替えに注意を払う必要もなく、キーワードが 1 つだけで、シンプルかつ自然です。

チャネルを使用して、CSP モデルを実装します。同時実行ユニット間のデータ結合を分離し、それぞれが独自の役割を実行できるようにすることは、メモリ共有とロックの粒度に苦労しているすべての開発者にとって歓迎すべき救済策です。欠点があるとすれば、真の流通を実現するために、プロセス内からプロセス外へコミュニケーションを拡大するためのより大きな計画が必要であるということです。

  • メモリ割り当て

すべてを同時実行するのは良いことですが、多くの問題も発生します。高い同時実行性の下でメモリの割り当てと管理をどのように実現するかは、難しい問題です。幸いなことに、Go は同時実行向けに設計された高性能メモリ割り当てコンポーネントである tcmalloc を選択しました。

メモリ アロケータは、3 つの主要コンポーネントの中で実行時に最も変更が少ない部分であると言えます。メモリ アロケータは、ガベージ コレクタと連携するために変更された内容を除いて、tcmalloc の元の構造を完全に保持しています。キャッシュを使用して現在の実行スレッドにロックフリーの割り当てを提供し、複数のセントラルを使用して異なるスレッド間でメモリユニットの再利用のバランスをとります。より高いレベルでは、ヒープは大きなメモリ ブロックを管理し、それらを異なるレベルの再利用されるメモリ ブロックに分割します。高速割り当てとセカンダリ メモリ バランシング メカニズムにより、メモリ アロケータは高圧下でもメモリ管理タスクを適切に完了できます。

最近のバージョンでは、コンパイラの最適化は非常に効果的です。ガベージ コレクションの圧力を軽減し、管理消費量を削減し、実行パフォーマンスを向上させるために、スタック上にオブジェクトを割り当てるために最善を尽くします。オブジェクト プールと自律的なメモリ管理の使用を強制するような時折のパフォーマンスの問題を除いて、基本的にメモリ管理操作に参加する必要はないと言えます。

  • ガベージ コレクション

ガベージ コレクションは常に問題となっています。 Java は当初、ガベージ コレクションの非効率さから長らく嘲笑されていましたが、その後、Sun は多くの人や技術を次々と取り入れて発展し、今日に至りました。しかし、それでも、Hadoop などの大容量メモリ アプリケーションのシナリオでは、ガベージ コレクションは依然として限界があり、困難です。

Java と比較すると、Go はより多くの困難に直面しています。ポインタが存在するため、再利用されたメモリを縮小することはできません。幸いなことに、ポインター演算はブロックされています。そうでない場合、正確なリサイクルを実現するのは困難です。

アップグレードするたびに、ガベージ コレクターがコア コンポーネントの最も変更された部分になる必要があります。同時クリーンアップから STW 時間の短縮、Go バージョン 1.5 で同時マーキングが実装されるまで、段階的に 3 色のマーキングや書き込みバリアなどが導入されるまで、すべてはユーザー ロジックに影響を与えることなくガベージ コレクションの動作を改善するためのものです。努力にもかかわらず、現在のバージョンのガベージ コレクション アルゴリズムは使用できるとしか言えず、実用には程遠いです。

  • 静的リンク

Go が最初にリリースされたとき、静的リンクは利点として宣伝されました。何も添付せずに、コンパイルされた実行可能ファイルだけをデプロイできます。これは良いアイデアだと思われましたが、その後傾向が変わりました。いくつかのバージョンを続けて、コンパイラはダイナミック ライブラリの buildmode 関数を改善しており、しばらくの間、状況は少し恥ずかしいものになりました。

未完成の buildmode モードについてはさておき、静的コンパイルの利点は明らかです。ランタイムおよび依存ライブラリは実行可能ファイルに直接パッケージ化されているため、展開およびリリースの操作が簡素化され、事前に実行環境をインストールしたり、多くのサードパーティ ライブラリをダウンロードしたりする必要はありません。ライブラリの依存関係は常に問題となるため、このシンプルなアプローチはシステム ソフトウェアを作成する場合に非常に役立ちます。

  • 標準ライブラリ

充実した機能と信頼できる品質を備えた標準ライブラリは、プログラミング言語に十分なパワーを提供します。ほとんどの基本的な機能の開発はサードパーティの拡張機能を使用せずに完了できるため、学習コストと使用コストが大幅に削減されます。最も重要なことは、標準ライブラリはアップグレードと修復が保証されており、サードパーティのライブラリでは利用できないランタイムからの詳細な最適化の利便性も得られることです。

Go 標準ライブラリは完全にはカバーされていませんが、それでも非常に豊富です。賞賛に値するものの 1 つは net/http で、わずか数個の簡単なステートメントで高性能 Web サーバーを実装でき、これは常に注目を集めてきました。さらに、これをベースにした多数の優れたサードパーティ フレームワークにより、Go は Web/マイクロサービス開発標準の 1 つの地位に押し上げられました。

もちろん、優れたサードパーティのリソースも言語エコシステムの重要な部分です。近年登場したいくつかの言語の中でもGoは独特で、優れた作品が頻繁に登場しており、Goを学ぶ上での参考にもなります。

  • ツールチェーン

#完全なツール チェーンは、日々の開発にとって非常に重要です。 Go はここでかなり良い仕事をしており、コンパイル、フォーマット、エラー チェック、ヘルプ ドキュメント、サードパーティ パッケージのダウンロードと更新のための対応するツールを備えています。機能は完璧ではないかもしれませんが、少なくともシンプルで使いやすいです。

単体テスト、パフォーマンス テスト、コード カバレッジ、データ コンペティション、チューニング用の pprof などの組み込みの完全なテスト フレームワーク。これらは、コードが正しく安定して実行できることを確認するために不可欠なツールです。

さらに、ランタイム監視情報、特にガベージ コレクションと同時スケジューリング追跡を環境変数を通じて出力することもできます。これは、アルゴリズムを改善し、ランタイム パフォーマンスを向上させるのにさらに役立ちます。

プログラミング関連の知識について詳しくは、

プログラミング ビデオをご覧ください。 !

以上が囲碁は言語ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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