Go言語(golang)でTUIアプリを作ろう ( その1 golangの特徴 )
Pythonの次は、Go言語(golang)にチャレンジしよう。
昨年、PythonをベースにしたTUIアプリケーションを作成してきたわけですが、今度はGo言語(golang)をターゲットにしてみようかと考えています。
なぜ、Go言語(golang)なのかといえば、単純にこの言語に興味がある、ただそれだけのことなのです。言語を理解するには、「Hello World」だけではどうしようもないので、少しまとまったコードを書く必要があります。小さくても良いですから、1つのアプリケーション全体を開発してみることが、その本質を理解する近道だと思うわけです。
そこで、これから数回に渡って、「Go言語(golang)でTUIアプリを作ろう」と題し、先にPython Urwidで開発したアプリケーションと、ほぼ同じものを作成していきたいと考えています。
なお、以下の文章では、Go言語は”golang”と記述します。また、TUIという用語については、PythonでTUIアプリを作ろう ( その1 TUIアプリとは )を参照してください。
golangの特徴
最初に、golangの特徴についてまとめておきます。実は、golangについては、2018年ころ少し調べたことがあります。その時まとめた資料が出てきましたので、そこから概要をまとめてみましょう。
(1) golangは、下記の特徴を持つCompilerである。
特徴 | 概要 | ポイント |
---|---|---|
Native | 各環境ネイティブな実行ファイルを生成する。 | 性能 実行速度に優れる。 |
Multi platform | Linux(x86,64,ARM),Windows(386,64),Mac,BSDなどをサポート。 | 汎用性 |
Static | 1つの独立実行ファイルを生成する。ランタイム(dll,lib,vm,interpreterなど)が不要。 | 可搬性 Deployが容易(1ファイルだけコピーすれば良い) |
Cross | 一つの開発環境にて、別の環境で動く実行ファイルを生成できる。 (例)Windowsで、Linux(386,amd64,arm)などを作成可能。 |
可用性 |
(2) golangの第一印象
golangは「C言語は好きだが、C++は嫌い」という人が作ったような言語だ。
Interview with Ken Thompsonに、それを裏付ける情報がありました。
Ken Thompson: Yes. When the three of us [Thompson, Rob Pike, and Robert Griesemer] got started, it was pure research. The three of us got together and decided that we hated C++. [laughter]
Ken Thompsonは、UNIXを作った人ですね。Legendです。
さらに、Ken Thompson on C++という記事では、C++を嫌いな理由を、より具体的に述べています。
Stroustrup campaigned for years and years and years, way beyond any sort of technical contributions he made to the language, to get it adopted and used. And he sort of ran all the standards committees with a whip and a chair. And he said “no” to no one. He put every feature in that language that ever existed. It wasn’t cleanly designed—it was just the union of everything that came along. And I think it suffered drastically from that.
Stroustrupとは、C++の開発者のことです。
(3) Web上での評判など
以下に一般的なものをまとめておきます。
良い点
- コンパイルが速い (vs. C++)。
- GCとメモリ安全性 (vs. C++)。
- 実行時パフォーマンスの良さ (vs. Python/Ruby)。
- スレッドモデルによる並行プログラミング (vs. Node.js)。
- Dockerなどの大規模プロジェクトでの実績。
悪い点
- Generics (template) がない。
- 継承がない。
- 例外がない。まるで1970年代に設計されたかのようである。
- 非知的なプログラマのためにデザインされている。
(4) 評価(私見)
golangは、「Better C」である。
- GCがある
これは、C(C++)に対する完全なるアドバンテージ。本来C++は、Cにおけるメモリ管理の脆弱性を解消すべきであったのに、ほとんど進歩がない。結局、Memory leakとSegmentation faultから逃れられない。 - オブジェクト指向ではないが、Interface、Methodをサポート
そもそも静的コンパイラであるC++が、「オブジェクト指向技術に拘泥してしまった」ことに問題がある。まるでイソップの「カエルと牛」ではないか。「golangの距離感とバランス感覚」は、むしろ好ましい。 - 標準ライブラリによるサポート
Json、Http、SQL、Mapなど幅広くサポート。このあたりは、Pythonを見習っているのかもしれない。 - その他
プログラム内に使わない変数やライブラリがあると、コンパイルエラー(Warningではない。)になるのはなんとも言えない。趣旨は理解するものの、正直鬱陶しい。
まあ、こんなところでしょうか。
golang、非常に気に入ったのですが、その当時はコードを書く時間的な余裕がなく、十分な検証は出来ませんでした。もう4年も前の話ですね。
今回は、当時の記憶をたどりながら、前回開発したPython Urwidのコードとも対比させながら進めていきたいと考えています。