swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf ·...
TRANSCRIPT
Swiftコンパイラの実装
出水 厚輝 Arch B3 demmy oya: macchan
* Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生 * Swiftコンパイラのソースコードや仕様は非公開
Background�
1 / 13�
Problem�
バグの修正や仕様の変更に関する議論が 実装上の問題や速度とのトレードオフから乖離
仕様検討・バグ考察のための フリーでオープンかつ拡張可能な言語環境が必要
2 / 13�
TERM Research goal�
Swiftのサブセットを実装し 検証にあたって充分な拡張性と性能を満たす実装が
可能であることを確認する
3 / 13�
* 拡張性が高くなるよう実装を工夫 * コンパイルの性能を評価 * 生成できる実行ファイルの性能を評価
TreeSwift�開発言語 Swift
構文解析手法 LL(k)
最適化・バックエンド生成環境 LLVM
ライセンス 2-Clause BSD
コード配布ホスト Github
* 構文はApple公式ドキュメント内の拡張BNF定義を基本に設計 * LLVM IRの生成部分は本家コンパイラが生成するLLVM IRを参考に実装 * コードと構文は常にGithub上で公開 ( https://github.com/demmys/treeswift )
4 / 13�
Name Swift Silver Phoenix TreeSwift
Organization Apple RemObjects Software ind.ie me
Purpose Cocoa, Cocoa Touchのための新言語をつくる
同社の提供するCocoa,
Android, .NET開発環境の新言語としてSwiftを使用可能にする
Swiftのオープンかつフリーな 実装をつくる
フリーでオープンかつ拡張可能な実装で仕様の改善提案をする
License Proprietary Proprietary GPL v3 2-Clause BSD Host Language C++? ? Objective-C Swift
Parser ? ? LALR LL(k) Backend LLVM ? - LLVM
Announcement 6/2 7/24 10/11 10/30
Progress 1.1 released Preview released Mock only Subset
implemented
Comparison�
5 / 13�
Implementation�Source.swift
Source.ll
Text file� C POSIX functions�
Lexical analyzer�
AST�
Code generator�
Tokens�
Parser�
Objective-C++ wrapper classes�
LLVM C++ API� LLVM IR file�
6 / 13�
Lexical Analyzer�
Buffer�
* ボトムアップ構文解析に近い形式 * 解析を並行して走らせることでバックトラックを除去 * 失敗した生成器の状態からより詳細な構文エラーを検知可能
Classified character�
Character classifier�
Token composer 1�
Token composer 2�
Token composer 3�
Token�
7 / 13�
Parser� LL(k) - 予言的再帰下降構文解析
Rule arbiter�
Token stream� Rule�
Token consumer� AST
look k times process k step
process len(Rule) step
* 先読みで解析結果を決定づける * BNFの構文定義とコードの対応関係が分かりやすい * ルールを決定するDFAをトークンの処理から分離 * 先読みを冗長にすることでより詳細な構文エラーを検知可能
8 / 13�
Parser�
1 class PrimaryExpressionSymbol : NonTerminalSymbol { ! 2 init() { ! 3 super.init({ tp in ! 4 switch tp.look().kind { ! 5 case .Identifier: ! 6 return [TerminalSymbol([identifier])] ! 7 case .IntegerLiteral, .BooleanLiteral, .Nil, .LeftBracket: ! 8 return [LiteralExpressionSymbol()] ! 9 case .LeftBrace: !10 return [ClosureExpressionSymbol()] !11 case .LeftParenthesis: !12 return [ParenthesizedExpressionSymbol()] !13 case .Underscore: !14 return [WildcardExpressionSymbol()] !15 default: !16 return nil !17 } !18 }) !19 } !20 } !
primary-expression -> Identifier ! | literal-expression ! | closure-expression ! | parenthesized-expression ! | wildcard-expression
コード例
9 / 13�
Code generation�
* Swiftから直接LLVMのライブラリを触れないため、Objective-C++でラップするライブラリを書いてからブリッジ
* LLVMのPassを利用することで最適化を分離し、LLVMの資源を活用 * 現状のリンクと実行ファイルの生成には外部コマンドを使用
visit accept
Pass�
AST�
LLVM IR�
Pass manager�
Code generator�
Assembly file�
LLVM IR file�
Executable file�
clang
llc
10 / 13�
Evaluation�
11 / 13�
* コンパイル速度
* 実行ファイルのサイズ
フィボナッチ数を求める関数を100回定義したコード
時間 [ 秒 ]
treeswift 4.976
swiftc 0.066
サイズ [ KB ]
treeswift 24
swiftc 28
20 swiftc -O
Evaluation�
12 / 13�
* 実行速度
45番目のフィボナッチ数を再帰で求めるプログラム
時間 [ 秒 ]
treeswift 9.043
9.256 swiftc -O
swiftc 15.59
Schedule�
13 / 13�
現在の実装完成度 10~15%
* AST・コード生成部分の書き直し
* 構文解析のほぼ全構文への対応・高速化
* 基本的な構文のコード生成を完成
* 多く議論が起こっている改善案を取り入れられるか検討
* ほぼ全てのコード生成を完成
* 改善案を取り入れた実装を公開
Mar.
May
Jul.
Sep.
Nov.
Implementation
Switch文
総称型
列挙型
構造体
Protocol
標準ライブラリ
クラス
文字型
小数型
継承
辞書型
Optional関連構文
型拡張
分割ソース
アクセスレベル宣言
可変長引数
型エイリアス
カスタム演算子
In-out引数
キャスト演算子
三項演算子
配列型
クロージャ
パターン代入
タプル型
import宣言
Getter・Setter
Attribute
遅延評価変数
重い
軽い
基幹的 蛇足的
Mar.
May
Jul.
Sep.
Nov.
14 / 13�
Compiler Clang GHC OCaml Rust Scala Valac Language C++ Haskell OCaml Rust Scala Vala
Organization Apple etc...
Industrial Haskell Group
INRIA Mozilla EPFL GNOME project
Original implementation C Lazy ML C・ML OCaml Java ?
Self-hosted�
* その言語独自の機能に対して自然かつ明快な記述のできる場合が多い * インタプリタの実装やテストの記述が容易であることが多い
15 / 13�