あいをなくした。

あいをなくしたボカロP「あいなし」と、知識欲に飢えた大学生「アライさん」の週記です。

【LLVM】LLVMリファレンスを読む【経緯、抄録、概要】

はじめに

 ボクも初めて行う試みですので、結構誤った解釈をしているかもしれません。発見し次第ご連絡いただけたならすぐに修正いたしますのでよろしくお願いします。

そもそもLLVMとは(これを書き始めようと思った理由)

 LLVMというのは結論から言うと、コンパイラ基盤と呼ばれる言語と言えます。今回、BlanCという自作言語を開発するうえで、一からコンパイラを作っていたのでは時間が足りないことに気づきました。

 そこで、かなりリファレンスもしっかりしているLLVMにBlanCで書かれている言語を変換し、そこから実際に実行可能な機械語に翻訳するためのコンパイラ(既に存在する奴)に変換してもらおうという魂胆で学び始めようと思いました。

 

 今回読むのは一次情報である、「LLVM Language Reference Manual 12 documentation(ページ確認日:2020/8/28)」を引用しながら実際に学んでいきたいと思います。一次情報はあまりにも長いので、何十回かに分けて連載記事を出したいと思います。ただ、何処から学べばいいのかわからんので、一から書いてあったことをまとめていきます。

 前述したように、まだまだ至らぬ点が多いと思いますので、間違った解釈を見つけ次第、ご連絡ください。すぐに対応いたします。

Abstract(とりあえず抄録)

This document is a reference manual for the LLVM assembly language. LLVM is a Static Single Assignment (SSA) based representation that provides type safety, low-level operations, flexibility, and the capability of representing ‘all’ high-level languages cleanly. It is the common code representation used throughout all phases of the LLVM compilation strategy.

 とりあえず、英語力皆無なのでDeepL先生に助けてもらいました。多分これからも直訳文を置いていきます。

この文書は、LLVMアセンブリ言語のリファレンスマニュアルです。LLVMはスタティックシングルアサインメント(SSA)ベースの表現であり、型の安全性、低レベルの操作性、柔軟性、「すべての」高レベル言語をクリーンに表現する機能を提供します。LLVMは、LLVMコンパイル戦略のすべてのフェーズで使用される共通のコード表現です。

 LLVMについてはココでも触れていました。LLVMというのはアセンブリ言語の一種のようです。

 「型の安全性、低レベルでの操作機能、柔軟性、『すべての』高レベル言語('all' high-level languages)をクリーンに表現する機能を提供します。」という文章にもあるように、あらゆる言語の文法を再現することが可能であるようなので、今回はこの言語の学習を行いたいと思います。

Introduction(概要)

The LLVM code representation is designed to be used in three different forms: as an in-memory compiler IR, as an on-disk bitcode representation (suitable for fast loading by a Just-In-Time compiler), and as a human readable assembly language representation.

DeepL翻訳で翻訳しました。

LLVMコード表現は、3つの異なる形式で使用できるように設計されています。すなわち、インメモリコンパイラIRとして、ディスク上のビットコード表現(ジャストインタイムコンパイラによる高速ロードに適しています)として、そして人間が読めるアセンブリ言語表現としてです。

 LLVMコードは複数の表現があるようで、インメモリコンパイラIR(すみませんこれについてわかりませんでした。誰かわかる方はコメントください), バイナリ表記, 人間が読めるアセンブリ言語表現の三つです。ボクが一番重要視しているのは、記述が楽なバイナリ表記なのですが....

 続きを読みます。

This allows LLVM to provide a powerful intermediate representation for efficient compiler transformations and analysis, while providing a natural means to debug and visualize the transformations. The three different forms of LLVM are all equivalent. This document describes the human readable representation and notation.

翻訳です。

これにより、LLVMは効率的なコンパイラ変換と解析のための強力な中間表現を提供し、変換をデバッグして可視化する自然な手段を提供します。LLVMの3つの異なる形態は、すべて同等です。このドキュメントでは、人間が読める表現と表記法について説明します。

 人間が読める表現とその表記法に教えてくれるそうです(残念でした)。まあ、そうですよね。人間に分からないバイナリ表現なんて、すぐに理解できるわけじゃないですから、仕方ないですね。

 後日、バイナリ表現は学ぶことにして、とりあえず今は前に進むほかありません。

The LLVM representation aims to be light-weight and low-level while being expressive, typed, and extensible at the same time. It aims to be a “universal IR” of sorts, by being at a low enough level that high-level ideas may be cleanly mapped to it (similar to how microprocessors are “universal IR’s”, allowing many source languages to be mapped to them).

翻訳です。

LLVM表現は、軽量で低レベルでありながら、表現力があり、型付けされており、同時に拡張可能であることを目指しています。LLVMは、高レベルのアイデアをきれいにマッピングできるほど低レベルであることで、一種の「ユニバーサルIR」であることを目指しています(マイクロプロセッサがどのように「ユニバーサルIR」であるかに似ていて、多くのソース言語をマッピングできるようにしています)。

 この辺の内容は、基本的には文字通り概要って感じですね。こういう言葉ならべられると滅茶苦茶意欲上がります。

 LLVMは型付け、拡張可能であることを目指しているようで、ユニバーサルな中間表現を目指しているようです(クロスプラットフォームを目論む私としてはありがたい)。

 By providing type information, LLVM can be used as the target of optimizations: for example, through pointer analysis, it can be proven that a C automatic variable is never accessed outside of the current function, allowing it to be promoted to a simple SSA value instead of a memory location.

 翻訳

型情報を提供することで、LLVMは最適化の対象として使用することができます。例えば、ポインタ解析を通して、Cの自動変数が現在の関数の外にアクセスされることがないことを証明することができ、メモリ上の位置の代わりに単純なSSA値に昇格させることができます。 

  SSA値については、スタックメモリに格納する変数の表現を単純化させたものと思っておいてください。正直ボクもまだ理解できていないので読み取りが進んでわかり次第、きっと書くことになると思います。

 

この後に、このリファレンスで話す内容はきれいな構文であってパーサが読み取ってエラーを吐かない構文であるかどうかは別問題というお話がIntroduction内にあるのですが、とりあえず、今回はこれで終了したいと思います。ありがとうございました。