2008-12-31

http://anond.hatelabo.jp/20081230225149

元増田っす

言語仕様コンパクトなのがなぜ良いのかと言うと、実は2つ理由があります。

  1. 学ぶのが楽だから
  2. コンパイラを作るのが楽だから

1つめは「全体像を把握するのが楽」という理由で。C++JAVAだと全体像を把握するだけで疲れてしまうわけです。(使い方は奥深いけどね)

2つめはCOBOLを学ぶのと同じ後ろ向きの理由だけど、これからも活躍の場が多いだろうという予測。いまだに組み込みとかハードよりのところだとCは現役だったり、新製品の開発でももりもり使われてます。コンパイラが簡単に作れるし移植も楽だから。(これがCOBOLとかJAVAだと、開発環境を整えるのが大変なので選択されない。未来はわからないけれどもね)

標準ライブラリまで含めても、Cは異常に小さいよ。速いし。

Cのポインタってのは、値渡しのみにするとスタックコンパイラをすっきりかけるけど、じゃあどうやって柔軟に運用させるべーと考えた妥協の産物です。

だから標準ライブラリにすら文字列・集合・リスト配列を便利に扱えるものは入ってないし、ガーベジコレクションも多重のスレッドもヒープも入ってないわけです。(だからスタックと静的割り当てだけなんとかすればコンパイラが作れちゃう)知らなかったから作れなかったんじゃなくて、あえて切り捨ててる。

方向性として「間違いを少なくプログラミングする」とか「効率よくプログラミングする」ではなく、「コンパイラを簡単に作れるのが1番。でもできるだけプログラミングしやすいよう」にしてる。

そういう言語を2番目以降に学ぶのが良いのは、ハードよりの考え方(正確には、コンパイラよりの考え方)が出来るようになるから。これが「ポインタと言う概念を理解できる」ということに含まれてる。

メモリ意識したりポインタ概念を理解しておくと「なんで暴走するのか」「どうすると自分の足を撃てるのか」が理解できる。限界も面倒くささも便利さもわかるからね。(ポインタだからっつって暴走するんじゃなくて、C言語ポインタの実装だから、なんだけども。あと、ほんとは機械語アセンブリを学ぶのが良いとは思うけど、それはハードルが高い。出来ることも少なくなっちゃう)

ポインタが暴走するから隠蔽する・使わないようにする・ミスっても平気にする、ミスらないようにするというのは、言語としては正しい方向性だと思う。

誰がどう考えても「存在しない配列を参照したらエラーを返さずに黙って暴走する(そこにあるメモリを見ちゃう)」「仕様として不定な動作が多い」なんてのはまずいでしょう。けれども、なぜまずいのか知らないまま便利な言語に慣れちゃうのは、感覚として良くない様な気がする。

C#だと信じられないくらい簡単にアプリ作れるし、PythonPerlは普段使いの言語としてはすっごく便利。でもそれって、パック野菜やお惣菜を買ってきて晩御飯を作るようなものじゃないかな、と。ピーラーやミキサーは便利だし炊飯器はなきゃ炊事なんてやってられない。それでも、その道を学ぶのであれば「レシピを見れば料理は作れる」「包丁となべで調理できる」「なべかまでご飯は炊ける」なんてのは、必要じゃないかなあと。

今あえてC言語を学ぶのは、それが学びやすい(情報が手に入りやすい)最後の言語だから。

(まあ、何を目指すかによって違うとは思うけどね。僕の言ってんのは「いまあえてスペイン語だ!」って言ってるようなもんだし。違うか)

トラックバック - http://anond.hatelabo.jp/20081231004901
  • いまC言語を学ぶべき3つの理由

    使用できる環境が多いから 言語仕様がコンパクトだから ポインタと言う概念を学べるから プログラミング言語として、二番目以降に学ぶには良い。(最初のプログラミング言語には...

    • http://anond.hatelabo.jp/20081230040914

      少少梃子摺るけど、Cを最初に学ぶべきだと思う。ポインタを理解しないと他の言語でポインタを隠蔽している仕様を理解できない。 あたしはいつのまにかC#しかつかわなくなったけ...

      • http://anond.hatelabo.jp/20081230211311

        http://anond.hatelabo.jp/20081230060518です。 自分の中で「プログラム言語を学ぶ」ということが「コンピューターの動作を理解する」と同義でした。実際にはポインタなんて暴走するプログラム...

        • http://anond.hatelabo.jp/20081230225149

          元増田っす 言語仕様がコンパクトなのがなぜ良いのかと言うと、実は2つ理由があります。 学ぶのが楽だから コンパイラを作るのが楽だから 1つめは「全体像を把握するのが楽」と...

          • http://anond.hatelabo.jp/20081231004901

            ポインタと一口に言っても メモリポインタもあるけど、関数ポインタもあるっしょ? いまは、Code Exploitなどのクラックに使われちゃうので、やらないといえばやらないけど。 ディスク...

            • http://anond.hatelabo.jp/20081231050338

              関数ポインタも、結局関数がメモリに乗ってて、関数の開始位置をメモリのアドレスで表せるから使えるわけで、やっぱメモリポインタで良いんじゃないの? それをいうなら変数ポイン...

            • http://anond.hatelabo.jp/20081231050338

              その辺のメモリポインタと関数ポインタのあいまいさがCのポインタの面白いところだと思うよ? よくわからんが何が曖昧なんだろう。 区別されているでしょ。 クラックされるから関...

              • http://anond.hatelabo.jp/20081231093830

                ×クラックされるから関数ポインタを使わない ○メモリ上にプログラムを自力でロードして、それを関数ポインタに変換して関数コールすると、Exploit系のバグなのか、わざとやっている...

                • http://anond.hatelabo.jp/20081231173837

                  Exploit系のバグなのか、わざとやっているのかが外部ツールで判別付かない場合がある ツールにひっかかるから、ですらないと思う。単にそういう技が必要なくなっただけ。 そもそもexp...

                  • http://anond.hatelabo.jp/20081231175925

                    単にそういう技が必要なくなっただけ 必要が無くなったのは大前提だと思うけど? だから、昔はやったけど、今はやらない。DLLやSOがあるというのが1番の理由。でも、なんでDLLやSOが...

                    • http://anond.hatelabo.jp/20081231180928

                      あきらかに素人さん相手の説明でそりゃーないでしょ。というか、第1の問題点として指摘しているかのように書いてあるし。まぁいいけど。。。 そもそも、まさに動的リンク機能がOSに...

                      • http://anond.hatelabo.jp/20081231182008

                        最初期の増田っす。 そもそも関数ポインタって、最近流行の言葉(笑)で言えばバッドノウハウだから、別に細かいこと良いんじゃないの? 関数呼び出しってのも「式」にしちゃうとコン...

                      • http://anond.hatelabo.jp/20081231182008

                        関数ポインタはバッドノウハウどころか、手続き的な抽象を使いたいところで多用しますぜ。 C++やオブジェクト指向言語だと 継承と仮想関数を使うけど、同じようなケースで C言語では...

                        • http://anond.hatelabo.jp/20081231184943

                          そういうのはバッドノウハウとは言わないの?(「本来想定されていない使い方をするために、工夫してできるようにしちゃうノウハウ」を指してバッドノウハウと言うんだと思ってたか...

                          • http://anond.hatelabo.jp/20081231190326

                            そういうのはバッドノウハウとは言わないの? 関数ポインタをバッドノウハウとは言わないでしょ。C言語自体がバッドノウハウと言うなら、当たりだけど:) 手続きという抽象はまこと...

                            • http://anond.hatelabo.jp/20081231191611

                              関数ポインタで、例示された5つを実現するのはバッドノウハウじゃないの? 「関数ポインタを使ってプログラミングしましょう」というプログラミングスタイルは、正統派ではないと...

        • http://anond.hatelabo.jp/20081230225149

          C/C++にいくつか思うこと (ちなみに、プログラマ始めたのはCができた頃でC++よりも私のプログラマ歴の方が長い) Cはポインタ というか、ポインタを使いこなすことで、チューニング...

          • http://anond.hatelabo.jp/20081231045122

            Cはプログラミング言語の速度の基準になるくらい速いよね。 でも、チューニングに行き着くのは最後の最後じゃないかなあ。問題の立て方、解き方が間違ってる(最適でない)事が多い...

            • http://anond.hatelabo.jp/20081231054019

              組み込みだとコンパイラの最適化以前にそのハード用のコンパイラ自体なかったりするからやはりCって事になるんじゃないかと。組み込みやるのが一握りって事もないはず。

              • http://anond.hatelabo.jp/20081231110651

                組み込みって言っても、最近は、ほとんど、マーベルかシグマテル、なくてもARM系の亜種、大手家電メーカーの独自チップとほとんど決まり切ってるから、さすがにコンパイラが無いって...

            • http://anond.hatelabo.jp/20081231054019

              チューニングは最初と最後にやる物だと思う。 最初にチューニングの方向性を決めて設計。 実装 必要な部分からチューニング という方法でないと、いざ、チューニングと思っても、設...

      • http://anond.hatelabo.jp/20081230060518

        いや、「プログラミング」という行為を学ぶのにポインタという概念は、隠せるほどのものでしかないのだから、Cは2番目でいいだろう。 ちなみにおいらはCから習った。だが、一学...

      • http://anond.hatelabo.jp/20081230060518

        少少梃子摺るけど、Cを最初に学ぶべきだと思う。ポインタを理解しないと他の言語でポインタを隠蔽している仕様を理解できない。 あたしはいつのまにかC#しかつかわなくなった...

        • http://anond.hatelabo.jp/20081230102719

          C言語におけるポインタの使い方って、ほとんどがメモリを直接弄るってものじゃない。今の言語で、あるアドレスに一定の値を加減算したアドレスを求めたり、そのアドレスの中の内...

      • http://anond.hatelabo.jp/20081230060518

        とはいえ、参照や配列を理解するのにポインタは必須ではない、というか別概念だよね。 Cでは参照や配列を扱うときにポインタという生の実装がむき出しになってしまうけど。 OCamlやSML...

      • http://anond.hatelabo.jp/20081230060518

        元増田だけども。 「プログラミング」の最初期は、 逐次実行 変数 分岐 繰り返し 入出力 を使って、思ったことを実現すること(問題→モデル化→実装→実行)を実現するだけで充...

    • anond:20081230040914

      あんま関係ないけど、 どうやって作るか?より、 何を作りたいか?から始めた方がいいんじゃないのかな PICとかの組み込みが楽しそう!とかなれば、 やっぱりC覚えたほうが何かとら...

      • http://anond.hatelabo.jp/20081231052120

        どうかなあ、C覚えるのは教養の幅も広がるし潰しも利くぜってのが発端だからなあ。 最もやりたいことに向いている言語を覚えたほうが早いってのはその通りだと思うんだけれども。定...