投稿

ラベル(LLVM Clang)が付いた投稿を表示しています

Swift Compiler Architecture (Swiftコンパイラの構造)

Swiftがオープンソースになって公開された資料の中でSwiftのコンパイラについて書かれている部分を抜粋し、日本語に訳す。意味がわからないところは(?)を付けた。 Compiler and Standard Library The main Swift repository にはSwiftのコンパイラとスタンダードライブラリのソースコードがあります。 Compiler Architecture Swiftで書かれたソースコードからLLVM IRに変換される工程です。上から下に流れていきます。 Parsing ( lib/Parse ) : parserはソースコードをAbstract Syntax Tree (AST)に変換します。ここでは意味の情報も、型の情報も扱いません。ソースに文法の問題があるときはメッセージを出します。 Semantic analysis ( lib/Sema ) : parseされたASTを整形された型チェック済みのASTに変換します。意味の問題があるときはメッセージを出します。ここには型推論が含まれます。 Clang importer ( lib/ClangImporter ) : Clang modules をインポートします。そしてCやObjective-CのAPIと対応するSwiftのAPIをmapします(?) SIL generation ( lib/SILGen ) : Swift Intermediate Language (SIL)とはSwift用の中間言語で、さらなる分析と最適化に適しています。SIL generationは型チェック済みのASTを"生の"SILに"レベル下げ"します。 SIL guaranteed transformations ( lib/SILOptimizer/Mandatory : 変数の初期化などのデータの流れを診断します。この工程を終えると“canonical(正式な)” SILとなります。 SIL Optimizations ( lib/SILOptimizer/Analysis と lib/SILOptimizer/ARC と lib/SILOptimizer/LoopTransforms と lib/SILOp...

Interface「新時代コンパイラ入門」はよかった

Interface2015年3月号は「高性能でフリー!新時代コンパイラ入門」特集。 Swiftのコンパイルエラーの記事を書いたこともあって買ってみました。 変なハショリなどもなく読みやすかったです。 話に出てくるコンパイラはいさぎよくGCCとLLVMに絞ってあります。 コンパイルの各工程の解説が書かれています。 対象読者は普段プログラムをされている方か昔されていた方。そうでない方だと意味のわからないアルファベットが大量に出てくる状態になってつらいかもしれません。 対象とする前程知識はかなり基本的なコンパイラの知識で十分です。 ・コンパイルとはプログラムを解釈してCPUへの命令に置き換える作業 ・ARMとはCPUの設計をする会社 ・ARMが作ったものにはv7やv8などがある 程度でOKでした。 自分が読んだ部分はSwiftでの開発に関係ありそうなところだけで イントロダクション Appendix 1 第1章〜第6章 でした。 Clangの機能の使い方についての説明があった。これはブログで記事を書くのに役に立ちそう。

Swiftのコンパイルエラー寄せ集め

Appleが2014年6月に出してきた新しいプログラミング言語Swiftのコンパイルエラーの収集。こんなプログラムでこんなエラーが出ました、という例をいくつか集めたものです(仕様を読みながらわざとエラーを出したものもかなり含む)。理想を言うならコンパイルの工程を理解した上でそれぞれの説明をしたいのだが、かなり専門的になるのでそこまでは出来ない。 宣言、初期化の実行文 Type annotation missing in pattern 型の指定がない(型がわからない) 【確認ver】Swift 3.0.2【語】annotation 注釈 //Swift 3.0.2 var abc //エラー abcが何の型かわからない。 var abc: Int や var abc = 0 なら型が決まる(推測できる)のでOK。 //Swift 3.0.2 var a, b, c: Int = 0 //エラー Intと=0はcのみに対して適用されるようで、aとbが不確定になる。 var a, b, c: IntならOK。 //Swift 3.0.2 var a, b = 0, c: Int //エラー aに対して、= 0は適用されない(bに対して適用)、Intもaに対して適用されない(間に= 0が適用されたbがあるため?) Cannot assign to value: '***' is a 'let' constant 値を代入できません。***はletで定義された定数です。 【確認ver】Swift 3.0.2【語】assign 割り当てる 値を初期値以外にするならvarで宣言すること。 //Swift 3.0.2 let abc = 0 abc = 1 //エラー //Swift 3.0.2 func funcA(a: Int) { a = 0 //エラー } 関数の引数で与えられたものを関数内で変更しようとした。関数の引数はデフォルトで定数扱い。関数内で変数として使いたいなら関数の頭でvar a = aなどとして書き換え可能にする。 Cannot assign to value: '***' returns immutable value 値を代入できません。***は変更できない...