ポインタってそんなに難しい?
まだ引っ張るか、というか波及した関連に対する雑感とか。
一言で言ってしまうとポインタってプログラム空間におけるアドレスの抽象化表現でしょ?
とかいってやっつけてしまう事はできないのかなぁ。(いや、無理なんですけどね)
そもそもポインタがない言語から始めた人たちは、
プログラムにアドレスが存在しているということが身近ではないためなのかもしれない、
と考える事もある。
odzさんが言われるように
「プログラムカウンタが分からないようなやつはプログラマになるな」っていわれると「いやそれ、本当に必要?」と思うわけです
初心者にCの話の続き - odz buffer
確かに、
JP nn ;PC ← nn
なんていう時代は終わった。
文字列を操作するだけで、ひたすらメモリ領域を気にしないといけないし、任意長のデータを扱おうとすると途端に面倒になる。
初心者にCの話の続き - odz buffer
と言われるとおり、
C言語ではその特性上、任意長及び可変長なデータ構造を実現する際のメモリ管理は頭が痛い。
さらにきむら(K)さんの言うとおり、
たとえばの話。 わたしが中坊の頃あたりの「マイコン入門」なんてのだと プログラミング入門といえばまあまずはBASICでした。 で、二つの整数を入力してその合計を出しましょうとか、 なんとかいうのが最初の方にあったりしたわけですね。
10 input "ヒトツメノカズ? ", kazu1
20 input "フタツメノカズ? ", kazu2
30 print "ゴウケイハ", kazu1+kazu2, "デス"
40 endなんてな(適当なものなので間違いはご容赦)。 んじゃあ同じことをCでやるとどうなるのよ? すると、悪名高い scanf だの getsだのがでてくるわけですよ。 さらにはCにはBASICでいうような「文字列」は存在しないので、
C言語はそれ自身で容易に「文字列」の複写もできなければ、
文字列の長さだって、ヌル文字を探して探査しなきゃいけないくらいだ。
またBASICのように単純にグラフィカルな操作を行うことすらできない。
まぁ、線分すら描けないからこそ「Bresenhamアルゴリズム」に到達したりすることもあるわけですが。(閑話休題)
しかしながら、いまどきそんなことをしなければ線分もかけないのかよ、というのは至極当然で、
できればご免被りたい代物であるのは確かで、
やっぱりC言語は面倒くさい言語なんだよなぁ……と。
かといってC++は学ぶのに適しないくらいgdgdな言語な訳で。(凄く良い言語だけどね、ある意味)
ここはやはりBASICに変わる何か、
セーフティなC(そう、まるでCycloneのような)でありながら、
パワフルなライブラリを備えている存在があれば良いのではとか。(学ぶ、という側面ではセーフティは意味ないかもですが)
まぁ、C言語は学習用言語ではなく実用言語なので、仕方がない訳なんですけども。
まさにpoorなCPUでもそれなりに動くコードをはけるコンパイラが実在したという実用的側面は無視できない。
その優位性は失われて久しいわけですが。(ある側面、例えばWebでは)
とはいえ、
JavaBlack氏の言う「C言語が理解できない人で,まともなJavaのプログラムを書ける人はあまりいないと思う」もまた真理だと思うんですよね。
あとC言語が理解できない人で,まともなJavaのプログラムを書ける人はあまりいないと思う.これは「Javaスクールの危険」で出ているポインタと再帰に必要な能力,
ポインタと再帰には、ある種の推論力、抽象的思考力、そして何よりも問題を同時に複数の抽象レベルで見るという能力が要求される。そしてポインタと再帰を理解できる能力は、優れたプログラマになるための能力と直接的に相関している。
が,Javaで必要とされるOOP技術やGoFの基礎となっているからだ.C言語を容易く理解し自在に使いこなす素質の無い人間には,Javaを使いこなすのはまず不可能だろう.
初心者向けの言語 - カレーなる辛口Javaな転職日記
僕自身すんごい優秀不断ですが。
学習用途のCのサブセットみたいなのがあればいいのかなあ。
ポインタとかアドレスとか捨て去る覚悟でRubyやPythonが担えばいい気もしますけど。
でも、次世代のプログラマがみんな「C言語……? なにそれ?」とか言い出したら悲しいなぁ。