ゴー言語の概要[翻訳]

言語の概要を行きます

この記事要約:本稿ではゴー、生態系および実装の非常に一般的な言語の定義をまとめたものが、また、様々なニーズに対応する詳細情報を参照文書を与えるこの記事の最後を参照してみてください。

私たちは、「言語を行く」の話をするたびに、それが異なるため多くのことに話を聞い異なるシナリオであってもよいです。だから私は囲碁言語の概要とその生態系をやろう、と関連文書は(ビットも私が最近遭遇した多くの実用的な問題を含んで寄せ集め、等であってもよい)本書の各セクションに記載されています。それでは始めましょう:

言語プログラミング行きます

ゴー言語は、プログラミング言語です。権威として、行く言語仕様は表し形式の仕様とコードコードの意味を定義します。これは、仕様言語を行くされていません満たしていません。同様に、仕様されていない何を述べてきたが、言語の一部とは見なされません。仕様は現在、ゴー、半年ごとに新しいリリースの開発チームによって維持されています。私はこの記事の最新バージョンを書きます1.12

言語仕様が指定する行きます:

  • 文法
  • 変数の値を入力し、セマンティック
  • 事前に宣言した識別子とその意味
  • ゴーランプログラム
  • 特別危険なパケット(意味論のすべてが含まれていないが)

仕様がなければなりませんあなたが言語の囲碁コンパイラを実現させるには十分。実際には、異なるコンパイラの数を達成するために、この上の多くの人がすでにあります。

コンパイラを移動して、実行時に

言語仕様自体はあまり有用であるだけで、テキスト文書、です。あなたがそれを必要とすることは、コンパイラ(解析は、ソースコードを調べて、実行可能な形式に変換)とランタイム(実行環境のコードを提供するために必要な時間)これらのセマンティックソフトウェアを達成することです。このような多くのソフトウェア・ポートフォリオがありますが、彼らは多かれ少なかれ、少し異なっています。例としては、次のとおりです:

  • gc、純粋な移動を達成するために、独自の言語を開発するために、言語の開発チームを行くコンパイラとランタイム(コンパイルのごく一部含まれています)。これは、囲碁の言語と一緒にリリースされます。そして、他のそのようなツールが異なっている、gcそれがされていない厳密に、コンパイラ、アセンブラ、リンカを区別-彼らはの実現に多くのコードを共有し、いくつかの重要な責務を共有したり、渡します。そのため、一般の異なるバージョンでリンクすることができないgcパッケージのコンパイル。
  • gccgoとlibgo、そしてそのフロントエンドGCCランタイム。これは、Cで実装され、また、ゴー開発チームによって維持されています。しかし、それはgccの組織の一部であり、gccのリリースサイクルのリリースに合わせて、それは少し「最新」バージョンの囲碁言語仕様の後ろにあることが多いです。
  • llgo、LLVMフロントエンド。私はかなりそれを理解していません。
  • gopherjs、囲碁コードはJavaScriptのにコンパイルし、実行としてのJavaScript VMといくつかのカスタムコードを使用しています。長期的には、のためにgc獲得ネイティブサポートWebAssembly、解消される可能性が高いです。
  • tinygo小規模プログラミングのため実現は、不完全です。それをカスタマイズすることができ、実行は、マイクロコントローラ(ベアメタル)またはWebAssembly仮想マシン上で実行されます。理由は、その制限のため、技術的に全ての機能が、それは囲碁言語を達成していない-それは主に、ガベージコレクション、同時実行性と反射の欠如に反映されています。

そこ達成するために、より多くのがありますが、あなたが別の実装を理解させるのに十分なされています。上記の各方法は、囲碁の言語を達成するためにさまざまな方法で使用し、独自の特色を持っています。違いは、彼らが(次の文のいくつかは少し奇妙であってもよいし、この点を説明するために)が存在することがあります。

  • int/ uintサイズ-長さが32ビットまたは64ビットであってもよいです。
  • そのようなメモリ割り当て、ガベージコレクションと同時達成などランニングの基本的な機能の実装。
  • トラバーサルmap順序は、囲碁の言語で定義されていません- gcどうやらこのタイプの操作は、ランダム化され、gopherjsあなたがトラバーサルを使用しているJavaScriptを使用します。
  • appendオペレーティング割り当てられた追加のメモリスペースが必要-しかし、追加スペースの割り当てではありません再び多くのメモリ領域を割り当てます。
  • unsafe.Pointerそして、uintptrの間の変換モード。具体的には、gc変換は、自身の持つべき効果取るためのルールを通常、unsafeパッケージには、それは、コンパイラに実装され、仮想的です。

一般的には、いくつかの仕様の詳細に応じて、あなたのプログラムが別のコンパイラを使用することができますすることができます(上記の特に詳細)で言及されていないコンパイルすることが、しばしばプログラムは、あなたが期待好きではないだろう動作するようにしたがって、あなたが起きてからそれを回避しようとしてください。

お使いの言語が(インストールしてダウンロードして公式サイトをインストールするか、パッケージマネージャを介して)、それをインストールするには、「通常」のチャネルを介して行く場合は、先に行くの開発チーム取得しますgcと正式な操作を。私たちは、「Goが行う方法である」話し合うときに、この記事では、文脈に指定されていない場合、つまり、我々は通常の話をgcそれが最も重要な実現しているため。

標準ライブラリ

標準ライブラリは、すぐに実用的なアプリケーションの数を構築するために使用することができる依存関係のグループ、の囲碁言語に含まれています。また、囲碁開発チームによって維持され、ゴー言語およびコンパイラと一緒にリリースされます。一般的には、特定の標準ライブラリは、通常の使用にコンパイラが共同で発行するに頼ることができます。(すべてではない)、ほとんどが標準ライブラリのランタイムの一部であるため(メインに含まれruntimereflectsyscallパッケージ)。コンパイラは、コンパイル時に、現在使用中の実行に対応している必要がありますのでので、彼らのバージョンが同じです。標準ライブラリのAPIは安定しており、標準ライブラリの特定のバージョンに基づいて、囲碁プログラムはコンパイラの将来のバージョンで正常な動作でも書くことができるので、互換性のない方法で変更されません。

他は一部のみを達成しながら、いくつかの標準ライブラリには、完全に、すべてのコンテンツの彼らの全体のライブラリーを実現します-特定の意志で、開発者runtimereflectunsafeおよびsyscallパッケージは、カスタム機能を実装します。例えば、私は信じていAppEngineの標準ライブラリがされたセキュリティ上の理由から、標準ライブラリの機能の一部を再実装します。通常、再実装これらのいくつかは、ユーザーに対して透過的維持しようとします。

あり、標準ライブラリ以外の別のライブラリ素人の用語である、xまたは「拡張子が。」これと同時に開発し、維持しますが、いくつかのコードゴー開発チーム格納されているライブラリはありません同じリリースサイクルを持っていると言語を行く、とに比べゴー言語自体を、互換性が悪くなる(機能とメンテナンスが意志貧しいです)。コードは(将来的には標準ライブラリに含まれていてもよい)、実験のいずれかである、または標準ライブラリ関数と比較され、まだジェネリックではない、またはいくつかのまれなケースでは、開発者が提供しているところ同期コードは、開発チームを見直して行くことができます。

ここでも、追加のは、「標準ライブラリ」を参照して、指摘されていない場合、我々は公式のメンテナンスを意味してリリースし、ホストされたgolang.orgを移動標準ライブラリに。

コードモーフィングツール

私たちは、コードのGo言語が使いやすいようにするためにツールを構築する必要があります。主な責任は、パッケージとすべての依存関係をコンパイルし、必要なパラメータに応じて、コンパイラとリンカをコールする必要性を見つけるためのツールを構築することです。言語を行く持っているパッケージのサポートを、コンパイル時に単位として複数のソースコードファイルを可能にします。この実施形態はまた、他のパッケージの導入や使用を定義します。それが重要である。しかし、それはパッケージソースファイルをインポートすることで、パスのマッピングを定義していません。また、ディスク上のパッケージのインポート場所を定義しません。したがって、この問題のために、それぞれの建物のツールは異なるアプローチがあります。あなたは(そのようなメイクコマンドなど)の一般的な構築ツールを使用することができますが、多くの建物のツールは、囲碁の言語の学生のために特別にあります。

  • 言語ツールを行く[1]ツールは、チームの公式を維持して行く構築することです。これとゴー言語(gc標準ライブラリ)は、同じリリースサイクルを持っています。これは、名前の必要がありGOROOT、コンパイラ、ライブラリ、およびその他の標準的なツールを格納するために(この値は環境変数から取得され、それはインストール時にデフォルト値を持つことになります)ディレクトリを。これは、ソースコードの全ての名前に格納することを必要とするGOPATH(この値は、デフォルトで、環境変数から取得されたディレクトリ$HOME/goまたは値のそれに相当)。例えば、パケットa/bのソースコードは次のように配置されなければならない$GOPATH/src/a/b/c.go経路。そして、$GOPATH/src/a/bパスがなければならないだけで、パッケージ内のソースファイルが含まれています。分散モードでは、メカニズムができ再帰的にパッケージし、任意のサーバ上でその依存関係からダウンロードし、このメカニズムは、バージョン管理やダウンロードのキャリブレーションをサポートしていない場合でも、。(のためのテストコードのドキュメントを読んで行く、言語ツールもツールなど、他のツールキットの数が含まれていますgolang.org、展開のGo言語のツールとの)バグツールを提出し、他のガジェットの様々な。
  • gopherjs大幅に行くの言語ツールを模倣する独自のビルドツールを、。
  • gomobileは、モバイルオペレーティングシステムのための専用ツールゴーコードです。
  • DEPはギガバイトはグライドは、とそう宣言独自のファイルレイアウト(一部のGo言語ツールと互換性を持つことができる、といくつかの互換性がありません)との依存関係を持っているそれぞれの地域開発のためのビルドと依存関係の管理ツールです。
  • bazelは、オープンソースのバージョンを構築するためのGoogleの内部ツールです。その使用は囲碁の言語を制限されていませんが、言語がしばしばあるので、私は、独立した項目としてそれを置く理由は、GOツールは、Googleのサービス、およびコミュニティのニーズとの競合のために設計されていると述べた。が、bazelは、互換性のないファイルレイアウトを使用するためしかし、言語ツールを行く(および他の多くのオープンツール)、Googleが使用することはできません。

コードモーフィングツールは、直接コードを記述する際、ほとんどのユーザーが使用するための重要なツールなので、大部分が決定ゴー言語生態系の側面を、だけでなく、プログラマが行くとの間にも影響を与えます組み合わせパッケージを決定し、通信と通信。前述したように(別のオペレーティング環境を指定しない限り)、言語ツールを暗黙的に参照されて行く、大幅にそのデザインに影響を与える「ゴー言語」の一般大衆の認識を行います。利用可能な多くの代替ツールはありますが、これらのツールも広く、内部使用および他のシナリオとして使用されてきたが、オープンソースコミュニティは、一般ゴーゴー言語ツールを使用すると言語が意味し、フィット:

  • あなたは、ソースコードを入手することができます。バイナリパッケージの配布のための言語ツールを行くだけで、非常に限定的なサポート、そして唯一のサポートは、将来のリリースで削除されます。
  • に基づくべきであるゴー公式ドキュメントフォーマットの文書を書くこと。
  • するために、テストケースを含めると、可能go testテストを実行します。
  • 完全に通過することができますgo buildコンパイルする(総称して、「ゴーをすることによって得ることができる」と呼ばれる機能を備えた後述する- 「行く-gettable」) 。ソースコードを生成したり、メタプログラミングする必要がある場合は特に、使用されて生成して行くと、生成されたメンバーを提出します。
  • ドメイン名の最初の部分を導入することにより、名前空間のパスは、ドメインコードは、サーバーやWebサーバー上で実行されているサービス、ソースコードを見つけることができます移動し、その依存する可能性があるとも管理作業します
  • 各ディレクトリには、一つだけのパッケージを持っており、使用することができ、コードの制約が構築条件付きコンパイルを。

ゴー言語の文書化ツールは、様々な生態系を行く方法を学ぶための良い出発点で、非常に包括的です。

その他のツール

言語の標準ライブラリが含まれている行くのソースコードの一部が行くパッケージと対話することができますし、より多くの機能のx /ツールの拡張機能が含まれています言語を行くので、(正式には強くリーンのGo言語自体を滞在したいので)コミュニティに文化を開発するために非常に強力なサードパーティ製のツールを持っています。これらのツールは、多くの場合、元の場所を知っている必要があり、あなたはまた、型情報を取得する必要があるかもしれません。行く/構築パッケージを大会囲碁言語ツールを追ったので、そのビルドプロセスの文書自体一部として使用することができます。欠点は、ツールの上に構築されたということです時々 、他のコードベースのビルドツールと互換性がありません。だから、そこにある開発中の新しいパッケージは、それが他のビルドツールと統合することができます。

言語は、実際にツールをたくさん持っている、と誰もが自分の好みを持って行きます。しかし、概ね次のとおりです。

概要

私は、リストの内容が混乱し、初心者を感じる人のために準備され、この記事の最後に参考文献の短いリストを使用します。下のリンクをクリックしてください:

また、多くの貴重な文献がある補完することができますが、これらはあなたが良いスタートアップを持たせるのに十分でなければなりません。この記事はどの不作為を持っている(私は詳細が追加される場合があります)、または任意の貴重な情報をお探し見つけた場合、してください、初心者として言語を行くのTwitter経由で私に連絡あなたが行くで経験豊富な開発者である、とあなたは初心者が行くの語学学習に新鮮さを感じることができるように、私は重要な何かを逃した(しかし、私はいくつかの重要な参考資料を見落として喜んだことが判明した場合::)笑顔、私にメッセージをお願いします。


[1]注意:開発チームは現在に取り組んで行くのモジュールいくつかのサポートモジュールは、バージョン管理のためのサポートが含まれており、基礎工事の問題を解決するために、「伝統的な」行く言語ツールのいくつかを作ることができ、パッケージコード配布ユニット、上にありますか。これらおよびその他のサポートが終了した後、この段落のすべての内容は基本的に廃止されました。モジュールのサポート現時点ではまだ囲碁言語の一部であり、ではありません。この記事の中核的なコンテンツは、囲碁の言語の異なる部分が簡単に紹介されているように、コンテンツは、変更することは容易ではない、私はこれらの歴史問題を理解することも必要であると考えています。

あなたは、変換エラーや改善のための他の領域がある見つけた場合は、へようこそデンバー翻訳プログラムは変更と翻訳PRは、また、対応するボーナスポイントを得ることができます。記事の冒頭固定リンクの記事は、 GitHubの上で、この記事内のリンク値下げです。


ナゲッツ翻訳プロジェクトは、技術的な記事のインターネットコミュニティの高品質な翻訳のためのソースでナゲッツに英語を共有する記事。カバーのコンテンツのAndroidiOSのフロントエンドバックエンドブロックチェーン製品設計人工知能などの分野は、あなたがより多くの高品質の翻訳を見たいと思って、集中し続ける下さいナゲッツ翻訳プログラムを公式マイクロブログは私たちはほとんどの列を知っています

おすすめ

転載: juejin.im/post/5d386166e51d454fd8057c6a
おすすめ