パスワードを忘れた? アカウント作成
7675083 story
プログラミング

「変数に型がない」はメリットなのか、それともデメリットなのか。宗教戦争勃発 193

ストーリー by reo
若い山彦 部門より

insiderman 曰く、

プログラミング言語どうしの優劣を比較する「宗教戦争」は定期的に勃発するが、今回話題になっているのは「変数に型がない」ことはメリットなのか、それともデメリットなのか、という点だ。

発端となったのは、「サンプルコードによる Perl 入門とは」というブログの「変数に型がないということの利点について考える」という記事。ここでは Perl や Java、C++ などの例を使い、変数に型がないことの利点として「どのような型の値でも代入できる」「記述量がとても短くなる」「変数に型がないと変更に強い」「関数のオーバーロードが不要になる」「複数の型を受け取りたいときに、インターフェースを実装する必要がない」「C++ のテンプレートのような機能も必要がない」などが挙げられている。

これに対し、「型がないというのはデメリットだ」という意見もコメントやはてなブックマークで多数寄せられている。型がないデメリットとしてあげられているのは、「コンパイル時に型の不整合を検出できない」「型がある言語でも型推論を使えば記述量を減らせる」「保守性が高くなる」などのようだ。

個人的には C++ でキャスト地獄を味わったことがある体験から、近年は変数に型のない言語のほうが好みにはなっているのだが、十分かつできの良い仕様書があってそれを元にコードを書くのなら型ありの言語も良いとは思う。/.J 読者のご意見はいかがだろうか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • キャスト『地獄』? (スコア:5, すばらしい洞察)

    by EarOwl (24188) on 2013年03月01日 13時07分 (#2334928) 日記

    > C++ でキャスト地獄を味わったことがある経験から

    それって型の有無によるメリットデメリット以前に、適切なクラス設計が出来ていないのでは…

    ちゃんとクラス設計出来ているのにキャスト『地獄』とまで言うような状況になることってあるのだろうか。

    • 型有りなのに (スコア:5, おもしろおかしい)

      by Anonymous Coward on 2013年03月01日 13時28分 (#2334950)

      せっかくの型チェックが形無しだな。

      親コメント
      • by Anonymous Coward

        誰が上手いこと言えと

    • Re:キャスト『地獄』? (スコア:5, すばらしい洞察)

      by Anonymous Coward on 2013年03月01日 13時42分 (#2334973)

      「それはお前の使い方が悪いんだ、適切にやれば問題はおきない」と
      言う人が出るのも、この手の宗教論争の定番ですね。

      親コメント
      • by Anonymous Coward on 2013年03月01日 15時42分 (#2335121)

        そして事実そうであっても、初心者や老害(やマネージャーや経営者や顧客)には
        全く理解されないことも定番なのです。

        これは一応フィクションだけど、
        http://el.jibun.atmarkit.co.jp/pressenter/2010/11/3-bc3f.html [atmarkit.co.jp]

        > 「だからね」三浦マネージャは子供に言い聞かせるようにゆっくり言った。
        >「どうしてわざわざ違う型で宣言しなくちゃいけないの? おかしいでしょ、普通?
        >整数使うのにfloatとか使う? 使わないでしょ?」

        > ――いやいやいや、それは違うでしょう。型の違いと、インターフェイスと具象クラスの違いをごっちゃにしてます。

        > 「ArrayListを使うんなら、素直にArrayListで宣言すればいいじゃない。
        >どうしてわざわざこういう分かりにくいことをするかなあ。カッコつけか?」

        みたいな感じで。

        親コメント
    • by USH (8040) on 2013年03月01日 13時39分 (#2334966) 日記

      プロトタイピングや、アジャイルな開発をしていると、クラスの整理法をガラリと変えないといけない時がたまに来ます。

      そんな時、型なしだとちょっとずつの変更が楽なんですが、型有りだと、全コード書き直しに近い再設計が待っています。で、それをごまかすためのキャスト地獄ということは、経験があります。

      はじめから仕様がかっちりしているのなら、地獄に陥らないように設計できますが。

      もちろん、型なしで中途半端に変更したままにほっておくと、後々スパゲッティ同然の理解不能コードが出来上がるわけですが。

      親コメント
      • by firewheel (31280) on 2013年03月01日 15時31分 (#2335108)

        プロトタイプ限定ならそれもありかもしれませんけどね、

        「プロトタイプ限定だから型システムなんかなしでいいよね!」
        「リリースする時は静的型システムのある言語で書き直すから問題ないよね!」

        なんて言って、本当に書き直したことってどれくらいあるんだろう?
        #身近な事例では、書き直しが必要でありながら実際に書き直した例は見たことが無い。残念ながら。

        親コメント
        • ずっと疑問なんですが、
          なぜ最初から型無し型付け両方に対応した言語で書かないのかわかりません。
          型なし版を書いて、動いたらそのまま型宣言をつければいいだけのこと。
          バージョン管理しておいて、プロトタイピングに戻りたくなったら型なしバージョンに戻せばいい。

          型なしを許容するけど、型をつけると早くなるというのが一番ですよ。
          ついでに言えば、型をつければネイティブに静的型付けでコンパイルしてくれる言語。

          まあ、外部の問題のせいで型を書き換えまくる必要が出るというのは、
          スパゲッティみたいに依存しまくったクラス設計のせいだとは思いますが・・・。

          --
          新人。プログラマレベルをポケモンで言うと、コラッタぐらい
          親コメント
        • by USH (8040) on 2013年03月01日 17時01分 (#2335197) 日記

          個人的には、そうなる(型なし言語で作っているけど、型あり言語に素直に移行できるように、採集t系には持っていく)ようにしている。

          希望としては、型なし言語(例えば ruby) とかで、静的型あり言語に移行できるかどうかをチェックしてくれる機構が欲しい。

          親コメント
  • by Anonymous Coward on 2013年03月01日 13時13分 (#2334933)
    これはあれか、仮定が偽の命題は恒真ってヤツ?
    仕様書なんて常に不足しているか間違っているかのどちらか(たいていは両方)だろ。

    void *YourFunction(void *ptr)
    {
        // ここにコードを書いてください。仕様書はありません。
    }

    みたいな仕事振られたときのために型が必要なんだろうがw

  • by Anonymous Coward on 2013年03月01日 14時35分 (#2335050)

    IDEの性能にもよるのでしょうが、型情報があった方がコードの補完が効くのでお手軽にコーディングできると感じています。
    型がない場合、確かに記述量は短くなるのかもしれないですけど、どう記述すればいいのかマニュアル見ないといけなかったりして面倒に感じることはあります。
    #文字列に変換するのは、to_str? to_s? to_string? とか悩まなくて済むだけでもありがたい。

  • 「型がない」ポリシーを貫いてもらえばいいのだが
    中には「デフォルト型変換」というものを持つのも
    あり・・・。

    「デフォルト型は数値型」という言語で文字列比較
    をした場合、頭に空白や0を付加していてもTrue
    になるという、とんでもない事例がありました。

  • by imunolion (39292) on 2013年03月01日 13時37分 (#2334961) 日記

    十分かつできの良い仕様書があってそれを元にコードを書くのなら型ありの言語も良いとは思う。

    これは何を言っているんだろう?
    逆に不十分なドキュメントしかない環境では,
    動的型付けの言語の方が優れていると言いたい?

    私の理解が間違いでなければ,
    動的型付けであれば, 開発者が意図していない型をもつ入力が与えられても,
    なんとなく動作しているように見えることがある,
    という話になるのだと思います.
    そして変な入力が与えられたら, その時は実行時にコケればいい.
    「ドキュメントに書かれてないし, それはそれでいいんだよ」という考え方でしょうか?

    たぶん, この宗教論争で一つの争点の中心になるのは,
    これを「正しい」とするか「誤り」とするかの違いだと思います.

    # 私はこれは誤りで,
    # 発覚した時点でドキュメントの修正に戻るのが本筋だと思います.
    # その具体的なタイミングを測るために,
    # コンパイルエラーとして怒られた方がいい

  • by homoludens (40431) on 2013年03月01日 13時41分 (#2334967)

    一般論として型がある方が実行効率に優れると思ってるんですが、いまどきのリソース潤沢な環境だとんなの論点にはならないんですかねえ。
    コーディング上の理由だけじゃなくてさ。

    • by firewheel (31280) on 2013年03月01日 15時28分 (#2335103)

      んなことはないと思う。

      Javaの高いパフォーマンスを支えてるのが静的型システムで、サーバーサイドでパフォーマンスが
      欲しい分野だとJavaがデファクトスタンダードになる理由の一つだ。

      でも型システムの有効性も理解できない程度の人が、静的型システムとVMのパフォーマンスとの
      関係など理解できるはずも無く、議論に登ることも無いだけでは。

      親コメント
  • お手軽な言語でちょっとしたものなら型がないほうが扱いやすいと思うし
    お堅いモノをつくるならキッチリしてたほうがいいと思うし

    プログラムはあくまで道具なので作るものにあわせて用途を選べばいいんじゃないかと思う。

    • 仰ることはわかる...のですが、小規模なモノがサクッと書けるだけが動的型付けのメリットではないと思います。

      たとえば、Ruby on Railsでよく使われるORマッパーであるActiveRecord。Rubyにおける型が動的であるがゆえに、簡潔なのに強力な使い勝手を実現しています。
      これは、動的型付け言語であるRubyのメタプログラミングや柔軟なクラス実装ができる特長によるものです。
      RoRは、Rubyの特長に依存しており、不可分なのです。

      もとより、大規模なRoRがRubyで実装されていることや、RoRでそこそこ大規模なWebサービスが作れることこそが、その証明であると思います。

      一長一短で、適材適所であることは同意です。
      そこを鋭い目で見分ける勘が重要。
      親コメント
  • Flashの簡単の場合は、型宣言ない方が使いよいんだがなー。
    型宣言必須ってのは、やっぱりTPOに合わせられなくって面倒かなあ。
    スクリプト的な簡単かつ汎用的な物なら、型宣言なしでぶち込めた方が便利だろうしなあ。
  • by harutin_99 (34900) on 2013年03月01日 13時14分 (#2334935) 日記

    スポーツカーとワゴン車、どっちがいいかっていう話と似ているような。

  • by lcc (46023) on 2013年03月01日 13時22分 (#2334944) 日記

    VBが最高ってことでおk?

  • まあ、宗教戦争なので所詮個人の好みの問題でしかないとは思いますが・・・

    お手軽にプログラミングするなら型がない方がいいとはおもいます。
    プログラミング技術のコモディティ化にもすごく貢献してると思われます。

    ただ、変数の型がない言語で書かれたミドルウェアには若干の不安を覚えますね。
    言語仕様というよりもインタプリタの問題の気もしますけど。
  • by Anonymous Coward on 2013年03月01日 14時14分 (#2335017)

    この手の話はLisper連中が、30年くらい前にさんざんやってたね。
    結果Common Lispは見ての通り、中途半端な蝙蝠状態なわけだが。

  • 個人的見解ですが、動的型付けだと規模が大きい、というかもうそれこそ2人以上からのレベルで「こうさせたくない」という意思表示が難しくなるのでちょっといやだなという印象です。ダック・タイピングでヒャッハー解釈されたそれこそ目も当てられない(ノ∀`)アチャー
    なので、そういう局面ではコメントで「絶対するなよ、絶対だぞ」と書いているのに、後年のサポートでそれを無視したあげくに落ちるんですけど的なご指摘が。。。(´・ω・`)

    以前のPHP、Javascriptなんやらの議論でも話題になってた記憶があるのですが、開発コストの中に便利機能(ライブラリとか型のauto casting/convertとか)に対するテスト工数が含まれていない気がしてなりませんし、逆に、それをしっかりやるためにドキュメントやテストをがっちりやろうとすると、「なんで動的型付け言語(LL)なのにそんなに時間かかるん?」とかestimation時に言われてがっかりします。なので、そこいらへんは純粋主義的な感情をぬぎすててやる必要があるんじゃないかと私は思います(´・ω・`)

  • by bhind (32461) on 2013年03月01日 14時32分 (#2335045) 日記

    こちらはいかがでしょうか( ´∀`)つ ミ
    GNOMEでもJavaScriptによるアプリケーション開発を推奨? [srad.jp]

  • by parsley (5772) on 2013年03月01日 14時41分 (#2335059) 日記

    他人がどう思おうが勝手だが、部下や上司には居て欲しくない。

    私は強めの型制約言語が好きです。

    --
    Copyright (c) 2001-2014 Parsley, All rights reserved.
  • by Anonymous Coward on 2013年03月01日 14時43分 (#2335062)
    静的型付けではない言語だとIntelliSense的なコード補完が不完全か、あるいは、不可能なので、静的型付け言語の方がうれしいです。
    っていう簡単な意見が意外とないのが不思議。
  • by Anonymous Coward on 2013年03月01日 22時47分 (#2335430)

    自分は動的型付言語も静的型付言語もどちらも好きですが,少なくとも発端となった記事自体で主張していることは動的型付言語(ここではPerl)の良い点としては見当外れかなぁとおもいますね.
    今回の件は宗教論争ではなく,元記事の見当外れな点を多くの人が指摘,訂正しているものかと.
    この件で静的型付言語の利点を主張している人も,おそらく用途によっては動的型付言語を利用しているのではないかと思います.

    多くの人が指摘していますが,静的型付言語でも型推論によって変数の型を明示的に記述する必要がない言語もあります.
    これらの言語では,元の記事で主張している「型の変更時に記述を変更する部分が少なくて済む」というメリットが確かにあるでしょう.
    「型推論によって変数宣言時に型を明記する必要がないことのメリット」という見方をすれば一部頷ける部分もあるのではないでしょうか.

  • by Anonymous Coward on 2013年03月01日 13時22分 (#2334945)

    記述する人間からみたら、暗黙の了解で宜しくやってね。
    と、型情報は処理系にお任せにしたい。

    暗黙の了解で実行したら、ちがう、そうぢゃない、となることもある。

    処理系の実装からしたら、実行の効率化のため付加情報として型もほしい。

    だから、記述効率、デバッグ効率、実行効率、を勘案して、
    バランスの取れるところに落ち着く。

    様は適材適所だが、そのバランスを測るのは難しいけど人間様がやるしかない。

    プロトタイプは形無しでやっつけてみて、効率化(ハンド最適化)は型情報を与えて
    人間がやるとか、その辺がシームレスにできたらいいんじゃないかな。

    • by Anonymous Coward on 2013年03月01日 15時53分 (#2335134)

      >記述する人間からみたら、

      後から読む人間からみたら、
      「型よ、あってくれー!」と、心の叫び。

      親コメント
  • by Anonymous Coward on 2013年03月01日 13時29分 (#2334951)

    ひたすら大量のコードを効率よく作りまくるのに適したスクリプト言語のたぐいと、信頼性重視の開発に使うプログラミング言語をちゃんぽんに議論してもはじまらない
    型無しでお気楽な方が良い場合もあれば、コンパイル時のチェックが厳密にかかる方が良い場合もある

  • by Anonymous Coward on 2013年03月01日 13時36分 (#2334960)

    メモリの使い方をカタにはめてるのは、
    現在のコンピュータの性質とか、能力の限界によるものと思ってるので
    現在はベターな手法だけど、将来は改善されるかもしれない。

    ソフトを作ることを考えると、
    コンピュータに密着してる方が都合がよいかもしれないし、
    型を隠蔽した言語の方が簡単でよろしいかもしれ

    環境も信条も個人によりけりなので、まさに宗教戦争やないか…

typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...