SwiftcKaigi #1 に行ってきた

swiftc、つまりSwift Compilerの勉強会に行ってきました。

Swiftを書いている身としてはやはりSwiftがどうやってコンパイルされて動いているのかは気になるわけです。毎日コンパイルしているので。

iosdiscord.connpass.com

 

ABI安定化

Logger.swiftとmain.swiftを使ってABI互換性を壊しながら知見を得ていこうという発表があった。@frozenのAttributeは見たことあったけど全く使い所がわからなかったのに今日出てきて、ABI互換性の話と繋がったらすんなり理解できた。要はこれはもうInterfaceは変わらないので凍結として扱ってもいいですよと宣言するという感じ。(実際にはメモリレイアウトがこれ以上変わらないよという宣言)@frozenしたのにプロパティを追加したりメソッドを生やしたりすると再コンパイルが必要になる。だからABI互換性があるとは言えない状況になっちゃう。でもiOSエンジニアからしたら基本的に外部フレームワークも含めて一度全部コンパイルしちゃうので別にいいじゃんっていう気持ちにもなった。

 

mangle / demangle

今日何度もこの言葉を聞いていたが、ちゃんと解説するスライドもあって非常に嬉しかった。mangleはswiftc上でモジュール名や型名、メソッド名、引数などをひとまとめにした名前にすること。swift demangle するとSwiftで読める形にすることができる。これが参考になった。

qiita.com

 

オブジェクトの参照カウンタ

これは初めてのiOSDCで聞いた内容だったので知っていたけど、久しぶりに聞いたのであぁそうだったなという感じ。オブジェクトはstrongの参照カウンタとweakの参照カウンタが存在していて、どちらも0になったときに初めて解放されるというもの。質問の中ではヒープ領域にはアドレスは残っていてオブジェクトにアクセスしたときに初めてnilを返すようにする仕組みだとか言っていたけど、あまりよくわからなかった。

 

vtable / witness_table

一昨年のiOSDCでよく聞いた話だったけど、実際にそれは何かっていうのは全然意味がわからないままになってた。今回はあるSwiftの事象を紐解く過程で出てきてなんとなく理解できた。言っていたことは理解できたけど、まあ勉強不足であまり腹落ちはしていない。まあでもクラスメソッド呼び出しかwitnessメソッド呼び出しかの違いで、インスタンスのメソッドなのか、プロトコルが持つメソッドなのかでdispatchの方法が違う、っていうくらいの理解でとりあえずいいかな〜と勝手に思っている。

 

SILOptimizerのPass

Passの作り方をデモをしながら教えてくれた人がいた。IntのオーバーフローはSILOptimizerで検知されている内容とかが結構興味深かった。自分で勝手にPass作ってオレオレ検査swiftcを作っちゃえばなんか面白ことができるんじゃないかとかも思ったりした。SILInstructionを読んでいくのが結構辛そうな感じだったけど。

 

わからないことだらけだったけどキーワードは拾えたし興味が出たら触ってみようという気持ちになった。この分野は目に見える形がわかりにくいので難しいなーと思った。swiftcを体系的にザーッと理解できるような本を1冊作って欲しいくらいな感じ。面白かったので2回目もあったら行きたい。