Linux徒然講座<NO.1>
みんながパソコン大王 |
総 合 | 目 録 | 趣意書 |
表題一覧表 |
NO | 表題 | 起稿 | 起稿日 |
LinuxNO.1 | |||
1 | 徒然に・・・ポインタと絶対アドレスの違い(C言語) | 磯津千由紀 | 11/03/08 |
NO.1 徒然に・・・ポインタと絶対アドレスの違い(C言語)<起稿 磯津千由紀>(11/03/08)
【磯津千由紀】 2011/03/08 (Tue) 10:24
<ポインタと絶対アドレスの違い(C言語)>
これを混同している人が非常に多いです。
バイト・アドレシング、1バイト=8ビット、1ショート・インテジャー=1バイト、1インテジャー=2バイト、1ロング・インテジャー=4バイトのマシンを仮定します。
絶対アドレスは、バイト単位ですから、1を加えると1増えて次のバイトを指します。
「ショート・インテジャーを指すポインタ」に1を加えると、次のバイトを指し、絶対アドレスと同等です。但し、アドレスではないので、「1増えた」とは言いません。
「インテジャーを指すポインタ」に1を加えると、次の2バイトを指します。絶対アドレスは2増えます。
「ロング・インテジャーを指すポインタ」に1を加えると、次の4バイトを指します。絶対アドレスは4増えます。
「『12バイトからなる構造体』を指すポインタ」に1を加えると、次の『12バイトからなる構造体』を指します。絶対アドレスは12増えます。
「a」がポインタだとすると、そのポインタが指してる中身は「*a」と表記します。「*a」の実体は、1バイトかもしれませんし2バイトかもしれませんし4バイトかもしれませんし12バイトかもしれません・・・ポインタ「a」がどんなオブジェクトを指しているかによって違うのです。
ポインタと絶対アドレスの違いの“さわり”をご理解いただけたでしょうか。
『ポインタ』はC言語入門の最初の関門でして、分かってみれば簡単ですが、此処で躓く人が凄く多いです。
尚、インテジャーが16ビットのマシンもあれば32ビットのマシンもあります。インテジャーはそのマシンで「最も自然な単位」なのです。実際には、同じマシンでも「Cコンパイラ」が違うと、違うことが有ります。勿論、インテジャーとロング・インテジャーが同じ長さのことも珍しくありません。
ソフトウェアを書くときには、インテジャーが16ビットでも32ビットでも更に長くても大丈夫なようにするのが、C言語流です。
「C言語は移植性が良い」と誤解されますが、そんなことはなく、「C言語流」で書かれたソフトウェアだけが移植性が良いのです。
明確な取り決めはないです(今はあるかもしれません)が、ショート・インテジャーは8ビット以上、インテジャーは16ビット以上、ロング・インテジャーは32ビット以上を前提として書かれてるソフトウェアが多いです。
尚、インテジャーがショート・インテジャーより短くはない、ロング・インテジャーがインテジャーより短くはない、とは決まっています。
C言語は、ハードウェアを直接操作したりする記述には向いてますが、ソース・コードを読んだときに誤りに気付きにくいので、一般のアプリケーション・ソフトウェアなどを書くには勧めません。
UNIXのアプリケーション・ソフトウェアの多くがC言語で書かれてるのは、当初はUNIX上で動く「高級言語」のコンパイラが無かったからと、UNIXカーネル(OS中核部)と作者が同じだったからに、過ぎません。
C言語は、エキスパートの手に掛かれば生産性が高いですが、アベレージ・プログラマが使うとデバグに手間取って「高級言語」より生産性が落ちますし出来上がったソフトウェアの品質も低くなりがちです。
一般のソフトウェアはPascalなどの「高級言語」で書きましょう。
高級言語の中でどれが優れてるかについては、敢えて、本稿では言及せずに置きます。但し、自分でその言語でプログラミングしたことがない人が言うことは、信用してはいけません。
C言語に限りませんが、30年ぐらい前に、かのP.J.プラウガー氏に会ったときに「良いプログラマを育成するにはどうしたら良いか」と片言の英語で聞いたら、即座に「良いプログラマの隣に座らせて置くことだ」と返ってきました。
本を見て独学で勉強する以外の方法がない人は多い(私もそうだった)ですが、出来れば良いプログラマに付いてください。
無理なら、次善の策は、「良いプログラム」を徹底的に読むことです。前述のP.J.プラウガー氏などが書かれたプログラム例を暗記するほど頭に叩き込みましょう。
こんな文章、喜ぶ人は居るのかしら。
兎に角、試しに1本、書いてみました。
【生理学的教えて君】 2011/03/08 (Tue) 22:17
うう、食い下がらねば。
しかし、これを投稿するのには勇気が要ります。自分の水準(背伸びも含めて。)を明かして、今後の照準をシフトして貰おうという物ですから。
打ち明けた話、メモリ中の機械語プログラムの態様についての知識を欠いています。「アドレシング」・「絶対アドレス」の方が、より遠く感じる難しい言葉です。
とにかく、コンピューターが制御に用いる「絶対アドレス」と呼ぶ、場所を示す数値があって、その単位が、バイトだったり、そうでなかったりするのですね。
それとは別に、インテジャーと言う、機械に最も自然な単位があって、これを単位として進めるポイント方式が合理的という事ですか。
その為にポインタという物がC言語にあり、ポイントを進める単位は、インテジャー始めショートとかロングとか指定できるが、それらの実際の長さは、機械毎に異なる物なのですね。
そういう実際の寸法を意識せずに翻訳プログラムに任せる様にすると、異なる規格のコンピュータにも良き様に、「絶対アドレス」に換算してくれるのでしょう。それが移植性を良くするのでしょうね。
しかし、ピンと来ないのが「絶対アドレス」です。対照となるのは「相対アドレス」なのだと思い、C言語のポインタは、「相対アドレス」表現の道具になるのだと思いますが、より機械寄りの低級方面を知らない身には、それであれば、「絶対アドレス」の方は意識の外に追いやって、ない物と考えた方が楽です。
そもそも、ここで勝手に持ち出した絶対・相対の想像は当たっていますか。全体、自分の理解が正しいかおかしいかを判定していただく為に、無理に別表現をしてみました。どんな物でしょうか。
C言語にあるポインタは、場所(アドレス)を指すのに使えるという事が分かったのですが、「絶対アドレス」と違うぞと強調された理由の方が分かっていないのです。
これはつまり、磯津さんがこの文章を書かれた事情を全く理解していないという事でないですか。
さて、蛮勇を奮って投稿しちゃいましょう。絶句されないと良いのですが。
【磯津千由紀】 2011/03/09 (Wed) 00:25
生理学的教えて君様、こんばんは。
「絶対アドレス」の概念は、コンピュータ・アーキテクチャの基礎の基礎ですので、しっかり覚える必要があります。
単に「アドレス」と言ったらそれは殆んどが「絶対アドレス」のことです。
「相対アドレス」は、プログラムが喰うメモリー量を小さくしたり、プログラムの一部分を任意の「絶対アドレス」の場所に置けるようにするために使うものですが、勉強が進んでから覚えることにして、当初は忘れてください。
流石に「アドレス」の説明を始めると夜が明けてしまうので、コンピュータ入門書に譲ります。
尚、本稿は、「アドレス」がバイト単位であるマシンだけを仮定しています。(そうでないマシンも多々ありますが、今からC言語を学ぶには、その存在を覚える必要はないでしょう)
「インテジャー」などは、どの言語にもある「データ型」のうちの一つです。
これもコンピュータ入門書に譲ります。
C言語特有の概念が「ポインタ」でありまして、これが「アドレス」とどう違うのかが、本稿の趣旨であります。
本稿をご理解頂くためには、「アドレス」や「データ型」などの基礎知識を、済みませんが別途勉強して頂く必要があります。
【磯津千由紀】 2011/03/09 (Wed) 00:46
本稿の記述は、C言語のプログラムを書いたり読んだりする際には必須のものですが、UNIX系OSを単なるユーザとして使う際には必要の無いものです。
何故本稿を書いたかというと、コンピュータ・アーキテクチャの基礎知識はあるがC言語をご存じない人に、UNIX内部の説明をするための前振りです。(UNIX内部の何を次に書くかは白紙ですが、何を書くにしても避けて通れないのがC言語のポインタなのです)
従って、今後は、更に難しくなっていく予定でした。
試しに1本、書いてみた次第ですが、UNIX内部の話を書いても、面白がる読者がいらっしゃらないなら、書くのをやめます。
皆様、読みたいか不要か、レスください。
【ゴロツキ】 2011/03/09 (Wed) 01:38
皆様、お久し振りです。
難しい話はわかりませんが、興味があります。
シバケンさんが『徒然講座』と銘々で、枠を設けられました。
シバケン風の表現で、委細構わず講義をされる感覚でお願いします。
【磯津千由紀】 2011/03/09 (Wed) 07:34
ゴロツキ様、初めまして、おはようございます。
激励、ありがとうございます。
他の方の御意見もお待ちしております。
【シバケン】 2011/03/09 (Wed) 07:47
磯津千由紀さん
<生理学的教えて君>さん
ゴロツキさん
起稿、投稿を有り難う御座います。
で、
>面白がる読者がいらっしゃらないなら、書くのをやめます。
皆様、読みたいか不要か、レスください。
この設問に対するの返答は難しいです。
その上で、
私も、ゴロツキさんと同じ感覚です。どんな内容かと、興味津々です。
で、私自身も、真正、真正直に難しい事は分かりませんです。
でで、
閲覧の皆様のレベルは千差万別でして。
高度な内容を理解される方、されない方。
当然にして、話を噛み砕いた優しい内容の方が有り難いですが。
識者には、つまらんやろなあと。
よって、
私の立場からは、起稿者、投稿者は難度を考慮する必要性は無く、出来れば、難しい事を平易に表現し、より広範囲に分かって戴けるようにして戴けたらと。
しか、云いよが無いです。
そもそもが、誰様にも、同じに理解して戴ける文言は不可能です。
言葉を続ければ、これをキッカケに、勉強をと、考える方が出現すれば、コレ又、素晴らしい事です。
で、私の考えなら、ゴロツキさんが代弁して戴いてますが、そのままの、委細構わず、ご自由にと。
有り体には、掲示板ですので、高度な内容があったり、私の投稿のような、世間話的、どっちでも、ええよな話があって宜しいかと。
【costbuster】 2011/03/09 (Wed) 08:25
わたしは、フォートラン言語までで断念したものです。
ただフォートランのときは、文字の長さに制限があり、その後のC言語とかでは、その長さにそんなに制限がなくなったことと今回の内容が関係しているのかなーと勝手に想像していますが・・・
【磯津千由紀】 2011/03/09 (Wed) 08:51
シバケン様、おはようございます。
そなら、“ぼちぼちと”断片的にでも、書いてみようかと。週1回乃至月1回ぐらいのペースで。
そうですね、次回は「物理アドレスと論理アドレス(仮想記憶)」か「関数(サブルーチン)はコール・バイ・バリューでリカーシブ・コール可能(C言語)」辺りは、とっつき易いでしょうか。予定は未定ですが。
costbusterさん、おはようございます。
FORTRANの素養が有れば、理解に困難はないでしょう。
変数名の文字数制限は、関係ないと思います。
LISPやPascalを得意とする人は長ったらしい変数名を付けるのが好きですが、「C言語流」ではごく短い変数名を使うのが普通でした。
最近は、アルゴリズムの説明にC言語をPascal様に使う方もいらっしゃるようですけど。
それよりも、77以降のFORTRANの様にフリーフォーマットで、自由に字下げ出来る利点の方が、プログラムの読み易さ(作者自身にとっても)に、貢献してると思います。
記憶で書いているので、細部に誤りも多かろうと思います。
お気づきの方、ご指摘ください。
【生理学的教えて君】 2011/03/09 (Wed) 13:22
ううっ、困った。ウィキペディアに「絶対アドレス」の項がない。
私の子供に、単に「アドレス」と言ったら、メールアドレスの事です。その交友範囲の比較的ましなところに、「絶対アドレス」と聞かせたら、IPアドレスかMACアドレスの話と思うでしょう。
80年代の事ですが、私はコンプレックスに堪えかねて、「8ビットマイコンでボードコンピューターを作って動かしてみよう」という様な本に、書店で手を掛けました。「絶対アドレス」は、あの世界の言葉でしょう。私の同級生では、私が乗り損なった、「BASICでは遅いので、アセンブラプログラムを始めた。」と言った連中なら、それと分かるのでしょう。
しかし、同世代人では、工学部の教授であろうと、例えば化学工学科などでは見込めない気がします。また、私より若い世代で、専門学校でプログラマー養成を受けた人達でも、どうでしょうか。あの様な青少年向けの本であっても、一体誰が手に取ったでしょう。
パソコンのソフトが、ユーザーフレンドリーに発展して、表計算やスライドのソフトで日々パソコンを活用している、自信満々のパソコンユーザーでも、恐らくは駄目でしょう。
誤解しないでください。磯津さんに「基礎の基礎」から語ってくださいと言うのではないのです。
ただ、大学のコンピューター関連学科やコンピューターメーカーの社内教育に縁のなかった者には、その基礎の方が、何より遠いのです。
「コンピューターアーキテクチャー」という言葉は、「宇宙真理」・「自然原理」・「基本法則」という様な語と同等な、具体性を感じ難い物なのです。
「そんな奴には、話してやる事などない!」と、やめられては困るので、教えて君個人は、全てを分かった振りしてでも付いて行きます。
しかし、「面白がる読者がいらっしゃらないなら、書くのをやめます。」となると、教えて君は、別の事を言わねばなりません。
基礎の基礎に属する語であっても、全く日常的でない言葉については、それがどんな物であるかを思い違って見当外れの方に行かないように、助けてください。
インターネット利用者の大半が携帯電話です。安く買える様になったのにパソコンを買わないのも普通です。
「シバケンの天国」の閲覧者は、余程優秀です。まして、磯津さんのコンピューター講義に耳を傾ける意欲的な人々は、かなりの特別製です。しかし、それであっても、大抵は「基礎の基礎」がありません。
ただ、そういう者は、努力もします。先に備えている事が前提として不可欠では、お腹に戻って生い立ちからやり直しですが、今からでも追い付く事であれば。
ですから、基礎の基礎を欠く者に足掛かりを与えるご配慮だけいただきたいのです。
尤も、磯津さんが、今現在の読者の全てが条件を満たさねば語る気が起きないというお考えでなく、とにかくお続けいただければ、当然に、好ましい生徒が集まり出すでしょう。そうすれば、磯津さんとオフラインで、必要な具体的基礎知識の普及が始まるはずです。それで皆が、物分かりが良くなれます。
【生理学的教えて君】 2011/03/09 (Wed) 19:34
皆様、危機回避、有り難うございました。
後の文章は、教えて君が今朝に書いた物です。絶望感に胸が潰れて半泣きです。教えて君が嫌になった、教えて君の本音の教えて君です。
生理学的教えて君は、故障しました。今は全く危機に耐えず、正常動作を回復するのには、日数を要します。
教えて君は、しばらく機能しません。磯津さんの話に興味津々でありながら、それを表明せずにいる方達、出番です。交代をお願いします。
うわーん、もう駄目。
ゴロツキさん、有り難う。
教えて君は、基本的に、自分が教われれば良いの。でも、磯津さんは、お前に個人教授するだけの為の作文なんかできない、詰まらんと言うの。教えて君、それ解るの。すっごくよく解るの。そんなの当ったり前じゃない。
いくら図々しくしようとしても限界。磯津さん、教えて君には引き止められない。誰か助けて。
教えて君は、ひとりになって泣くの。そのまま眠っちゃう。目が覚めた時、世界がバラ色だといいなあ。
【シバケン】 2011/03/09 (Wed) 20:55
<理学的教えて君>さん
>教えて君は、基本的に、自分が教われれば良いの。
この件ですが、皆様、誰もが同じです。自分が教われば、結構でして。
>でも、磯津さんは、お前に個人教授するだけの為の作文なんかできない、詰まらんと言うの。
更には、この件は、磯津千由紀さんの当然の発想でして。
理由は簡単でして。
<生理学的教えて君>さんが承知されてるのレベルは第三者には、分かりませんです。
よって、ゴロツキさんが、お見事、代弁して戴いてますが、私からは、委細構わずとなりまして。
只、磯津千由紀さんは、どのレベルで作文すれば良いのかを、迷っておられる筈でもありまして。
又、折角の作文するからには、理解して欲しいは当然でして。
で、私が何を云いたいかとなればの、<生理学的教えて君>さんのレベルは私よりも、数段の上です。
更には、磯津千由紀さんは、<生理学的教えて君>さんが、思われている程には、水臭くはありませんです。
何故、私がそんな具合に判断してるかは、簡単には、<猫の話>からです。
<参考=NO.11 猫対策、どうしてらっしゃいますか?>
オッとの、猫と、人間様であるの、<生理学的教えて君>さんを同一視はしておりませんです。
そんな次第で、作文なるは、一人でも多くの方に理解して戴く事が目的でして。
ならばの、ご遠慮無く、<教えて君>の本領発揮の、教えて頂戴と、ホカの面々の事は、無関係に、正々堂々の、具体的に質問されれば結構かと。
【磯津千由紀】 2011/03/10 (Thu) 01:02
皆様、こんばんは。
だいぶ物議を醸してしまったようで、お詫び申し上げます。
シバケン様の仰るように、想定読者レベルを何処に置くか、悩んでおります。ただ、世間にはUNIXエキスパートが沢山いらっしゃいますので、真正面から進めても意味が有りませんから、「こぼれ話」を思い出そうと努力中です。
さて、どなたか、独学向きのコンピュータ・アーキテクチャ入門書をご存じありませんか。
入門講義は、黒板の前でやれと言われればすんなり出来ますが、文章だけで伝えようとすると本を1冊書くのと同じ労力が要り、とてもじゃないですが手に余るのですよ。
【costbuster】 2011/03/10 (Thu) 07:25
本年2月に市立図書館に寄った際に、この投稿を予感していたのか(?)
図解雑学 PCアーキテクチャ 245p(ナツメ社刊)を借り受けました。まだ読みはじめですが、・・・
<参考=「図解雑学 PCアーキテクチャ (図解雑学シリーズ) [単行本]」(Amazon)>
応援しておりますので、書き進めてください。
【生理学的教えて君】 2011/03/11 (Fri) 13:00
教えて君は、教えて君なの。自分では、なーんにも努力しないで、ひたすら教えてって言うの。
その代わり、知りたい事を教えてくれる人は尊敬しちゃう。背伸びするし、素直にも、忠実にも、従順にもなる。卑屈だっていいの。
でも、今は壊れてる。そういう事できないの。教えて君なりの努力もできないの。
UNIXの事一から十まで分かってて概観できる磯津さんに、早分かりをお願いしたかったの。でも、磯津さん、そんなタイプじゃない。向かない事お願いしたら、磯津さんの方が壊れちゃう。
磯津さん苦しめて、ごめんなさい。教えて君は、もういいの。
思い出しちゃった。本屋の工学書コーナーに行くと、きっと、「電子計算機理論」とか、「オペレーティングシステム概論」とか、「概説UNIX」とかいうのがあるんだと思う。そういうの自力で読破できていたら、今の私、教えて君やってない。きっとLINUXの誕生に間に合っていたと思うの。それでLINUXの日本上陸を迎えたと思うの。
だから、大上段のUNIX諦めたの。残念だけど諦めるの。悲しくなって、もう教えて君できなくなったの。
でも、LINUXパッケージのディスク入手して、性能が不足か知れないの構わずにインストールして、起動してみるくらいの事、教えて君にもできる。ちゃんと動いてくれないの、教えて君だって興味ないの。
2008とかecoでなくて、Fedora13の話してよ。Fedora14も、あるのね。どんなパソコンだとスイスイ動くのかなあ。
工夫で、よく動かせる様になりたくて、UNIXを知りたかったんだ。教えて君、それも思い出したの。
もう諦めついて泣き止んだの。でも、また寝ちゃう。いい夢を見よっと。
【磯津千由紀】 2011/03/12 (Sat) 01:42
costbuster様、こんばんは。
ご提示いただいた文献、内容確認のために注文しておりましたが、アマゾン日本より「地震のために遅れる」との連絡が御座いました。
従いまして、該文献をお勧めするか否かのコメントが、遅れます。
【磯津千由紀】 2011/03/12 (Sat) 02:45
<副題=勉強するということ>
生理学的教えて君様、こんばんは。
個人的独白と考えてレスせずにおりましたが、気が変わり、少しコメントします。
義務教育等では「答えが有ると分かっている問題」を解かせますが、実際の社会で出会う「問題」はそうではありません。
自分で解法を見付け出さねばならないのです。
私は、答えを見付け出すお手伝いは致しますが、問題を解くのは、あくまであなた自身です。
人にはそれぞれ得意分野(専門分野)が有ります。
全ての分野で自分一人で答えを見付けだすことは困難です。
どの投稿に書いたか忘れましたが、例えば、お百姓さんは農業のエキスパート、医師は医療のエキスパート。私はどちらも、自分では解決できず、エキスパートに任せます。私は、電子機器と写真に関してのみ、エキスパートであるにすぎません。
自分の専門分野以外では、知識が乏しくて当然です。
自分の専門以外は、専門家に任せるか、「趣味の範囲」で断片的に(系統的でなく)知識を拾って行けば良いのですし、全貌を理解しようと努力する必要もありません。
悲観的にならず、趣味の範囲で覚えれば良いのではないでしょうか。
【生理学的教えて君】 2011/03/12 (Sat) 14:37
教えて君、違うの。教えて君、本当は、何でも自分でしたいの。それできる様になりたくて、教えて君やってたの。
教えて君に代わって、教えて君のパソコンの面倒を見てくれる専門家はいないの。教えて君の食べたい物を作って届けてくれるお友達のお百姓さんもいないの。いつでも教えて君の大切な人達の事を考えてくれるお医者さんもいないの。
でも、教えて君の場合、昔はいた事もあったんだ。いないのが当たり前でもないの。みんなはいると思っているけれど、本当に必要な時に助けになる事なんて、普通はないの。教えて君それ知ってるの。もう、教えて君には教えて君だけなの。
ねえ、磯津さんに分かる。教えて君、柿好きなの。おいしい柿、貰ったの。教えて君、お猿さんじゃないの。柿の種蒔いたの。なったの。小さいのが2つ。渋柿。教えて君それ干し柿にしたの。おいしかったの。あんなの、どこにも売ってない。甘柿の種から育てたの。同じ物なんか、きっとない。ねえ、磯津さん分かる。
教えて君、自分でできる事したいの。どうしてもできない事、諦めるの。教えて君それだったら諦められるの。本当に教えて君に代わって何かしてくれる人っていないの。もう、いないの。
できるだけの事って、望めないの。でも教えて君それ欲しい。大した事より納得できるのがいい。賭け事嫌いなの。殺されても文句言いませんて宣誓しないと面倒見ない医者も嫌なの。その人、教えて君の味方じゃない。
自分のカメラに写真屋でフィルム入れて貰ってた人達とは教えて君は違う。でも、最初は教えて君そうだったの。でも最初だけなの。本当だから。
【磯津千由紀】 2011/03/31 (Thu) 21:59
<副題=「図解雑学 PCアーキテクチャ」>
こんばんは。
震災のために遅れていた首記の本が、今日、やっと届きました。
パソコンの中身はどうなってるのか勉強するには良い本です。
黎明期からのパソコンの歴史を知るのにも良い本です。
但し、9年前の本ですが。
でもって、コンピュータの基本(CPUの動き)を知るには、役立ちません。
「コンピュータ・アーキテクチャ」入門書か、適当なアセンブリ言語プログラミング入門書を、読まれる必要があると思います。
【Plamo方面名倉 at Windows 8.1】 2018/06/03 (Sun) 13:10
このあたりにぶらさげさせてもらって
<参考=「世の中にはプログラミングを理解できない人間が存在する」(本の虫)>
自分も似た経験あるなあ。