DarkLogo

Golangに関する素朴な疑問01

· Kishimoto

Q1: golangはgolangで書かれていると聞いたことがあるのですがどういうことですか?

Golang (またはGo) は、Googleが開発したプログラミング言語です。GolangはC言語のような低レベルの言語でありながら、PythonやRubyのような高水準の言語の柔軟性も持ち合わせています。

Golangが自己言及しているというのは、GolangのコンパイラやランタイムがGolangで書かれているということです。つまり、Golangは自分自身を構築するために必要なすべてのコードを自己完結しているということです。

このような自己言及のアプローチは、Golangの設計者たちがプログラムの信頼性、品質、および開発速度を向上させるために採用したアプローチの一つです。自己言及により、Golangのコンパイラやランタイムのコードは、自分自身に適合し、自分自身を解釈するための十分な機能と品質を持つことが保証されます。

Q2: どのように自己言及を実現しているのですか?
直感的には自分がまず存在しないと自分を解釈できないわけですがそもそも解釈する側の自分が存在しないと言う所謂ニワトリが先か卵が先かのような状態になる気がするのですが。。。

確かに、自己言及するプログラムをどのように構築するのかということは、直感的には矛盾しているように見えるかもしれません。

Golangが自己言及する方法は、まず初めにGolangのコンパイラを別の言語で実装し、その後、Golang自身で書かれた新しいコンパイラをビルドすることです。つまり、最初にGolangのコンパイラを別の言語で書いた後、それを使用して、Golangで書かれた新しいコンパイラをビルドします。そして、新しいコンパイラを使用して、さらに新しいコンパイラをビルドし、このプロセスを繰り返すことによって、Golangのコンパイラやランタイムは自己言及することができます。

このプロセスにおいて、最初のGolangのコンパイラが別の言語で実装されているという点に注目すると、ニワトリが先か卵が先かのような問題を回避することができます。つまり、最初のGolangのコンパイラを別の言語で書くことによって、自己言及のための基盤を確立することができるのです。

ただし、最初のGolangのコンパイラを別の言語で書くというプロセスは、Golangのコンパイラを開発するという目的にはあまり適していないため、Golangの設計者たちは、最初にGolangを実装するために必要な最小限の機能を持つ「自己ホストツールチェーン」と呼ばれるコードセットを別の言語で書くことを選択しました。そして、この自己ホストツールチェーンを使用して、Golangのコンパイラやランタイムを自己言及することができるようになりました。

Q3: 自己ホストツールチェーンというのはなんの言語で書かれているのですか?
また自己ホストツールチェーンは具体的にどんなことをするものですか?

自己ホストツールチェーンは、Golangのコンパイラやランタイムを自己言及するために必要な最小限の機能を備えたコードセットであり、C言語で書かれています。

具体的には、自己ホストツールチェーンは、Golangのコンパイラとツールを実行するために必要な最小限の機能を提供します。たとえば、C言語のコンパイラ、アセンブラ、リンカー、および必要なツール類が含まれています。

自己ホストツールチェーンは、最初にGolangを実装するために使用され、その後、Golang自身で書かれた新しいコンパイラをビルドするために使用されます。つまり、最初に自己ホストツールチェーンを使用してGolangのコンパイラを構築し、その後、新しいGolangのコンパイラを自己言及するために使用します。このプロセスにより、Golangのコンパイラやランタイムは、自己言及を実現することができます。

自己ホストツールチェーンは、C言語で実装されているため、Golangの設計者たちは、C言語のコンパイラがほとんどのシステムに存在することを前提にしています。つまり、Golangのコンパイラをビルドするために、まずC言語のコンパイラを使用して自己ホストツールチェーンを構築し、それを使用してGolangのコンパイラをビルドすることができます。

Q4: つまり一番初め、開発当初はC言語に依存していますがその後Golang自身でコンパイラが生成されてからはC言語には依存せずそのGolang製コンパイラをOSS等でpublicにしてしまえば実質GolangはGolangで書かれていると言えるということで現にそうなっているという認識であっていますか?

はい、その通りです。最初に自己ホストツールチェーンを使用してGolangのコンパイラを構築し、その後、Golang自身で書かれた新しいコンパイラをビルドすることにより、Golangは自己言及を実現することができます。そして、その新しいコンパイラを使用して、Golangの開発に必要なすべてのコードを書くことができます。このように、Golangは実質的にGolangで書かれた言語となります。

ただし、Golangが完全に自己完結しているわけではなく、依然としてオペレーティングシステムや他の言語のランタイム、ライブラリ、およびツールに依存することがあります。ただし、Golang自身で書かれたコンパイラやランタイムは、Golangの開発者が必要とするすべての機能を提供するために十分な品質と信頼性を持っているため、Golangの自己言及に成功しています。

Golangのコンパイラやランタイムは、オープンソースで公開されているため、誰でもダウンロードして自由に使用することができます。そして、Golangはその高速性、並行性、およびスケーラビリティによって、多くの開発者や企業によって広く採用されています。

Q5: Golangをwebで使うメリットを教えてください。
またGolangを使うことでとてもメリットを得られる開発対象物はなんですか?
その実例を複数例教えてください

GolangをWeb開発に使用する主なメリットは以下の通りです。

  • 高速性: Golangは、高速なコンパイルと実行速度が特徴的な言語です。Webアプリケーションに必要なリクエストの処理や応答の生成において、高速で効率的な処理を実現することができます。

  • 並行性: Golangは、軽量なスレッドであるGoroutineとチャネルを使用することで、効率的な並行処理を実現することができます。Webアプリケーションにおいて、同時に多数のリクエストを処理する必要がある場合に非常に有効です。

  • 安全性: Golangは、メモリ管理やゴミ回収の自動化、型付けなどの機能が備わっており、より安全なコードを書くことができます。

  • 単純性: Golangの構文はシンプルで、学習しやすいです。Web開発に必要な機能は標準パッケージに含まれており、外部ライブラリを使用する必要が少ないため、プログラムの保守性が高くなります。 Golangを使用することで、特に以下のような開発対象物に対して多くのメリットを得ることができます。


  • マイクロサービス: Golangは、マイクロサービスアーキテクチャの実装に適しています。Golangの高速性と並行性により、多数の小さなサービスを簡単に実装できます。

  • クラウドアプリケーション: Golangは、クラウドネイティブなアプリケーションの開発に適しています。Golangの並行性と安全性により、高いスケーラビリティと信頼性を実現することができます。

  • ネットワークプログラミング: Golangは、ネットワークプログラミングに適しています。Golangの標準パッケージには、TCPやUDPなどのネットワークプロトコルをサポートするライブラリが含まれており、プログラムの開発が容易になります。

    実際の例としては、以下のようなWebアプリケーションが挙げられます。

  • Docker: Dockerは、Golangで開発されています。Dockerは、コンテナ仮想化技術を提供するプラットフォームであり、高速で信頼性の高いアプリケーションの開発、配信、および実行が可能です。

  • Kubernetes: Kubernetesは、Golangで開発されたオープンソースのコンテナオーケストレーションシステムです。Kubernetesは、クラウドネイティブなアプリケーションを簡単に管理できるようにするために設計されています。

  • Prometheus: Prometheusは、Golangで開発されたオープンソースのシステム監視ツールです。Prometheusは、高速でスケーラブルな時系列データの収集、ストレージ、およびクエリを可能にし、複雑なシステムの監視が容易になります。

これらの例は、Golangを使用することで高速、並行、安全なWebアプリケーションを開発し、簡単に管理することができることを示しています。