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
Hacking Elixir How-To
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
650
Hacking Phoenix Performance
ohr486
1
410
Plug & WAF
ohr486
2
550
elixirをプロダクションに導入する
ohr486
1
730
IEx maniacs
ohr486
4
660
Hack and Read Elixir
ohr486
2
810
Running App on AppRunner
ohr486
0
860
sponsor-talk-drecom-heisei-ruby-kaigi
ohr486
0
910
Other Decks in Programming
See All in Programming
Swiftのレキシカルスコープ管理
kntkymt
0
220
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
240
さぁV100、メモリをお食べ・・・
nilpe
0
140
dRuby over BLE
makicamel
2
330
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.2k
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
130
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
660
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
450
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
140
Docker and Python
trallard
47
3.9k
Ethics towards AI in product and experience design
skipperchong
2
310
The untapped power of vector embeddings
frankvandijk
2
1.8k
Code Review Best Practice
trishagee
74
20k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
420
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 • 標準モジュールを追加