1日でSwiftコンパイラを作る!Swiftコンパイラインターンを開催しました

こんにちは、モバイル基盤部の @giginet です。

去る3月28日、Cookpad Spring 1day Internship 2019の一環として、Swiftコンパイラコースを開講しました。

最近のSwiftコンパイラ

近年、iOSエンジニアの間ではOpen Source Swiftがホットトピックとなっています。

ここ1年ほど、わいわいswiftcというSwift言語処理系に関する勉強会が盛り上がっていますし、 先日のtry!Swiftでは、参加者がSwift自体にcontributionするOpen Source Swiftワークショップが開かれました。

Swiftコンパイラに用いられているLLVMという技術は今、多くの言語処理系で利用されています。これを学ぶことで、さまざまな言語処理系に応用することができます。

このインターンは、Swiftコンパイラを例に、LLVMに触れ、コンパイラの動作を理解することを目的に構成しました。 後半のワークショップでは、実際にMinSwiftという簡易的なSwiftコンパイラをSwiftで開発してみます。

講義

まず最初の30分は講義パートです。Swiftコンパイラの構成を見ていき、LLVMの仕組みを学びます。

Swiftコンパイラ(swiftc)の構成

f:id:gigi-net:20190404183119j:plain

まず、Swiftコンパイラがどのようなフローを経て、動作するかを見ていきました。 コンパイラと一口で言っても、swiftcはパーサーや意味解析、中間言語など、様々な要素技術から構成されています。

1日でSwiftコンパイラ全てを理解することはできないので、今回はそれぞれの役割は説明するだけで留め、このインターンでは、現在、多くの言語処理系の要となっているLLVMに焦点を当てていきました。

LLVMを学ぶ

Swiftコンパイラのうち、LLVMとの橋渡しを行うIRGenに注目し、LLVMとは一体どのようなもので、どのように動作しているかについて学びました。

LLVMとは

LLVMは、コンパイラ基盤と呼ばれるもので、機械語の生成や最適化など、コンパイラに必要なものを共通化して作れるようにした仕組みです。

この仕組みを用いれば、一から作るよりは非常に少ない労力で汎用的なコンパイラが作成できます。 現に、Swiftのみならず、非常に多くのコンパイラがLLVM上で実現されており、LLVMについて学ぶことで多くの言語処理系について理解することができます。

LLVM IR

LLVM IR(LLVM Intermediate Representation)は、LLVMで使われる中間表現です。

どの言語であっても、最終的に適切なLLVM IRを生成することで、バイナリの生成や複数アーキテクチャへの対応、最適化などをLLVMの提供する仕組みに任せることができます。

LLVM IRは、ヒューマンリーダブルであるという特徴があり、例えば以下のような C のコードを例に挙げます。

int main(void) {
    return 42;
}

このコードは、以下のような LLVM IR で表現することができます。

define i32 @main() {
  ret i32 42
}

この講義では、LLVM IRの簡単な読み方や、LLVMの最適化がどのように動作するかを扱いました。

MinSwift

簡単な講義を経て、SwiftでSwiftをコンパイルするコンパイラ、MinSwift*1 を製作しながら、コンパイラの構成や、LLVMの扱いについて学びました。

このワークショップは、LLVMが公式で提供しているLLVM Tutorialを参考に構成されており、ここで実装している架空の関数型言語Kaleidoscopeと同程度の表現力を持つコンパイラをSwiftで実装しました。

MinSwiftは以下のように動作します。

  1. Swiftのコードをパース
  2. Abstract Syntax Treeに変換
  3. LLVM IRを生成
  4. ビルドして実行オブジェクトを生成
  5. SwiftやC++からリンクして呼び出す

多くはSwiftコードのパーサーをSwiftで書いたり、LLVM IRの生成部分を実装しますが、他にも実装を通して、受講者は非常に多くのことを学ぶことができます。 例えば必要となったのは以下のようなトピックです

  • Swift Package Managerを使ったコマンドラインツールの開発
  • Swiftにおけるユニットテストの実行とTDD
  • Swiftによるパーサーの実装
  • LLVMSwift を用いたlibLLVMの利用
  • LLVM IRの読み方
  • XcodeやLLDBの扱い方

ワークショップ

f:id:gigi-net:20190404183144p:plain

ワークショップは、予め用意されているユニットテストを通しながら、ドキュメントを参考に実装を進めていく形式となっていました。

f:id:gigi-net:20190404183201p:plain

テストケースが全て通過するように、1ステップずつ実装を進めていくと、最終的にSwiftコードからLLVM IRを生成し、LLVMを使ってコンパイルできるコンパイラ、MinSwiftが完成します!

最後まで実装を行うと、以下のようなコードをコンパイルすることができるようになります。少しは実用に耐えるコンパイラになったでしょうか?

func fibonacci(_ x: Double) -> Double {
    if x < 3 {
        return 1
    } else {
        return fibonacci(x - 1) + fibonacci(x - 2)
    }
}

応用課題

最後に、それぞれ好きなテーマを探して、MinSwiftの改善に取り組んでもらいました。

例えば以下のような課題です。

  • 関数定義の拡張
  • 数値リテラルの改善
  • for文の実装
  • 変数の実装
  • 文字列リテラルの実装

課題を完了させて、独自の実装まで到達できた参加者は極僅かでしたが、一方で短い時間の中、上記のような言語機能を追加できた参加者もいました。

f:id:gigi-net:20190404183220j:plain

まとめ

普段Swiftを書き慣れていても、アプリ開発と言語処理系の開発では全くノウハウが違い、戸惑った方も多かったようです。

コンパイラインターンという割には、パーサーの実装量が多くなってしまったのは反省点です。

未経験の方には多少難しかったようですが、概ね好評を頂けたようで嬉しく思っています😊

クックパッドではSwiftコンパイラや言語処理系に興味があるエンジニアを募集しています。

*1:これはRubyコミッターの @mametter が行ったRuby処理系のワークショップ、MinRubyのオマージュとなっています https://techlife.cookpad.com/entry/2018/10/16/131000

SRE Lounge #8 でスポンサー & 登壇をしました

こんにちは。技術部 SRE グループの吉川 ( @rrreeeyyy ) です。

少し遅くなってしまいましたが、先日の 3/13 に行われた SRE Lounge #8 の、 会場・フード・ドリンクスポンサーをクックパッドで行いました!

また、スポンサーだけでなく Cookpad Microservice Architecture Overview というタイトルで登壇もしましたので、簡単に紹介させて頂きます!

SRE Lounge について

SRE Lounge は、UZABASE さんのSRE チームが中心となり発足した勉強会で、 現在は SRE 同士での情報共有や交流の場として有志の方により定期的に開催されています。

SRE Lounge は有志の方が開催しているため、会場の提供やドリンク・フードなどの支援を行うスポンサーを募集しており、 今回は、主催の方とのご縁もあり、クックパッドで会場提供ならびにドリンク・フードのスポンサーをさせてもらいました。

f:id:rrreeeyyy:20190403220609j:plain
乾杯の様子

各発表について

ソラコムAPIの裏側で運用チームは何をやってきたのか

最初は、株式会社ソラコムの五十嵐様より、「ソラコムAPIの裏側で運用チームは何をやってきたのか」というタイトルで発表がありました。 ソラコム様でのシステム構成や、内部での DevOps の取り組みや苦労についてお話されたあと、 SRE の採用について、各社の Job Description の分析についての調査結果を踏まえてお話されていました。

f:id:rrreeeyyy:20190403220725j:plain

資料はこちらです。

Cookpad Microservice Architecture Overview

次に、私、吉川 ( @rrreeeyyy ) が、 「Cookpad Microservice Architecture Overview」という題でお話させてもらいました。

クックパッドでのマイクロサービスへの取り組みに関して、 Cookpad Tech Kitchen #20 などでもお話させて頂いてますが、 今回は、これらの全体像がどうなっているのかについて簡単に紹介しました。

発表は少し駆け足になってしまったのですが、この発表をベースに、懇親会で気になったことについて深い議論を交わすことができ、 非常に有意義な時間を過ごすことができたと感じています。

f:id:rrreeeyyy:20190403220833j:plain

資料はこちらです。

また、マイクロサービスへの取り組みのさらなる詳細は、 先ほど紹介した Cookpad Tech Kitchen #20 などの資料も併せてご覧いただければと思います。

割れ窓理論をWebインフラの改善に活用し、チーム内の知識共有を促進している話

最後に、株式会社はてなの @hokkai7go 様より「割れ窓理論をWebインフラの改善に活用し、チーム内の知識共有を促進している話」というタイトルで発表がありました。

技術的負債や軽微な問題などを、Issue にしておき、週に 1 度、1 時間程度取って作業をしているそうです。 今回の発表にもある通り、こういった取り組みに対して実施してみてどうだったかの振り返りや改善をしっかり行えており、学びのあるお話でした。

f:id:rrreeeyyy:20190403220901j:plain

資料はこちらです。

おわりに

class SRE implements DevOps と言われているように、 会社の事業や、チームとして実現したい信頼性のあり方によって SRE の振る舞いや、目指すべきゴールはある程度変わってくると考えています。

その際に、SRE Lounge のような場で、他社の SRE の方々と意見を交換し、どういったゴールを目指しているのか、 どういった取り組みを行っていて、どういった結果になったのかを知るのは、非常に有意義なものだと感じました。

SRE Lounge から派生して、テーマを決めてディスカッションを行う SRE Session #1 というのも開催されるそうです。興味がある方は是非参加してみてください。

また、クックパッドでは SRE に限らず、SRE と一緒にサービスの信頼性に取り組んでくれる開発エンジニアも募集しています。 興味がある方は https://info.cookpad.com/careers/ をご覧頂いたり、Twitter などでお声がけ頂ければと思います。

クックパッドが今、エンジニアとデザイナーを採用したい理由

こんにちは、クックパッドの冨永(@mamiracle__)です。

突然ですが現在クックパッドでは、サービス開発に携わるエンジニアとデザイナーの採用に注力しています!

しかし、社外の方とお話をしていると「クックパッドはひとつの完成したレシピサービスをやっている会社だよね。本当にエンジニアやデザイナーを積極採用しているのですか?」と聴かれることがよくあります。

答えは「YES!!!!!!」です。

わたしたちが積極採用をするのは、ミッションである「毎日の料理を楽しみにする」の達成に向けてサービスを生み出し、成長させるため。このことには大きな意義があるとクックパッドは信じていて、そのためにやるべきことが(レシピサービスでもそれ以外でも)たくさんあります。

そのことを皆さまに伝えるために、採用サイトを大幅にリニューアルしました。

今日はリニューアルに際してお伝えしたかった想いを、ブログに綴りたいと思います。ぜひ温かい眼差しでお読みいただけたら幸いです。

リニューアルした採用サイトはこちらです👇✨

クックパッド株式会社 | クックパッド株式会社 採用サイト

はじめに

食事が心とからだの健康をつくる、ということは誰もが認めていることです。

わたしたちにとって食事は、単なる栄養摂取の方法ではありません。一緒に食事をする家族や友人や、日常生活の中で接する人々とのつながり、さらに視野を広げてみれば地球環境を見直すことにまで密接に関係しています。(ある調査では、生産されたものの食べられていない食品ロス分だけでも、世界の温室効果ガスの8%に相当することがわかっているのだとか!)

わたしたちにとって「自分たちのための食事を料理すること」は、自分の意思(や食べる人のことを想って)で自分たちの食事をコントロールできる、とても身近で創造的で健康的な手段だとクックパッドは考えています。

ですが、料理することや食べることは日常生活に密着しすぎていて、まさにつくる・食べるその瞬間に大切さを改めて考えることは少ないかもしれません。わたしたち人間にとって不可欠に重要だけれど、考えずに「こなす」ことも容易なのが、料理や食べるという行為です。

クックパッドはそのことについて世界中の人々が、自然と考えたくなる世界、行動したくなる世界を目指しています。

「技術」で「料理の課題」を解決する

「料理」とひとことで言っても食材や道具などの生産、物流、流通、調理、食卓、洗い物、記録、実はさまざまなシーンが存在します。これを世界中の人々に向けて価値を届けようとすると、やりたいこと・やらなければならないことが溢れ出てくるのです!

いまは下記の三つの領域で、ミッションの実現に向けた挑戦をしています。

■つくり手を増やす

毎日の料理の課題を技術で解決し、つくるハードルを最小限に。つくる楽しさは最大限に。毎日の料理を楽しみにしし、つくり手を増やします。 f:id:mamiracle:20190402123438p:plain

各サービスの紹介はこちら

Our Challenges | 私たちのチャレンジ | クックパッド株式会社

関連するTechLife記事

■つくり手をつなげる

料理、道具、食材など、さまざまなつくり手をつなげることで、すべてのつくり手が継続的に収入を得ることができる仕組みをつくります。 f:id:mamiracle:20190402123444p:plain

各サービスの紹介はこちら

Our Challenges | 私たちのチャレンジ | クックパッド株式会社

関連するTechLife記事

■世界70億人のインフラへ

料理は、万国共通の習慣。だから、私たちの挑戦は国内にとどまりません。英国ブリストルに構えたグローバル本社を起点に、世界各国へとクックパッドを広げていきます。71カ国26言語にて展開しています。(2018年12月現在)

世界各地域のクックパッドはこちら

Our Challenges | 私たちのチャレンジ | クックパッド株式会社

英国ブリストルチームの開発者ブログ

sourcediving.com

一緒にやっていきませんか!

毎日の生活のちょっとしたワクワクと喜びの連続を生むために、わたしたちはサービスに触れていない時間も含めて、料理に関する全てを楽しみにする一連の体験をデザインします。

そして、料理の中にある様々な課題を、スケーラブルに解決するために技術の力を活用します。課題に向き合い、最善な手段を取り続けること。

そんな姿勢に共感してくださる方がいたら、ぜひ私たちに会いに来てください!

リニューアルした採用サイトには、お伝えしきれなかったことを詰め込んでいます。こちらもぜひご覧いただけたら幸いです。

Let’s make everyday cooking fun together!

info.cookpad.com