プログラミング超初心者ですが質問があります
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という対応はどうやって行われているんでしょうか?
つまり変数名とアドレスの紐づけがどう行われているのかを知りたいです
ポインタとかの話ではないです
詳しい方教えてください
例えば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
スタックは前から
ヒープは空いてるところ探す
基本データ型は大体宣言された順番で保持したメモリ領域を前から埋めてってるから最初に宣言された変数は位置を覚えずとも最初のだねってなってくれてる
メモリの位置と変数はそのまま直結してるからどう繋がってるかとなると最初からそうだという感じかもしれない
大体の場合は得た領域を前から詰めてるはず
だから文字列[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
なるほど…分かりやすいです
ありがとうございます
大まかに言うと「コンパイラが割り当てる」で正解
ざっくりな説明だけど、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
ほげぇぇ…ちょっと理解出来そうにないですね
アーキテクチャの違いによる命令セットの違いとかも調べれば出てくるんじゃないかな?
命令セット
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
なるほど参考になります
ありがとうございます
コンパイラとかアセンブラとかその辺も勉強したくなりますね
スタックの話も出てるから少しだけ
スタック領域ってのがあって、それは領域と言うくらいだから大きさを持つ
そんでその大きさはコンパイル時に指定するんだけど、普段は気にしないモノだし、いちいち指定しなくてもいいようにデフォルト値がコンパイラごとに設定されてる
例えば「スタック領域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
なかなか新鮮な話題だな
しかも勉強してるやつが結構有能な質問投げてるっていうのがもう
まとめたニュース
がしました