いくつかのプログラミング言語を紹介します — Go 言語

いくつかのプログラミング言語を紹介します — Go 言語

Go言語

導入

Go 言語 (または Golang) は 2007 年に誕生し、2009 年に正式にリリースされました。Go は非常に若い言語であり、その主な目標は「Python などの動的言語の開発速度と、C/C++ などのコンパイル言語のパフォーマンスとセキュリティを組み合わせる」ことです。

Go 言語は、プログラミング言語設計のもう 1 つの試みであり、C 系言語を大幅に改善したものであり、基盤となるオペレーティング システムにアクセスできるだけでなく、ネットワーク プログラミングと同時プログラミングの強力なサポートも提供します。Go 言語には多くの用途があり、ネットワーク プログラミング、システム プログラミング、同時プログラミング、分散プログラミングに使用できます。

Go 言語の導入は、アプリケーションのパフォーマンスを損なうことなくコードの複雑さを軽減することを目的としており、「展開が簡単、同時実行性が高い、言語設計が優れている、実行パフォーマンスが優れている」という利点があり、現在、多くの IT 企業が導入しています。中国では Go. 言語開発プロジェクトを採用しています。

Go 言語は、「C に似た言語」または「21 世紀の C」と呼ばれることもあります。Go は、C 言語の同様の式構文、制御フロー構造、基本データ型、呼び出しパラメーター値の受け渡し、ポインター、その他多くのアイデアを継承しており、コンパイルされたマシン コードの操作効率やオペレーティング システムの既存のシームレスな適応も同様です。

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

さらに、Docker、Go-Ethereum、Thraform、Kubernetes など、多くの重要なオープンソース プロジェクトが Go で開発されています。

Go言語の創始者

言語を評価するときは、設計者の動機とその言語が解決しようとしている問題を理解することが重要です。Go 言語は、コンピューター サイエンスの分野の重鎮である Ken Thompson 氏と Rob Pike、Robert Griesemer 氏の手によるものです

  1. ケン・トンプソン

ベル研究所の Unix チームのメンバーであり、1970 年代に C 言語、Unix、およびプラン 9 の創設者の 1 人であり、オリジナルの UNIX オペレーティング システムを設計および実装しました。この観点から見ると、彼のコンピュータ サイエンスへの貢献はどのようなものでしょうか。強調しすぎませんか?彼はまた、UTF-8 エンコーディング スキームの設計に関して Rob Pike と協力しました。

  1. ロブ・パイク

Go 言語プロジェクトのゼネラル ディレクターであり、ベル研究所 Unix チームのメンバー。UTF-8 の設計に加えて、分散マルチユーザー オペレーティング システム Plan 9、Inferno オペレーティング システム、Limbo プログラミング言語の開発にも貢献しました。 、共著「The Unix Programming Environment」は、UNIX の設計概念を正統的に詳述しました。

  1. ロバート・グリーズマー

Google に勤務し、Java HotSpot 仮想マシンの開発に参加し、言語設計を深く理解しており、Chrome ブラウザと Node.js で使用される Google の V8 JavaScript エンジンのコード生成部分を担当しています。

これらのコンピュータ サイエンス分野の重鎮は、Google のニーズを満たすために Go 言語を設計しました。この言語の設計には 2 年かかり、チーム全体の長年の経験とプログラミング言語設計に関する深い知識が組み込まれました。設計チームは、Pascal、Oberon、C の設計の知恵を活用しながら、Go に動的言語の利便性を与えました。したがって、Go 言語は経験豊富なコンピューター科学者の言語設計哲学を体現しており、世界最大のインターネット企業の 1 つのために設計されています。

Go 言語の設計者は全員、C++ に不満を感じたために言語を設計したと述べています。Google I/O 2012 での Go Design Team のミートアップで、Rob Pike は次のように述べました。

私たちは C++ 開発を頻繁に行っており、コンパイルが完了するのを待つのにうんざりしています。これは冗談ではありますが、ほぼ本当です。

主な機能

Go の構文は C 言語に似ていますが、変数の宣言が異なります。Go はガベージ コレクションをサポートしています。Go の並列処理モデルはTony Hall の Communicating Sequential Processes (CSP) に基づいており、同様のモデルに従う他の言語には Occam や Limbo などがありますが、Piチャネリングなどの操作の機能も備えています。1.8 1.8バージョン1.8では、プラグイン (Plugin) のサポートがオープンされました。これは、一部の関数をGo から動的にロードできることを

C++と比べると、Goには列挙、例外処理、継承、ジェネリック、アサーション、仮想関数などの機能は含まれていませんが、スライス(Slice)型、同時実行性、パイプライン、ガベージコレクション、インターフェイス(Interface)などの機能が追加されています。などの言語レベルのサポート。Go のバージョン 2.0 はジェネリックスをサポートし、アサーションの存在に対して否定的な立場を取り、型継承を提供しないことでそれ自体を正当化します。

Java とは異なり、Go には文字列型と同様に、連想配列 (ハッシュまたは辞書とも呼ばれます) が組み込まれています。

Go言語の特徴

簡単な文法

文法的なスタイルはさておき、型やルールだけを見ても、Go は C99 や C11 と多くの類似点があり、これが Go 言語が「NextC」と名付けられている重要な理由でもあります。

**Go 言語の構文は、単純さと複雑さの両極端にあります。**C 言語は非常にシンプルなので、コードを 1 行書くたびに、コンパイル後の内容、命令の実行方法、メモリの割り当て方法などを頭の中で想像できます。C の複雑さは、曖昧で限界のあるルールが多すぎることであり、これが本当に頭の痛い問題です。それに比べて、囲碁はゼロからスタートし、歴史的な負担がなく、多くの教訓を学んだ後、厳格なルールとシンプルな順序で世界をゼロから計画することができます

Go 言語の文法規則は厳格で、曖昧さはなく、黒魔術のようなバリエーションの使用はありません。コードを書く人は基本的に同じなので、Go 言語は学びやすいです。保守性の向上と引き換えに、ある程度の「柔軟性」や「自由」を放棄する価値はあると思います。

を演算子からステートメントにダウングレードする++こと--、ポインタを保持しながらデフォルトでポインタ演算をブロックすることの利点は明らかです。また、スライスと辞書を組み込み型として使用し、実行時にそれらを最適化することは「単純」であると考えられます。

同時実行モデル

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

おそらくGoroutineGo の最も注目すべき機能です。コルーチンに似た方法を使用して同時ユニットを処理しますが、ランタイム レベルでより詳細な最適化を行います。これにより、構文的に同時プログラミングが非常に簡単になり、コールバックを処理する必要がなく、スレッドの切り替えに注意を払う必要がなく、キーワードが 1 つだけで、シンプルかつ自然になります。

channelCSPモデルを実現するマッチング。同時実行ユニット間のデータ結合を解体し、その役割を実行することは、メモリ共有とロックの粒度に苦労しているすべての開発者が期待できる安心感です。欠陥があるとすれば、真の分散を達成するために、プロセス内からプロセス外へコミュニケーションを拡大するためのより大きな計画が必要であるということです

メモリ割り当て

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

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

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

ガベージコレクション

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

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

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

静的リンク

Go が最初にリリースされたとき、静的リンクは美徳であると宣伝されました。実行可能ファイルとしてコンパイルするだけで済み、何も追加せずにデプロイできますこれは良いことのように思えましたが、その後雰囲気が変わりました。いくつかの連続したバージョンで、コンパイラはbuildmodeダイナミック ライブラリの機能を改善しており、しばらくの間は少し恥ずかしい状況になります。

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

標準ライブラリ

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

Go の標準ライブラリは完全にカバーされているとは言えませんが、非常に豊富です。中でも、常に宣伝の目玉となっている、たったnet/http数回の簡単な発言で高いパフォーマンスを達成できることは賞賛に値します。Web Serverさらに、これをベースにした多数の優れたサードパーティによって、 Go は開発標準の 1 つの地位にFrameworkまで押し上げられました。Web/Microservice

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

ツールチェーン

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

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

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

マスコット

Go 言語にはマスコットがあり、カンファレンス、ドキュメント ページ、およびブログ投稿には、主に下の写真の Go Gopher が含まれています。この Go Gopher は、Go のデザイナーの 1 人である Rob Pike の妻でもある才能あるイラストレーター Renee French によってデザインされました。

簡単なプログラム

「Hello World!」を出力します。

package main 

import (
    "fmt" 
)

func main() {
    
     
    fmt.Println("Hello World!")
}

A+Bの問題

package main
import "fmt"
func main() {
    
    
    var a, b int
    fmt.Scanf("%d%d", &a, &b)
    fmt.Println(a+b)
}

単純なHTTPサーバーを実装する

package main

import (
    "net/http"
)

func main() {
    
    
    http.Handle("/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":8080", nil)
}

おすすめ

転載: blog.csdn.net/ZH_qaq/article/details/131260383