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
870
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
910
ex-app-on-k8s
ohr486
0
270
Other Decks in Technology
See All in Technology
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
Webアクセシビリティ入門 2026
recruitengineers
PRO
3
620
LLM Internals: 언어 모델의 계보와 알고리즘 진화 (2023~2026)
inureyes
PRO
0
310
ブラウザ研修 2026
recruitengineers
PRO
6
1.1k
Genie Codeハンズオン基礎編
taka_aki
1
130
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7.5k
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
310
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
4
350
案件に一番詳しいAIを Amazon Bedrock AgentCore で作る ― 知見が知見を生むチームへ / Compounding Knowledge with AgentCore
yusukeshimizu
1
110
DatadogのBits Chatが開発組織にもたらしたもの / What Bits Chat Has Brought Us
sms_tech
1
280
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
340
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
280
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Docker and Python
trallard
47
4.1k
Building Adaptive Systems
keathley
44
3.2k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Fireside Chat
paigeccino
42
4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
580
Between Models and Reality
mayunak
4
390
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
210
It's Worth the Effort
3n
188
29k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
420
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本体のコードリーディングの起点について紹介しました