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
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
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
490
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
240
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
210
技術記事、 専門家としてのプログラマ、 言語化
mizchi
3
690
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Swiftのレキシカルスコープ管理
kntkymt
0
220
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
Oxcを導入して開発体験が向上した話
yug1224
4
310
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
5
4k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Webフレームワークの ベンチマークについて
yusukebe
0
160
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
71
40k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Chasing Engaging Ingredients in Design
codingconduct
0
220
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
A better future with KSS
kneath
240
18k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
Building Adaptive Systems
keathley
44
3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
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 • 標準モジュールを追加