Forskellen på assembler og C#

Tags:    c#

<< < 123 > >>
Hej er nybegynder i C# så bær over med mig vis jeg stiller nogle dumme Spørgsmål.

Har programmeret 8 år i assembler og der arbejder man jo med macro og subrutines.

Kan man samme ligne C# og assembler på den måde det er bygge op på, i assembler har man jo main hvor programmet starter fra, når programmet køre kalder det nogle subrutines, macro og springer frem og tilbage i programmet, det gør man vel også i C# på en eller anden måde.

Har købt nogle bøger og undervisning på nette og synes slet ikke der er nogle logik i den måde C# er bygge op på i forhold til assembler.

En af de største problemer jeg har, det er at arbejde frit med variabler/array/memory i hele programmet.

Synes det hele virker menigs løst.

Kan man overhovode samme ligne C# C++ og assembler på nogen måder ?

MVH Nicolas






21 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 28 karma
Sorter efter stemmer Sorter efter dato
Man kan ikke sammenligne dem!

C# er et imperativt sprog i modsætning til assembler der er et funktionelt sprog. I et funktionelt sprog har du subrutiner og funktioner, gotos osv. som sikerer den samme tilstand altid når det kører. I et imperativt sprog har du modeller objekter klasser og metoder. Et imperativt program/sprog kender til "tilstand" det gør et funktionelt sprog ikke.

Eksempel: Skal jeg kode en bil (aner ikke hvordan i assembler) vil jeg lave en bil klasse. Bilklassen skal modelleres som en almindelig bil, dvs. den skal have motor, dæk, lygter, nøgle osv. En klasse er så din designtime repræsentation af din bil (det er stadig kun en prototype indtil din kode rent faktisk instantierer (laver en ny) unik bil - dem kan du lave så mange af du vil. Når bilen er startet har det objekt (en instantieret klasse er et objekt) sit eget liv og sin egen tilstand. Du kan starte en vil uden at starte de andre. Når du har startet en bil har den tilstanden "startet", dvs. de variable der er på en bil har nogle værdier som afspejler at den er startet. fx. motoromdrejninger=1100, lys=on, radio=on, speed=110, osv. alle biler vil være forskellige, men udspringe fra den samme klasse - klassen er "tegningen"(blueprint) der beskriver hvordan en bil skal se ud.

Den største forskel er tilstand, du skal vænne dig til at du ikke har globale variable, alt (ALT) er i klasser/objekter, du har ikke goto, du styrer derimod dit program med conditions og events.

Bemærk der er fra nyeste version af .NET kommet en ny dreng i klassen, det er F#, det er til ren funktionel programmering...måske kunne det være en blød overgang for dig?



Assembler er vel omkring så low level som du kan komme...

C# er omkring så high level som du kan komme.


Så jeg vil sige nej. Det er begge to programmeringssprog. Andet har de ikke rigtigt til fælles.


Hvis du har kodet 8 år i assembler uden at kode andet, skal du nok vride din tankegang lidt rundt, lidt ligesom os .NET folk (dvs blandt andet C#) nok ville skulle dreje hjernen en ekstra gang for at hoppe ind i assembler.


Koder du Console, WPF eller Windows Forms applikationer i øvrigt? Eller lidt af det hele? Ville nok anbefale at starte i Console applikationer da du så ikke skal lege med GUI endnu.

Og så er der også en stor autogenereret funktion der sørme hedder "Main" i en C# console applikation. Der inde kan du fx begynde at lave variabler og lege med Console.ReadLine() og Console.WriteLine().




Men hvis du allerede har undervisningsmateriale er dit bedste skud altså at smide din viden på hylden og starte fra point zero. Og så bare gå langsomt gennem hvert kapitel. For du vil nok skulle tænke på en ny måde med event drive programming, og en masse ting der bliver gjort for dig.


Jeg vil i øvrigt tilføje her til sidst at du nok vil elske C# hvis du kommer ordentligt igang. Mange af de ting du nok gør i hånden i assembler er gjort for dig, og du kan fokusere på at lave seje programmer (fx med WPF som kan give dine applikationer det der sexy "woaw" touch:P).




Hey Nicolas.
Nu programmerer jeg ikke C#, men jeg kan dog godt enkelt besvare dit spørgsmål.

Assembler er et sprog med utrolig lavt abstraktions niveau (low-level). Du er næsten nede og rode med 0'er og 1 tal, og du er meget tæt ved hardwaren. Assembler er skide svært, og tager enorm lang tid. Til gengæld kan alt blive super optimalt.

C# er omvendt på et meget større abstrations niveau. Det vil altså sige at alle koder er skredet på en måde at det er rigtig let for mennesker at forstå dem. Mange til er lavet i forhånd med C# i forhold til assembler. Og så er C# et objekt orienteret sprog. Det er Assembler ikke.
Til sidst skal også nævnes at tanken om at "gå til et andet sted i koden" (ala: goto) ikke er noget der benyttes i C#, da det kan forvirre koden. Til gengæld bruger man noget der hedder loops (på dansk: løkker).

C++ minder om C#, men er dog lidt lavere abstraktions niveau, og her skal man også tænkte lidt i hardware og memory...



Tjo, tja...programmering er programmering så alle sprog kan sammenlignes på ét eller andet niveau.

En subrutine svarer sådan ca. til en funktion/metode.
De data din assembly rutine tager med via stakken eller registre, svarer til parametre til funktionen/metoden.
Det resultat, som din assembly rutine lægger i et register (eller i hukommelsen) efter dens udførsel svarer ca. til returværdien i funktionen.
Og du skal starte ét eller andet sted, i C#/Java/C hedder dette 'main' metoden.
Du allokerer noget plads til data i hukommelsen og giver adressen et navn i assembly. Dette hedder en variabel i C#.

Så jo, der er mange lighedspunkter, men det lyder lidt til at din kodestil har været præget af spaghetti, sådan som du springer rundt. I moderne sprog bruger man funktionskald og kontrolstrukturer (if/while/for/switch/ og så videre) til at opnå det samme.
Men det er en meget anderledes måde at programmere på, så som andre har sagt, så skal du nok tænke meget anderledes, hvis du forsøger at skifte.

Brian, jeg er ikke enig i at assembly er et funktionelt sprog. Som du så rigtigt siger, så kender funktionelle sprog ikke til tilstand, men det gør assembly i høj grad. Det kan ændre i hukommelsen og registre, som udgør tilstanden.



Indlæg senest redigeret d. 02.09.2011 22:45 af Bruger #2695
@Brian - Assembler værende et funktionelt sprog? Du har da rigeligt med tilstand i Assembler, tilstand som kan ændres tilmed. Du har mere end rigelig mulighed for at loade tilstande ind i registre og hukommelse og skrive til disse igen - fuldstændig ligesom i et imparativt sprog. Husk også at medmindre der er snak om et interpreted sprog - som kompilleres alt jo ned til Assembler alligevel. Derudover laver langt de fleste kompilere jo diverse tricks for at få funktionelle sprog til at kunne køre hurtigt på CPUen (det sprog CPUen snakker kan mere end alt sammenlignes med Assembler) - derfor forstår jeg ikke hvorfor du vil kalde det et funktionelt sprog - om noget ville jeg faktisk kalde dette for imperativt også (dog åbenlyst ikke Object Orienteret, men imperativt på niveau med C).

Så TL;DR: hvorfor mener du at det er funktionelt?



Jeg siger 1000 tak for alle jeres svar.

Nu skal det lige sige jeg udlukke bruger assembler til programmere af Microchip/Microcontroller hvor der bliver tilslutte tastatur, display, lysdioder, tryk knapper, eeprom, porta, portb, portc, portd, osv... Jeg arbejder udlukke med Hex og binnary coder og synes bestemt ikke Assembler er svært det er meget mere overskueligt, fordi jeg ved præcis hvor jeg har mine data og det hele handler i bund og grund om 0'er og 1 tal'er mere simpel kan det ikke blive. Grunden til jeg gerne vil lære C# er jeg skal lave nogle programmer som kan læse data fra Microcontroller ind i programmet via serial og USB porten og her snakker vi igen om HEX coder som skal vise på skærmen og ændres i, er starte lidt med C# med console.readline, console.writeline download nogle program eksempler og betalt for undervisning hos LearnVisualStudio.NET og købt nogle bøger. Problemet er nok for mig jeg kommer fra en hele anden verden og begyder at samme ligne tingene, men kan forstå på alle jeres svar at C# arbejder på en hel anden måde end assembler gør. jeg kan også forstå, jeg skal start helt fra bunden, synes bare nogle af de koder jeg kigger på, er der slet ikke noget logik i, men det kommer vel med tiden :-)

Endnu en gang 1000 tak for jeres svar.

MVH Nicolas



Du kan jo går igang med at prøve at programmere i C#,så skal vi nok hjælpe dig med noget forklaring til koden, hvis du paster det du ikke forstår. Det er nok det bedste sted at starte.



C# har da goto? Jeg er enig i at der er en gigantisk forskel mellem Assembly og C#, men at sige at de ikke kan sammenlignes er en fejl af endnu større dimensioner, IMO.



@Robert, @Kaare: med tilstand og et imperativt sprog taler man om tilstand inden for et objekt (hvordan ser et "objekt" ud i assembler?), ikke hukommelsestilstand. NAturligvis kan man skrive til registre, ellers ville det jo være vanskeligt at lave noget fornuftigt med sproget. Men det er ligegyldigt, for det er ikke det man taler om når man taler om tilstand, det er på et højere abstraktionsniveau. Du kan ikke i et funktionelt sprog have 2 forskellige objekter med forskllig tilstand (forskellig data i samme registre på samme tid). En anden typisk karakteristik ved et funktionelt programmeringssprog er at du kan kalde det samme metode 2 gange i træk med garanti for den samme opførsel hver gang. I teorien kan du ikke garantere det i et imperativt sprog, da det objekt hvor din metode findes på kan ændre sin tilstand mellem de to kald, og derfor ændre grundlaget for metodekaldet.

@Thomas: Jepsen, C# har goto, men hvorfor i alverden skulle jeg bruge det i et objektorienteret sprog? Ville jeg ikke kunne lave mere robust og bedre objektorienteret kode uden gotos? (kodeeksempler ses gerne)



@Brian - Præcis et funktionelt sprog har idempotente funktioner (hvis det er rent/pure funktionelt, hvilket de færeste er, men de stræber sig imod det om ikke andet). Lad mig stille et andet spørgsmål om ikke andet - hvad vil du klassificere C som - imperativt eller funktionelt? Du har ingen objekter i C - du har structs som mest af alt bare er blokke af hukommelse.



<< < 123 > >>
t