{ "cells": [ { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "slide" } }, "source": [ "# なんで型なんてあるのか\n", "\n", "20180907 勉強会" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 型に興味をもったきっかけ" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## プログラミングに初めて触れたとき\n", "\n", "- 最初に触ったのはC言語\n", "- int, float, char, ...\n", " - コレ全部覚えなあかんの?\n", " - ややこしくね???\n", " - なんでわざわざ範囲の狭い型使うの?\n", " - 全部long long intでええやん!!!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## そして動的型付けの言語を始める\n", "\n", "\n", "- Python\n", "- JavaScript\n", "- PHP\n", "\n", "→型書かんで良いの超ラクじゃん!!!最高!!!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 再び静的型付けの言語を始める\n", "\n", "- 仕事でTypeScript\n", "- ノリでHaskell, Go\n", "\n", "→型に興味を持ち始める\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# この本を読んだ\n", "\n", "- 8章が型の話\n", "\n", "![](data:image/jpeg;base64,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)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 静的型付けと動的型付けの違い" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 静的型付けの言語\n", "\n", "- プログラムを実行前に型検査を行う\n", "- 効率がいい\n", " - 型宣言をすることで、その変数に対して適切なデータ領域を確保できる\n", " - それによって高度な最適化ができる\n", "- コンパイルを通すのが大変だったりする\n", "\n", "- 例\n", " - C, C++, Rust, Go, Haskell, etc.\n", " \n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 動的型付けの言語\n", "\n", "- プログラムを実行しながら型検査を行う\n", "- 楽に書ける\n", "- 遅い\n", "\n", "- 例\n", " - Python, JavaScript, PHP, Ruby, etc." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 強い型付けと弱い型付け" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 強い型付け\n", "- 型安全性がある\n", "- 型検査を通れば、安全さが保証される\n", "- ML, Haskell, etc.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## 弱い型付け\n", "- 型安全性がない\n", "- 検査を通っても安全さは保証されない\n", "- C, C++, etc.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 本題: なんで型が必要なのか。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# そのまえに..\n", "## 0と1でデータを表す方法" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 例えば浮動小数点数\n", "\n", "- IEEE754で定められたものがよく使われる\n", "- 以下の3つの部分で表される\n", " - 符号\n", " - 0なら正、1なら負\n", " - 指数\n", " - -127~128 (2^8とれる)\n", " - -127なら小数点を右に127個動かす\n", " - 128なら小数点を左に128個動かす\n", " - 127のバイアスが加わる\n", " - 0個ずらすとき127\n", " - 仮数\n", " - 1.XXXXX の XXXXX の部分\n", "- [浮動小数点数シミュレーター](https://tools.m-bsys.com/calculators/ieee754.php)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### 単精度浮動小数点数の場合はこんなん\n", "\n", "- 全体で32bit\n", " - 符号部に1bit\n", " - 指数部に8bit\n", " - 仮数部に23bit\n", "\n", "\n", "![](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.png) \n", "【画像引用元】[浮動小数点数型と誤差](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 例\n", "\n", "さっきの32bitで表現してみる!\n", "- 10進数で7.0" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "#### → 2進数で表す\n", "- 111.0" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "#### →小数点を左に2つずらす \n", "- 1.11 * 10^2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 1.11 * 10^2 とは\n", "\n", "- 符号\n", " - 正数なので0\n", "- 仮数\n", " - 1.XXX の XXX の部分なので\n", " - 11\n", "- 指数\n", " - 10の2乗なので2\n", " - 127のバイアスを考慮すると129(2^7 + 1)\n", " - 10000001\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### 結果\n", "\n", "0 10000001 11000000 00000000 0000000" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## じゃあこれはなんぼ?\n", "\n", "- 0 10000001 11000000 00000000 0000000" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 答え\n", "\n", "さっきと同じだから7!!!!!!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "と思ったが、 \n", "これが示す型が「浮動小数点数型」ではなく「整数型」の場合、1,088,421,888になる \n", "\n", "どういうことかというと.." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 整数型の場合 \n", "00000000 00000000 00000000 00000001 なら1 \n", "00000000 00000000 00000000 00000010 なら2 \n", "... \n", "... \n", "... \n", "00000000 00000000 00000000 11111111 なら255 \n", "... \n", "\n", "\n", "となる" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## さっきのは\n", "\n", "- 0 10000001 11000000 00000000 0000000\n", "\n", "### 整数型の場合\n", "\n", "- 2^(6+8+7) + 2^(6+8+8) + 2^(6+8+8+1) + 2^(6+8+8+8)\n", "- = 2097152 + 4194304 + 8388608 + 1073741824\n", "- = 1,088,421,888\n", "\n", "\n", "### 浮動小数点数型の場合\n", "\n", "- さっきみたように7.0\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## つまり\n", "\n", "- 0 10000001 11000000 00000000 0000000\n", "- これだけみてもコンピュータはどの数値を表しているのかわからない\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "→ 型いるやん!!!!!!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 動的型付けの言語はどうしているのか\n", "\n", "### 例えばPython\n", "\n", "![](https://github.com/mrsekut/slides/blob/master/img/py.png?raw=true)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# 他におもろかったもの\n", "\n", "- 型推論についての話\n", "- クラスやinterfaceも型や!!みたいな話" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" }, "toc": { "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }