952 :
774ワット発電中さん :2012/07/28(土) 14:45:10.94 ID:Bp19gHBm
いまだに、TLCS12Aで生産してる装置がある。
PL/M 懐かしいなあ。 4004 ってスタック3段とからしいのですぐにオーバーフローしそうだが… そもそもローカル変数とか使えるんか?
ローカル変数?何それ美味いの?って世界かと。
ローカル変数はCPU関係ないだろ
変態 CPU とか触ったことないでしょ。 4004 は、ハードウェアスタックで PC の退避専用だから、ローカル変数サポートしようと したらスタックとは別にそういう仕組みを用意しないといけない。 そもそも世の中には、汎用機のように (ハードウェアとしての) スタック持ってないマシン もあったりするし。
なんでメインフレームってそんな設計にしたんだろうな。 360の時にはしょうがなかったにしても。
普通に 360 を引きずってるだけだと思うが…
>>956 お馬鹿はお前だ。
ローカル変数をスタックフレームに置くかどうかは実装の問題であってハードアーキテクチャとは独立だろ。
>>960 再帰を考えなければスタックで実装する必要はないが再帰呼び出しもできないような「何か」なら
その中で使われる一時変数をローカル変数とは普通は言わない。
スタックも論理的には別にHWで実装されている必要はないが、push、popの操作が
アトミックになるように書かなければならず、実用的とは思えん。
まあとにかく、馬鹿が知ったような口を利くなと。
その実装の話をしてるんだが… 話についてこれないなら、絡んでくるなよ。
じゃあHWスタック使わずにどうやってローカル変数を実現するか言ってみろ馬鹿が
>>960 本当の馬鹿だったんだな。
リカーシブに使うからってスタックフレームに置く必然性はないし、仮にそうだとしてもHWの用意したスタックメカニズムを使わなければならないということも無い。
実用的云々はもう笑うしかない。
4004で高級言語の話を始めた時点で実用性は棚に上げた話だということもわからないのか。
おのれの知っている実装方法だけが全てと信じて知ったかぶり全開とはね。
>>964 グダグダ言ってねえでスタックを使わずにローカル変数を実装する方法を述べてください。
まあ無理しなくてもいいよ
>>965 ?
簡単じゃないか。
ソフトウェアでなんでもいいからスタック的なものを作れば。
>>962 は
>>960 宛ね
>>961 > 再帰を考えなければスタックで実装する必要はないが再帰呼び出しもできないような「何か」なら
> その中で使われる一時変数をローカル変数とは普通は言わない。
昔の COBOL や FORTRAN の手続きや関数内で宣言されている変数はなんて言うんだ?
> push、popの操作がアトミックになるように書かなければならず
大抵のマシンの push/pop 操作はアトミックじゃないけど?
馬鹿に突っ込むなら、もう少し勉強してからの方がいいと思うぞ。
push/popがアトミックじゃないCPUが一つでもあったら教えて欲しいわw 論外過ぎる
夏だなぁーと思わせる進行だ。 落ち着けよ。 火病を起こすな。
ARMってpush/popはSTRM/LDRMでやってるんじゃなかったっけ?
>>969 例えば 6809 で複数レジスタを push/pop したら、メモリーサイクル間に他の CPU やデバイス
(DMA とか) が割り込んでくる。
そもそもローカル変数の確保/解放がアトミックである必然性もないし、今時の CPU でローカル
変数の確保に push/pop なんて使ってる間抜けなコンパイラなんてそうそうないし。
大抵スタックポインタを操作するだけだよ。
何か知らんが久し振りにレスがあったと思ったらいきなり荒れまくりとはね。 そもそもさすがに4004じゃスタック以外にも限界ありまくりなんだから。 限界や実用性を無視しなきゃ何も話できないし、限界や実用性を無視していいのなら何でもできると言えばできる。 目くじら立てても仕方ないよ。
4004 だから、実用性無視はみんな合意してると思うよ。 その上でハードスタックとして戻りアドレス専用のスタックしか持たない 4004 でローカル変数実装 しようとしたら、今時の CPU に比べて面倒だから本当に実装してるのか? っていうなかに、 「CPU 関係ないとか」言い出す馬鹿がでてきただけの事。 まあ、荒れてると言っても夏休みだし、ネトウヨがいるわけでもないから、こんなもんでしょ。
ちょっと話題が違うよって言えばいいところでいきなり馬鹿とかいうから荒れるんだよ。 ここにいるのは必然的にいい歳した大人のはずなのにな。
2ch の全盛期を知ってる「いい歳した大人」から見て、とても荒れてるとは思えないんだが…
いい歳した大人って全共闘世代だろ むしろ荒れるのが自然だ
おれもpush/popしたい
先入れ中出し、後入れ外出し
4004ってアドレッシングも特殊だし(ROMはともかく、RAMが電卓用の 仮数と指数みたいな変な構成だったはず)さすがに例としてどうかと 思うぞ。
PUSH, POP各々の命令単位ではアトミックだけど、PUSH〜POPの命令ペアが アトミックな動作になるアーキテクチャは、世の中にはないのでは? ローカル変数の確保は、スタックポインタの演算ないし、x86系みたいに 専用のENTER/LEAVE命令がある。 DMAに関しては、1命令実行中のインストラクションフェッチや、メモリ バスサイクルの途中に割り込む可能性があるけど、CPUアーキテクチャと いうより、システムの設計依存な気が。
>>982 めちゃ久しぶりに、改めて見るが古臭いながらよく出来たデバイスだね。
>>981 >PUSH, POP各々の命令単位ではアトミックだけど
だから違うって
>>972 に書いてあるんだが。
ひょっとして、割り込みが入らない = アトミック とか言う、シングルコア脳の人なのか?
>DMAに関しては、1命令実行中のインストラクションフェッチや、メモリ
>バスサイクルの途中に割り込む可能性があるけど、CPUアーキテクチャと
>いうより、システムの設計依存な気が。
システム設計にももちろん依存するが、CPU アーキテクチャも必要。
詳しくは compare and swap atomic あたりでググって見てくれ。
>>965 アトミックという言葉を覚えて嬉しいことはわかるがもう少し勉強したほうがいいよ
//スタックを使わないローカル変数の実装(main関数その他は省略)
*void alloc_pointer=XXXX; //XXXXはハードウェア固有のアドレス値
//ポインタル変数 x,y,z が事実上のローカル変数として使用できる
void local_func(){
static int *x;
static short *y;
static char *z;
x = xmalloc(sizeof(int));
y = xmalloc(sizeof(short));
z = xmalloc(sizeof(char));
//(実際の処理)
z = xmfree(sizeof(char));
y = xmfree(sizeof(short));
x = xmfree(sizeof(int));
}
//メモリ割り当て
void* xmalloc(int x){
static void* t;
t = alloc_pointer;
alioc_pointer += x;
return t;
}
//メモリ開放
void xmfree(int x){
alloc_pointer -= x;
}
986 :
985 :2012/07/29(日) 16:50:31.83 ID:m58oaPdY
誤字、脱字はご容赦ください
良く見たら文法エラーorz、ゴメン今はこれが精一杯 >z = xmfree(sizeof(char)); >y = xmfree(sizeof(short)); >x = xmfree(sizeof(int)); ↓ xmfree(sizeof(char)); xmfree(sizeof(short)); xmfree(sizeof(int));
既に
>>967 に答え書いてあるし、
*void alloc_pointer=XXXX; とか、
z = xmfree(sizeof(char)); で、void の関数から値取得するとか、馬鹿すぎ。
「アトミックという言葉を覚えて嬉しいことはわかるが」なんて煽り入れるなら、
もう少しちゃんとやれや。
ソース修正後に「馬鹿すぎ」とか突っ込まれても困りますなw
>>985 ポインタのビット幅 = アドレスバスのビット幅とコアがネイティブに扱えるデータの
最大幅た一致しないCPUでは
alioc_pointer += x;
はアトミックじゃないから問題がある。
985の処理にアトミックとか言ってるところが 例題としては×
いやそもそも割り込みもない4004でアトミックとか言ってる時点でもう
993 :
.985 :2012/07/29(日) 20:39:35.60 ID:m58oaPdY
実際にはアセンブラで書くべきなんだろうね。
とりあえず
>>985 のソースは参考程度にしておいてください。
>alioc_pointer += x;
>はアトミックじゃないから問題がある。
一応コンパイラも作った経験者ですがその程度ならどうとでもなりますので・・・
なんだか、アトミックを理解していない、自称マルチプロセッサ搭載ゆとり脳が 混じっているな。
誰か知らんが早く埋めてスレ終了にしたがってる奴が居るな
>>985 atmic性云々は、無関係。
その記述だと、まったくリエントラントにならない。
なぜなら、func を実行中にもう一個funcのイスンタンスを呼び出そうとしても、
アドレスを保持している x,y,z の実体が一個しかないから。
正しい実装は、
static int *sp; // スタック用メモリーを指すように初期化しておくこと。
void local_func(){
static int x;
static short y;
static char z;
*--sp = x;
*--sp = y;
*--sp = z;
// 実際の処理
z = *sp++;
y = *sp++;
z = *sp++;
}
x = xmalloc(sizeof(int));
y = xmalloc(sizeof(short));
z = xmalloc(sizeof(char));
//(実際の処理)
z = xmfree(sizeof(char));
y = xmfree(sizeof(short));
x = xmfree(sizeof(int));
}
すまん、書き込みミス。 最後から2番目の}以降は不要。 マルチタスク対応するには、一連のpush/popをatomicにする必要がある。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。