以前、Go コミュニティで知識や経験を共有したとき、次のようなスラングをよく聞きました。「少ないほど良い」「少ないほど良い」「シンプルさへの道」「シンプルさへの道」等
Go の問題や提案について議論するときでも、「less is more」を使って反論したり、議論を支持したりする人がいますが、これは非常に興味深いことです。誰もが非常に興味があるでしょう、それはどこから来たのか、そしてそれは何を意味するのでしょうか?
このような根深いコミュニティ文化概念は、きっと芯のある人が提案したものでしょう。彼は次のように言った著者です:
誰かそれを知っていますか?
彼は Go 言語の父、ロブ・パイクです。
ロブ・パイクは「少ないほど豊かである」というようなことについて何度も言及しており、それは広く広まっている考えです。
次のような機会で共有してください:
Less isexponentially more[3]」からの引用です。テキスト部分 @MIKESPOOK[4] 翻訳、ここでは再構成、整理、引用、図解を行いますので、車輪の再発明はしません。
以下に示すように:これは、2012 年 6 月にサンフランシスコで開催された Go カンファレンスに出席した私 (ロブ・パイク) の内容です。スピーチ。
これは個人的なスピーチです。私は Go プロジェクト チームの誰かを代表して話すわけではありませんが、まず、Go を可能にするためにチームが行ってくれたことすべてに感謝したいと思います。
同時に、この講演の機会を与えてくれたサンフランシスコの Go コミュニティにも感謝したいと思います。
少ないほど良いと思いますか、それとも少ないほど少ないと思いますか?
2007 年に戻る9 月、私は巨大な Google C プログラム (皆さんが使っているもの) で、些細ではあるが中心的な作業をしていました。
その巨大な分散クラスターでコンパイルするのに約 45 分かかりました。
Google に雇用され、C 標準化委員会に所属している数名が A レポートを作成するという通知を受け取りました。
彼らは、当時 C 0x と呼ばれていたもの (現在は C 11 として知られている) で行われる改良点について教えてくれます。
1 時間のプレゼンテーション中に、すでに 35 の機能が計画されているような話を聞きました。
実際にはさらに多くの機能がありますが、レポートでは 35 の機能のみが説明されています。もちろん、いくつかの機能は小さいですが、レポートで言及する価値があるほど重要です。
C 委員会は、C の問題は十分な機能がないことだと本当に信じていますか?
ロン ハーディンの別のジョークで間違いなく、言語の簡素化は大きな成果をもたらします。機能を追加するだけではありません。もちろん、これは少しばかげていますが、このアイデアを覚えておいてください。
はこれらのアイデアを C で実装しようとしましたが、失敗しました。C の制御構造を同時操作に結び付けるのは非常に難しく、最終的には実際の処理を理解するのが難しくなります。
私は C にあまり熟練したことがないことを認めますが、純粋な C は今でもすべてを可能にします。あまりにもかさばりそうだったので、このアイデアはやめました。しかし、C 0x レポートを見て、私はもう一度考えさせられました。私が本当に気になることの 1 つは (ケンとロバートもきっと気になるでしょう)、新しい C メモリ モデルにはアトミック タイプがあることです。
すでに過負荷になっている型システムに、このような詳細な記述の微細なコレクションを追加するのは完全な間違いのように感じます。これも短絡的で、今後 10 年間でハードウェアが急速に進歩することはほぼ確実であり、言語を今日のハードウェアにあまりにも密接に結びつけるのは非常に愚かです。
レポートの後、私たちはオフィスに戻りました。私は別の編集を開始し、椅子をロバートの方に向けて、重要な問題を伝え始めました。
コンピレーションが完了する前に、私たちはケンを連れてきて何をするかを決めていました。
私たちは C を書き続けるつもりはありません。私たち、特に私は、Google コードを書くときに同時実行性を簡単に記述できるようにしたいと考えています。
同時に、後述する「ビッグプログラミング」の制御も進めていきたいと考えています。
欲しいものとその必要条件をホワイトボードに書き出しました。構文や意味の詳細は無視され、青写真と全体像が思い描かれます。
当時の興味深いメールが今でも残っています。
これは抜粋です:
Robert: 出発点は C で、いくつかの明らかな欠陥を修正し、乱雑な要素を取り除き、不足している機能をいくつか追加します。
ロブ: 「ゴー」という名前です。名前の由来をでっち上げることもできますが、それには十分な根拠があります。短くて綴りやすいです。ツール: goc、gol、goa。インタラクティブなデバッガー/インタープリターがある場合は、それを「go」と呼びます。拡張子は.goです。
Robert: 空のインターフェースはインターフェース{}です。これらはすべてのインターフェイスを実装しているため、これを void * の代わりに使用できます。
すべてを正しく描写したわけではありません。たとえば、配列とスライスのマッピングにはほぼ 1 年かかりました。しかし、この言語の重要な機能のほとんどは最初の数日で決まりました。
ロバートは C ではなく C が開始点であると言っていることに注意してください。よくわかりませんが、特にケンが近くにいる場合は、彼が C を意味していると思います。
しかし実際には、最終的には C から始めることはできませんでした。私たちは、演算子、括弧、中括弧、およびいくつかのキーワードのみを借用して、ゼロから開始しました。 (もちろん、私たちが知っている他の言語からも最高のものを取り入れました。)
いずれにせよ、私たちは今、C の逆を行っており、すべてを分解し、振り出しに戻ってやり直しています。私たちは、より優れた C、あるいはさらに優れた C を設計しようとしているわけではありません。私たちが関心を持っている種類のソフトウェアに適した言語です。
最終的には、C や C とはまったく異なる言語になりました。各リリースはますます異なってきています。
Go における C と C の重要な簡略化のリストを作成しました:
もちろん、ここで Go にインターフェースが登場します。しかし、それらはすでに青写真の一部であり、それが真の囲碁哲学です。
C と Java が型継承と型分類に関するものであるとすれば、Go は合成に関するものです。
Unix パイプの最終的な発明者である Doug McIlroy は 1964 年に次のように書きました (!):
何らかの方法で庭のホースを蛇口に接続する必要があります。メッセージ データ ピースを接続する部分的に。これはIOでも使用されている方法です。
これは Go でも使用される方法です。 Go はこのアイデアをさらに一歩進めました。これは組み合わせとつながりに関する言語です。
わかりやすい例は、インターフェイスが結合されたコンポーネントを提供する方法です。メソッド M を実装していれば、それが何であるかは気にせず、適切な場所に配置できます。
もう 1 つの重要な例は、独立して実行される計算を同時実行によってどのように接続するかです。また、珍しい (しかし非常に単純な) 型合成パターン、埋め込みもあります。
これは Go 独自の組み合わせ技術であり、C や Java プログラムとはまったく異なります。
関係のない Go の設計について触れておきたいと思います。Go は、大規模な書き込みを支援するために設計されました。プログラムは大規模なチームによって作成および保守されます。
「ビッグプログラミング」と呼ばれる観点がありますが、どういうわけかこの分野では C と Java が主流です。これは単なる歴史上の間違い、あるいは労働災害だと思います。しかし、オブジェクト指向設計で何かができるというのは広く受け入れられている考えです。
私はそれを全く信じません。大規模なソフトウェアには方法論の保護が必要ですが、強力な依存関係管理や明確なインターフェイス抽象化、さらにはそのような豪華なドキュメント ツールは必要ありませんが、強力な依存関係管理、明確なインターフェイス抽象化、優れたドキュメント ツールよりも重要というわけではありません。そして、これらはいずれも C が得意とするものではありません (Java の方が明らかに優れていますが)。
Go で書かれたソフトウェアが十分ではないため、まだわかりませんが、大きなプログラミングの世界で Go が傑出することは間違いありません。時間がすべてを証明してくれる。
さて、スピーチの冒頭で述べた驚くべき質問に戻ります:
C を破壊するために設計された言語である Go が、なぜ C プログラマーの心を掴めないのでしょうか?
冗談はさておき、それはGoとCの哲学が全く違うからだと思います。
C は、指先ですべての問題を解決できるようにすることです 。
C 11 FAQ からこの段落を引用しました:
C は、特別に作成された手作業でコーディングされたコードの大幅な増加に比べて、はるかに幅広い抽象化、優雅さ、柔軟性、およびゼロコストの表現力を備えています。
この思考の方向性は囲碁とは異なります。コストゼロは目標ではなく、少なくとも CPU コストゼロではありません。 Go の提案は、プログラマの作業負荷を最小限に抑えることです。
Go はすべてを網羅するものではありません。すべてを内蔵することはできません。実行の細部をすべて正確に制御することはできません。たとえば、RAII はありません。代わりにガベージ コレクションを使用できます。メモリ解放機能もありません。
得られるものは強力ですが、理解しやすく、問題を解決するために接続および結合するために使用されるいくつかのモジュールを構築するのに使いやすいです。
これは、他の言語で書かれたソリューションほど速く、洗練され、イデオロギー的に明確にはならないかもしれませんが、確実に書きやすく、読みやすく、理解しやすく、保守しやすくなります。 、そしてより安全です。 言い換えれば、もちろん、ある程度単純化しすぎています:以上がGo の設計哲学: 少ないほど良い、それはどこから来たのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。