はてなキーワード: C/C++とは
C/C++ならば、ループカウンタにローカル変数を使えば、最適化されることは分かってるから保守性重視で書く。
真面目なコンパイラなら1はどっちを書いても同じようなコードになるさ。
まー、こんな所をチマチマこだわっても、全体は良くならん。
こまけーこたぁいいんだよ!!(AA略
ところが今回はカウンタ変数を引数に入れてメソッドを呼び出している。
メモリを毎回確保することは確かだけど、それとカウンタ共通化とのつながりがわからない。
ケース1はなんか言語特性の違いなのかという気がしてきた。
C言語からはじめてJava中途半端にかじった後、C++メインに以降しつつあるへっぽこプログラマです。
私の書くコードの可読性が低いのは確かだろうなと思う。
プログラムのあるべき論として、ヘンな箇所でアクセスされて不良を作らないように
変数の寿命をなるべく短くなるようにする原則があることは知っている。
ただ、C/C++はポインタというものが存在してメモリの解放とか明示的に行う。
またC/C++プログラマは大きなメモリの解放/再確保がかなり性能コストがかかることをしっている。
それなので、C/C++だと一度確保した大規模領域を解放/再確保しないように
本来の変数の寿命より、長めに扱えるように設計することがある。
そんな変な寿命の変数は不良の温床であり、可読性が低いことは理解しつつも。
メソッド抜けるときは関数ローカル変数はすべて領域を解放するようにコーディングするもんじゃないっけ
そんな怪しいことをやるプログラマなんで、
適材適所
perl そこそこの文書処理に
Java わりと何でもいけるが、わりと平均的にめんどくさい
JSP メモリ64K制限さえなければすばらしかったが、Java展開されたときのPrintfにサイズに制限があるので、小さいHTML向け
PHP Perl的に使う人大杉、あくまでも、HTML埋め込み言語として使うと最適print("HTMLほげほげ")とかみると悲しくなる
C/C++ 速度が必用なときに。まぁ、今では巨大トランザクションサーバーとか、CGの世界とか
速度マニアで正規表現マニアな人はlex/yacc/bison (BNFな人はANTLRらしい。最近知った)。
って感じか? 用途と違う道具を選んで、道具がどうのこうの言う前に、適切な道具を選べばいんじゃねーかと。
プログラマーは道具の善し悪しを語るんじゃない、道具を使いこなす自分の腕の善し悪しをかたらなくっちゃーだめなんだーーーーーーーー
とか、増田るあたり、俺もまだまだ、若いなぁって安心するけど・・・そろそろ、大人にならなくちゃと思う。
もともと
if("0x0a" == 10){
}
を成り立たせた方が都合がよい。というのの応用で
"0x0a" == 10 == "10" となるだけだからねぇ。
if ("0x0A" == 0x0A) { print '(´ε` )チュッ'; }else{ print '\(^o^)/'; }
は'(´ε` )チュッ'だしねぇ。
"0x0a" == 10 == "10" == 0x0Aなんだよね・・・
数字に変換されると言うよりは
だからねぇ。
もともと、HTMLやXMLの中の数字っぽい物を数字として処理する方が、多いからこうなってるだけで・・・
文字列をキャストしたら0になるっていうのが、単なる他の言語の決めの問題だからねぇ。
少なくともC/C++言語では文字列はキャストしたら、ポインタアドレスが返ってくるから0じゃねーし。
atoiの事を言っているなら、それキャストじゃなくて、関数つかってるし・・・関数使うなら=タイプした方が速いだろうという、マインド。
めんどくせーめんどくせー言ってる増田だけど。
C/C++はまずガベージコレクタが無いのがめんどくさすぎる。いちいちライブラリ導入したりboostのスマートポインタ使ったりしなきゃいけないのがめんどい。
あと入出力とか文字列処理とかが発狂しそうなほどめんどくさい。俺としては。
あとなんかvectorを参照渡しだか参照返しだかしようとして発狂しそうになったことがある。
まぁ上級者的にはありえない話なんだろうけどさ。
C/C++はCPU依存性を減らしたアセンブラで、面倒くささを耐える代わりに速度を稼ぐという特殊用途言語なんだから、「プログラミングは面倒だ」の例としては局所的すぎるなー。大量のバッドノウハウを楽しんで乗りこなすマニアどもが、ゲームや組み込みや検索エンジンあたりの開発に使うプロ向けの道具で、間違っても「プログラミングの細かいところが嫌い」なんていうライトなプログラマが使うようなものじゃない。
もっとチャラい言語使いなよ。RubyとかActionScriptとか。よりによってPHP/C/C++とか選択がマゾヒスティック過ぎ。仕事だか学生の課題だかで無理矢理使わされてるの?
自分はMacメインなプログラマじゃないので、ズレたこと言うかも知れませんが……。
参考書も参考サイトも無数にある。その中にはプログラミング未経験者を対象にしたものも多い。しかもJavaなら将来WindowsでもLinuxでも通じるし、Webアプリなどにも利用出来る。C++様信者の私としては悲しいけど、時代はJavaだ。
ネイティブアプリを真面目に作ろうと思ったら、Objective-Cが基本っぽい(C++ではCocoa使えず、Carbonになってしまう)。
ただ、Objective-Cの参考書・サイトは、C/C++やJavaなんかと比べて絶望的に少ない上、ざっと見た感じCocoaな部分やXCodeの機能とごっちゃに記述されているものが多く、初心者にはとっつきにくい(理解しづらく、書かれている通りに打って動かす以上のことを行いにくい)点が多々あると思うので、まずはCでプログラミング(コンソールアプリ製作)を知っておくのが良いかも知れないです。
何にせよ、プログラミング言語というものは何か一つやっておくのが重要なので、(もの凄ーく悔しいですが)Javaが無難なんじゃないかなーと思います。
ここ1年弱でfortranとかのクソコードを書いた経験以外一切無くてブランクも数年あった状態から、C/C++を使ってオブジェクト指向でそれなりに書けるようになった俺だけど。
一番苦労したのはメモリ空間のイメージを掴むまでだったね。C++で言うと、newしたオブジェクトがメモリ空間上にどう存在してどう振る舞うのか、っていうイメージが湧かなくて最初大変だった。
UMLのシーケンス図で表現される振る舞いを、頭の中に作った仮想的なメモリ空間上でシミュレートする感じか。この辺さえ理解できたらあとは細かいテクニックの話だけな気がする。
チューニングは最初と最後にやる物だと思う。
実装
必要な部分からチューニング
という方法でないと、いざ、チューニングと思っても、設計がダメでチューニングできないことがある。
だから、C/C++のチューニングって設計段階で計画しておいて、最後に実行する物。
だから、C/C++って設計が命。とくに100人越えるプロジェクトとかだと、最初に設計しておいて
外注するまえに手を打っておかないと、最悪 部品丸ごと交換とかをチューニングと呼ぶはめになる。
このチューニングを前提とした設計と、単なるあてずっぽうの設計は全然違うのに・・・
チューニングって結局 実際に行うのは1年後だったりするわけで・・・
お客さんが理解してくれないことも多いんだよね・・・
で安い方に仕事出して、1年後に作り直し費用とか支払ってる。
C/C++にいくつか思うこと (ちなみに、プログラマ始めたのはCができた頃でC++よりも私のプログラマ歴の方が長い)
Cはポインタ というか、ポインタを使いこなすことで、チューニングしていく言語だから ポインタ使いたくない=チューニングしたくない
って人は他の高級言語で良いと思う。ただ、動画などの処理をC/C++又はアセンブラ以外で書く人というのは、あまり聞かないので
速度が必要=C/C++って事かと思う。
昔、全くチューニングしていない、CとJavaを比べて同じ速度だからJavaでもOKというレポートを読んだことがあるのだが、あれは酷かった。
Cはチューニングしたときに、もっとも伸びしろが大きく、必要な場合アセンブラと並記できることで、ほぼアセンブラという領域まで
チューニングできるところが魅力。その際、ポインタは無くてはならない。知っておくべき技術。
繰り返しになるけどチューニングしない人には意味がない言語と言われればその通り。
また、ポインタだけではなく、レジスタについても知っておくとCでの伸びシロが大きくなる。
そして、少なくともアセンブラレベルでのPUSH,POP,CALLは覚えておいた方がよい。
関数コールをすると、レジスタ類の待避がアセンブラレベルでは走り、その上、スタックに引数や返値を積んでジャンプするという
ものすごく遠大な処理がアセンブラレベルでは走っているが、Cレベルでは1行の関数コールに見える。
という事を理解しておくと、C++でのインライン関数の重要性や、再帰関数が実行時にはかなり重い理由が頭の中に浮かんでくる。
こういう言い方をすると、最近はCPUが早いから大丈夫とか言う人が多いが、じゃぁWindows Vistaは売れましたか?と聞きたい。
少なくともチューニングが必要な事もある。必要ないこともある。という事で選択すれば良いと思う。
たかだか、数行のスクリプトでチューニング不要ならそりゃ、Perlつかうさ
参考までに書いておくと、個人的感覚ではC++はオブジェクト指向言語ではない。
アセンブラにまで行き着く C言語を大規模開発する時に最低限必要となる抽象化をするための言語
そのために、まともにOOPで設計するとC++では重くなる事が多い。いかに、崩せるかがキモ。
またC++使いか?エセC++使いか?の見分け方は
constを正しく使えるか?参照を正しく使えるか? vtableの説明ができるか?
という質問に正しく答えられるか?で見分けると結構見分けがつくと思っている。
「私、プログラミング好きだよ」と言うプログラマに、好きな言語や開発ツールを聞いて「C/C++/C#」の名前があがってくるとげんなりする。心底がっかりする。C/C++/C#は俺も大好きだし、素晴らしい曲開発環境だと思うけども、臆面も無く低レベルプログラミング言語を挙げる人のほとんどが、それ以外の低レベルプログラミング言語を知らないんだもの。それどころか、IA-32の仕様書があることすら知らないし、興味が無い。せめて4004の基本構造くらい理解してから言ってもらえませんかね。
要するに「プログラミングを理解する知識の深い私」を演出するために、いちばんてっとり早くて優等生な回答なんですよね。C/C++/C#は。あと、アセンブリ言語や、機械語もこのカテゴリに入る。
確かにUnixを記述したC言語として鉄板なことは間違いないけど、本当にプログラミングが好きならもっとたくさんの名前が挙がってもいいと思う。もっと書けよ!インテル系以外も!最近のも!「C」「アセンブラ」「MMX」「SSE」「3DNow!」のコンボはもう飽きました。
1度だけ悲しきAdaという回答が返ってきて、土下座せんばかりに感動したことがあります。あ…この方、本当にプログラミングを趣味でやってるんだ…と思ったよ。
ごめんなさい、僕、嘘をつきました。
でもね、今さらアセンブリ言語やC/C++を勉強するのは時代遅れだと思う。もちろん、携帯電話などの組み込み産業ではそういった言語はまだまだ健在だし、パソコンで何かを制御したりするようなニッチ産業でも生き続ける、「使える言語」であることに違いない。でも入門者にお薦めするような言語ではない。昔ならBasicじゃ遅いからCかアセンブリ言語で書くという動機があったが、今じゃPerl/PHPでも十分に動作は速い。ちょっとしたGUIを作りたいならTcl/tkか、Javaを使うべきだ。VBもいい。C++&DirectXはよっぽどプログラミングに熱中できる人が使えばいい。あくまでパソコンに限定した話だけどね。
携帯やパソコン制御はニッチだから初心者にお勧めできなくて、GUI作りやすいから初心者にお勧めできるってのがよくわからん。
低級言語で頑張って"Hello World"作ってた自分から見ると、Java/PHP/Perl/Rubyのような超高級言語でさくさく高度なWEBアプリケーションを作ってる人がとても羨ましく見えると同時に、「大した苦労もしないで、俺はやったぞみたいな顔するんじゃねえよ。」とついつい思ってしまうことがある。アセンブリ言語ときたら比較命令を発行するたびに分岐先ラベルをいくつも定義しないといけないような面倒臭さがあった。それでも、それ以前のハンドアセンブル組や、機械後を生で見たり、パンチカード使ってたような人達から見れば甘いと思うだろう。
と、俺のひがみを書いてみるテスト。
でもね、今さらアセンブリ言語やC/C++を勉強するのは時代遅れだと思う。もちろん、携帯電話などの組み込み産業ではそういった言語はまだまだ健在だし、パソコンで何かを制御したりするようなニッチ産業でも生き続ける、「使える言語」であることに違いない。でも入門者にお薦めするような言語ではない。昔ならBasicじゃ遅いからCかアセンブリ言語で書くという動機があったが、今じゃPerl/PHPでも十分に動作は速い。ちょっとしたGUIを作りたいならTcl/tkか、Javaを使うべきだ。VBもいい。C++&DirectXはよっぽどプログラミングに熱中できる人が使えばいい。あくまでパソコンに限定した話だけどね。
プログラミングするのは何もパソコンだけじゃないんで。マイコンとか一杯あるから。線と線をつないで、発行ダイオードとかをピコピコ光らせるの。完成すると楽しいよ。よく、はんだごてあてすぎて、部品こわしちゃうけど(汗)。
もし、私が「アイツ、○○なんて言語使ってらー」なんて言って来たらぜひ、「○○言語を使うと、○○が簡単に記述できて便利だよ。」と、そのとき使ってる言語の利点を教えてください。私も所詮、いま使ってる言語のことしか知らないんで、ついつい、違う言語には拒否反応を起こしてしまうんです。
だいたい、セグメンテーションフォルトを起こすような言語は嫌い
Haskelわけわかんないし
Java重苦しいし、いちいちclass Hogehoge { public static void main() { ... } }書くのがめんどくさいし、API多すぎ
オブジェクト指向したくなるような複雑なプログラムは最初から考えない(作れない)
言語が提供するGUIのツールはOSとは別に独自のレイヤー、世界感を持っててとっつきにくい
マルチスレッド、排他処理を扱うようなプログラムは脳味噌がついて行かないので書かない
Ruby、、、そもそもLL言語で大規模でオブジェクト指向なプログラム書きたくない。小規模ならオブジェクト指向要らない。
俺のマシンで実行できないAda/Basic/Fortran/Pascal その他いろいろ
VHDL、Verilog?FPGAやゲートアレイなんて持ってない、持ちたくない(苦手だもん)
HTML、XMLは日本語とタグが入り乱れるので、そのつど日本語入力の切替えが死ぬほど嫌になった。
だから、HTMLとXMLは全部手入力なんて真似は絶対してやらねえ。
Flex(Action Script)はコンパイラがJavaで実装されてて重すぎる。(シェルを使えばまし)
JavaScriptはブラウザごとの挙動の違いを吸収しきれる自身が無いので使わない。
1プログラムにつき、(コメント含めて)250行以上書きたくない
(本文には触ったこともない言語を思い込みで罵倒しているなど、嘘、おおげさ、紛らわしいが多数混入しています。それが全部わかった貴方はプログラミング言語マスターです。)