この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 10198|答える: 1

囲碁でのプログラミングの長所と短所

[リンクをコピー]
掲載地 2019/05/27 9:57:10 | | |
囲碁の言語はどれくらい人気がありますか? Google、AWS、Cloudflare、CoreOSなどの外国企業や、QiniuやAlibabaなどの国内企業が、クラウドコンピューティング関連製品の大規模開発にGo言語を使い始めています。 囲碁を使う際に注意すべき「はい」と「しかし」は何ですか?

最近、私たちは2009年にGoogleが導入したオープンソースプログラミング言語であるGo言語を使ってAPIを作成しました。 開発にGoを使う過程で多くの経験を積み、それを読者の皆さんと共有したいと思い、この記事を作成しました。

プロジェクトにプログラミング言語を選ぶ際は、どのプログラミング言語で構築するかを考える前に、プロジェクトが何で構築するかを理解することを常にお勧めします。 製品が作り方の決定的な要素となるべきです。

次のプロジェクトに合うかどうかを判断するために、Goで開発する際に見つけたメリットとデメリットをいくつかご紹介します。

私たちが囲碁を愛する理由

囲碁の利用は近年爆発的に増加しています。 ほとんどのスタートアップがバックエンドシステムに使っているようです。 開発者がこれほど人気がある理由は多々あります。

囲碁の言語は非常に速いです

Goは非常に高速なプログラミング言語です。 Goは機械語にコンパイルされるため、インタプリタティブや仮想実行時間を持つプログラミング言語を自然に上回ります。 Goプログラムも非常に速くコンパイルでき、非常に小さなバイナリも生成します。 私たちのAPIは数秒でコンパイルし、実行ファイルは11.5MBほどの小さなファイルになります。

習得しやすい

囲碁の構文は他の言語と比べてシンプルで理解しやすいです。 Goの文法のほとんどは頭の中で覚えられるので、探すのに多くの時間を費やす必要はありません。 囲碁の言語も非常にシンプルで読みやすいです。 特にCスタイルの構文に慣れた非Goプログラマーは、囲碁のコードを読んで何が起きているのか理解できます。

静的型定義言語

Goは強力な静的型定義言語です。 int、byte、stringといった基本的なタイプがあります。 構造物にも種類があります。 強型付け言語と同様に、型システムはコンパイラがクラス全体のエラーを検出するのに役立ちます。 Go言語にはリスト型やマッピング型が組み込まれており、使いやすいです。

インターフェースタイプ

Go言語にはインターフェースタイプがあり、任意の構造はインターフェースを実装することで単純にインターフェースを満たすことができます。 これにより、コード内の依存関係を切り離すことができます。 その後、テストで依存関係をシミュレートできます。 インターフェースを使うことで、よりモジュール化されテスト可能なコードを書くことができます。 Go言語には一流の関数も搭載されており、開発者がより実用的にコードを書くことを可能にします。

標準ライブラリ

Go言語にはかなり良い標準ライブラリがあります。 基本的な型を扱うための便利な組み込み機能を提供します。 一部のパッケージはウェブサーバーの構築、I/Oの処理、暗号化の使用、生のバイトの操作を簡単に可能にしています。 標準ライブラリが提供するJSONのシリアライズおよびデシリアライズは非常にシンプルです。 「tags」を使うことで、構造体フィールドの横にJSONフィールド名を指定できます。

テストサポート

テストサポートは標準ライブラリに組み込まれており、追加の依存関係を必要としません。 thing.goというファイルがあれば、thing_test.goという別のファイルにテストを書き込んで「go test」を実行してください。 Goはこれらのテストを迅速に実施します。

静的解析ツール

Go言語用の静的解析ツールは多数かつ強力なものです。 特にgofmtというツールがあり、Goの推奨スタイルに従ってコードをフォーマットします。 これにより、プロジェクトの多くの意見が正規化され、チームの授与マネージャーがコードの成果に集中できるようになります。 各ビルドでgofmt、golint、vetを実行し、警告があればビルドは失敗します。

ガベージコレクション

Go言語の設計において、メモリ管理は意図的にCやC++よりも簡単になるように設計されました。 動的割り当ての対象はガベージコレクションです。 Go言語はポインタ操作を許可しないため、ポインタの使用をより安全にしています。 値タイプを使うオプションも用意されています。

より容易な並行処理モデル

並行プログラミングは決して容易ではありませんが、Goは他の言語よりも並行プログラミングが容易です。 「goroutine」と呼ばれる軽量スレッドを作成し、「チャネル」で通信するのはほぼ簡単な作業ですが、より複雑なモデルでは可能です。

Goで嫌いな点

先ほども述べたように、囲碁は確かに優れた言語です。 文法はきれいで、実行も速いです。 また、多くの利点もあります。 しかし、プログラミング言語全体が単に構文を参照するわけではありません。 以下は私たちが直面した問題のいくつかです。

ジェネリックは存在しません

まず、この問題はまるで「部屋の中の象」のように、明白で見過ごされがちな事実です。 囲碁語には汎用語はありません。 Javaのような言語の開発者にとって、Goへの切り替えは大きなハードルです。 これはコードの再利用レベルが低減することを意味します。 Go言語にはファーストクラスの関数がありますが、「map」「reduce」「filter」のように特定のタイプのコレクションで動作する関数を書くと、これらの関数を他の種類のコレクションに再利用することはできません。 この問題を解決する方法はたくさんありますが、どれも結局はより多くのコードを書くことになり、生産性や保守性が低下します。

インターフェースは暗黙的です

インターフェースがあるのは良いことですが、構造上インターフェースは明示的ではなく暗黙的に実装されています。 これはGo言語の強みの一つと言われていますが、構造からインターフェースが実装されているかどうか判断が難しいと感じました。 本当に理解するには、プログラムをコンパイルしてみることでしかわかりません。 プログラムが小規模であれば、それ自体は何の問題もありません。 しかし、このプログラムが中規模から大規模であれば、問題は大きい。

ライブラリのサポートが不十分

Go図書館のサポートはまちまちです。 私たちのAPIはContentfulと連携していますが、後者には公式にサポートされているGo SDKはありません。 つまり、私たちは執筆(そして維持)しなければなりません。 Contentfulでデータを要求・解析するためのコードがたくさんあります。 また、サードパーティのElasticsearchライブラリにも頼らざるを得ません。 ベンダーが提供するGoのSDKは、Java、Ruby、JavaScriptのSDKほど人気はありません。

コミュニティとのコミュニケーションは難しい

囲碁コミュニティでは提案を受け付けていない場合もあります。 golintのGitHubリポジトリでこれを考えてみてください:ハイパーリンクのログインが見えます。あるユーザーが、golintが警告を見つけたときにビルドに失敗できるようにリクエストしました(これはプロジェクト内で行っていることです)。 弁護側は即座にその考えを退けました。 しかし、多くの人がこの問題についてコメントしたため、1年後、ついにメンテナは要望された機能を追加せざるを得ませんでした。

Goコミュニティもウェブフレームワークを好まないようです。 Go言語のHTTPライブラリは多くの側面をカバーしていますが、パスパラメータ、入力チェック、検証をサポートしておらず、ウェブアプリケーションで一般的なクロスカッティングの問題もサポートしていません。 Ruby開発者はRails、Java開発者はSpring MVC、Python開発者はDjangoを持っています。 しかし、多くのGo開発者はフレームワークの使用を避けることを選びます。 しかし現実には、フレームワークが全くないわけではなく、むしろ多くのものがあります。 しかし、一度フレームワークを使い始めると、放棄される運命を避けるのはほぼ不可能です。

断片的依存管理

長い間、Go言語には安定した正式なパッケージマネージャーがありませんでした。 長年のコミュニティの懇願の末、Goプロジェクトはつい最近までGodepをリリースしました。 それ以前から、このギャップを埋めるための多くのツールがすでに存在していました。 私たちのプロジェクトでは非常に強力なGoベンダーを使っていますが、そのためコミュニティが分断されており、Go言語に不慣れな開発者にとっては非常に混乱を招くことがあります。 さらに、ほぼすべてのパッケージマネージャーはGitリポジトリによって動いており、Gitリポジトリの歴史はいつでも変わる可能性があります。 Maven Centralと比べてみてください。Maven Centralはプロジェクトが依存するライブラリを削除したり変更したりしません。

Goを使うかどうか決めてください

時には、機械のことを考える必要があります。 バイトを送受信するとき。 何千もの同時処理を管理する場合です。 オペレーティングシステム、コンテナシステム、ブロックチェーンノードを書いている場合もあります。 そういう場合、ジェネリックにはあまり関心がないでしょう。 なぜなら、チップからナノ秒あたりのパフォーマンスを搾り取るのに忙しいからです。

しかし、多くの場合、人間のことを考える必要があります。 扱うべき事業分野のデータ:顧客、従業員、商品、注文。 これらのドメインエンティティ上で動作するビジネスロジックを書く必要があり、このビジネスロジックを長期間維持し続ける必要があります。 そして変化するニーズに対応する必要があり、早ければ早いほど良いのです。 このような場合、開発者の経験が重要です。

Goは機械時間を人間の時間よりも重視するプログラミング言語です。 時には、あなたの分野では機械やプログラムの性能が最も重要です。 このような場合、Goは良いC言語やC++の代替手段となり得ます。 しかし、典型的なn層アプリケーションを書くと、パフォーマンスのボトルネックはデータベースや、より重要なデータのモデリング方法にしばしば発生します。

囲碁を使うかどうか決める際には、以下の経験則を考慮してください。

  • バイトを扱うなら、Go言語が良い選択かもしれません。
  • データを扱う場合、Go言語はあまり適していないかもしれません。


これは将来的に変わるかもしれません。 囲碁の言語とコミュニティはまだ若い。 ジェネリック薬の追加で驚かされるかもしれませんが、 あるいは、人気のあるウェブフレームワークが大勝するかもしれません。 しかし現時点では、普遍的なサポート、成熟した依存関係管理、ビジネスドメインモデリングに重点を置く成熟したプログラミング言語にとどまります。





先の:Common.LoggingLog 設定
次に:c# ディスカズ投稿
掲載地 2019/05/27 10:09:35 |
囲碁語にはあまり触れられませんでしたが、よく書かれていました
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com