Xcode(5回目) [Xcode]

OpenGLに進む前に、C言語のおさらいではないのですが、コンパイラーが読み込む記号の意味に付いてあれこれ。
よく市販本には、->, sizeof, =, <<, >>, >, >=, <, <=, !=, /, *, \, -, +, ==, ^, //, #, $, %, &, ' ,#, @, ¥, &&, ||, (), <>, ?:, **, --, ++, { }, [ ], ,;,: ,., _, ~, +=, -=, *=, /=, %=, >>=, <<=, &=, |=, ~=とかあります。これには優先順位(priority)が有り、( )は省略できる事になっています。ざっと上げただけですが、使い方は結構有ります。
また、どういった位置で使うかに依って意味合いも違って来ます。私は専門に習った訳でもなく、MachintoshのGUIに引かれるまま(何故絵が出て来るんだ?)、学んでいます。数学の分野で言えば難しいものなどなく、小学校で習う足し算、引き算、掛け算、割り算、余りの世界です。それ以上の機能は有りません。なので、教えよう、学ぼうと思えば、小学生、小学校から学んでも可笑しくはないのです。
しかし、記号論から見れば立場は一転します。10/2=5これは割り算です。10%3=1これは余りです。//計算のプログラムです 
int x, y, ans;
 x=10,y=3; ans=x%y;
NSLog(@"%d", ans);
 Foundationコマンドラインツールのinsert hereにこの部分を挿入すれば、コンソールに答えが表示されます。しかしよく見て下さい。この式の中には/,%は別の所にも使われています。つまり使い方によって化けるのです。普通の人であれば、//以下この1行はコメントと覚えるでしょう。
また、/* コメント */も同様です。これなんかは最たる物です。割り算をして掛け算をして文字を読み込み、掛け算をして割り算をして終わりです。と読めない事もないはずです。では何故コンパイラーは計算しないのでしょうか。又は読み飛ばす事が出来るのでしょうか。誰か巧い回答が出来る人がいるでしょうか。
実はこの疑問こそが、言語を拡張できる概念だと思っています。科学万能時代の落とし穴にも似たような疑問を投げかけた事が有るのですが、記憶や計算は機械に任せて、人間は創意の方に力を割かなければなりません。人間が暗記に頼って覚えたところで、所詮限界があります。次の日のテストに出る答えを丸暗記してテストで100点取ったって、何の役にも立ちません。
そこで、解決するのに良い例がありますのでUnixの電卓であるbcを引用します。
ターミナルからbcと打ち、エンターで電卓プログラムを起動します。このプログラムは物理計算も何のその出来ます。例えば放物線の方程式、x=x1 + v1*t + 0.5*g*t^2と言う方程式に値を代入して行きます。
x1=5 enter 以下enterを省略
v1=3
t=2
g=9.8
x=x1+v1*t+0.5*g*t^2
x
30.6
と出て来ます。これを卓上の電卓でやると結構ややっこやしいのではないでしょうか。話が逸れましたが、プロセスとしての最初のbcは計算をしていると思いたいところですが、残念ながら最初のbcは計算などしていません。只読んでいるだけです。答えが30.6とでたところで、Ctrl+Zを押してプロセスを確認してみましょう。psコマンドで確認すると、bcが2つに増えているのが分かります。つまり2番目のbcが計算をした事を意味しています。最初のbcはプリプロセッサーでありパーサーであり、次のbcがスタックを使って逆ポーランド記法で計算して、ユーザに戻すらしいのです。
この概念はWebサーバ迄拡張できるみたいですが、コンパイラーも同じ事です。逆ポーランド記法では、演算子の前後をスタックにプッシュしてからプラスならプラスしているのです。なので、* /は優先順位が上と言う表現も実は正確ではないようです。
では、//や<* *>はどうなのでしょうか。コンパイラーは前後に数値がないので計算できません。又続けて打つ事によって終止符の意味が有り後文を無視できます。では、/comment/n はどうでしょうか。やってみましょう。確かにcommentを計算しようとし、nで割ろうとしています。当然出来ないのでこれによるエラーが付属して来ます。
続けて打つ記号では、** が有ります。表現としては、ポインターのポインターでハンドラーと捉えられています。しかし考えようによっては、ポインターに何かを掛けるとも取れます。
又は、ポインターの終わりの位置とも言えないでしょうか。これをメモリー上でどういう状態かを想像するのは、私にとってまだ難し過ぎます。
まだ有ります。&&, ||, ==この3つは、且つ、または、等価で使われています。しかし、コンパイラーは人間のように考える訳ではありません。単体であれば&はポインターである変数のアドレス渡しです。または、(bitwise AND)で二進数で上位ビットが両辺1以上であれば1を帰します。色々な解釈が有りますよね。でも本質は一つです。&&は、こう考えると良いようです。最初の&は、左から右に繋げます。ところがどっこい、続けて&が有りますからこれで終わりと思いきや、&にはもう一つ取り得る値が有ります。今度は右から左に変数の値渡しです。つまり、両辺が成り立つ時(両辺が1の時)、真であり1の値を得ます。
| はどうでしょうか。|も続けて同時にと言えそうです。|=であれば、二進数で左と右の足し算です。
足し算なので、両辺のどちらか一つが1以上であれば1を返す事になります。何か変かな?
==はどうでしょうか。=であれば、右いから左への代入です。a +=bは次のaの値がa + bに成ります。
しかし==は、代入できません。最初の=が邪魔をして左に行けないのです。なので、左と右は値が等しいとした時に真であり、1か0しか返せません。
これらの3つは従ってif文の中でしか、使えません。と言うより他では見た事が有りません。
長くなったので一旦打ち切ります。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

Xcode(4回目)Xcode(6回目) ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。