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
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
230
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
140
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
840
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
4.2k
Railsバージョンを4倍にした話
optim
0
520
Jetpack Compose Mechanisms
skydoves
3
840
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
440
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
4
740
AmebaブログはKMPから卒業します
kmars0605
0
220
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
140
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
For a Future-Friendly Web
brad_frost
184
10k
The SEO identity crisis: Don't let AI make you average
varn
0
590
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
740
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
59k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Become a Pro
speakerdeck
PRO
31
6.3k
Code Reviewing Like a Champion
maltzj
529
40k
ラッコキーワード サービス紹介資料
rakko
3
5.4M
Deep Space Network (abreviated)
tonyrice
0
380
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
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 • 標準モジュールを追加