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
820
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hack and Read Elixir
tokyo.ex reboot
ohr486
November 20, 2021
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.9k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
660
Hacking Phoenix Performance
ohr486
1
420
Plug & WAF
ohr486
2
560
elixirをプロダクションに導入する
ohr486
1
750
IEx maniacs
ohr486
4
690
Running App on AppRunner
ohr486
0
880
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
920
ex-app-on-k8s
ohr486
0
270
Other Decks in Technology
See All in Technology
Genie Codeハンズオン応用編
taka_aki
0
130
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
5
740
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
360
NANDでも描画したい!
nichica906
0
230
MulticaとPi Coding Agentで、小規模OSSを30本同時運用した流れ
eiei114
0
130
小粒でもパワフルなJS Runtime Antjsについて
comamoca
0
110
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
180
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
120
強化学習「理論」入門
enakai00
3
3.6k
20260817_生成AIの動向と中学校・高等学校での活用を考える_v1.00_公開用
doradora09
PRO
0
140
MIXIで活躍できるエンジニアを 若手社員目線で考えてみる
mixi_engineers
PRO
0
110
My broken English still works: speaking at global OSS events
naruoga
0
120
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
300
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
440
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
790
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
The browser strikes back
jonoalderson
0
1.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.4k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Crafting Experiences
bethany
1
260
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
870
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
470
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本体のコードリーディングの起点について紹介しました