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
Naoya Furudono
May 09, 2025
Programming
0
4
「型システムのしくみ」輪講 第一章
社内で開催している輪講の発表に用いた資料です
Naoya Furudono
May 09, 2025
Tweet
Share
More Decks by Naoya Furudono
See All by Naoya Furudono
waiwai-aiを入社2ヶ月の エンジニア3人と作るための さいきょうのアーキテクチャ
naoyafurudono
0
400
CLIツール開発をProtocol Buffers スキーマで駆動する
naoyafurudono
1
640
Protocol Buffersスキーマ定義から GoのCLIを生成する
naoyafurudono
0
66
Other Decks in Programming
See All in Programming
Flutterでllama.cppをつかってローカルLLMを試してみた
sakuraidayo
0
130
VibeCoding時代のエンジニアリング
daisuketakeda
0
110
MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLEについて学んだ話
hatsu38
2
110
The Nature of Complexity in John Ousterhout’s Philosophy of Software Design
philipschwarz
PRO
0
160
開発者フレンドリーで顧客も満足?Platformの秘密
algoartis
0
200
監視 やばい
syossan27
12
10k
Cursorを活用したAIプログラミングについて 入門
rect
0
180
20250426 GDGoC 合同新歓 - GDGoC のススメ
getty708
0
110
「理解」を重視したAI活用開発
fast_doctor
0
290
カウシェで Four Keys の改善を試みた理由
ike002jp
1
130
note の Elasticsearch 更新系を支える技術
tchov
9
3.5k
プロフェッショナルとしての成長「問題の深掘り」が導く真のスキルアップ / issue-analysis-and-skill-up
minodriven
8
1.9k
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
38
1.7k
Building Applications with DynamoDB
mza
94
6.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Side Projects
sachag
453
42k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Done Done
chrislema
184
16k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
For a Future-Friendly Web
brad_frost
177
9.7k
The Pragmatic Product Professional
lauravandoore
33
6.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
4 Signs Your Business is Dying
shpigford
183
22k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
Transcript
型システムのしくみ輪講(第一章) 古殿直也 2025-05-09
輪講でやること(復習) 担当者を持ち回りでやる(今回はぼく) 担当範囲が決まっている(今回は第一章) 担当範囲の解釈を説明する(以降のスライドで説明します) 参加者はツッコミとか質問とかをする。すべての参加者が少なくとも一回は質問 すること いつでも質問してOK。担当者の発言を遮ってください 終わらなかったら次回に繰り越し このように本のトピックを議論して理解していきましょう 2
第1章 型システムとは 3
型システムはプログラムのOK / NGを判定する 以下のような OK / NG の判定基準を定めるのが型システム 1 +
true // よくない。NGと判定したい 1 + 2 // 良さそう。OKと判定したい 判定基準は(すなわち型システムは)どのような基準で定義するのが良いだろうか 4
誰がどのように判定基準(型システム)を定義するか 「実はとても難しい問題」 定義の方針を考えるにあたっての歴史的背景としてプログラムの未定義動作があ る 5
1.1 プログラムの未定義動作 6
CやC++には未定義動作がある 言語仕様の定義では、プログラムの動作の一部を仕様で定義しない、とする場合があ る 未定義動作の定義をC17(C言語の仕様)のドラフトから定義を引用 behavior, upon use of a nonportable
or erroneous program construct or of erroneous data, for which this document imposes no requirements Geminiによる翻訳 移植性のない、または誤ったプログラム構成要素や誤ったデータを使用した場合 の振る舞いであって、本ドキュメントが何の要求も課さないもの。 7
未定義動作の例 無効なポインタを参照する 最大の整数に1足した値を計算する 配列の範囲外を参照する そのほかもっと込み入ったものも(C17のドラフトを "undefined behavior"で検索 するとたくさん出てくる) 8
未定義動作をするプログラムを書くと、プログラマは辛い 未定義動作をするプログラムは、その振る舞いが仕様で定められていない 派手に壊れるかもしれない それっぽく動くかもしれない しばらくはうまく動くけど、ある日突然壊れるかもしれない 実際のところはどうか それっぽく動作する OSの保護機能でプロセスが落ちる segmentation faultで落ちるのはこれ
などなど 辛いのでなんとかしたい 9
1.2 歴史的解決策としての「型安全性」 10
未定義動作への対処 コンパイル時に型検査する この本で扱うような型システムが活躍するのはこちらのアプローチ 言語の例: OCaml, Haskell, Go, ... 実行時にたくさん検査する 言語の例:
JavaScript, Ruby, Smalltalk, ... 11
コンパイル時に型検査するアプローチ 未定義動作になるようなプログラムはプログラムと認めない 型検査器でプログラムを検証する。検証が通ったならば、プログラムは決して未 定義動作にならないことを型検査器と言語仕様に求める 12
実行時にたくさん検査するアプローチ(おまけ、蛇足) 未定義動作に踏み込みかけたときに例外を投げたりする 例外を投げるという動作を定義しているので未定義動作はなくせる C言語でも、どんなときに未定義動作になるかは定義されている。それを愚直に実 行時に検証すればよい 13
型安全性は「型システム」と「プログラムの振る舞いの定義」の間の関係 TaPLでは型安全性を「型検査器がOKと判定したプログラムは、定義されていない状態 (行き詰まり状態、stuck)にならない」という性質としている 以下のように解釈しました 型システム: 型検査の仕様 定義されていない状態:未定義動作 型安全性:型検査器がOKと判定したら未定義動作にならないという、型システム とプログラムの振る舞いの定義の間の関係 14
まとめ: 未定義動作に型システムで対処できる 未定義動作は辛い 型検査をして、未定義動作するかもしれないプログラムはコンパイル時に弾く 結果的に、プログラムを動かす段階では絶対に未定義動作に陥らないことを保証 できる 15
1.3 本書における型システムと型安全性 16
前提の確認 TypeScriptプログラムは普通、JavaScriptプログラムに変換されてからJavaScriptと して実行される JavaScript言語には未定義動作がない(少なくともC言語にあるような未定義動作 はなさそう) https://stackoverflow.com/questions/14863430/does-javascript-have- undefined-behaviour ここにあるように、implementation defined な動作はある
細かい話だし、どちらに転んでも型システムのしくみを感覚として理解 するためには問題にならなさそう 17
TypeScriptでは未定義動作ではなく「望ましくなさそうな動作」に対処するた めに型検査する JSには未定義動作がない 何かしら動作が定義されている。望ましい動作かはさておき 実行時に検証して、例外を投げる 不思議な計算結果を無理やり返す 実装に依存するとしている(これはCの仕様でもでもやられている) TSでは未定義動作を防ぐことではなく、 「望ましくなさそうな動作」を防ぐことを 目的に型検査をする
1 + true を計算する際のプログラムの振る舞いはJSで定義されているけど 望ましくなさそう 18
1.4 実装する型検査器のプログラムについて 19
型検査器と対象言語 型検査器が検査対象とする言語を「対象言語」と呼ぶ 例: tsc の対象言語は TypeScript JavaScriptではない go の対象言語は Go
20
今後実装していく型検査器の対象言語はTypeScriptのサブセットである サブセットであるとはどういうことだろうか 例えば arith.tsで実装する型検査器の対象言語 (arith-langとしましょう)が、TypeScript のサブセットであるとはどういうことか 21
ぼくの持っている答え arith-langの(型検査が通る)プログラムはすべて、TypeScriptの(型検査が通る)プロ グラムでもある、ということ。 言い換え: arith.tsで実装する型検査器がOKとするプログラムはすべて、tsc(TypeScript の型検査器)がOKとする、ということ。 クイズ: 最小の対象言語を持つ型検査器はどんな型検査器でしょう 22
クイズの答え どんなプログラムが来てもNGとする型検査器。 23
型検査器の実装を追加して、対象言語を徐々に大きくしていく (arith) 真偽値・数値、条件演算子・足し算 (basic) arith + 関数と変数定義 (obj) basic +
オブジェクト (rec) obj + 再帰関数 + 再帰型 ... TypeScript 24
演習問題 みんな動かせましたか?まだなら早めに試すのが吉です。苦戦したらSlackであらかじ めヘルプを求める、その辺にいる人を捕まえて一緒になんとかしてもらうなどしまし ょう 25
次回 2章の全てを予定しています 26
参考文献 27
C17 のドラフトをここから引用: https://www.open- std.org/jtc1/sc22/wg14/www/projects#9899 28