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
Elixir におけるリスト反転処理の実装を覗いてみよう
Search
Shohei Kajihara
July 01, 2019
Technology
2.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elixir におけるリスト反転処理の実装を覗いてみよう
2019/07/01 【学生限定】Akatsuki Geek Live Vol.3【LT会:7/1(月)】 にて発表した資料です。
Shohei Kajihara
July 01, 2019
Other Decks in Technology
See All in Technology
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
200
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
1
260
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
140
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
120
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
400
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
430
音声コミュニティを守るAI監視基盤_ 90%以上の入力削減を支えたServerless設計と運用判断
shuheioka123
0
120
GitHub Agentic Workflows を触ってみる
htkym
2
880
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
150
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
1
290
「今盗んで、後で解く」に備える ― AWSのポスト量子暗号入門
yama3133
2
280
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Between Models and Reality
mayunak
4
470
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
890
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Transcript
Elixir における Elixir における リスト反転処理の実装を リスト反転処理の実装を 覗いてみよう 覗いてみよう 2019/07/01 Akatsuki
Geek Live Vol.3 アカツキ サーバーエンジニア 梶原星平 (@s-capybara)
⾃⼰紹介 ⾃⼰紹介 2017 年 アカツキに新卒⼊社(3 年⽬) Elixir でゲームサーバーを書いています
今⽇の⽬的 今⽇の⽬的 Elixir の紹介 プログラミング⾔語の中⾝の学び⽅
Elixir とは Elixir とは プログラミング⾔語 関数型 動的型付け 不変性 (immutability) Erlang
VM 上で動作 並⾏性 (concurrency) 耐障害性 (fault-tolerance) Erlang の関数を呼び出せる
不変性 不変性 予想外の値変更による実装ミスが起きにくくなる defmodule Sample do def foo() do bar
= 1 if :rand.uniform() > 0.5 do bar = 2 IO.puts("Modified bar to 2!") end bar end end iex(1)> Sample.foo() Modified bar to 2! 1
List List iex(2)> numbers = [1, 2, 3] [1, 2,
3]
List の基本操作 List の基本操作 Lisp と同じく Car, Cdr, Cons 処理ができる
Car: リストの先頭を取り出す Cdr: リストの残り部分を取り出す Cons: リストの先頭に要素を⾜す iex(3)> [head | _] = numbers iex(2)> head 1 iex(4)> [_ | tail] = numbers iex(4)> tail [2, 3] iex(5)> [0 | numbers] [0, 1, 2, 3]
Enum.reverse Enum.reverse リスト(など)を反転する関数 標準の関数が⾼速なので、 ⾃前実装は NG と⾔われている iex(6)> Enum.reverse(numbers) [3,
2, 1]
気になるところ 気になるところ 1. リストはどういうデータ構造なのか? 2. 標準の関数はなぜ⾼速なのか?
解決策1: 本を読む 解決策1: 本を読む The Beam Book ( ) Erlang
VM の中⾝が紹介されている (プロセス、スケジューラ、型システム、... ) 無料で読める(ただし英語) 書籍は著者視点による説明 説明の順序にストーリーがあるので⼊⾨に最適 公式ドキュメントなどより先に書籍にあたるのが おすすめ https://github.com/happi/theBeamBook
Erlang VM の型システム Erlang VM の型システム 64 ( または32) bits
で 1 word 末尾 2 bits ( あるいはもっと) で型を表現 リストは「アドレス + 01 」という形の 1 word 00 Header (on heap) CP (on stack) 01 List (cons) 10 boxed 00 11 Pid
単⽅向リストの実体 単⽅向リストの実体 リストはポインタであり、 参照先の隣のアドレスがまたポインタになっている
解決策2: ソースコードを 解決策2: ソースコードを 読む 読む Elixir: Erlang: https://github.com/elixir-lang/elixir https://github.com/erlang/otp
Enum.reverse/1 の実装 Enum.reverse/1 の実装 簡単なやつだけ Elixir レイヤーで定義 結局、Erlang のコードを呼び出している @spec
reverse(t) :: list def reverse([]), do: [] def reverse([_] = list), do: list def reverse([element1, element2]), do: [element2, element1] def reverse([element1, element2 | rest]), do: :lists.reverse(rest, [element2, element1])
lists:reverse/2 の実装 lists:reverse/2 の実装 結局、C ⾔語実装の Built in Funciton (BIF)
を呼び出し ている %% Shadowed by erl_bif_types: lists:reverse/2 -spec reverse(List1, Tail) -> List2 when List1 :: [T], Tail :: term(), List2 :: [T], T :: term(). reverse(_, _) -> erlang:nif_error(undef).
lists_reverse_2 lists_reverse_2 erts/emulator/beam/erl_bif_lists.c というそれっぽい名前のファイルに lists_reverse_2 というそれっぽい名前の関数を発⾒
lists_reverse_2 ( 抜粋) lists_reverse_2 ( 抜粋) CAR, CDR, CONS をやっているらしい
(説明は後で図⽰) while (alloc_top < alloc_end) { // リストをポインタ化する Eterm *pair = list_val(list); // 確保したヒープ領域の先頭を [ リストの先頭 | 反転済みリスト ] に tail = CONS(alloc_top, CAR(pair), tail); // 続きは Cdr から list = CDR(pair); ASSERT(is_list(list) || is_nil(list)); // 2 words 分ヒープ領域のへのポインタを進める alloc_top += 2; }
リスト操作のマクロ リスト操作のマクロ CAR, CDR, CONS の定義(説明は割愛) #define TAG_PRIMARY_LIST 0x1 //
01 の⾜し算でポインタをリストに、引き算でリストをポインタに #define _unchecked_make_list(x) ((Uint)(x) + TAG_PRIMARY_LIST) #define _unchecked_list_val(x) ((Eterm*) ((x) - TAG_PRIMARY_LIST) // ポインタの指すアドレスに値を仕舞ったのちリストにする #define CONS(hp, car, cdr) \ (CAR(hp)=(car), CDR(hp)=(cdr), make_list(hp)) // ポインタの指すアドレスが CAR, その隣が CDR #define CAR(x) ((x)[0]) #define CDR(x) ((x)[1])
lists_reverse_2 の概観 lists_reverse_2 の概観 (1/4) (1/4)
lists_reverse_2 の概観 lists_reverse_2 の概観 (2/4) (2/4)
lists_reverse_2 の概観 lists_reverse_2 の概観 (3/4) (3/4)
lists_reverse_2 の概観 lists_reverse_2 の概観 (4/4) (4/4)
標準の関数は 標準の関数は なぜ速いのか? なぜ速いのか? そもそも C ⾔語なので速い 不変性を保つ必要がない result は
C ⾔語上のローカル変数
結局、理解できて 結局、理解できて 何が嬉しいのか? 何が嬉しいのか? すぐに役⽴つわけではないが... 「この⾔語ではどういう操作のコストが⾼いの か?」など理解したうえでコードが書けるようにな る(かも) トラブルシューティングに強くなる(かも)
まとめ まとめ まず本を読み、その後ソースコードを読もう すぐには役に⽴たないが、中⾝を知っておいた⽅が 安⼼