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
410
Plug & WAF
ohr486
2
560
elixirをプロダクションに導入する
ohr486
1
740
IEx maniacs
ohr486
4
680
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
それでも、技術なブログを書く理由 #kichijojipm / Why I Still Write Tech Blogs Even Now
shinkufencer
0
990
AIが当たり前の組織で エンジニアはどう育つか
nishihira
1
1.3k
データ活用研修 データマネジメント【MIXI 26新卒技術研修】
mixi_engineers
PRO
4
470
歴史から理解するクラウドインフラのしくみ
kizawa2020
0
170
現場で使える AWS DevOps Agent 活用ノウハウ - Release Management 機能の検証結果を添えて / AWS DevOps Agent Release Management and Know-How
kinunori
3
110
全社でのソフトウェアサプライチェーン攻撃対策をやってみた with Takumi Guard
z63d
0
310
インシデント事例と パッケージの全量解析に学ぶ ソフトウェアサプライチェーンの守り方 / supply-chain-attack-defense
flatt_security
0
1.1k
AI研修(Day1)【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
1.3k
現場との対話から始める “作る前に問い直す”業務改善
mochico50
2
310
Git 研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
460
「休む」重要さ
smt7174
7
1.7k
データエンジニアこそ組織のオントロジーに向き合うべき — 問いに答えるAIから、事業を動かすAIへ
gappy50
2
450
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
420
GitHub's CSS Performance
jonrohan
1033
470k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
840
Facilitating Awesome Meetings
lara
57
7k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Accessibility Awareness
sabderemane
1
160
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
390
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
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本体のコードリーディングの起点について紹介しました