Chomado's Blog
You Are Reading

「強い型付け」「弱い型付け」って言葉を知った!

9
プログラミング, 理論

「強い型付け」「弱い型付け」って言葉を知った!


[追記] この記事は2014年、私が文系大学生の頃、手探りでプログラミングを独学し始めた頃の記事です。温かい気持ちで見ていただけたら幸いです。
ーー
!! おことわり !!
このブログには、いわゆる「技術記事」は一切ありません!!!
(書きたくても書けない)
ただの「勉強記録ノート」です!!!
プログラミング初学者の勉強記録ノートです!「日記」です!!

生暖かい目で見ていただけたらさいわいですヽ(;▽;)ノ

Index

  1. “型のありがたみ”を覗く
  2. “型付けの弱い世界”を知る
  3. 動的型付けと静的型付け
  4. 型付けによる比較
  5. “型付け”と”型変換”
  6. 強い型付けと弱い型付け
  7. まとめ
  8. 追記 (あとで読むリストなど)

Introduction

よくTwitterのタイムラインで「型安全」という言葉を見ます。

でも、その意味を私は全く分かっていませんでした…そもそも「型安全」という言葉は
「安全な型」を指す(だから安全でない型もある?)のか
「型が安全」(どう安全なの?何と比べて?)なのかも分かっていませんでした。

(* この時点で私は「型による制約はあって当たり前」だと思っていたので、型のありがたみを知らなかったのです… )( 今まで触ったことのある言語は C言語, Haskell, OCamlで、どれも”型”を宣言するものだった。(型推論のあるHaskellなどでも私は必ず型を書くようにしてた)*)

“型のありがたみ”を覗く

Wikipediaを見ます。
型システム: http://ja.wikipedia.org/wiki/型システム
そしたら、一般的に言われる「型安全」とは、どうやら「型の安全性」の略称らしいです。(type safety)

> 型の使用によってコンパイラが無意味な、または不正であろうコードを検出することが可能になる。
> In computer science, type safety is the extent to which a programming language discourages or prevents type errors.
メモ: 型の安全性とは、型エラーをどのくらい防ぐかっていう程度(範囲)
> A type error is erroneous or undesirable program behaviour caused by a discrepancy between differing data types for the program’s constants, variables, and methods (functions), e.g., treating an integer (int) as a floating-point number (float).
メモ: 型エラーというのは、違うデータ型同士の間での矛盾によって引き起こされる、望ましくない挙動のこと。たとえばInt型をFloat型として扱ったり

するとTwitterで南山まさかずさんにご教授頂きました!ヽ(;▽;)ノ

おお!(((o(゚▽゚)o)))なななるほどです!!!
おかしなことができないように型というシステムが守ってくれてるかんじかな?

さらに。

なるほど、型には「安全性の高さ(どのくらい高いか)」というステータスがあるらしい。

なるほど!!
メモメモφ(゚▽゚)oメモメモ

つまり「型安全」という言葉は、「安全な型がある(だから安全じゃない型もある?)」という意味ではなく「型により安全」「型システムの与えてくれる安全性」という意味でした!

“型付けの弱い世界”を知る

この会話


について。
同時にタイムラインに流れてきたもの。

なんだかよくわからないことになっていました!!
えっ、なんで 2 + “Hello” が普通に評価されてるの???????!!!?!?!?!?

すると。

!?Σ(・□・;)

えっ?
そういうのって言語によって違うの?
言語によっては 2 + “Hello” が普通に通っちゃうの? そしてそれは型がゆるふわしてるか厳しいかで違いが出るんだ?
っていうかそもそも型にゆるふわとか強弱あったんだ????
型は型だからそんな強弱も何もないと思ってました

ひょえー
私が今まで触ってきたものは全てそんなものじゃなかったので、とても新鮮でした。

なるほど〜色んなのがあるんだなあ〜
私が今まで触ったことのあるもの(C言語, Java, Haskell, OCaml)がたまたまそんな感じじゃなかっただけかあ

動的型付けと静的型付け

動的型付け (Wikipedia)

> 動的型付け(どうてきかたづけ、英: dynamic typing)とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型を、コンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のことである。

対して、静的型付け (Wikipedia)

> 静的型付け(せいてきかたづけ、英: static typing)とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型が、コンパイル時など、そのプログラムの実行よりも前にあらかじめ決められている、という型システムの性質のことである。
> 静的型の関数型言語では、キャストなどを基本的に許さず、不正なデータを処理する関数が原理的に書けないため、ほぼインスタンスの妥当性も保証されることになる。これをもって関数型言語の支持者は「ほぼ全てのバグを型エラーにより検出する事が可能」と提案している。

ふむふむφ(゚▽゚)oメモメモ

あとTwitterに載ってた@uchan_nosさんのパロディが分かりやすい&&面白かったです!(((o(゚▽゚)o)))


これめっちゃ分かります! 動的型付けのことはよく分からないのですが、静的については、私もちょっと複雑な関数を作る時はまず型を考えてからやるので、型が導いてくれるというか、型は設計書のような機能を果たしてくれるのです(((o(゚▽゚)o)))

型付けによる比較

他Wikipediaの「プログラミング言語の比較」というページにも型付けによる比較覧が載っていました。
http://ja.wikipedia.org/wiki/プログラミング言語の比較
プログラミング言語の分類

型付けのところだけ抜き出して表にしてみました!

静的型付け (強い→弱い)

Ada 宣言型の安全な強い静的型付け
Fortran 宣言型の安全な強い静的型付け
OCaml 構造型の安全で静的型付け、型推論
Haskell♡ 強い静的型付き言語、型推論
Java 強い静的型付け
Scala 強い静的型付け、部分的な型推論
Visual Basic .NET 強い静的型付け
Object Pascal 宣言型の安全で(ただし安全でないのも許可してる)強い静的型付け
C# 強い安全である/ない静的型付け
C 安全でない弱い静的型付け
C++ 宣言型の安全でない強い静的型付け

動的型付け (強い→弱い)

Common Lisp 安全で強い動的型付け
Prolog 安全で強い動的型付け(単一化)
Smalltalk 安全で強い動的型付け, ダック
Python 強い動的型付け(ダック・タイピング)
Ruby 強い動的型付け(ダック・タイピング)
Mathematica 強い動的型付け
Scheme 動的型付け
ColdFusion 弱い動的型付け (ダック・タイピング)
Erlang 弱い動的型付け
JavaScript 弱い動的型付け
Perl 弱い動的型付け
PHP 弱い動的型付け

“ダックタイピング”という言葉を初めて聞いたので、少しググりました。
Wikipediaより

ダック・タイピング(duck typing)とは、Smalltalk、Python、Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。
つまり、オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせる、ということである。
それはまた、同じインタフェースを実装するオブジェクト同士が、それぞれがどのような継承階層を持っているのかということと無関係に、相互に交換可能であるという意味でもある。

(((o(゚▽゚)o))) …???
…難しくてよく分からなかったんですけどまぁこういう名前の作法があるみたいです!(((o(゚▽゚)o)))

==== 追記 (2/19) ====
「ダックタイピング」について教えて頂きました!

なるほどです!φ(゚▽゚)oメモメモ
いつもありがとうございます!m(_ _)m!

てか

JavaScriptは実行時にメンバ増やしたり置き換えたり消したり自由
これめっちゃ怖いですねΣ(・□・;)
====追記終わり===

とりあえず、列挙して表にしてみた結果、分かったのは、
各々のプログラミング言語が、型付けに関して、色々個性がある
ということでした!
ちょっと広く世界を俯瞰できたというか…そんな感じです!(((o(゚▽゚)o)))

“型付け”と”型変換”

ちょっとごっちゃになってきたのでまとめます。

型付け 処理系が値に型というタグを付与すること. 特定の型に決めてしまうこと.
(値1に型intを付ける、変数aに型intを付ける、…)
型変換 型を変換すること. 型Aを型Bに変換すること.
(型intの付いた値1の型を型uintに変換する、型intの付いた変数aを型uintに変換する、…)

(* これもTwitterで皆さまから教えて頂きました! いつも本当にありがとうございます… *)

強い型付けと弱い型付け

またWikipediaの型システムのページからまとめます!(https://ja.wikipedia.org/wiki/型システム#.E5.BC.B7.E3.81.84.E5.9E.8B.E4.BB.98.E3.81.91.E3.81.A8.E5.BC.B1.E3.81.84.E5.9E.8B.E4.BB.98.E3.81.91)
(* 追記: 住井先生の記事から2箇所引用させていただきました! *)

強い型付け

  • ある処理・演算が間違った型の引数をとることを禁止するというもの。
  • 『検査を通れば、安全さ(safety)が保証される、という(普通は静的な)型つけ。MLとかHaskellとかJavaとか。Javaはバグがあったりしたので少し怪しいですが。』住井先生の記事から引用

弱い(ゆるい)型付け

  • 言語が型の暗黙的な変換(またはキャスト)をする。
  • 柔和な記述が可能(らしいけど私はただただとても怖いと思う)。
  • 『検査を通っても、安全さ(safety)は保証されない、という型つけ。CとかPascalとか。』ここで、”安全さ”とは、『プログラムが言語仕様で定義されていない状態(Cのバッファオーバーフローとか)にならないこと。』住井先生の記事から引用

暗黙の型変換

var x := 5;
var y := “37”;
x + y;

これは
5 + “37”
Int型+String型というものですが、これがどうなるかというと、

強い型付け→ エラー(コンパイルが通らない)
弱い型付け→ どんな結果になるか言語ごとに異なる

例) JavaScriptは”537″となり、AppleScriptでは42になる(左のオペランドの型のみによって決定されている)

また、暗黙の型変換において、どの型からどの型への変換が許されるかは言語によって異なります。

PHPなどのように文字列と数値が普通に計算できてしまう(怖い)ものもあれば、
Int + Double => Double になるのはOK、な限定的なのは多くの言語でよくある。(Haskellなどではそれすらできない(のが良い気がする))

C# の場合、暗黙的型変換といって、完全に互換性のあるキャストだけが暗黙的に行える。
long -> int (だめ)
int -> long (OK)
(@lambdaliceさんから教えていただきました!)

まとめ

今日知ったこと

  1. 「動的型付け」と「静的型付け」
  2. 型付けに強弱があること
  3. 型付けには「安全性の高さ(どのくらい高いか)」というステータスがあるらしい

ゆるふわですね…
でもこの話題は掘り下げようとしたらめちゃくちゃ大変だと思う(TAPLが出てきそうな)ので、とりあえず今日はここまでです!(((o(゚▽゚)o)))

追記

あとで読む!

これ紹介されました! あとで読む!

今後の課題

住井先生の

>少なくとも型システムの研究者の標準的な用語としては、type safetyが成り立つ(ことになっている)のが強い型つけで、そうでないのが弱い型つけなので、暗黙のキャストの有無とは独立です。念のため。
<https://twitter.com/esumii/status/435939531632562176>

ぬぬ…Wikipediaと書いてあることが違う…! Wikipediaは、「定義」と「特徴」を混同するような書き方なんだって。(さらに、type safetyの定義は研究者間でも揉めるらしい)
私は(Wikipediaだけでなく)もっと広く色々見なきゃいけないらしい!(((o(゚▽゚)o)))

田中さんのツイート

尊敬する田中さん(すごい人)です! めっちゃ参考になるので許可頂きました!φ(゚▽゚)oメモメモ


なるほどです…φ(゚▽゚)oメモメモ
「安全でない動的型付け言語とか使いもんにならないから、普通そういう実装にはしない」らしいです! たしかによく分からないことになりそうですね
(* 例えばこんなかんじで… https://www.destroyallsoftware.com/talks/wat *)
スクリーンショット 2014-02-20 3.34.58
スクリーンショット 2014-02-20 3.38.11


ひょええΣ(・□・;)
他の著名な方々もおっしゃっていたのですが、どうやら日本語版のWikipediaはあんまり良くないらしいです…(それでも,かすってるだけでも我々初心者にはありがたいのですが)


φ(゚▽゚)oメモメモ


なるほど、「強い型付け」「弱い型付け」って言い方は、ちゃんとした文章(論文とか?)では見かけないらしい!
だからフォーマルなところではあんまり使われない言葉みたい! 定義がゆるふわだからかな?


ひょえ〜ヽ(;▽;)ノ
もうこの辺になるとガチ専門的になってきて理解ができなくなりましたもうダメです

まあとりあえず今の段階では「ゆるふわに」「なんとなく」「こんなもんかな」って感じで理解しておこうと思います…!
このエントリーをはてなブックマークに追加


Madoka Chomado (ちょまど)

千代田まどかです。よく「ちょまど」と呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。

(8) Comments

  1. 少し追記しました(((o(*゚▽゚*)o)))
    ・ダックタイピング
    ・静的片付けと動的片付け、という喩え
    ・“型付け”と”型変換”
    ・暗黙の型変換

  2. もっと追記しました(((o(*゚▽゚*)o)))
    追記が長すぎて「<h2>追記</h2>」ってスペース作ってしまいました

  3. 通りすがり says:

    とてもためになりました。

  4. か~みっと says:

    はじめまして、

    どうやら凄いスキルアップしましたね(^^)

    個人的にはphpをよく使っています。

    スクリプト系言語だと厳密な比較である

    ===、!==っていうのもありますよ。

    それぞれ一長一短ありますからしっかり特徴を捉えてプログラムして下さい!!

    C言語だと失敗するとかなり手痛い状態になるので
    その辺りをちゃんとプログラム出来るようにならないといけませんね。

    因みに元々のC++はCへのトランスレーターなのでCで出来る事は全てC++で出来ますf(^^

  5. ななし says:

    ダックタイピングという言葉から意味を捉えるのも面白いですよ。
    西洋のことわざの「アヒルのように泣き、アヒルのように歩き、アヒルのように飛ぶのはアヒルだ」ということわざからきてるそうです。

    つまり、メソッドで「泣け」、「歩け」、「飛べ」ってあったらアヒルってことにしようってことですね。PHPとかがこれですかね。
    (そういうメソッドがあるならアヒルってことでいいよね。みたいな)

    JavaとかC#とかはアヒル・インターフェースを定義して
    (つまりちゃんとアヒルの定義)を用意して、それを実装しないとアヒルって認めない! ってことです。

    1. なるほどです…! ありがとうございます!

  6. 匿名 says:

    Javascriptから覚え始めた者からしてみればそういうものだと思ってた。それ前提で書いているので何が怖いのかよくわからない。
    暗黙の型変換便利でござる。便利でござr
    Javascriptだとコンピュータへアクセスできる範囲に制限があるけどそうじゃない言語だと不正操作されたりのきっかけになるってことなのかな。

  7. […] するのであれば、下記のブログ記事が面白い。 「強い型付け」「弱い型付け」って言葉を知った! […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です