Allgemeine Frage
Geizhals » Forum » Programmierung » Allgemeine Frage (37 Beiträge, 689 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.
Re: Allgemeine Frage
04.11.2005, 16:05:57
Falls die Frage ernst gemeint war:
Bei einigen Teilen wirst an Assembler i.d.R. nicht vorbeikommen.
Du sprichst von einem OS, das du schreibst - also nicht einer "Unique-Applikation" die rennt.

Dann muß dein OS den Prozessor evtl. in geeignete Modi heben. z.B. Intel - da wirst du sicher nicht im Real Mode (DOS-Welt, 16bit) bleiben wollen, sondern in den Protected Mode/Virtual Maschine Mode/...) wechseln wollen.

Einige Operationen der Speicherverwaltung (PAE, ..) und einiges exotisches (zB Verwenden des "Virtual Interrrupt Pending"-Flags) wirst auch in Assembler machen. Bootloader und anderes schreien auch nach Assembler...

In der Regel solltest du Assembler auf der gewünschten Zielmaschine /sehr/ gut können und viel Praxis mitbringen, bevor du das angehst.

Der Witz dabei ist: Je besser du Assembler kannst, desto weniger schreibst du drin ;-). Nur das, was nur in Assembler geht, wirst dann in Asm schreiben - der Rest ruft IMHO nach C.

Wenn du zB Linux ansiehst, spiegelt sich das wieder. Wirklich die Masse in C, kleinste Teile in Assembler. Wenn du bei den alten Versionen begonnen hast - damals wurde statt in C in C++ gecoded. C++ ist aber denkbar unbrauchbar für ein OS - wenn du auf die Objektorientierte Welt verzichtest, bist in C besser dran (C bietet auch Features, die es in C++ nicht gibt). Wenn du deine HW, Prozesse, ... aber in Objektstrukturen verwaltest (was ja von der Idee her absolut Sinn macht) - so wirst du entdecken, daß C++ über den VMT(Virtual Method Table)-Overhead gerade dann um bis zu Faktor 10 langsamer ist - für ein Betriebssystem mit 100-1000 Taskswitches pro Sekunde eher Suboptimal. Drum wurde auch Linux sehr schnell von C++ auf C umgestellt.

Grundsätzlich paßt aber jede Sprache, die dir ein Binary liefern kann...

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
...
Re(3): Allgemeine Frage
04.11.2005, 16:27:18
Kurzer Sinn meiner Antwort:

Teile eines Betriebssystems sind i.d.R. in Assembler zu schreiben. Computersysteme sind zu unterschiedlich, als daß ich sagen würde "immer" - daher "i.d.R." ;-). Du kannst aber in der Praxis von "immer" ausgehen.

Man geht im Endeffekt davon aus, daß ein Programmierer 6 Zeilen "finalen" Code am Tag produziert. Verblüffend wenig, ist aber so. Code wird immer und wieder umgeschrieben, und das Programmieren selbst macht bei sauberem Projektmanagement nur einen kleinen Teil (10-20%) der Zeit aus, der Rest geht in Plandefinitionen, Teststellungen, Dokumentation, ...

Ich würde mal behaupten, daß die Anzahl der LOC's (Lines Of Code - Programmzeilen) bei Assembler im Schnitt um den Faktor 100-1000 mehr sind als in einer höheren Sprache wie C.

Wenn du also ein Programm in C schreibst und das dort sagen wir 1000 Zeilen hat - wären das stattdessen 100000-1000000 Zeilen Assembler. (mich bitte nicht auf das genaue Zahlenverhältnis festnageln - nur als Daumen*Pi)

Assembler schreiben ist also unrentabel.

Früher wurde Assembler gerne benutzt, um "kritische" Routinen in deinem Programm zu schreiben - die schnell gehen mußten wie zB bei frühen 3D-Spielen.

Das macht heute auch keinen Sinn mehr, weil die Prozessoren zu unterschiedlich sind.

Angenommen (wieder nur Hausnummern) du willst ein Register (=eine der wenigen Prozessorvariablen) auf 0 setzen - und du hast auf einem 80286 gearbeitet. In Assembler konntest du schreiben
MOV AX, #0 ; Lade 0 in das Register AX.
das war mal der "offensichtliche" Befehl, und er kostete sagen wir 6 Taktzyklen.
Es gibt aber auch die Variante
XOR AX, AX ; Wende ein Exklusiv-oder von AX auf AX an.
Ein Exklusiv-oder zwischen 2 gleichen Zahlen liefert immer 0 - war also vom Ergebnis gleichwertig.
Du hast also in deinen Tabellen gegraben und bist draufgekommen, daß der nur 3 Taktzyklen kostet - also doppelt so schnell ist - und um 1-2 Bytes kürzer.

Daher hast du immer XOR AX,AX verwendet.

Mit dem 80386 änderte sich aber die Implementierung von MOV und XOR...
MOV kostete sagen wir 2 Taktzyklen, XOR 3 -> Schlagartig war auf deinem Prozessor die schlechtere Variante im Einsatz ;-)

Wenn du in C programmierst, sagst einfach
a=0;
und gibst beim Übersetzen an, für welchen Prozessor er optimieren soll - und hast immer schlagartig das bessere...

Wo ich hinwill:
Zwischen den Prozessorgenerationen - auch in der selben Linie wie 80x86 - ändert sich weit mehr als nur mehr Funktionalität und Speed... Statements, die früher teuer waren, wurden billig und umgekehrt.

[gute] Compiler sind inzwischen schlau genug, daß sie seeeehr effizienten Code liefern - daher fällt der vorletzte Grund für Assembler (Speed) aus - und du nutzt ihn nur dort, wo es wirklich nicht anders geht.

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung