・・・を見れば、少なくともCであれば、j の値が5倍されて結果が i に格納されるということがわかる。
しかしC++の場合では、同じスニペットから分かることは何もない。まったく。C++で本当に起こることが何か知るためには、ぜんぜん違う場所で宣言されているかもしれない i と j の型を見つける必要がある。それはjがoperator*をオーバロードしている型の変数かもしれず、かけ算したときにはなはだ気の効いたことをやってくれるかもしれないからだ。そして i はoperator=をオーバロードしている型の変数かもしれず、また型が異なるために暗黙の型変換関数が呼ばれることになるかもしれない。そして何が起るか知るためには変数の型をチェックするだけでなく、その型を実装しているコードを見つける必要があり、そして,神よ救いたまえ、どこかで継承が行われていれば、コードが実際どこにあるのか自分でクラス階層をたどる必要があり、そしてどこかにポリモーフィズムがあれば、あなたは本当に難儀することになり、それは i と j の型がどう宣言されているか知るだけでは不十分で、実行のその時点における型が何か知る必要があるからであり、それにはどれくらいの量のコードを調べなければならないかわからず、停止性判定問題のおかげで、あなたは決してすべてをチェックしたか本当に確信することはできないのだ。(やれやれ!)
女房と言語は新しい方がいい (スコア:1)
と言ってるだけだな。
Cの何が悪いかちゃんと理解できればC++できちんとしたコード書けるだろ。
Windowsにはmanaged objectだとかもあるだろ。
取り替えられるならとっくにやってる&あんたが知らないだけだと思われ。
Re:女房と言語は新しい方がいい (スコア:1)
今のC++は複雑すぎるだろう。
新しい言語の成果をどんどん取り入れるのはいいが、頑なに互換性を守るために歪な文法を強いられる。
Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。
モダンC++は a = b;とだけ書かれていても凡人には想像も及ばないことが行われていたりする。
あと、C++のコミュニティが最悪だね。
間違った理解やちょっと古臭いコードを書くと「そんなことも知らないんですか。勉強して出直してきてください」だもんな。
Re:女房と言語は新しい方がいい (スコア:4, 興味深い)
どこかで似たような話を読んだなぁと思ったらブックマークに残ってた。
間違ったコードは間違って見えるようにする [joelonsoftware.com]
一般的に言って、私はものごとを隠してしまうような言語機能には恐れを感じる。次のコード
i = j * 5;
・・・を見れば、少なくともCであれば、j の値が5倍されて結果が i に格納されるということがわかる。
しかしC++の場合では、同じスニペットから分かることは何もない。まったく。C++で本当に起こることが何か知るためには、ぜんぜん違う場所で宣言されているかもしれない i と j の型を見つける必要がある。それはjがoperator*をオーバロードしている型の変数かもしれず、かけ算したときにはなはだ気の効いたことをやってくれるかもしれないからだ。そして i はoperator=をオーバロードしている型の変数かもしれず、また型が異なるために暗黙の型変換関数が呼ばれることになるかもしれない。そして何が起るか知るためには変数の型をチェックするだけでなく、その型を実装しているコードを見つける必要があり、そして,神よ救いたまえ、どこかで継承が行われていれば、コードが実際どこにあるのか自分でクラス階層をたどる必要があり、そしてどこかにポリモーフィズムがあれば、あなたは本当に難儀することになり、それは i と j の型がどう宣言されているか知るだけでは不十分で、実行のその時点における型が何か知る必要があるからであり、それにはどれくらいの量のコードを調べなければならないかわからず、停止性判定問題のおかげで、あなたは決してすべてをチェックしたか本当に確信することはできないのだ。(やれやれ!)
Re: (スコア:0)
つまり、kotlinはクソってことだね。
Re: (スコア:0)
https://cpplover.blogspot.jp/2013/05/linus-torvalsc.html [blogspot.jp]
https://srad.jp/~taro-nishino/journal/509450/ [srad.jp]
SFINAE萌えとかC++初心者の自分ではありますが、御大の言ってることは確かになぁ、って思う。
Re:女房と言語は新しい方がいい (スコア:1)
> Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。
最近はコンパイラの最適化がかなり進んだ代償として、Cでもどういう機械語に置き換わるか予想できないことがかなり増えたよ。
Re: (スコア:0)
> 最近はコンパイラの最適化がかなり進んだ代償として、Cでもどういう機械語に置き換わるか予想できないことがかなり増えたよ。
組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。
割り込みルーチンなどのクリティカルな箇所は生成コードをいちいち目視で確認してますが、びっくりさせられるような最適化は見たことがありません。
Re: (スコア:0)
組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。
組み込み用のコンパイラでLLVMベースつーとルネサスの CC-RX [renesas.com]やCC-RL [renesas.com]なんかはそうだけど、敢えて最適化なしの指定をしない限りは最適化は有効になる動作だし、外部変数を宣言がなくともvolatile扱いとする `-volatile' というスイッチも存在
Re: (スコア:0)
元コメは最適化を全くしないとは言ってないでしょ。
コードレベルの最適化とか局所的なのは結構あるけど、アルゴリズムに踏み込むレベルまではあまりしてくれない感じのが多いような。
Re: (スコア:0)
元コメは最適化を全くしないとは言ってないでしょ。
コードレベルの最適化とか局所的なのは結構あるけど、アルゴリズムに踏み込むレベルまではあまりしてくれない感じのが多いような。
クソの役にも立たないお前の思い込みなんて語ってないでちっとは具体的なこと書けや。
↑のコードを CC-RX V2.07.00 を使用して標準の
Re: (スコア:0)
>
組込み用のコンパイラだとバックエンドがLLVMのような最新のものでも、たとえば変数のvolatile 宣言が必要となるようなアグレッシブな最適化はかなり最適化レベルを上げないとやらないです。
最適化なしで生成されたプログラムをリリースするなんて愚行だし、デバグ中のステップ実行したい場合なんかは兎も角としても開発中でも `-O2' とか `-Os' は普通に使うだろ。
# 「最適化を有効化すると出るバグが解決できなかったので最適化なしでリリースした」
# なんてマヌケな話も聞いたことはあるけどもそういう職場の人かな?
Re: (スコア:0)
しかし未定義動作まで積極的に利用した最適化がいらないのであれば、別にC言語である必要もない。
Re: (スコア:0)
凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
それが想像できないってモダンな他の言語やスクリプトを書けないレベルだろ
Re:女房と言語は新しい方がいい (スコア:1)
左辺の型によって代入演算子だったり初期化演算子だったりする。
右辺値の評価結果がconst参照を返す関数の場合、右辺の関数のreturn文で左辺が直接初期化される。
Re: (スコア:0)
初期化演算子って何?
auto a = func();
ならともかく
a = func();
でRVOが働くとは思えんが
そもそもRVOが働くのはconst参照に限らないけど
初期化演算子やらRVOへの無理解やらこれは勉強して出直せって言われても仕方のないことなのでは…
Re: (スコア:0)
代入が実行されようが直接初期化されようが正常に動くようにコンストラクタや演算子を実装すべきというだけの話であって、
C++ではそれらの違いを常々意識しながらプログラミングしなければならないという話ではない。
Re: (スコア:0)
そうだね。実装す「べき」。
「べき」で済ませる人にはc++は向かない。
Re: (スコア:0)
やったね!!!
Re:女房と言語は新しい方がいい (スコア:1)
代入演算子が信用できないって話だろ。実際、カウンタを回したりしてるんだし。
Re:女房と言語は新しい方がいい (スコア:1)
C#の場合
a.xは何が起きるかわからないし
rustでも
a + bがどうなるかもわからんぞ
演算子が代わりに関数を呼び出すっていうのはモダンな言語では当たり前に実装されてるし
そこがC++は複雑だとはならんだろう
Re: (スコア:0)
航空宇宙とか高い信頼性を要求される分野で単純なオペレータが見た目どおりでないのは邪魔なだけ。
言語仕様の隅から隅まで読んで、コンパイラの出力したバイナリまで確認しなきゃ動作に不安を
もつようだとC言語の一部のアプリケーションの置き換えは不可能。
Re: (スコア:0)
議論にロケットサイエンス
Re: (スコア:0)
航空宇宙用とかの高い信頼性を要求される分野に特化された言語であるAdaにも演算子のオーバーロードあるじゃん?
Re: (スコア:0)
カウンタ回すってshared_ptrの事かな?
リファレンスカウント方式のGCなんて他の色々な言語でも使われてるけど、そういう言語も使えないの?
Re: (スコア:0)
> 凡人だけどa = b;と書かれていれば代入演算子が呼ばれてるんだろうなってことがわかるけど
私にはこの =演算子がどこでどのように定義されているか簡単にはわかりませんね。
Re: (スコア:0)
a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
aの型の定義を見ればいいと思います
Re:女房と言語は新しい方がいい (スコア:1)
演算子がオーバーライドされていることを知っていれば、
調べようという気が起きるでしょうけど、起きなかったらそれまでですね。
調べるのも開発環境のサポートがあるから簡単なだけで、無ければ結構手間ですね。
C以上にフリーダムであり、演算子が想像通りの動きをしてくれるとは限らず、
人によってはむしろバグの温床になったりしませんかね。
Re: (スコア:0)
話のすり替え乙
Re: (スコア:0)
いや、「演算子オーバーロードを乱用すべきではない」というのはあるのでは?
(特に代入演算子のオーバーロード)
固有の実装が行われていることが判別しづらいので。
Re:女房と言語は新しい方がいい (スコア:1)
C++は色々な出自のライブラリを組み合わせるとそこら辺で各ライブラリで方針が異なっていて非情に厄介ですね。
他の言語なら「ベンダ毎の方針が異なるの当たり前だろ?」となるのだが、C++だと最悪組合せを諦める事になる。
Re: (スコア:0)
aの型がわからないことも多いわけで。
Re: (スコア:0)
> a.f();でfがどこでどのように定義されているか簡単にはわからないなんて言う人はいないでしょ?
動的ディスパッチをまさにそういう理由で嫌う人は大勢いますね
linusとかerlangのjoe armstrongとかclojureのhickyとかjanes streetなど金融系とか
それを知らないということは、つまりあなたが大したプログラマではないということです
Re: (スコア:0)
例えばaの型がクラスAだとして、そこにはf()の定義が無いかもしれません。
そうなるとクラス階層をたどる必要があります。
クラスAの上位のどこかのクラスにf()の定義があっても、純粋仮想関数かもしれません。
そうするとAの複数ある派生クラスのうち実行時にaがどの型なのかを知る必要があります。
デバッグで動かしてトレース出来る状況なら分かりやすいでしょうが、ソースコードから追うのは簡単じゃないと思いますよ。
Re: (スコア:0)
C++ でそういう想像をしたら危ない。
Re: (スコア:0)
Cの良いところは、言語使用が小さく一行一行がどういう機械語に置き換わるか予想できるところ。
今どきのCコンパイラはそんなマヌケなコード生成しないよ。
Re: (スコア:0)
予想で書くやつはいなくなってほしい。
確認しろ。
勉強しないやつもだめだな。