Top Banner
Swiftコンパイラの実装 出水 厚輝 Arch B3 demmy oya: macchan
16

Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa...

Sep 10, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Swiftコンパイラの実装

出水 厚輝 Arch B3 demmy oya: macchan

Page 2: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

*  Cocoa Touch開発用言語の急激な広まり *  Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生 *  Swiftコンパイラのソースコードや仕様は非公開

Background�

1 / 13�

Page 3: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Problem�

バグの修正や仕様の変更に関する議論が 実装上の問題や速度とのトレードオフから乖離

仕様検討・バグ考察のための フリーでオープンかつ拡張可能な言語環境が必要

2 / 13�

Page 4: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

TERM Research goal�

Swiftのサブセットを実装し 検証にあたって充分な拡張性と性能を満たす実装が

可能であることを確認する

3 / 13�

*  拡張性が高くなるよう実装を工夫 *  コンパイルの性能を評価 *  生成できる実行ファイルの性能を評価

Page 5: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

TreeSwift�開発言語 Swift

構文解析手法 LL(k)

最適化・バックエンド生成環境 LLVM

ライセンス 2-Clause BSD

コード配布ホスト Github

*  構文はApple公式ドキュメント内の拡張BNF定義を基本に設計 *  LLVM IRの生成部分は本家コンパイラが生成するLLVM IRを参考に実装 *  コードと構文は常にGithub上で公開 ( https://github.com/demmys/treeswift )

4 / 13�

Page 6: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�

Page 7: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�

Page 8: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Lexical Analyzer�

Buffer�

*  ボトムアップ構文解析に近い形式 *  解析を並行して走らせることでバックトラックを除去 *  失敗した生成器の状態からより詳細な構文エラーを検知可能

Classified character�

Character classifier�

Token composer 1�

Token composer 2�

Token composer 3�

Token�

7 / 13�

Page 9: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�

Page 10: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�

Page 11: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�

Page 12: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Evaluation�

11 / 13�

*  コンパイル速度

*  実行ファイルのサイズ

フィボナッチ数を求める関数を100回定義したコード

時間 [ 秒 ]

treeswift 4.976

swiftc 0.066

サイズ [ KB ]

treeswift 24

swiftc 28

20 swiftc -O

Page 13: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Evaluation�

12 / 13�

*  実行速度

45番目のフィボナッチ数を再帰で求めるプログラム

時間 [ 秒 ]

treeswift 9.043

9.256 swiftc -O

swiftc 15.59

Page 14: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Schedule�

13 / 13�

現在の実装完成度 10~15%

*  AST・コード生成部分の書き直し

*  構文解析のほぼ全構文への対応・高速化

*  基本的な構文のコード生成を完成

*  多く議論が起こっている改善案を取り入れられるか検討

*  ほぼ全てのコード生成を完成

*  改善案を取り入れた実装を公開

Mar.

May

Jul.

Sep.

Nov.

Page 15: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

Implementation

Switch文

総称型

列挙型

構造体

Protocol

標準ライブラリ

クラス

文字型

小数型

継承

辞書型

Optional関連構文

型拡張

分割ソース

アクセスレベル宣言

可変長引数

型エイリアス

カスタム演算子

In-out引数

キャスト演算子

三項演算子

配列型

クロージャ

パターン代入

タプル型

import宣言

Getter・Setter

Attribute

遅延評価変数

重い

軽い

基幹的 蛇足的

Mar.

May

Jul.

Sep.

Nov.

14 / 13�

Page 16: Swiftコンパイラの実装 - web.sfc.wide.ad.jpweb.sfc.wide.ad.jp/~demmy/2014f/term_slide.pdf · * Cocoa Touch開発用言語の急激な広まり * Cocoa・Cocoa Touch開発用の新言語としてSwiftが誕生

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�