2019年11月20日

プログラミング超初心者ですが質問があります

1 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:03:13.728 ID:veU4FteO0
例えばC言語で
int x = 100;
とするとメモリのある領域(仮にアドレスをxxxxとする)にint型サイズの4バイト分確保されて100という情報が一時的に保存されますよね
続いてx = 200と代入すると
アドレスxxxxに確保されている4バイト分の領域で保存されていた100という情報が200という情報に書き換わりますよね
ここで質問なのですがx = 200と代入した時に変数x→アドレスxxxxという対応はどうやって行われているんでしょうか?
つまり変数名とアドレスの紐づけがどう行われているのかを知りたいです
ポインタとかの話ではないです
詳しい方教えてください








おすすめ
韓国、ついに気が狂う「こうなったら、核武装しかない」

つるの剛士:桜を見る会追及はくだらない 原口:公金.行事の私物化.公選法違反をくだらないとは何だ!

「知らない番号から着信があったら、その電話番号をググります。」 友達ドン引き。

ナイナイ岡村、中居と絶交していた




4 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:07:11.861 ID:nNLMvCu10
コンパイラがアドレス割り当てるんやで


5 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:07:43.963 ID:aD0PsRBG0
コンパイラが頑張ってる


6 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:08:25.511 ID:oqf4zFY00
どういう意味かわからんがコンパイルしたら変数名なんてなくなる


7 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:08:32.779 ID:/8KLzi5E0
コンパイルってぷよぷよ作ってる会社があってだな


8 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:10:05.418 ID:gEAvtoWK0
トランスレーターさんが


9 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:12:15.167 ID:jD0Wwr6X0
メモリは実行時に割り当てられるのにどうやってコンパイラが頑張るんだよ


10 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:12:17.213 ID:veU4FteO0
あーなるほど
コンパイラに関して全く知識が無いのでイメージですけどコンパイル後は
int x = 100;
x = 200;

アドレスxxxx = 100;
アドレスxxxx = 200;
みたいな感じになって変数名↔アドレスのようなステップが消えるということでしょうか?



11 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:13:13.212 ID:kpvaY4oJ0
基本データ型は大体宣言された順番で保持したメモリ領域を前から埋めてってるから最初に宣言された変数は位置を覚えずとも最初のだねってなってくれてる
メモリの位置と変数はそのまま直結してるからどう繋がってるかとなると最初からそうだという感じかもしれない
大体の場合は得た領域を前から詰めてるはず
だから文字列[3]と文字列[3]の領域を同時に入手して
'1'、'2'、'3'と'4'、'5'、'\0'にしたらぶち抜いて読み込んで並ぶ…はず保証はしない



16 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:20:56.613 ID:veU4FteO0
>>11
基本データ型は前から埋めてくんですか
ランダムに確保するイメージでした



17 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:25:01.496 ID:jD0Wwr6X0
>>16
スタックは前から
ヒープは空いてるところ探す



12 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:16:25.684 ID:lGyCOnbX0
コンパイルしてイメージして関数がアレしたらいいよ


13 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:17:23.944 ID:4kmDe/uq0
大まかに言うと「コンパイラが割り当てる」で正解
ざっくりな説明だけど、C言語で書かれたプログラムをコンパイルしてリンクすると(最近はこの2つで「コンパイルして実行ファイルを作る」とか言う)
1.プログラムの部分←アルゴリズムの部分
2.固定データの部分←定数の部分
3.変数の部分←そのまんま
の3つの機械語になると考えればいい
そんでOSがそれを実行するときに、「メモリのここの領域が空いてるからそこにロードするわ」ってやるんだけど、この時点で実際のアドレスが決定される
それまでは、プログラムは「100番地から始まる4バイトのエリアが変数xな」って理解しかしていないけど
ローダーが割り当てるときに「変数部分の開始アドレスは50000番地な」って設定して
実際に動作するときは「変数部分に割り当てられたアドレス+100番地から始まる4バイトが変数x」→「50100番地から4バイトが変数x」って変換されてる
実際にはもっと細かいことやってるんだけど、基本こんな理解で大丈夫



14 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:19:11.666 ID:4kmDe/uq0
なんか3.の部分が機械語になる、ってのも変な表現だな
まぁ深く考えるな



16 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:20:56.613 ID:veU4FteO0
>>13
なるほど…分かりやすいです
ありがとうございます



15 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:19:23.983 ID:oqf4zFY00
スタックとか調べればいんじゃね


18 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:25:24.819 ID:86/ZI0Ms0
アーキテクチャと命令セットで調べてみれば?
たとえば


https://ja.wikipedia.org/wiki/MIPSアーキテクチャ


MIPSの命令セットとか載ってるからしらべてみれば?


それかディスアセンブルすればわかる(´・ω・`)



19 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:26:08.874 ID:oqf4zFY00
cで基本データ型言うの初めて聞いたな
構造体でも宣言順にメモリに積まれるけどな



20 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:28:41.566 ID:86/ZI0Ms0
アーキテクチャの違いによる命令セットの違いとかも調べれば出てくるんじゃないかな?

命令セット


https://ja.wikipedia.org/wiki/命令セット



こういうとこ見てみて!(´・ω・`)



26 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:59:17.045 ID:veU4FteO0
>>20
ほげぇぇ…ちょっと理解出来そうにないですね



21 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:33:11.590 ID:86/ZI0Ms0
アーキテクチャによって命令サイクル数とかパイプラインの段数とかも違って
色々違う(´・ω・`)



22 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:34:59.554 ID:4kmDe/uq0
スタックの話も出てるから少しだけ

スタック領域ってのがあって、それは領域と言うくらいだから大きさを持つ
そんでその大きさはコンパイル時に指定するんだけど、普段は気にしないモノだし、いちいち指定しなくてもいいようにデフォルト値がコンパイラごとに設定されてる

例えば「スタック領域1000バイト」とか指定したら、1000バイトを大きいアドレスから消費していく
32ビットコンパイラだったとして
void main() {
int x,y,z;
とあれば、
0番地から4バイトが変数x
4番地から4バイトが変数y
8番地から4バイトが変数z
みたいな感じ
そんでメイン関数からいろいろ関数呼ぶじゃん
そしたらどんどんローカル変数を割り当てていく
(もしも再帰関数なんかを呼び出したりしてると、変数は次第に増えていくよね)
そのうち使ってる変数の全体の大きさが1000バイトに近づくと、しまいにゃ999番地から1バイトが変数chとかになったとする
したら、次の変数を確保しようとすると、用意してあった1000バイト分使い果たしてるかもう確保できない
するとOSが「今の実行してるプログラムは1000バイトじゃ変数領域足りませんでしたー!」って言ってくる
これが「スタックオーバーフロー」

って長いななんかすまん



23 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:40:51.715 ID:4kmDe/uq0
あれ
なんかおかしいな
1000バイトから大きいアドレスをってなにこれ
「ローダーが指定した変数用のアドレスから順番に消費していく」だな

C言語をコンパイルしたときに生成されるアセンブリのソースを見ると、ここら辺がしっかり理解できるよ



26 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:59:17.045 ID:veU4FteO0
>>22
なるほど参考になります
ありがとうございます
コンパイラとかアセンブラとかその辺も勉強したくなりますね



25 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 05:55:56.142 ID:9TlCs2mS0
勉強なるなあ


27 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 06:09:05.998 ID:5k7bSCSUd
初心でcかいぶし銀なチョイスだな。現代流のオブジェクト指向ないのが難点だがlinux使いだしたらその知識はマジマッチョす
しかしこんなの気にするやつも稀よなw
pythonの型なきvar扱い見ても当然のことと思い何も思わないやつも多い
車輪の再発明し続けるのもあれだが車輪の観察欠かさないやつの方がいいprogrammerになれるかもしれんなw(´・ω・`)



28 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 06:35:16.511 ID:Dk9MctU60
最近はPythonが流行ってるけど、流行に乗るより、プログラムがなぜ動くのかという基本を押さえないと
上っ面を追っかけてるだけで終わってしまう。
それよりもCのように汎用性があるけどメモリまでいじくる言語をじっくり勉強した方が後でつぶしが効くよ



29 : 以下、5ちゃんねるからVIPがお送りします :2019/09/08(日) 06:56:39.686 ID:ELbmJcoF0
まあ、ものすごく大雑把に言うと、
単に全部の変数を含んだ巨大な構造体のメンバーアクセスと同じコードが書かれるだけよな
気になるAmazonの本

雑談│10:40

 コメント一覧 (19)

    • 1. 名無しさん@まとめたニュース
    • 2019年11月20日 10:57
    • 未経験者が初めて勉強するのにCってのも
      なかなか新鮮な話題だな
      しかも勉強してるやつが結構有能な質問投げてるっていうのがもう
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 2. 名無しさん@まとめたニュース
    • 2019年11月20日 11:09
    • 勉強するってのが何か嫌なんだよなぁ。
      作りたいものがあってそれに適した言語を選択するっていうのがしっくりくる。
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
      • 7. 名無しさん@まとめたニュース
      • 2019年11月20日 11:27
      • >>2
        基礎知識がなかったら適した言語の選択すらままならないだろ
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
      • 10. 名無しさん@まとめたニュース
      • 2019年11月20日 11:57
      • >>2
        適した言語とやらの実態は人気のフレームワークがあるというだけ
        勉強しないから言語なんてなんでもいいというレベルまでたどり着かないんだよ
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
    • 3. 名無しさん@まとめたニュース
    • 2019年11月20日 11:16
    • まずグローバルなのかローカルなのかそっからじゃね
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 4. 名無しさん@まとめたニュース
    • 2019年11月20日 11:17
    • 今どきこんな低レベルな話を勉強するなんて真面目な子だな
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 5. 名無しさん@まとめたニュース
    • 2019年11月20日 11:18
    • コンパイラやファームウェアを作る人も必要ですからね
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 6. 名無しさん@まとめたニュース
    • 2019年11月20日 11:27
    • 老人の質問にありがちな、そんなモノ知るかっ!どうでもいいわ
      って類の質問だねw
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 8. 名無しさん@まとめたニュース
    • 2019年11月20日 11:34
    • もう少し掘り下げないと、変数のスコープが理解できんだろうなあ。たぶんイッチはそこでまた引っ掛かる。
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 9. 名無しさん@まとめたニュース
    • 2019年11月20日 11:50
    • こういうことを気にする人はオブジェクト指向には来ないでくださいお願いします
      C/C++言語が得意な人が来るとめちゃくちゃになりますので
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
      • 11. 名無しさん@まとめたニュース
      • 2019年11月20日 12:00
      • >>9
        これがパラダイムの話だと思える人は業界に来ないでくださいお願いします
        めちゃくちゃになりますので
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
      • 15. 名無しさん@まとめたニュース
      • 2019年11月20日 12:40
      • >>9
        オブジェクト指向好きな人って宗教とか好きそうだよね
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
    • 12. 名無しさん@まとめたニュース
    • 2019年11月20日 12:10
    • 【例】
       
      int hoge(int a, char b, long c)
      {
       a = 1;
       b = 2;
       c = 3;
       return 4;
      }
       
      これをアセンブリ言語へ変換すると
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
      • 13. 名無しさん@まとめたニュース
      • 2019年11月20日 12:12
      • >>12 続き
         
        public _hoge
        _hoge proc near
         push bp ; スタックフレームの作成
         mov bp,sp ; 同上
         mov ax,0
         call __stack_chk ; スタックチェック
        a$ equ [bp+4] ; aのアドレス
        b$ equ [bp+6] ; bのアドレス
        c$ equ [bp+8] ; cのアドレス
         mov word ptr [a$],1h ; a=1
         mov byte ptr [b$],2h ; b=2
         mov word ptr [c$],3h ; c=3
         mov word ptr [c$+2],0h ; cの上位ワードをクリア
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
      • 14. 名無しさん@まとめたニュース
      • 2019年11月20日 12:13
      • >>13 続き
         
         mov ax,4h ; 戻り値の設定
         mov sp,bp ; スタックフレームの復元
         pop bp ; 同上
         ret ; 復帰
        _hoge endp
         
        となる。
         
        (終わり)
      • 0
        まとめたニュース

        まとめたニュース

        likedしました

        liked
    • 16. 名無しさん@まとめたニュース
    • 2019年11月20日 12:56
    • よほど古い本でも参考にしたのかな。今時アドレスを意識して作らせるなんてあるか?
      それともより低レベルなハードよりなプログラミングをしたいんだろうか。
      そこいらの概念を知りたいならCよりもCASLを勉強した方が分かりやすいかもね。
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 17. 名無しさん@まとめたニュース
    • 2019年11月20日 13:03
    • CASLはOS/360系のアセンブリ言語を目茶苦茶簡略化したようなもんだから、インテル系を勉強するのにはむいていない。
      C言語で簡単なプログラムを書いて、コンパイルオプションでアセンブリ言語を出して比較するのが一番だ。
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 18. 名無しさん@まとめたニュース
    • 2019年11月20日 13:03
    • より低級な言語で理解してないと仕組みがわからないんだよ
      この質問はアホだけど
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked
    • 19. 名無しさん@まとめたニュース
    • 2019年11月20日 13:52
    • ※18
      こう言う仕組みを学ぶのに、C言語はいいものだよ
      C言語より低級な言語は、ハード寄りすぎて応用が効かないし。

      たぶん、動的に確保するメモリのプログラムを見てこういう質問に至ったんじゃないかな。
      だからコンパイラがどうこうというよりは、やっぱりポインタの話をすべきだったんじゃ。
      まぁでもこの質問者の子、わからないところをmallocの実装とか見て
      自分で学び出したらたぶん化けると思うよ。
    • 0
      まとめたニュース

      まとめたニュース

      likedしました

      liked


コメントフォーム
記事の評価
  • リセット
  • リセット

コメントを投稿してくれる方へ
いくつかのエロい単語やURL等は使えません。
下記の投稿は無断で削除する場合があります。予めご了承ください。
・荒らし行為(宣伝行為含む)
・犯罪的なコメント
・差別的なコメント
・過激な下ネタ

他ブログのネタ満載 アンテナページへ


スポンサードリンク
記事検索
月別アーカイブ
QRコード
QRコード
読者登録
LINE読者登録QRコード
スポンサードリンク