狠狠撸

狠狠撸Share a Scribd company logo
2016/08/17
kyobashi.swift #2
@gomi_ningen
この実装には问题がある!
自己紹介
某ラビットハウス社で働く社畜 新3年生
? Java, Scala, Swift, C#, PHP, F-BASIC など...
? iOS開発初めて1年くらい
? 日本ごちうさユーザーグループ(JGUG)
? ごちうさ関連のエンジニアリングのお仕事依頼お待ちしております
? 時間がないので自己紹介は割愛します?
@gomi_ningen
今日話す内容
末尾呼び出しとその周辺のお話
1. 末尾呼び出し?末尾再帰とは?(3分)
簡単な関数の実装について考えながら、末尾再帰とは何かをおさらい
2. 再帰っぽいけど実はループな実装(3分)
ループならスタックの問題は発生しないので、再帰風にアルゴリズム
を実装できるが、実際はループになるようなコードを書いてみる
3. Swiftと末尾呼び出しのちょっと未来の話(3分)
Swift 4 とか
末尾呼び出し?末尾再帰とは
簡単な関数について考えていく
1 から n までの整数(0, 1, 2 ...)の和を返す関数 tri を実装したい
tri(n) = 0 + 1 + 2 + ... + (n -1) + n
簡単な関数について考えていく
1 から n までの整数(0, 1, 2 ...)の和を返す関数 tri を実装する
tri(n) = 0 + 1 + 2 + ... + (n -1) + n
だいたいこんなかんじ?
簡単な関数について考えていく
1 から n までの整数(0, 1, 2 ...)の和を返す関数 tri を実装する
tri(n) = 0 + 1 + 2 + ... + (n -1) + n
デカい数を引数にして呼び出すと死ぬ
?? いわゆる スタックオーバーフロー というもの
簡単な関数について考えていく
1 から n までの整数(0, 1, 2 ...)の和を返す関数 tri を実装する
tri(n) = 0 + 1 + 2 + ... + (n -1) + n
実行中のサブルーチンに関する情報をスタックに積んでいくため、
関数から関数を呼び出しまくるとスタックから溢れてしまう
簡単な関数について考えていく
サブルーチン内で計算が完結していればスタックフレームは生成されな
いので、単純に while ループで書けばよい
コードとしてはちょっと見通しが悪い?
再帰でこれを実現する方法はないのか?
末尾呼び出し
あるルーチンが、他のルーチンを呼び出して戻り値を受け取ったとして、
それを返す以外の操作をしないとき、末尾呼び出しであるという
?? 言葉にするとややこしいがコードを見れば単純
この実装には问题がある!
末尾呼び出し
Swiftの処理系は、最適化オプションを有効にすると
ほぼほぼ末尾呼び出しをスタックフレームを生成しない形の
アセンブリコードに変換してくれる
(これを末尾呼び出しの除去とよんだりするらしい)
最適化あり: swiftc –O /path/to/file.swift
最適化なし: swiftc –Onone /path/to/file.swift
つまり先ほどの例の関数も、
末尾呼び出しの形にしてあげれば
再帰を使った形かつ大きな引数で
関数を呼び出すことができるはず!
簡単な関数を末尾呼び出しにする
else 句のほうが、末尾呼び出しになっている。特に自分自身を再帰的に
末尾呼び出しするとき、末尾再帰呼び出しという。
もちろん playground 上では最適化がかからないので、
でかい引数で呼び出すと死ぬ
この実装には问题がある!
iOS/OSXプロダクト開発上、問題が発生することは稀だと思うが
一応難癖をつけると、以下のような問題がある(ことにしておく)
? 実際に末尾呼び出し除去がかかるという保証はない
? playgroundでデカい引数で呼び出したいとしても無理
実際、前者は抽象的なライブラリを設計する開発者にとっては若干悩ま
しい部分があるかもしれない...
再帰っぽいけど実はループな実装
を作れば問題が解決する
準備: フレームワークの実装
再帰っぽいコードをループに変換するための下準備
関数の実装部
普通の再帰っぽい雰囲気
引数を 100000 で呼び出しても死なない!!!!!!!!!
ちょっと未来の厂飞颈蹿迟の话
@tailrecアノテーションの導入
? Scalaと同様の @tailrec アノテーションの導入提案 issue
? Swift3 では、ほぼ間違いなく入らない
? しかし、Swift4 では入る可能性はある
https://github.com/apple/swift-evolution/pull/103/files
まとめ
? Swiftには末尾再帰除去を想定したコードであることを
明示的に宣言するための言語機能が存在しない
? ほぼ末尾再帰的な記述でスタックフリーな実装をする
フレームワークは簡単に自作できる
? とはいえ日常のSwiftプログラミングでこれを考慮しなければ
ならないケースは非常にまれである
? コンビネータを大量に含むライブラリを書くときは考慮が必要
? Swift4 に向けて Scala の @tailrec 的なアノテーションが
入るかどうかの検討が進む見通し

More Related Content

What's hot (20)

PDF
人间たちと蝉测蝉迟别尘诲
Uchio Kondo
?
PDF
ペパボ福冈支社における搁耻产测の活用事例
Uchio Kondo
?
PDF
いまさら耻ずかしくて础蝉测苍肠を补飞补颈迟した
Kouji Matsui
?
PDF
Hello! intermediate language
Kouji Matsui
?
PDF
World plonedaylt
Atsushi Odagiri
?
PDF
これからの「补蝉测苍肠/补飞补颈迟」の话をしよう
Kouji Matsui
?
PDF
Hello Ruby
Takahiro KUREBAYASHI
?
PDF
20130615 組込みの仕事場て?Rubyを使う
Ryo Nagai
?
PDF
continuatioN Linking
Kouji Matsui
?
PDF
闯补惫补のテスト骋谤辞辞惫测て?いいのて?はないかという话
disc99_
?
PDF
ペパボのサービスと搁耻产测
Uchio Kondo
?
PPTX
ほ?くの狈辞诲别.箩蝉のた?いいっほ?
拓弥 遠藤
?
PDF
搁耻产测ボードハンズオンテキスト
三七男 山本
?
PDF
骋搁-颁滨罢搁鲍厂の绍介
三七男 山本
?
PDF
Thread affinity and CPS
Kouji Matsui
?
PDF
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Tomoya Kawanishi
?
PDF
闯惫尘言语と闯补惫补、切っても切れないその関係
yy yank
?
PDF
Swift 3 その基本ルールを眺める #cswift
Tomohiro Kumagai
?
PDF
Osc2012 hiroshima
Akira Kaneda
?
ODP
Python-Tokai at Nagoya Ruby Meeting 01
itouakihiro
?
人间たちと蝉测蝉迟别尘诲
Uchio Kondo
?
ペパボ福冈支社における搁耻产测の活用事例
Uchio Kondo
?
いまさら耻ずかしくて础蝉测苍肠を补飞补颈迟した
Kouji Matsui
?
Hello! intermediate language
Kouji Matsui
?
World plonedaylt
Atsushi Odagiri
?
これからの「补蝉测苍肠/补飞补颈迟」の话をしよう
Kouji Matsui
?
20130615 組込みの仕事場て?Rubyを使う
Ryo Nagai
?
continuatioN Linking
Kouji Matsui
?
闯补惫补のテスト骋谤辞辞惫测て?いいのて?はないかという话
disc99_
?
ペパボのサービスと搁耻产测
Uchio Kondo
?
ほ?くの狈辞诲别.箩蝉のた?いいっほ?
拓弥 遠藤
?
搁耻产测ボードハンズオンテキスト
三七男 山本
?
骋搁-颁滨罢搁鲍厂の绍介
三七男 山本
?
Thread affinity and CPS
Kouji Matsui
?
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Tomoya Kawanishi
?
闯惫尘言语と闯补惫补、切っても切れないその関係
yy yank
?
Swift 3 その基本ルールを眺める #cswift
Tomohiro Kumagai
?
Osc2012 hiroshima
Akira Kaneda
?
Python-Tokai at Nagoya Ruby Meeting 01
itouakihiro
?

Viewers also liked (17)

PPTX
Lecture 7 organization structure- chapter 1 jamed a hall
Habib Ullah Qamar
?
DOCX
Edward's C.V
Edward O' Connell
?
PPS
DECOWORLD
Alanka Jayawardena
?
PDF
25 Co Reference
George Bashkingy
?
PDF
The Effect of Movie Subtitling on Incidental Vocabulary Learning among EFL Le...
Conferenceproceedings
?
PDF
BIO Paulo Cavalcanti (english version)
Paulo Cavalcanti
?
PPTX
Slovakia twinnspace
kuboajuro
?
PDF
Dive into apple music app
Takuro Hanawa
?
PPTX
Uce metodologia de la investigacion
Katerin Mtza
?
PDF
Scrum глазами тестировщика или как создать стратегию для любой задачи
IT61
?
POTX
This Time It's Personal: One-on-One Canvas Support
LSEngle
?
PDF
Assembly lines
CRK Automa??o Industrial
?
PDF
Postman tests in jenkins
Alex Galkin
?
PPTX
Автоматизация тестирования ролей и привилегий
SQALab
?
PPT
Pl world and polish literature
Comenius Projects in Paderewski
?
PPT
Konsep Asas HE
teochaw
?
Lecture 7 organization structure- chapter 1 jamed a hall
Habib Ullah Qamar
?
Edward's C.V
Edward O' Connell
?
25 Co Reference
George Bashkingy
?
The Effect of Movie Subtitling on Incidental Vocabulary Learning among EFL Le...
Conferenceproceedings
?
BIO Paulo Cavalcanti (english version)
Paulo Cavalcanti
?
Slovakia twinnspace
kuboajuro
?
Dive into apple music app
Takuro Hanawa
?
Uce metodologia de la investigacion
Katerin Mtza
?
Scrum глазами тестировщика или как создать стратегию для любой задачи
IT61
?
This Time It's Personal: One-on-One Canvas Support
LSEngle
?
Postman tests in jenkins
Alex Galkin
?
Автоматизация тестирования ролей и привилегий
SQALab
?
Pl world and polish literature
Comenius Projects in Paderewski
?
Konsep Asas HE
teochaw
?
Ad

Similar to この実装には问题がある! (20)

PDF
Java one 2013 sf 報告会lt
torutk
?
PPTX
今日から始める尝补谤补惫别濒
Masaru Matsuo
?
PPTX
仕事でも Groovy を使おう!
Oda Shinsuke
?
PPT
补辫辫别苍驳颈苍别活用事例资料蔼罢顿顿叠颁札幌2.1
Go Sueyoshi (a.k.a sue445)
?
PDF
Zappa で Serverless CMS を作ってみる
Iosif Takakura
?
PPT
2009年の笔贬笔フレームワーク
Takuya Sato
?
PDF
闯补惫补に这いよる.狈贰罢
Hiroshi Maekawa
?
PDF
Letsgo developer 2012 Continuous Delivery
Nobuhiro Sue
?
PDF
狈辞诲别にしましょう
Yuzo Hebishima
?
PPTX
古い?タ?サい?まだまだイケル颁丑别蹿!
Naoto Ishizawa
?
PPT
Scala Daysに行ってみて
Kota Mizushima
?
PDF
Open stack swift is too Enterprise? 2014/12/01 advent cal
Naoto Gohko
?
PDF
鲍苍颈迟测とスマートフォンアプリの最适化
COLOPL, Inc.
?
PDF
LT#7 Hello coffeeしてきた
Shingo Inoue
?
PDF
Introduction to guard + rspec
koko_u
?
PDF
2015.08.29 JUS共催勉強会資料
umidori
?
ODP
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
Kazuya Numata
?
PPT
闯辫尘辞产颈濒别を使ってみる
Hiromu Shioya
?
PDF
20120616i phonedeveloperworkshop
Yoichiro Sakurai
?
KEY
驳辞辞驳.谤别辩耻颈谤别()を手书きしていいのは小学生まで
Teppei Sato
?
Java one 2013 sf 報告会lt
torutk
?
今日から始める尝补谤补惫别濒
Masaru Matsuo
?
仕事でも Groovy を使おう!
Oda Shinsuke
?
补辫辫别苍驳颈苍别活用事例资料蔼罢顿顿叠颁札幌2.1
Go Sueyoshi (a.k.a sue445)
?
Zappa で Serverless CMS を作ってみる
Iosif Takakura
?
2009年の笔贬笔フレームワーク
Takuya Sato
?
闯补惫补に这いよる.狈贰罢
Hiroshi Maekawa
?
Letsgo developer 2012 Continuous Delivery
Nobuhiro Sue
?
狈辞诲别にしましょう
Yuzo Hebishima
?
古い?タ?サい?まだまだイケル颁丑别蹿!
Naoto Ishizawa
?
Scala Daysに行ってみて
Kota Mizushima
?
Open stack swift is too Enterprise? 2014/12/01 advent cal
Naoto Gohko
?
鲍苍颈迟测とスマートフォンアプリの最适化
COLOPL, Inc.
?
LT#7 Hello coffeeしてきた
Shingo Inoue
?
Introduction to guard + rspec
koko_u
?
2015.08.29 JUS共催勉強会資料
umidori
?
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
Kazuya Numata
?
闯辫尘辞产颈濒别を使ってみる
Hiromu Shioya
?
20120616i phonedeveloperworkshop
Yoichiro Sakurai
?
驳辞辞驳.谤别辩耻颈谤别()を手书きしていいのは小学生まで
Teppei Sato
?
Ad

More from GOMI NINGEN (6)

PDF
15 minutes recipe of RxSwift
GOMI NINGEN
?
PDF
Dependency Injection in Swift2
GOMI NINGEN
?
PDF
搁虫厂飞颈蹿迟を用いたアフ?リ开発の実践
GOMI NINGEN
?
PDF
滨罢厂を用いた旅行の构筑
GOMI NINGEN
?
PDF
Xamarin.iOS によるフ?ロタ?クトアフ?リ開発の実践
GOMI NINGEN
?
PDF
RxSwiftのObservableとは何か | iOSDC Japan 2017
GOMI NINGEN
?
15 minutes recipe of RxSwift
GOMI NINGEN
?
Dependency Injection in Swift2
GOMI NINGEN
?
搁虫厂飞颈蹿迟を用いたアフ?リ开発の実践
GOMI NINGEN
?
滨罢厂を用いた旅行の构筑
GOMI NINGEN
?
Xamarin.iOS によるフ?ロタ?クトアフ?リ開発の実践
GOMI NINGEN
?
RxSwiftのObservableとは何か | iOSDC Japan 2017
GOMI NINGEN
?

この実装には问题がある!

Editor's Notes

  • #3: 时间がないので飞ばす
  • #4: 読み上げ