Minden programozási nyelvben átadódnak a globális változók a függvényeknek?
"A globális változók helyigénye a lokálisokéval bitre megegyezik."
Nyilván. De pl. azokban a rendszerekben amikkel foglalkozok a lokális változók a stack-ben vannak és a függvény lefutásakor a változó kvázi megsemmisül, így többé helyet nem foglal. Ellentétben a globális változókkal amik a teljes futás alatt léteznek és a helyet is ennek megfelelően végig foglalják, akárhol is legyenek. :)
9: Ez sem egy mai leírás. "Az adat-szegmens mérete is maximum 64 kbyte64 kbytelehet" Ez úgy nagyjából a 8088 és 8086 esetén volt így (talán még a szinte sehol nem használt 80186-ban, a 286-ra már nem emlékszem azt nem programoztam soha). Az igazi áttörés a 386-os sorozat volt, a protected móddal és gyakorlatilag megszüntetett szegmentálással. (lehet azóta is használni ezeket, de tök felesleges). Az oka, hogy a 8088 és 8086 procinél megjelent a kód és adatszegmens egyszerűen az volt, hogy 16 bitesek voltak ezek a procik (8088 nem teljesen, de most azon lépjünk túl). Viszont arra rájöttek igen hamar, hogy a 64kByte memória igen kevés. 16 biten max. 64k címezhető ki. A 8086 (és a 8088 is) 20 bites címeket tudott kezelni (max. 1MByte). És valahogy meg kellett oldani, hogy 16 bites regiszterekkel kicímezhető legyen a 20bites címtartomány. Ezért kitalálták (sokak szerint egy szörnyszülemény volt),hogy fognak 4 regisztert CS /kód sz./, DS /adat sz./, ES /Extra vagy extended sz./, SS /stack sz./ és ezekben tárolják az ún. szegmens címet. A 20 bites cím úgy jött össze, hogy egy címző utasításnál (az utasítás jellegétől függő szegmens regisztert (pl. ha az utasítás számláló volt akkor a CS, ha "sima" adat akkor a DS, ha stack akkor az SS) fogta a szegmens regiszter értékét beszorozta 16-al, és az így kapott számhoz hozzá adta az offszet regiszter (azaz a szegmensen belüli 16 bites cím) értékét, és így kapta meg a 20 bites "abszolut címet". Ennek volt néhány rossz tulajdonsága, egy szegmensen belül max. 64k adat lehetett (ezt át lehetett hidalni ha közben új szegmenst címzett az ember), a másik hiba, hogy egy fizikai címet sok féle képpen (ha jól emlékszem 16, de nagyon régen programoztam 8086-ot natív) le lehetett írni, és így gyakori volt a túlcímzés, meg amikor a program "összeakad" saját magával (akkor még az oprendszer erre nem figyelt, kb. annyit tett, hogy betöltötte a memóriába a programot, relokálta /.exe kiterjesztés esetén/ majd ráadta a vezérlést; a .com esetén az egész CS-nek egy 64k-s szegmensen el kellett férni, így nem volt gond a relokációval, bárhova lehetett tölteni a memóriába mert maga a program egy CS-en belül 64k-ban ki tudta magát címezni).
A 386-ostól felfelé 32bites (kséőbb 64 bites) lett a proci, és ennek megfelelően 32 illetve 64bites lett a címzés, és ha csak nem nagyon eldurvult virt címzést akar az ember használni akkor sok értelme már nincs a kód, adat, és stb. szegmenseknek, pláne megszűnt a 64k-s korlát.
Ez a hardver...
Az, hogy egy programnyelv hogyan történik a globális, lokális változók, függvények esetén az értékátadások az nyelv, fordító, és még egy csomó minden más függvénye. A "C" és leánykái esetén alapvetően a stack-et használják értékátadásra és alapvetően érték szerinti paraméter átadás történik. Voltak olyan nyelvek ahol az érték átadás cím szerint történt (ha jól emlékszem valamelyik Pascal változat is ilyen volt), és a meghívott függvény így "vissza tudott írni". A lokális-globális változók esetén igazán a "kérdés", hogy ugyanazt a változót az összes függvény eléri-e vagy sem. Ha a függvény nem dinamikusan jön létre (mert pl. egy objektum "sajátja") akkor tök mindegy mert ugyan annyi helyet foglal a memóriában, mert a függvényt is le kell fordítani, és bent lesznek a lokális változók is a memóriában. A kérdés annyi, hogy a függvényen belüli "névtér" része vagy sem az adott változó. Pl. a FORTRAN-ban ezzel egészen jókat lehetett játszani, ott voltak common blockok ahol egészen durván egymásra lehetett definálini akár különböző méretű változatokat. Vagy pl. láttam olyan mikroprocit ahol bitenként és byte-osan is lehetett címezni a memóriában. Ha bit műveletet hajtottam végre pl. a 953-as című bittel, az ugyanaz volt mintha a 119-es címen lévő byte 1-es bitjét "piszkáltam" volna. Tehát pl. A 119-es címen volt F5 és kiadtam egy SET (953) parancsot (a 953.bitet tegye 1-be) akkor a 119-es címen megváltozott az érték F7-re.
Aztán az, hogy egy adott fordító, interpreter (javascript interpretált) hogyan valósítja meg a változó kezelést az már akár verzió függő is lehet. És amit sok helyen ma már "tanítanak" le kell sz*ni mennyi memóriát zabál a cucc, mert a memória fogyasztás ma már teljesen sokadrangú szempotn. A gyorsaság, és a fejlesztés egyszerűsége ezerszer fontosabb. Azt meg már egy 1962-ben megjelent programozás könyvben olvastam, hogy egy programot vagy memória használatra, vagy sebességre optimalizálhatunk mindkettőre nem. Ha sebességre optimalizálunk azt csak úgy tudjuk elérni, hogy nő a memória igénye. És egyre igazabb a mai fejlesztésekre (ezért tudott az objektum orientált programozás elterjedni, mert elképesztően memória zabáló, cserébe gyors, áttekinthető, és egyzerább benne fejleszteni mint pl. egy FORTRAN-ban, vagy adott esetben egy ASM-ben). /Lepontozokzól részletes indoklást kérek, köszönöm/
12/13: Megkérnélek, ha ennyire ltáványosan hülye vagy valamihez, akor inkább ne ugass bele.
Ami ott olvasható, az ma is éppen úgy igaz. Annyi a különbség, hogy az még valós módról ír, ma pedig inkább védett módban használjuk a PC-t. Ettől függetlenül, használhatjuk ma is valós módban a gépünket.
A lényeg egy: Mind védett, mind valós módban ugyanaz a metodika. A statikus változók a programok adatszegmensében foglalnak helyet és véletlenül sem a heap-en.
Szóval, neked inkább kuss a neved, jóbarát. Fölöslegesen gépelgettél be olyan sok baromságot.
kicsit off topic de jól esik, amikor ilyen részletes válasz érkezik.
12/13, öröm volt olvasni :)
Jól esni az eső tud.
Jólesik a sok hülyeség, amit ez a dilettáns begépelt?
Meg is érdemled. Ha nem uganaz vagy, aki a két irgalmatlan baromságokat tartalmazó beírást ejtette.
14: És a heap hol foglal helyet? Szerinted? És mi a kapcsolat a heap és az között, hogy hogyan adunk át adatot egy függvénynek? A heap egy a "C" és "C" klón nyelvek egyik megoldása egy tárolási problémára. Ez egy nyelvi eszköz, ugyanúgy mint a beszélt nyelvben a névelő. Semmi köze ahhoz, hogy micsoda, milyen értéket, és hogyan ad át. heap használata nélkül is lehet dolgozni, és nagyon nincs köze ahhoz, hogy lokális, globális változókat használunk, érték szerint, címszerint, objektumosan vagy hogyan adunk át értékeket.
"Ettől függetlenül, használhatjuk ma is valós módban a gépünket." Annyira, hogy már a boot eljárás közben protected módba vágja a BIOS a gépet... Még oprendszer sincs behúzva de már protected módban van a gép. Az meg, hogy valaki 2021-ben DOS-t használ, és real módban használja a PC-jét az inkább elmebajra val, nem tudatos fejlesztésre (vagy arra, hogy sajnálja a lóvét és egy 40 éves programot használ a mai napig, mert az X okos magyar vállalkozó meggyőzői az ügyfelet, hogy az a boldogulás egyetlen útja, ha még mindig tákolgatják a 30 éve elavult programját X vállakozónak, amiből egyedül X vállalkozó jár jól, mert már 30 éve egy darab ügyviteli programból él...).
"Részletes cáfolatot kérek, hogy hol van olyan ami nem igaz a fentiekből amit leírtam!"
Hát nekem arra ingerem nincs, hogy minden sorodat megcáfoljam, de a lényegibbekre itt van egy két sor:
- A védett mód NEM a 386-osokkal lépett színre. Már a 286-osokat is védett módba lehetett kapcsolni.
- A 386-os nem szüntette meg a szegmentálást. Ezt a baromságot mikor találtad ki?
- A szegmentált címzés a maga idejében forradalmi volt. Eleve, akkoriban a gazdag embereknek volt csak sok memória a gépükben. IBM PC-t még 16 k memóriával is árultak.
- Mi az, hogy nincs értelme a kód atad és egyéb szegmenseknek te seggbuta állat?
A PC memória szegmentálását ne keverd már össze a program szegmentálásával te pökhendi, önképzőkörös, hugyagyú ökör!
A progamok ma is szegmentálva vannak, másképp nem is tudnának működni.
Ma is létezik stack, adat és kódszegmens, sőt, extra szegmensek is vannak, legalábbis lehetnek. Az ES regiszter pont erre való.
Már ha te hallottál volna erről a regiszterről.
Sötét, pökhendi, de nagyon rosszul önképzett emberke vagy, aki arra remek példa, hogy miért NE tanuljon valaki otthon, egyedül effélét.
Mert ide jut, hogy használhatatlan, téves ismereteket, butaságokat fog tudni csak bebüfögni mindenhova. Ahogy te is tetted itt.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!