- ベストアンサー
強い動的型付けって何ですか?
プログラム言語には、動的型付けと静的型付けがあります。 そして、弱い型付けと、強い型付けがあります。 残念なことに巷の解説だと、型付けの「強/弱」については、 静的型付け言語での比較ばかりがなされています。 Rubyのような「強い動的型付け言語」とJavaScriptのような 「弱い動的型付け言語」の違いを誰か教えていただけ ないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
じゃあこういう実例を見れば納得できますか? Rubyには質問者さんが書かれているような「自動的な型キャスト」はありません。 >irb irb(main):001:0> x = 5 => 5 irb(main):002:0> y = "37" => "37" irb(main):003:0> x + y TypeError: String can't be coerced into Fixnum from (irb):3:in `+' from (irb):3 irb(main):004:0> x + y.to_i => 42 irb(main):005:0> x.to_s + y => "537" irb(main):006:0> x.class => Fixnum irb(main):007:0> y.class => String irb(main):008:0> ついでにPython Python 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win 32 Type "help", "copyright", "credits" or "license" for more information. >>> x = 5 >>> y = "37" >>> x + y Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> int(y) 37 >>> x + int(y) 42 >>> str(x) '5' >>> str(x) + y '537' >>> type(x) <type 'int'> >>> type(y) <type 'str'> >>> どちらもWikipediaの解説にあるJavascriptやVBとは違いますよね。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
>動的型付けならば、自動型キャストは当たり前だと思っているのですが…。 それが誤解の元ですね。自動型キャストは、弱い型付け言語の特徴でしょう。 動的型というのは、データの型(RubyだとClass)がコンパイル時(*注1*)に決まらず、実行時に決まると言うことです。 Rubyでも全くデータの自動変換を行わない訳ではなく、例えば print メソッドに数字を渡すと勝手に文字列に変換してくれます。 ただ、これは言語仕様じゃなくて、printメソッドが引数オブジェクトのclassを判定して、文字列以外ならそのオブジェクトのto_s メソッドを呼び出すということで実現されていますので、各classに対して適切にto_sメソッドが定義されていないといけません(to_sが定義されていない/to_sが返すオブジェクトが文字列でないclassの場合はprint出来ない)。 注1:スクリプト言語はインタプリタ言語とも言われますが、実際には実行開始の際にプログラムをコンパイルして中間コードとか仮想機械言語にしてから実行しますので、コンパイル処理はあります。
- sakusaker7
- ベストアンサー率62% (800/1280)
型の扱いと、言語が静的か動的かということは独立したことだと思うのですが >残念なことに巷の解説だと、型付けの「強/弱」については、 >静的型付け言語での比較ばかりがなされています。 たとえばどのような解説をごらんになって不満に思われているのでしょうか? 単に実例を挙げればいい話でしょうか?
補足
回答ありがとうございます。 不満な解説として、Wikipediaの解説をあげてみます。 > 強い型付けの定義の1つは、ある処理・演算が間違った型の引数を > とることを禁止するというものである。 > 弱い型付けとは、言語が型の暗黙的な変換(またはキャスト) > をするという意味である。再び例を挙げる。 しかし、僕は、動的型付けならば、自動型キャストは当たり前だと思っているのですが…。