Yabu.log

ITなどの雑記

golangを触って見た雑感

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

C言語はいろいろ大変だからgoでシステムプログラミングを学ぼうぜ。 という趣旨の本を読んでいる。ちょうど半分くらい(146/338)読めたのでgoの雑感でも適当に箇条書きで書いてみる。*1

goはtcfmで何度か触れられていたり、インタプリタ作る本が出ていたり

Go言語でつくるインタプリタ

Go言語でつくるインタプリタ

で結構興味がある。直近でOSの仕組みを結構学んだのでそれに近いことも書かれているし、横浜で楽しそうな読書会をやっている

yokohama-go-reading.connpass.com

などなど、色んなタイミングが重なってちょうどいいかなと思って手に取ってみた次第です

  • go run <.gofile>で動かすので、一見インタプリタっぽいと思ったが、コンパイルしてネイティブの実行バイナリを作成できる
$ go helloworld.go
helloworld

$ go build helloworld.go

$ ls
helloworld       helloworld.go

$ file helloworld
helloworld: Mach-O 64-bit executable x86_64

$ ./helloworld
helloworld
  • 試していないがクロスコンパイルとかもできるらしい

https://qiita.com/Jxck_/items/02185f51162e92759ebe

  • アセンブルしてみようと思ったがバイナリサイズができすぎてよくわからなかった
$ ls -alt helloc helloworld
-rwxr-xr-x  1  staff     8432  9  3 02:14 helloc
-rwxr-xr-x  1  staff  2011816  9  3 02:13 helloworld
  • hellocはC言語のhelloworldだけど、goはその200倍近いサイズがある。

    • ランタイムや何かでかいライブラリをリンクしているのかな。
  • goはgoとアセンブラで書かれている

  • インターフェースの説明がわかりやすい
    • interfaceを実装したい型の宣言時にinterfaceの情報を含めなくて良い
    • 確かrubyもこんな感じの仕様だった気がする(publicメンバが同一ならポリモーフィックな関係がある)
      • ちょっと調べましたがダックタイピングと言われるものですね

ダック・タイピング - Wikipedia

type Talker interface{
  Talk()
}

//構造体GreeterにはTalkerを明示的に実装しているという情報は含めない
//Javaのimplements的なやつがない
type Greeter struct{
  name String
}

//この宣言の時の(g Greeter)はレシーバ。どの構造体にインスタンスメソッドを実装するか、的なやつ
func(g Greeter) Talk(){
  fmt.Printf("hello,"g.name)
}
func main(){
  var talker Talker
  talkder = &Greeter{"wozozo"}
  talkder.Talk()
}
  • メソッド名は大文字で書くとpublic,小文字で書くとprivateの可視性をもつ
  • goのbufio.Writerのデフォルトバッファサイズは4096
    • いろんなバッファ、4096のものが多い気がする
  • goのprint文は書いた分だけシステムコールが発行される

  • p44より

    (goには)残念ながらErlangの文法に組み込まれているバイナリパターンマッチのような強力なバイナリ解析はありません

    • バイナリパターンマッチ、よくわからないけどErlang詳しい人に聞いたとところ、ヘッダの解析とかにめちゃくちゃ使えるらしい。
  • goは関数呼び出し時に関数名に"go "をつけることでgoroutine(軽量スレッド)と呼ばれる並列処理が使える
    • goのランタイムがOSっぽくこのスレッドを管理する
      • CPUからOSからはプロセスが増えたようには見えないらしい
      • Cだとfolkするとtopコマンドとかで表示されるプロセスが増える
  • goにはジェネリクス今の所ない
    • go2で入るらしい
  • goには例外がない
    • channelというものを使って処理の動機を取ることができる
    • FIFOっぽく使える
  • rustみたいに特定のポスト特定の言語みたいなのを狙っている感じはない
    • rustはC++の代替を目標?にしている空気がある
  • goはML系言語をやっている人たちからあまり好ましく思われていない?らしい

本書はgoそのものの情報よりもシステムプログラミングのトピックが多い。HTTP2やファイルディスクリプタ,RESTやunix socketなどなど。

聞きかじりの知識と適当にググった情報でやってるけど大丈夫かな。*2

これはgoに限った話ではないけど、後発の言語は、以前の言語の問題点とかハマりポイントをうまく回避したり、 いろんな言語で成功している概念などを取り入れている印象があるので、特に使わなくても新しい言語を学んでおくメリットはあると思し、実際学んでみると結構楽しい。

*1:最初の環境構築をサボったので大急ぎで演習問題を解いて追い付こうとしているところです

*2:それでもある程度挫折せずに進めているのはgoの凄いところなんじゃないかなと思う