Kezdőoldal » Számítástechnika » Programozás » Minden programozási nyelvben...

Minden programozási nyelvben átadódnak a globális változók a függvényeknek?

Figyelt kérdés
Ezt egy javascript tananyagban olvastam, hogy több memóriát fogyaszt egy globális változó, mivel át kell adni minden fvnek. Én azt hittem, hogy átadás nélkül látják őket a fvnyek.

2021. aug. 24. 10:53
1 2 3 4
 11/32 Szirty ***** válasza:
100%

"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. :)

2021. aug. 24. 17:39
Hasznos számodra ez a válasz?
 12/32 anonim ***** válasza:
93%

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/

2021. aug. 24. 20:55
Hasznos számodra ez a válasz?
 13/32 anonim ***** válasza:
93%
9.: A második hivatkozásod nagyon jó. Élmény volt olvasni. Ez kb. ez előtt 30-40 évvel volt igaz (pont 40 éve jelent meg az IBM PC). 1985 óta biztosan nem igaz (akkor jelent meg a 386-os proci). A linken szereplő hivatkozásban szereplő DOS operációs renszer "végét" a Windows 3.1 jelentette (1992), azóta a linkelt dolog "történelem" (ez is már majdnem 30 éve volt! Egészen pontosan 29 éve). Ha jól emlékszem (bár nagyon régen volt, és nem sokat dolgoztam vele) az OS/2 korai változatai is támogatták már a bővített címtér használatát, és egészen más alapon működött mint a DOS (igaz a hardver is más volt hozzá mert az a PS/2-n futott), sima PC-n futó OS/2 WARP változat (ez futott sima 386-os PC-n) 1994-ben jelent meg, és ez már valódi 32 bites oprendszer volt (ez is már 27 éves történet!!!). Azóta biztosan felejtős az az anyag amit másodjára linkeltél. De ez már mind-mind történelmi távlatokat jelent.
2021. aug. 24. 21:10
Hasznos számodra ez a válasz?
 14/32 anonim ***** válasza:
0%

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.

2021. aug. 24. 21:16
Hasznos számodra ez a válasz?
 15/32 anonim ***** válasza:
93%

kicsit off topic de jól esik, amikor ilyen részletes válasz érkezik.

12/13, öröm volt olvasni :)

2021. aug. 24. 21:17
Hasznos számodra ez a válasz?
 16/32 anonim ***** válasza:
0%

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.

2021. aug. 24. 21:23
Hasznos számodra ez a válasz?
 17/32 anonim ***** válasza:
93%

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...).

2021. aug. 24. 21:24
Hasznos számodra ez a válasz?
 18/32 anonim ***** válasza:
93%
"irgalmatlan baromságokat tartalmazó beírást ejtette." Részletes cáfolatot kérek, hogy hol van olyan ami nem igaz a fentiekből amit leírtam!
2021. aug. 24. 21:25
Hasznos számodra ez a válasz?
 19/32 anonim ***** válasza:
50%
16: a szaktudásodról nem tudok nyilatkozni, simán lehet, hogy nagy tudásod van. De a stílusod alapján tipikusan az az ember vagy, akivel senki nem szeretne együtt dolgozni.
2021. aug. 24. 21:25
Hasznos számodra ez a válasz?
 20/32 anonim ***** válasza:
12%

"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.

2021. aug. 24. 21:37
Hasznos számodra ez a válasz?
1 2 3 4

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!