aster_ismの工作室

FPGAとかマイコンとか

clang/LLVMのお勉強

最近、clang/LLVMのお勉強をしている。

が、某きつねさんの本は発売から10年以上たっているし、検索してもStackoverflowで同じ質問して解決してなかったりと、自力でお勉強するのはつらい。 どちらかと言えば、clangとかC/C++のフロントエンド回りについて知りたかったが、LLVMで自作言語を作るとかの内容は、それなりにヒットするけどclangにはみんな興味ないんですかね? とはいえ、お勉強するには何か取っ掛かりがないとやりずらいし、どうしたものかと。

とりあえず、それなりに新しいLLVMについて書いていそうな本を探して読むことにした。 選んだのは、LLVM Techniques, Tips, and Best Practices Clang and Middle-End Libraries | Packt。ついでにPackt Publishing のサブスクリプションを契約(ちなみに、オライリーのOnline Learning and Training でも閲覧可能)。 Githubの本書のレポジトリ があり、まずはこれをやりつつ、読むことにした。

Packt Publishing について補足しておくと、 Packt PublishingでLinuxドライバ開発の良書を見つけました – ぷちのいず でも紹介されているように、この記事から少し値上げされているが$12.99/月で技術書が読み放題。普通に読んでるだけでCreditが溜まっていったり、Free Learningで無料でepubをDLできるので正直自分はサブスクリプション費用以外払ったことが無い。

オンラインのBrowse Libraryは基本的にオライリーとよく似ているが、今時っぽいのはコードブロックに対して「Explain」ボタンを押すとCode Explainerが起動して(恐らくChatGPT的なのに投げて)対話的にコード解説をしてくれる。技術書なのでサンプルコードとか色々載っているけど、細かいところまで本文に書かれていないのを補完するという意味で役だった。

この本を読んだ後に、同じく Packt Publishing の Learn LLVM 12 | Packt も読んで、clang/LLVMの構成とかを完全に理解した。

ここまでで、clang/LLVM概要は理解したので、あとは実際に手を動かして、なんか作りながら覚えるかということで、 clang の examples から機能拡張をしながら、もう少し勉強を進めた。機能拡張コードは基本的にChatGPTだったり、Bing Chatだったりに聞きつつ進めることで(コンパイルできないことも多いが)、どういう風に実装すれば良いかの糸口が得られるので、そこから解決していく感じで進めた。結局最終的に見るのは、公式のドキュメントだったり実装になったりするが、予備知識がある分最初の頃に比べて調べやすくなった。

ということで、何とか clangを改造したり、Passを作ってみたりといったことができるようになった。