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

悩まされてしまうプログラミング言語の奇妙な特徴は? 310

ストーリー by headless
個性的な 部門より
本家/.「Ask Slashdot: What Are the Strangest Features of Various Programming Languages?」より

プログラミング言語にはそれぞれ奇妙な文法や普通ではない機能、標準ではない実装といった独特の癖がある。こういったことはその言語を初めて使用する開発者だけでなく、熟練のプロをも悩ませる。ITworldの記事ではJavaScriptの+演算子の動作からC/C++のトライグラフ、Pythonのインデントレベルなど、プログラミング言語の奇妙な特徴を10個選んでまとめている。皆さんが最も悩まされているプログラミング言語の奇妙な特徴は何だろうか。

ITworldが選んだプログラミング言語の奇妙な特徴は以下のようなもの。他にもいろいろあると思われるが、/.Jerはどういった点に悩まされている(または悩んだことがある)だろう。

  1. JavaScriptでの+演算子の動作
  2. Perlモジュールは必ずTRUEを返す必要がある
  3. CとC++のトライグラフ
  4. PHPでのケースインセンシティブとケースセンシティブの混在
  5. Rubyで「0」がTRUEと評価されること
  6. Pythonでインデントレベルがブロックを示すこと
  7. Cの配列インデックスがポインターの算術演算のような動作をすること
  8. Perlの定義済み変数
  9. JavaScriptで勝手に挿入されるセミコロン
  10. Javaのオートボクシング
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 邪悪な仕様を列挙すると
    ・var の巻き上げ
    ・ブロックスコープがない
    ・モジュールがない
    ・class 構文がない (class のようなものは作れるのに!)
    ・ただの function なのに this にアクセス出来る (コールバックに登録した時は便利だけど、直で呼び出した時は this は何?とか)
    他も細かいのは色々…

    ただ、そんな JavaScript を俺は好きだ。

  • Java の getうんたらsetうんたらは、一体なんなのであろうか。無意味なコードがただ増えるだけだ。たぶん、アクセサメソッドには、重要な価値があると信じられた時代があったのだろうが、しかし、今となっては、くだらない役立たずなのは明らか。じっさい、今出てきてる新しいプログラミング言語には、そのようなものは無い。

    べつに Java で public インスタンス変数使ってコード書いても、コンパイルエラーが出るわけじゃなし。かまやしないのだが、API がそうなってないから、自分のコードだけそうするってのも少し格好わるい。

    • メソッドの後ろにつけられた throws IOException とか throws ParseException も、あれが困りものだ。必ず catch して何かをしなきゃいけないと決められてもらっても、無視したいものは無視するし、catch したいとなったら、RuntimeException だろうとなんだろうと、try catch 構文を書く。あれのせいでインデントは深くなるし、コードは長くなって読みにくくなるし、なんなんだあれは。

      親コメント
      • by Anonymous Coward on 2014年09月06日 19時20分 (#2671969)

        あれ、割ときっちり考えられてたりもするので侮れない。

        マルチスレッドでIO処理を書いたりするとよく分かる。
        例外を投げうるメソッドを呼ぶ自作メソッドで、「いや、IOが失敗したら失敗しても良いよ、このメソッドは」というやつには、throwを付け、
        「このメソッドが例外で死んだらマルチスレッドの後処理が転けて辻褄が合わなくなるからcatchして…」とやって行くと、
        結構、過不足無く、処理忘れの例外を撲滅できて、その合理性を実感できる。
        そういうプログラムって、ややこしい構造になりがちなので、とても助かる。
        例外ハンドリングの強要が無いC#でプログラムしてると、catch残しが出てきて苦労する。

        けどまあ、そんなめんどくさいプログラムは滅多にないので、普段使いだと、
        コンパイルオプションで全部チェックをOFFにしたくなる。

        むしろ、追加の静的型チェックツールかなにかで、別途提供されるべき仕組みなんじゃないかと思う。

        親コメント
    • えっと、それは本気で Java でパブリックフィールドを使わずにアクセサーを使う理由を理解できないと言っているの? 「Java には C# のプロパティーに相当する機能がなくてアクセサーメソッドだらけになるのが古臭い」とか言うならわかるけれど。

      親コメント
    • メンバー変数への直アクセスだと、複数スレッドから書き換えられた場合結果が保障できない。
      javaでスレッドセーフなのはローカル変数のみ。外部に公開するAPIはアクセッサメソッドでないと困るだろうに。

      親コメント
    • JavaというかC#だけど、フィールドを宣言するだけで、それがアクセサの糖衣構文になればいいのに、とは何度も思った。

      親コメント
    • by Anonymous Coward on 2014年09月06日 20時08分 (#2671983)

      誰も言及していないのが不思議ですが、Java Beansの命名規約がset, getを要求しているため、広まったのだと思います。
      一応、JavaBeans仕様に従えばいろんなフレームワークやライブラリで使い回せるというお題目もありましたし。

      // Java Beans仕様を知らずに、なんとなくでset, getを機械的に書く人が、私の観測範囲で多く見られるからそれだけが理由ではないかも

      私はJavaBeansとしてそれが必要である場合にしかgetやsetメソッドは書きません。
      逆に必要であれば、対応するフィールドが無くてもgetやsetメソッドを書きます(あまり重い処理ではやってはいけない)。
      メンバーには驚かれますが、説明して納得してもらっています。

      親コメント
  • by tamatukurikei (32435) on 2014年09月07日 15時05分 (#2672290) 日記
    NASA「暗黙の型宣言」
  • by sei5 (45140) on 2014年09月07日 20時03分 (#2672436)

    この中に、MATLABをお使いの方はいらっしゃいませんか?
    MATLABをお使いの方はいらっしゃいませんか?

  • by HomuraAkemi (46038) on 2014年09月06日 17時29分 (#2671884) 日記

    Luaで配列のインデックスが1からはじまること。

  • Cのポインタはそれ自体が曲者だと思いますよ。

  • by Anonymous Coward on 2014年09月06日 17時32分 (#2671887)

    C++ではトライグラフを廃止する提案があるようだ。Cはシラネ
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4086.html [open-std.org]

    • by saitoh (10803) on 2014年09月06日 17時53分 (#2671905)
      トライグラフと言えば、会議で国の代表が1票ずつもって規格を決める方式の弊害が出た典型事例ですかねぇ。 アルファベットがA~Zより数文字多くてASCIIの記号部分の一部もアルファベットにしている国に賛成票を投じさせるエサだったかしら?
      親コメント
  • by sakamoto (8009) on 2014年09月06日 17時33分 (#2671888) 日記

    JavaだとRaw型の理解をしないといけない
    A<B>[] c = new A<B>[3];
    でエラー
    A<B>[] c = (A<B>[])(new A[3]);
    でワーニング
    アノテーションでワーニングを抑制しないといけない。

    --
    -- 哀れな日本人専用(sorry Japanese only) --
  • JavaScript, PHP, Visual Basic, C, MySQL…
    とかく型変換は珍妙なルールが多くて混乱する。

  • by USH (8040) on 2014年09月06日 18時17分 (#2671928) 日記

    Rubyの改行は、文脈によって式の終端だったり、単なる区切り記号だったり、結構迷う。

  • by marimoo (46364) on 2014年09月06日 18時25分 (#2671939)

    本質的に問題を生んでいるものだけではなく、
    たんに書いた人が使い慣れている他の言語と違う挙動をするだけ、
    というものが結構混ざっているような。

    私にわかる分だけでも。

    >Pythonでインデントレベルがブロックを示すこと

    Python全否定されているんだが。CoffeeScriptはいいのか?

    >Cの配列インデックスがポインターの算術演算のような動作をすること

    他にどうやって配列の中身を表せと。
    1[a]と書けるとかの話をしている?

    >Rubyで「0」がTRUEと評価されること

    「0」がfalse出なければいけない理由がC出そうだという以外思いつかないのだが、何かあるのだろうが。

    >JavaScriptで勝手に挿入されるセミコロン

    Rubyでもそれはなかったっけ?

    • >Cの配列インデックスがポインターの算術演算のような動作をすること

      他にどうやって配列の中身を表せと。
      1[a]と書けるとかの話をしている?

      うん、元記事ではそういう話をしている。

      記事の著者が、どうしてそれでプログラマーが悩まされると思ったのかは知らない。それでプログラマーが悩まされる状況なんて、国際難読 C コードコンテストの応募作品が読解できなくて悩んでいるという状況しか僕には想像できないけど。

      親コメント
  • by help (36022) on 2014年09月06日 20時20分 (#2671993) 日記
    数字の先頭桁が 0x は 16 進数はしっていたのですが、 0 だと 8 進数であることを知らずに三日くらい悩みました。  date +%S で得た秒を計算に使っていて 08 秒のところでエラーがでてなんだろうなぁと。 一分の中で 08 秒と 09 秒のときしかエラーにならないので、 8 進数と解釈されることを知ったときは衝撃でした。
typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...