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
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
180
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
570
Heart of Swift Concurrency
koher
0
1.1k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
400
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
190
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.4k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
150
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.2k
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
510
アクセシビリティから考える情報設計
high_g_engineer
0
430
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
370
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
840
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
2k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Thoughts on Productivity
jonyablonski
76
5.4k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
480
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Bash Introduction
62gerente
615
220k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
390
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
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 • 標準モジュールを追加