Van értelme Assembly programozást tanulni?
Üdv!
Nem olyan rég kezdtem programozni tanulni C#-ban (az egyetemünkön ezzel kezdünk), de azon agyaltam, hogy önszorgalomból (meg mert érdekel is) elkezdenék assembly-vel is foglalkozni.
Nem a válaszaitok alapján fogom elkezdeni/nem elkezdeni, az fix, hogy ha az időm engedi, csinálom.
Inkább arra lenné kíváncsi, hogy ez a tudás érhet is valamit vagy sem?
Sosem árt, ha látod azt a világot is, de erre a jellegű tudásra akkor lesz szükséged, ha az utolsó csepp teljesítményt is ki akarod csikarni a hardverből, ami azért még egy átlag munkahelyen senior fejlesztőként is csak nagyon ritkán jön elő. Ha mégis ennyire performance-critical appot kell tervezni, ott nem a C#-ot fogják választani, hanem a C++-t. Viszont az assembly-t semmiképp sem mondanám haszontalan tudásnak.
A fő irányvonal maradjon a C# szerintem. Nagyon keresett, jól megfizetik ezt a fajta tudást is, és ez már maga is egy épp elég mély gödör tud lenni, ha igazán beleásod magad.
Az a tudás nem "valamit" ér, hanem a legtöbbet.
Az első jó nagy hülyeséget írt, de hát, ez itt megszokott, mindennapi fordulat.
ASM hasznos, de az elsővel értek egyet.
#2-ról meg annyit, hogy érvet egyáltalán nem kell mondani semmiről, mikor miért gondolod "hülyeségnek". A mert csak nem indok... -.-'
Az első a tipikus féligazságok,és az "ok-okozat hiánya". Gyakorlatilag értem mire gondolt, és az nem rossz, de picit pongyolán fogalmazott (ezért hasznosra ítéltem).
Egy picit árnyalva. Az assembly még egy darabig itt lesz velünk. De nem igazán a "PC" világban. Hanem a mikrovezérlőknél (mikrokontroller), ott még jó ideig az lesz a nyerő, ott sokkal fontosabb az amit írt az első "kipréselni mindent a hardverből". Ugyan vannak már nagyon jó C C++ optimalizálók, de még mindig rájuk tud verni egy jó programozó. És néha a programozó olcsóbb mint a hardver. Én vettem részt évekkel ezelőtt olyan fejlesztésben, hogy egy vezérlő panelen az volt a cél, hogy a 3 centtel olcsóbb mikrokontrollerbe beférjen a program, mert több száz ezer darabot akartak belőle eladni, és kiszámolták, hogy ha a programozó 1000 USD-ért optimalizálja a programot a kisebb mikrokontrollerre akkor 350 ezer eladott darab után megérte a programozót kifizetni.
PC-n ma már annyira brutálisan (és indokolatlanul) erős a proci, és van korlátlan memória, hogy nem éri meg a hosszabb fejlesztési idő miatt assemblyvel szerencsétlenkedni. ARM procis környzetben vannak még speciális esetek ahol megérheti.
Akkor jöjjön egy lepontozós poszt :D
Assembly a processzor utasítás készletének formális nyelve. Tehát, hogy a processzor végrehajtson bármit is, a CPU nyelvére le kell menni. Beszélhetünk bájtkódról, Java VM-ről, stb.. de attól még a CPU hajtja végre és a saját regisztereivel, amit CPU szinten utasítja, hogy tegye ide-oda.
Azaz: minden amit a CPU hajtana végre, leírható Assembly-ként. Más utasítás készlete van egy x86-nak és egy ARM-nek, de a processzoroknak architektúrától függően mindig lesz egy specifikált Assembly-je. Nyilván ezek az assembly-k nem kompatibilisek.
- Ofc ezért (is) kell egy C/C++t más-más architektúrára is lefordítani
- Ofc ezért (is) kell képenként/architektúránként más-más imprepretert telepíteni.
Szóval ya. Assembly velünk lesz, hiába "nem igazán a PC világ" része, mert az. Csak nem látjuk, elfedik előlünk. ;)
Assemblyt kevesebb helyen tudod hasznosítani mint a C nyelveket szerintem.
Kicsit olyan érzésem van vele, mint a latin nyelvvel. :D
Az, hogy valaminek van-e ételme, nem ugyanaz, mint ha azt kérdeznénk, hogy van-e rá poiaci kereslet?
Értelme mindenképp van, ha másért nem, azért, mert érdekel, és egy remek agymozgató időtöltés. De emellett van egyéb haszna is: túl azon, hogy mélységében is megérted, hogy hogy műkdik a számítógép, azzal, hogy egy nem megszokott nyelvet ismersz meg, a látóköröd, és ezáltal a gondolkodásmódod is bővül.
Az assembly egészen más gondolkodásmódot igényel. Bárki bármit állít. Eleve az assembly nem strukturált nyelv, és az OOPtől még messzebb van (az OOP sok esetben úgy fordítódik, hogy egy hívás esetén az egész objektumot kivágja a stackre). Nyilván leképezhető a strukturáltság, és az OOP-is assemblyre (ld. 5. válaszadó, mert végül is assembly-re fordít minden). És itt van a kutya elásva, hogy miért hatékonyabb sok esetben egy assembly kód mint egy C-ből gépilet optimalizált kód. Pl. C-ben (vagy kb. minden magas szintű nyelv estén) az if ... then ... else ... szerkezet így leírva rövid. De assemblyben lehet rajta gondolkodni, hogy hogyan érdemes ezt az adott ponton pl. hatékonyan megvalósítani. Igazán ott nincs is if ... then ... else ... szerkezet igazán inkább a "Basic"-hez hasonló "if then goto cím" esetleg "if then call cím" szerkezet az ami létező eszköz. Ugyanígy egy rakás szerkezet hiányzik.
Ezért nehéz sok esetben megtanulni.
Abban 6-nak igaza van, hogy kevesebb helyen lehet hasznosítani. 5-el picit "vitatkoznék" mert nagy vonalakban az összes assembly nyelv hasonlít egymásra, mert az alapvető felépítése a prociknak nagyon hasonló. Az eltérés bban van, hogy az egyik eszközben MOV vagy LD az adatmozgató utasítás. Illetve a proci képességei (pl. egy Risc jellegű proci esetén néhány tucat utasítás van, míg pl. egy korszerű intel procinál több száz utasítás van) még hozzá adnak plusz utasításokat az alaphoz. De az alapvető gondolkodás mód eléggé hasonló, és ha elolvassa az ember az adott proci architektúra leírását hamar rááll az agya.
#5 vagyok és #8-as: nem kell vitatkoznunk. :) Lényegében meg is válaszoltad, hogy egy bővített utasítás készletű téma, egy régebbin nem is menne. Tehát így nem kompatibilis, de a régebbi az újon igen.
Ez így adja is magát. :)
8:
Még a te leírásod áll talán a legközelebb a valósághoz.
Egy két dolog azért hibádzik. Pl ez:
"mert végül is assembly-re fordít minden"
Nem így van. Sokan hiszik ezt, ezért is pontosítok.
A processzor gép kódot ért meg és hajt végre. Minden proci a sajátját.
Az assembly nyelv áll a gépi kódhoz a legközelebb, ez tény, de nem azonos vele.
Az assembly-ben vannak különféle célú utasítások, ilyen például az adatmozgató utasítások csoportja is. Az x86 assembly-jében* ez az utasítás a MOV, ami az angol move szó rövidített alakja.
Azonban a MOV nem feleltethető meg a gépi kódok valamelyikével, ugyanis az attól függ, hogy mit MOV-olunk és hova, regiszterbe-e, vagy memóriába, ha regiszterbe akkor melyikbe, stb.
Ennek megfelelően van olyan gépi kód, amely az AX regiszterbe, van olyan amelyik a BX-be vagy máshova mozgat adatot.
De ez csak egy példa, sok hasonló létezik még.
Az assembly ráadásul nincs is úgy specifikálva, ahogy mondjuk a pascal, a c vagy a c++. Ezért is csillagoztam meg az x86 assembly-jét mint szót, ugyanis ilyet, hogy assembly bárki összehozhat és a saját x86 assembly-jében a MOV lehet VUK, netán PAX is, ha éppen nem NYUSZIMUSZI vagy bármi más.
Olyan, mintha a C nyelv fprint nevű függvényét mondjuk nyominak, az int kulcsszót pedig karcsinak definiálnánk, pedig, ennél sokkal több.
Az assembly emellett kötődhet az alkalmazott operációs rendszer és a processzor üzemmódjához is. Az x86 esetében ez lehet valós vagy védett. Ezen túl, van még olyan, hogy memóriamodell. Ezt is figyelembe kell vennie egy processzor assemblerének.
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!