Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hacking Elixir How-To
Search
ohr486
September 29, 2019
Programming
1.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hacking Elixir How-To
ohr486
September 29, 2019
More Decks by ohr486
See All by ohr486
負荷試験Night#1 負荷試験2023年トレンド
ohr486
17
4.9k
Elixir/PhoenixによるWeb開発の現場から
ohr486
1
680
Hacking Phoenix Performance
ohr486
1
430
Plug & WAF
ohr486
2
570
elixirをプロダクションに導入する
ohr486
1
760
IEx maniacs
ohr486
4
700
Hack and Read Elixir
ohr486
2
830
Running App on AppRunner
ohr486
0
890
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
930
Other Decks in Programming
See All in Programming
Kotlinの15年とServer-Side Kotlin
n_takehata
1
160
AmebaブログはKMPから卒業します
kmars0605
0
210
JIS keyboard support in Omarchy
lef237
0
140
Next.js: The final boss of Web Performance
guaca
0
290
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
contenteditable と日本語入力に向き合う
colorful12
0
200
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
550
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
0
140
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
850
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
190
Workers Cache を知る
syumai
0
370
Featured
See All Featured
BBQ
matthewcrist
90
10k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Git: the NoSQL Database
bkeepers
PRO
433
67k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
310
Why Our Code Smells
bkeepers
PRO
340
58k
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Crafting Experiences
bethany
1
390
The Curse of the Amulet
leimatthew05
3
16k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Transcript
Hacking Elixir HowTo tokyo.ex#13 @ohrdev
agenda • Goal • 準備 • ElixirのMake • Makefile内のコマンド •
Compileフロー • Elixirカーネルcompile • exファイルcompile • Hack#1 versionを差し替えてみる • Hack#2 標準モジュールを追加する
Goal • Elixir本体のコンパイルの流れを理解する • Elixir本体の改造方法を理解する • Elixir本体の簡単なHackを体験する
準備 • githubからElixirのソースコードをclone ◦ https://github.com/elixir-lang/elixir ▪ Elixir 1.9.1 を対象にしています •
Erlangのインストール ◦ macの場合 ▪ brew install erlang ▪ asdf erlang install {VERSION} ◦ winの場合 ▪ https://www.erlang.org/downloads • Elixirのインストールに必要なErlangのバージョン ◦ Makefile内のチェック関数を参照 ▪ elixir 1.9.1の場合は、erlang20.0以上 • https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L30
ElixirのMake • Elixir本体のCompileはMakefileを利用して行われます • Makeとは? ◦ コンパイル・リンク・インストール等のルールを記述した Makefileに従ってこれらの作業を自動で実 行するツール •
基本は以下の通り <変数宣言> <タスク名>: <実行したいコマンド> <タスク名>: <依存ファイル> <実行したいコマンド>
MakeのTips • インデントはタブ • 「:=」で変数定義 • 実行コマンドの結果を出したくないときは、コマンドの先頭に「@」をつけると非表示 になる • タスク内から別のタスクを実行することも可能
• 実行コマンドは複数行にわたって記述可能、ただしインデントは同レベルに • install, compileの様な明示的な要求タスクは.PHONYで宣言し、ファイルの存在に 関わらず必ず実行できるようにする • .NOPARALLELで指定されたタスクは(並行オプションをつけていても)シリアルに実 行される
Makeの中の自動変数とマクロ • 自動変数 ◦ $@: ターゲットのファイル名 ◦ $<: 最初の依存ファイル名 •
マクロ ◦ defineでマクロを定義 ◦ $nでn番目の引数を受け取り可能 • マクロの呼び出し ◦ callでマクロの呼び出し • マクロの定義 ◦ evalでマクロの変数を展開した上で Makefileの構文として定義
Makefile内の実行コマンド変数 • ELIXIRC: bin以下のelixircシェルスクリプトを実行、実態はexec ◦ https://github.com/elixir-lang/elixir/blob/v1.9.1/bin/elixirc#L35 • ERL: erlangのerlコマンドをオプション付きで実行 ◦
erl -I lib/elixir/include -noshell -pa lib/elixir/ebin ◦ http://erlang.org/doc/man/erl.html • ERLC: erlangのerlcコマンドをオプション付きで実行 ◦ erlc -I lib/elixir/include $(ERLC_OPTS) ◦ http://erlang.org/doc/man/erlc.html
Compileフロー • Makefile( https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile )のcompileタスク • 大きく以下の3フェーズに分類 ◦ erlangタスク ▪
erlangのバージョンチェック ( https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L27 ) ▪ パーサージェネレーターの生成 ( https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L78 ) ▪ erlangコードのコンパイル( https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L76 ) ◦ lib/elixir/ebin/elixir.appを生成 ▪ elixir.appファイルをescriptで作成( https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L100 ) ▪ escriptは https://github.com/elixir-lang/elixir/blob/v1.9.1/lib/elixir/generate_app.escript ◦ elixirタスク ▪ stdlib, EEx.beam, mix, ex_unit, logger, eex, iexを生成 ▪ elixir本体はstdlibの中のKERNEL(後述)
make compile make compile make erlang lib/elixir/ebin/elixir.app make elixir lib/elixir/src/elixir_parser.erl
lib/elixir/src/elixir_parser.yrl lib/elixir/src/elixir.app.src lib/elixir/ebin VERSION lib/elixir/generate_app.escript stdlib lib/eex/ebin/Elixir.EEx.beam mix ex_unit logger eex iex APP_TEMPLATE
make erlang make erlang lib/elixir/src/elixir_parser.erl lib/elixir/src/elixir_parser.yrl erlc -o lib/elixir/src/elixir_parser.erl +’{verbose,true}’
+’{report,true}’ lib/elixir/src/elixir_parser.yrl yecc: パーサージェネレーター http://erlang.org/doc/man/yecc.html https://github.com/elixir-lang/elixir/blob/v1.9.1/li b/elixir/src/elixir_parser.yrl CHECK_ERLANG_RELEASE https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L28 cd lib/elixir && mkdir -p ebin && erl -make Emakeファイル( https://github.com/elixir-lang/elixir/blob/v1.9.1/lib/elixir/Emakefile ) を読み込んで、make:all() を実行 http://erlang.org/doc/man/make.html lib/elixir/sec以下のerlangコードがコンパイルされ、 lib/elixir/ebin配下にbeamファイルが配置される
make stdlib make stdlib lib/elixir/ebin/Elixir.Kernel.beam VERSION lib/elixir/lib/*.ex lib/elixir/lib/*/*.ex lib/elixir/lib/*/*/*.ex KERNEL
$(ERL) -s elixir_compiler bootstrap -s erlang halt make unicode cd lib/elixir && ../../$(ELIXIRC) lib/**/*.ex -o ebin make app erl -s <Module> <Func> <Arg1> … Module:Func(Arg1,...) を実行 ----------------------------------------------- elixir_compiler:bootstrap を実行した後、 elrang:halt で終了する
ElixirカーネルComile • 実体はelixir_compiler:bootstrap ◦ https://github.com/elixir-lang/elixir/blob/v1.9.1/lib/elixir/src/elixir_compiler.erl#L123 • lib/elixir/lib 配下の.exファイルをコンパイル ◦ https://github.com/elixir-lang/elixir/blob/v1.9.1/lib/elixir/src/elixir_compiler.erl#L141
exファイルCompile • 実体は$(ELIXIRC) lib/elixir/lib/**/*.ex ◦ https://github.com/elixir-lang/elixir/blob/v1.9.1/Makefile#L5 ◦ https://github.com/elixir-lang/elixir/blob/v1.9.1/bin/elixirc
Hack#1 • バージョンの差し替え • elixir --version の結果表示の変更 • バージョンの実体 ◦
https://github.com/elixir-lang/elixir/blob/v1.9.1/lib/elixir/lib/system.ex#L85
Hack#2 • 標準モジュールを追加