パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

C言語は滅びるべきか」記事へのコメント

  • と言ってるだけだな。
    Cの何が悪いかちゃんと理解できればC++できちんとしたコード書けるだろ。
    Windowsにはmanaged objectだとかもあるだろ。
    取り替えられるならとっくにやってる&あんたが知らないだけだと思われ。

    • by Anonymous Coward on 2017年07月20日 8時13分 (#3247141)

      今のC++は複雑すぎるだろう。
      新しい言語の成果をどんどん取り入れるのはいいが、頑なに互換性を守るために歪な文法を強いられる。
      Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。
      モダンC++は a = b;とだけ書かれていても凡人には想像も及ばないことが行われていたりする。

      あと、C++のコミュニティが最悪だね。
      間違った理解やちょっと古臭いコードを書くと「そんなことも知らないんですか。勉強して出直してきてください」だもんな。

      親コメント
      • by Anonymous Coward on 2017年07月20日 11時11分 (#3247279)

        どこかで似たような話を読んだなぁと思ったらブックマークに残ってた。
        間違ったコードは間違って見えるようにする [joelonsoftware.com]

        一般的に言って、私はものごとを隠してしまうような言語機能には恐れを感じる。次のコード

              i = j * 5;

        ・・・を見れば、少なくともCであれば、j の値が5倍されて結果が i に格納されるということがわかる。

        しかしC++の場合では、同じスニペットから分かることは何もない。まったく。C++で本当に起こることが何か知るためには、ぜんぜん違う場所で宣言されているかもしれない i と j の型を見つける必要がある。それはjがoperator*をオーバロードしている型の変数かもしれず、かけ算したときにはなはだ気の効いたことをやってくれるかもしれないからだ。そして i はoperator=をオーバロードしている型の変数かもしれず、また型が異なるために暗黙の型変換関数が呼ばれることになるかもしれない。そして何が起るか知るためには変数の型をチェックするだけでなく、その型を実装しているコードを見つける必要があり、そして,神よ救いたまえ、どこかで継承が行われていれば、コードが実際どこにあるのか自分でクラス階層をたどる必要があり、そしてどこかにポリモーフィズムがあれば、あなたは本当に難儀することになり、それは i と j の型がどう宣言されているか知るだけでは不十分で、実行のその時点における型が何か知る必要があるからであり、それにはどれくらいの量のコードを調べなければならないかわからず、停止性判定問題のおかげで、あなたは決してすべてをチェックしたか本当に確信することはできないのだ。(やれやれ!)

        親コメント
      • by Anonymous Coward on 2017年07月20日 9時30分 (#3247196)

        > Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。

        最近はコンパイラの最適化がかなり進んだ代償として、Cでもどういう機械語に置き換わるか予想できないことがかなり増えたよ。

        親コメント
        • by Anonymous Coward

          > 最近はコンパイラの最適化がかなり進んだ代償として、Cでもどういう機械語に置き換わるか予想できないことがかなり増えたよ。

          組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。
          割り込みルーチンなどのクリティカルな箇所は生成コードをいちいち目視で確認してますが、びっくりさせられるような最適化は見たことがありません。

          • by Anonymous Coward

            組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。

            組み込み用のコンパイラでLLVMベースつーとルネサスの CC-RX [renesas.com]やCC-RL [renesas.com]なんかはそうだけど、敢えて最適化なしの指定をしない限りは最適化は有効になる動作だし、外部変数を宣言がなくともvolatile扱いとする `-volatile' というスイッチも存在

            • by Anonymous Coward

              元コメは最適化を全くしないとは言ってないでしょ。
              コードレベルの最適化とか局所的なのは結構あるけど、アルゴリズムに踏み込むレベルまではあまりしてくれない感じのが多いような。

              • by Anonymous Coward

                元コメは最適化を全くしないとは言ってないでしょ。
                コードレベルの最適化とか局所的なのは結構あるけど、アルゴリズムに踏み込むレベルまではあまりしてくれない感じのが多いような。

                クソの役にも立たないお前の思い込みなんて語ってないでちっとは具体的なこと書けや。

                char hoge;
                int piyo;
                int hogera;
                 
                void main(void)
                {
                    while (hoge){
                        if (hoge) {
                            piyo++;
                        }
                        if (hoge) {
                            hogera++;
                        }
                    }
                }

                ↑のコードを CC-RX V2.07.00 を使用して標準の

          • by Anonymous Coward

            >

            組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。

            最適化なしで生成されたプログラムをリリースするなんて愚行だし、デバグ中のステップ実行したい場合なんかは兎も角としても開発中でも `-O2' とか `-Os' は普通に使うだろ。

            # 「最適化を有効化すると出るバグが解決できなかったので最適化なしでリリースした」
            # なんてマヌケな話も聞いたことはあるけどもそういう職場の人かな?

        • by Anonymous Coward

          しかし未定義動作まで積極的に利用した最適化がいらないのであれば、別にC言語である必要もない。

      • by Anonymous Coward

        凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
        それが想像できないってモダンな他の言語やスクリプトを書けないレベルだろ

        • by Anonymous Coward on 2017年07月20日 8時35分 (#3247151)

          左辺の型によって代入演算子だったり初期化演算子だったりする。
          右辺値の評価結果がconst参照を返す関数の場合、右辺の関数のreturn文で左辺が直接初期化される。

          親コメント
          • by Anonymous Coward

            初期化演算子って何?
            auto a = func();
            ならともかく
            a = func();
            でRVOが働くとは思えんが
            そもそもRVOが働くのはconst参照に限らないけど

            初期化演算子やらRVOへの無理解やらこれは勉強して出直せって言われても仕方のないことなのでは…

            • by Anonymous Coward

              代入が実行されようが直接初期化されようが正常に動くようにコンストラクタや演算子を実装すべきというだけの話であって、
              C++ではそれらの違いを常々意識しながらプログラミングしなければならないという話ではない。

              • by Anonymous Coward

                そうだね。実装す「べき」。
                「べき」で済ませる人にはc++は向かない。

        • by Anonymous Coward on 2017年07月20日 8時45分 (#3247156)

          代入演算子が信用できないって話だろ。実際、カウンタを回したりしてるんだし。

          親コメント
          • by Anonymous Coward on 2017年07月20日 8時55分 (#3247163)

            C#の場合
            a.xは何が起きるかわからないし
            rustでも
            a + bがどうなるかもわからんぞ
            演算子が代わりに関数を呼び出すっていうのはモダンな言語では当たり前に実装されてるし
            そこがC++は複雑だとはならんだろう

            親コメント
            • by Anonymous Coward

              航空宇宙とか高い信頼性を要求される分野で単純なオペレータが見た目どおりでないのは邪魔なだけ。
              言語仕様の隅から隅まで読んで、コンパイラの出力したバイナリまで確認しなきゃ動作に不安を
              もつようだとC言語の一部のアプリケーションの置き換えは不可能。

              • by Anonymous Coward

                議論にロケットサイエンス

              • by Anonymous Coward

                航空宇宙用とかの高い信頼性を要求される分野に特化された言語であるAdaにも演算子のオーバーロードあるじゃん?

          • by Anonymous Coward

            カウンタ回すってshared_ptrの事かな?
            リファレンスカウント方式のGCなんて他の色々な言語でも使われてるけど、そういう言語も使えないの?

        • by Anonymous Coward

          > 凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど

          私にはこの =演算子がどこでどのように定義されているか簡単にはわかりませんね。

          • by Anonymous Coward

            a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
            aの型の定義を見ればいいと思います

            • 演算子がオーバーライドされていることを知っていれば、
              調べようという気が起きるでしょうけど、起きなかったらそれまでですね。

              調べるのも開発環境のサポートがあるから簡単なだけで、無ければ結構手間ですね。

              C以上にフリーダムであり、演算子が想像通りの動きをしてくれるとは限らず、
              人によってはむしろバグの温床になったりしませんかね。

              親コメント
            • by Anonymous Coward

              いや、「演算子オーバーロードを乱用すべきではない」というのはあるのでは?
              (特に代入演算子のオーバーロード)
              固有の実装が行われていることが判別しづらいので。

              • by Anonymous Coward on 2017年07月20日 12時02分 (#3247309)

                C++は色々な出自のライブラリを組み合わせるとそこら辺で各ライブラリで方針が異なっていて非情に厄介ですね。
                他の言語なら「ベンダ毎の方針が異なるの当たり前だろ?」となるのだが、C++だと最悪組合せを諦める事になる。

                親コメント
            • by Anonymous Coward

              aの型がわからないことも多いわけで。

            • by Anonymous Coward

              > a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?

              動的ディスパッチをまさにそういう理由で嫌う人は大勢いますね
              linusとかerlangのjoe armstrongとかclojureのhickyとかjanes streetなど金融系とか
              それを知らないということは、つまりあなたが大したプログラマではないということです

            • by Anonymous Coward

              例えばaの型がクラスAだとして、そこにはf()の定義が無いかもしれません。
              そうなるとクラス階層をたどる必要があります。
              クラスAの上位のどこかのクラスにf()の定義があっても、純粋仮想関数かもしれません。
              そうするとAの複数ある派生クラスのうち実行時にaがどの型なのかを知る必要があります。

              デバッグで動かしてトレース出来る状況なら分かりやすいでしょうが、ソースコードから追うのは簡単じゃないと思いますよ。

        • by Anonymous Coward

          C++ でそういう想像をしたら危ない。

      • by Anonymous Coward

        Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。

        今どきのCコンパイラはそんなマヌケなコード生成しないよ。

      • by Anonymous Coward

        予想で書くやつはいなくなってほしい。
        確認しろ。

        勉強しないやつもだめだな。

日々是ハック也 -- あるハードコアバイナリアン

処理中...