Goにアンパサンドとアスタリスク(&と*)があるのはなぜですか?

シンボル「アンパサンド」( &



)または「アスタリスク」(「乗算記号」 *



)を意味するか、何を使用するか混乱する場合は、この記事が役立ちます。 Goの著者は、ほとんどのプログラマーにこの言語を馴染ませようとしましたが、構文の多くの要素はC言語から借用されていましたが、2017年には、ほとんどのプログラマーがCを所有しているかどうかを理解することはすでに困難であり、それらはもはや存在しないと思います。 したがって、過去の世代の開発者になじみのある概念は、新世代にとって完璧な意味不明なものに見えるかもしれません。 少し歴史を掘り、Goのポインタと文字&



*



使用に関する質問でoverにすべての点を付けましょう。













ポインタ



私は、「Goで熊手を踏まない方法」という記事で、ポインターとはどのように機能するかについて書きました。Goの初心者でも読むことをお勧めします。 ポインターに関する短い繰り返し:







実際、これは、データが配置されている別のメモリブロックのアドレスを含む1つのメモリブロックです。 「ポインタの逆参照」というフレーズが聞こえる場合、「このアドレスが指しているメモリブロックからデータを検索する」という意味です。

これが記事の視覚化です:

画像







ここで、 Point{10, 20}



は「リテラル」-所定の場所で宣言された新しい変数、「メモリブロック」、&は「このメモリブロックのアドレス」です。







つまり、コードでは:







 var a int var b = &a fmt.Println(a, b) //  "0 0x10410020"
      
      





変数b



はポインターになり、 b



のアドレスが含まれます。







同じコードですが、タイプbを明示的に記述します。







  var a int var b *int = &a fmt.Println(a, b) //  "0 0x10410020"
      
      





ここで、アスタリスクは「数値へのタイプポインター」を意味します。 ただし、型の前ではなく変数自体の前に使用すると、値は反対の「このアドレスの値」に変わります。







  var a int var b *int = &a var c int = *b fmt.Println(a, b, c) //  "0 0x10410020 0"
      
      





これは、たとえばJavaScriptやRubyのような一般的な言語で、そこにないポインターで作業したことがない人にとっては特に、混乱と混乱を招く可能性があります。 さらに、CやC ++などの言語では、ポインターのアプリケーションがまだ多くあります。たとえば、「ポインター算術」では、未加工のメモリオフセットで直接実行し、最新の標準で非常に高速なデータ構造を実装できます。 これによるバッファオーバーフローを受信することも非常に便利で、数十億ドル相当の損害を引き起こすバグを作成します。 Cのポインターを理解する方法に関する本もあります







しかし、Goでポインターを操作する仕組みが比較的単純な場合、アンパーサンドとアスタリスクを使用する理由は疑問のままです。これはどういう意味ですか? おそらくこれは、キーボード上の文字が近くにあるためです( Shift-7



およびShift-8



)? さて、トピックを理解するためには、その物語を掘るより良い方法はありません。







物語



そして、物語はこれです。 Goの著者の1人は、伝説的なKen Thompsonでした。これは、コンピューターサイエンスの先駆者の1人であり、正規表現、UTF-8 、プログラミング言語Bを提供しました。 一般的に、Goの系譜はもう少し複雑ですが、Cは大学でプログラミングを学ぶための標準となっている言語であるという単純な理由の基礎として採用されました。まあ、当時はその人気について話す必要はないと思います。







ケントンプソンは現在Goから少し離れており、プライベートジェットを操縦していますが、彼の決定はGoよりずっと前にGoに入りました。 若い頃、彼は朝食用に新しいプログラミング言語を書くことで楽しまれていました(私は少し誇張します)。彼が別のコンピューターサイエンスの伝説デニスリッチーと一緒に作成した言語の1つはプログラミング言語B(Bi)でした。







当時、ケントンプソンはPDP-7コンピューターのアセンブリシステムを作成しました。このシステムは72,000 ドル(今日では約50万ドル )で、9 KBのメモリ(144 KBに拡張可能)を持ち、次のようになりました。













実際、このオペレーティングシステムはUnicsと呼ばれ、その後UNIXに名前が変更されました。 そして、新しいクールなPDP-11コンピューター用に書き直すことになったとき、高レベルのプログラミング言語で書くことにしました。 Bの前身であるBCPLは冗長すぎて、多くの文字でした。 Bはもっと簡潔でしたが、UNIXをPDP-11に移植するための貧しい候補者となった他の問題がありました。 そのとき、デニス・リッチーは主にBに基づいて、特にPDP-11でUNIXを書くために、新しい言語の開発を始めました。 名前Cは、Bの後のアルファベットの次の文字として選択されました。







しかし、アンパサンドとアスタリスクのトピックに戻ります。 アスタリスク( *



)は、まだBCPL言語にあり、BCPLにあったという理由だけで、ポインター指定と同じ意味でBに入りました。 まったく同じ理由で、Cに移行しました。







しかし、「可変アドレス」を意味するアンパサンド(&)はBに現れ(また単にCに移行したため)、いくつかの理由で選択されました。









私があなたを混乱させたなら、ここにもっと明確な絵があります:







そして、ここであなたはその当時のキーボードを注意深く見る必要があります。 PDP-7の写真の少し上にある入力デバイスを見ることができます。これはTeletype 33でした。 その当時の現実を理解し、その時点でプログラミング言語のプログラマーやデザイナーが直面している制限を理解するために、キーボードをより詳しく見る価値があります。













ご覧のとおり、タッチバーも絵文字も:)でなく、文字はテレタイプにあるセットからのみ選択する必要がありました。 また、アンパサンドとアスタリスクが近くになく、4つのキーまで離れていたことは注目に値します。これは、キーが近接しているためにアンパサンドを選択するという考えに反論しています。 実際、利用可能なすべてのキーの中で、当時のケン・トンプソンは、「アドレス」に似た「アンパサンド」を最も気に入っていました。







さて、Cは世紀の言語(過去)になり、他の多くの言語に影響を与え、Cに関する本はプログラマーのデスクトップバイブルに数十年なりました。 同様に、アスタリスクとアンパサンドに加えて、ポインターもC ++になりました。これは、Goの前にほとんどのGoネットワークとサーバーソフトウェアが記述された別の主流言語です。







したがって、Goに同じ構文で(幸運にもポインター演算なしで)ポインターを含めるという決定は、非常に論理的で自然なものでした。 C / C ++プログラマーの場合、これらはブラケット{



および}



と同じ基本的かつ単純な概念です。







それにもかかわらず、半世紀前に現代のテクノロジーに対して行われた歴史的な決定がどれほど強力な影響を与えているかを理解するのは驚くべきことです。







おわりに



Goのポインターでまだ安全でない場合は、2つの簡単なルールを覚えておいてください。









これが、Goの背後にあるポインターと文字の意味を少しでも良く理解するのに役立つことを願っています。








All Articles