Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hack and Read Elixir
Search
ohr486
November 20, 2021
Technology
2
680
Hack and Read Elixir
tokyo.ex reboot
ohr486
November 20, 2021
Tweet
Share
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.6k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
420
Hacking Phoenix Performance
ohr486
1
300
Plug & WAF
ohr486
2
460
elixirをプロダクションに導入する
ohr486
1
600
IEx maniacs
ohr486
4
560
Running App on AppRunner
ohr486
0
720
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
800
ex-app-on-k8s
ohr486
0
210
Other Decks in Technology
See All in Technology
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
730
抽象化をするということ - 具体と抽象の往復を身につける / Abstraction and concretization
soudai
18
7.3k
『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話 ~ 衛星搭載ソフトウェアと衛星運用ソフトウェア (実物) を動かしながらわいわいする編 ~』 @日本衛星データコミニティ勉強会
meltingrabbit
0
150
Developers Summit 2025 浅野卓也(13-B-7 LegalOn Technologies)
legalontechnologies
PRO
0
720
RSNA2024振り返り
nanachi
0
580
開発スピードは上がっている…品質はどうする? スピードと品質を両立させるためのプロダクト開発の進め方とは #DevSumi #DevSumiB / Agile And Quality
nihonbuson
2
3k
バックエンドエンジニアのためのフロントエンド入門 #devsumiC
panda_program
18
7.5k
リアルタイム分析データベースで実現する SQLベースのオブザーバビリティ
mikimatsumoto
0
1.4k
7日間でハッキングをはじめる本をはじめてみませんか?_ITエンジニア本大賞2025
nomizone
2
1.8k
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
360
目の前の仕事と向き合うことで成長できる - 仕事とスキルを広げる / Every little bit counts
soudai
24
7.2k
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
540
Featured
See All Featured
Designing Experiences People Love
moore
140
23k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
Docker and Python
trallard
44
3.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Designing for humans not robots
tammielis
250
25k
Fireside Chat
paigeccino
34
3.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
BBQ
matthewcrist
87
9.5k
Code Review Best Practice
trishagee
67
18k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Transcript
Hack and Read Elixir 2021-11-20 tokyo.ex Reboot
agenda • About Me • ゴール • モチベーション • リポジトリ
• ディレクトリ構造 • ビルドの全体構造 • コマンドの実体 • ソースコードのエントリーポイント • まとめ
About Me • おーはら / Twitter: @ohrdev / Github: ohr486
• 株式会社ドリコム SRE部 部長 ◦ Work: ▪ エンジニアマネージャ • 技術戦略の策定/推進 • エンジニア採用/採用戦略策定 ▪ サーバー/インフラエンジニア • 開発現場でゲームのバックエンド (Rails/Phoenix/Go/HCL)のコード書いてます ▪ 新規事業/ディレクター • 負荷試験支援/DevOps推進支援/設計コンサル • Community ◦ tokyo.ex / Japan Elixir Association / Erlang&Elixir Fest • Hobby ◦ 仏像制作 ◦ 自転車
ゴール • ターゲット ◦ elixir言語のコードを理解したい人 ◦ elixirにコントリビュートしたい人 ◦ elixir言語を改造したい人 •
今日のゴール ◦ elixir言語の全体概要を理解する ◦ github/elixir-lang/elixir のリポジトリの構成を理解する ◦ elixir言語のソースコードを読むためのエントリーポイントを作る
モチベーション • elixir言語自体の把握の仕方のドキュメントが少ない ◦ 日本語のドキュメントはほぼ無い • elixir本体のissue/PRを読む時に、elixir言語の全体構成を知っておけば捗るシチュ エーションが結構ある ◦ 全体構成を知らなくても
issue/PRを理解できる場合もあるが、コントリビュートする際は絶対知って おいた方が良い
リポジトリ • https://github.com/elixir-lang/elixir ◦ issue: https://github.com/elixir-lang/elixir/issues ◦ PR: https://github.com/elixir-lang/elixir/pulls •
特徴: issue/PRの取り込み/消化スピードが早い ◦ joseがすごい勢いで取り込んでいく ◦ issue/PRがだいたい常に1ページに収まっているのでは • Code of Conduct ◦ https://github.com/elixir-lang/elixir/blob/main/CODE_OF_CONDUCT.md ◦ github/メーリングリスト/IRC上での振る舞いの指針 ◦ コントリビュートする前に目を通すべし • (注意) メインブランチが master -> main に変更された ◦ 既にリポジトリをforkしている人は注意してください
ディレクトリ構造 • 重要なディレクトリ/ファイル ◦ Makefile ▪ 言語本体のビルド/コンパイルの起点 ◦ VERSION ▪
言語本体のコンパイル時に参照されるバージョンを記載 ◦ bin/ ▪ elixirの各種コマンドの実行ファイル • elixir, elixirc, iex, mix ▪ 実体はErlangのerlコマンドを起動するシェルスクリプト ◦ lib/ ▪ elixir本体と関連ツール/ライブラリのソースコード ▪ erlangとelixirのソースコードから構成される • eex, elixir, ex_unit, iex, logger, mix
ビルドの全体構造(tokyo.ex #13 elixirコードリーディング会) • https://speakerdeck.com/ohr486/hacking-elixir-how-to?slide=10
ビルドの全体構造 make make erlang elixir.app make elixir ビルド時の起点 yeccを使ってパーサーコードを lib/elixir/src/elixir_parser.erlとして生成
erl -makeでlib/elixir/src以下のerlangコードをcompile -> lib/elixir/Emakefileを読み込み make:all() を実行している -> コンパイルにより lib/elixir/ebin以下に*.beamファイルが生成される lib/elixir/generate_app.escriptでlib/elixir/ebin/elixir.appを生成 -> elixir.appはerlangのアプリケーション・リソースファイル Elixir.Kernel.beam make erlangで生成されたelixir_compilerモジュールのbootstrap関数を call -> $(ERL) -s elixir_compiler bootstrap -s erlang halt -> erl -s <Mod> <Func> <Arg1>... => Mod:Func(Arg1,...)を実行 -> elixir_compiler:bootstrapを実行して、erlang:haltで終了 mix,ex_unit logger,eex,iex MakefileのAPP_TEMPLATEの定義から標準ライブラリをコンパイル -> 各ディレクトリ内で、 elixircによるコンパイル 赤太字: erlangの機能
コマンドの実体 • bin配下のシェルスクリプト(windowsの場合は.batファイル) ◦ elixir / elixirc / iex /
mix • コマンドの依存関係 elixirc elixir iex mix +elixir オプションを付けて exec elixir 以下のオプションを付けて exec elixir --no-halt --erl “-noshell -user Elixir.IEx.CLI” +iex #!/usr/bin/env elixir Mix.start() Mix.CLI.main() 実体はerlコマンド elixirに渡されるオプションから erlに渡す引数を調整 例) +iexオプションがついていない時 erlの起動オプションに、 -noshell -s elixir start_cli を付与して から実行する erlコマンド実行時の内容を知りたい時は、 ELIXIR_CLI_DRY_RUN=1 を指定すれば内容を確認できる
コマンドの実体(elixir) ELIXIR_CLI_DRY_RUN=1 elixir --version erl -pa /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/eex/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/elixir/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/ex_unit/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/iex/ebin
/Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/logger/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/mix/ebin -elixir ansi_enabled true -noshell -s elixir start_cli -extra --version [オプション] -pa: 後ろに続くディレクトリ配下のモジュールを erl実行時にロード -noshell: erlangの対話シェルを起動せずに erlを実行 -s <Mod> <Func> <Arg>: ModモジュールのFunc関数を実行 elixir:start_cli() https://github.com/elixir-lang/elixir/blob/main/lib/elixir/src/elixir.erl
コマンドの実体(iex) ELIXIR_CLI_DRY_RUN=1 iex erl -pa /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/eex/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/elixir/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/ex_unit/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/iex/ebin /Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/logger/ebin
/Users/ohara_tsunenori/.asdf/installs/elixir/1.12.3/bin/../lib/mix/ebin -elixir ansi_enabled true -noshell -user Elixir.IEx.CLI -extra --no-halt +iex [オプション] -pa: 後ろに続くディレクトリ配下のモジュールを erl実行時にロード -noshell: erlangの対話シェルを起動せずに erlを実行 IEx.CLI https://github.com/elixir-lang/elixir/blob/main/lib/iex/lib/iex/cli.ex
ソースコードのエントリーポイント • elixirのビルドを理解したい ◦ Makefile: ▪ https://github.com/elixir-lang/elixir/blob/main/Makefile • 標準ライブラリを理解したい ◦
lib/*/mix.exs ▪ eex, ex_unit, iex, logger, mix ▪ mixプロジェクトの形式で提供される
ソースコードのエントリーポイント • elixirのコンパイラを理解したい ◦ パーサー: ▪ https://github.com/elixir-lang/elixir/blob/main/lib/elixir/src/elixir_parser.yrl ◦ コンパイラ(bootstrap関数): ▪
https://github.com/elixir-lang/elixir/blob/main/lib/elixir/src/elixir_compiler.erl ◦ ※一般的なプログラム言語のコンパイルの基礎知識は事前にあったほうが良い ▪ ソースコード > 字句解析 > 構文解析 > 意味解析 ◦ ※ErlangのAST/AbstractFormatの知識は事前にあったほうが良い • elixirのプログラム実行時の処理について理解したい ◦ elixirコマンドの起動モジュール(start_cli): ▪ https://github.com/elixir-lang/elixir/blob/main/lib/elixir/src/elixir.erl ◦ プロセス構造(elixir_sup): ▪ https://github.com/elixir-lang/elixir/blob/main/lib/elixir/src/elixir_sup.erl ▪ elixir:start_cli()実行時に elixir_sup:start_link() される
まとめ • elixirのリポジトリの構造について紹介しました • elixirのビルド時の処理について紹介しました ◦ elixirのコンパイラはerlangで実装されている事を紹介しました • elixir, elixirc,
iex, mixコマンドの実体について紹介しました • elixir本体のコードリーディングの起点について紹介しました