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
コード再利用のしくみ ライブラリ
Search
Satoru Takeuchi
PRO
September 29, 2024
Technology
3
78
コード再利用のしくみ ライブラリ
以下動画のテキストです。
https://youtu.be/Su6LnDaJOxM
Satoru Takeuchi
PRO
September 29, 2024
Tweet
Share
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
プロセスの生成 exec編
sat
PRO
1
28
プロセスの生成 fork&exec編
sat
PRO
0
20
プロセスの生成 コピーオンライトを使ったfork編
sat
PRO
0
23
プロセスの生成 fork編
sat
PRO
0
25
静的ライブラリと 共有ライブラリの違いを実験で確認
sat
PRO
1
35
ハイテク休憩
sat
PRO
2
190
利きプロセススケジューラ
sat
PRO
5
3.2k
俺とVSCode Python Debugger Extension
sat
PRO
1
210
AWKへの愛を語る
sat
PRO
3
560
Other Decks in Technology
See All in Technology
mixi2 の技術スタックを探ってみる (アプリ編)
ichiki1023
0
110
能動的ドメイン名ライフサイクル管理のすゝめ / Practice on Active Domain Name Lifecycle Management
nttcom
0
310
ZOZOTOWN の推薦における KPI モニタリング/KPI monitoring for ZOZOTOWN recommendations
rayuron
1
850
知っててうれしい HTTP Cookie を使ったセッション管理について
greendrop
1
110
深層学習と3Dキャプチャ・3Dモデル生成(土木学会応用力学委員会 応用数理・AIセミナー)
pfn
PRO
0
400
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
670
サーバーなしでWordPress運用、できますよ。
sogaoh
PRO
0
170
Unsafe.BitCast のすゝめ。
nenonaninu
0
150
型情報を用いたLintでコード品質を向上させる
sansantech
PRO
2
220
ネットワーク可視化の世界
likr
7
5.7k
rootful・rootless・privilegedコンテナの違い/rootful_rootless_privileged_container_difference
moz_sec_
0
110
React Routerで実現する型安全なSPAルーティング
sansantech
PRO
4
870
Featured
See All Featured
Optimizing for Happiness
mojombo
376
70k
Mobile First: as difficult as doing things right
swwweet
222
9k
Building Your Own Lightsaber
phodgson
104
6.2k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
490
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
940
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
jQuery: Nuts, Bolts and Bling
dougneiner
62
7.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
5
190
Building Adaptive Systems
keathley
38
2.3k
Transcript
コード再利用のしくみ ライブラリ Sep. 29th, 2024 Satoru Takeuchi X: satoru_takeuchi 1
はじめに • 「ライブラリ」という、プログラムのコードをまとめて再利用可能にした塊について説 明 • 注意 ◦ ライブラリには実行ファイルと同様、コードとデータ両方が入っているが、説明を簡略化するため コードをどう扱うかのみ説明する 2
ライブラリとは • 多くの人が使うコードを一つにまとめてファイル化したもの • 有名どころ: GNUのCライブラリ、glibc ◦ 標準Cライブラリ+その他山盛りの便利コード • 実行ファイルとの違い
◦ ライブラリファイルを直接実行するわけではない ◦ 実行ファイル内のコードから何らかの形でライブラリのコードを呼ぶ • 「静的ライブラリ」と「動的ライブラリ」の2種類がある 3
静的ライブラリと共有(動的)ライブラリ • 静的ライブラリ ◦ 実行ファイルにライブラリのコードを組み込む ◦ ライブラリが提供する関数の中から、実行ファイルが使うものだけ組み込む ◦ 拡張子は”.a” •
共有(動的)ライブラリ ◦ 実行ファイルには「ライブラリ内の関数を呼び出す」という情報だけ記憶 ◦ 実行ファイルから作ったプロセスのメモリにライブラリのコードを「動的」にマップしてから呼び出す ◦ 同じライブラリを複数の実行ファイルから実行時に「共有」できる ◦ 拡張子は”.so” 4
こういうソースファイルがあった場合… 5 main() { foo() } main.c foo() { …
} bar() { … } foo.c 呼ぶ
静的ライブラリの場合 6 main() { foo() } main.c foo() { …
} bar() { } foo.c main()のコード main.o foo()のコード libfoo.a main()のコード main (実行ファイル) リンク コンパイル コンパイル&静的ライブラリ化 mainプロセスのメモリ空間 bar()のコード foo()のコード main()のコード foo()のコード map 呼ぶ 呼ぶ • 実行前にリンク(静的リンク) • 使用する関数だけをリンク可能
共有(動的)ライブラリの場合 7 main() { foo() } main.c foo() { …
} bar() { } foo.c main()のコード main.o foo()のコード libfoo.so main()のコード main (実行ファイル) リンク コンパイル コンパイル&共有ライブラリ化 mainプロセスのメモリ空間 bar()のコード main()のコード foo()のコード map 呼ぶ 呼ぶ bar()のコード libfoo.soを動的 リンクしていると いう情報 実行開始後にリンク(動的リンク)
実行ファイルのサイズ • 静的ライブラリ ◦ ライブラリ内のコード (の一部)をコピーするので、一般に大きくなる • 共有(動的)ライブラリ ◦ 「実行時にライブラリを動的リンクすべし」というメタデータだけを持ち、ライブラリ内のコードそのも
のは持たないので、一般に小さくなる 8 main()のコード main (実行ファイル) foo()のコード main()のコード main (実行ファイル) libfoo.soを動的 リンクしていると いう情報 静的ライブラリの場合 共有ライブラリの場合 一般に大きい 一般に小さい
ライブラリ変更の実行ファイルへの影響 • 静的ライブラリ ◦ ライブラリ修正後に再リンクした際に実行ファイルに影響が出る • 共有(動的)ライブラリ ◦ ライブラリ変更後、即座に実行ファイルに影響が出る ◦
変更の影響がライブラリを使用する全実行ファイルに及ぶので管理が大変 9 静的ライブラリの場合 共有ライブラリの場合 main()のコード main (実行ファイル) foo()のコード (バグ未修正) foo()のコード (バグ修正済) libfoo.a bar()のコード main()のコード main (実行ファイル) libfoo.soを動的 リンクしていると いう情報 foo()のコード (バグ修正済) libfoo.so bar()のコード
ライブラリファイル破損時の実行ファイルへの影響 • 静的ライブラリ ◦ 無い • 共有(動的)ライブラリ ◦ プロセスを起動してもライブラリの関数が使えないため、機能しない 10
main()のコード main (実行ファイル) foo()のコード foo()のコード libfoo.a bar()のコード あっそ 静的ライブラリの場合 共有ライブラリの場合 foo()のコード libfoo.so bar()のコード main()のコード main (実行ファイル) libfoo.soを動的 リンクしていると いう情報 死んだ! 死んだ! 俺も死んだ! リンク後はlibfoo.aに関係ない
ライセンスの観点 • ライブラリを動的リンクするか静的リンクするかで扱いが異なるライセンスがある ◦ 例: LGPL • とても難しい話なので詳しいことは省略 • 興味があればLGPLの全文を読んでください
◦ https://www.gnu.org/licenses/lgpl-3.0.html.en 11
使い分けは? • 長短あるので、どっちも使われている • 好きなのを使えばいい • 全体的には共有ライブラリのほうが広く使われている(主観) ◦ 静的ライブラリを使うよりサイズが圧倒的に小さくて済む ◦
ただし、実行ファイルが特定バージョンのライブラリでしか動かないケースを避けるために、実行 ファイルと共有ライブラリを同梱して提供する、本末転倒なケースもある • コンテナ環境では静的ライブラリによって作られたシングルバイナリが人気 ◦ アプリケーションコンテナでは共有ライブラリの利点を活かしにくい 12
まとめ • ライブラリはプログラムのコードをまとめて再利用可能にした塊 • 静的ライブラリ、共有(動的)ライブラリの二種類がある • 長短あるので好きなのを使えばよい 13