Ich bin etwas neu in der Programmierung und kann diese Frage am besten anhand eines Beispiels stellen.
Ich weiß, wie man grundlegende Dinge in Java und C # macht. Dinge wie eine kleine Windows Forms-Anwendung oder eine generische Klasse. Ich habe im Grunde genommen gelernt und noch nichts Großes versucht. Wie auch immer, ich war schon immer neugierig, wie Dinge "unter der Haube" gemacht werden, könnte man sagen.
Ich weiß, dass alles auf Einsen und Nullen reduziert wird und dass Assemblersprachen im Grunde genommen Befehle für Muster mit Einsen und Nullen geben, aber es scheint, als gäbe es diesen Sprung von da zu: Verwenden Sie eine Bibliothek dafür, eine Bibliothek dafür. Mir scheint, dass alles, was C # ohne Bibliothek tun kann, Arithmetik und Binärlogik ist. Für die Eingabe oder Ausgabe verwenden Sie Bibliotheken usw.
Ich weiß, dass diese Frage für manche wahrscheinlich offensichtlich ist und ich weiß, dass ich noch viel zu lernen habe, aber ich weiß nicht einmal, wo ich mit einer solchen Frage anfangen soll. Vielen Dank.
Meine Frage lautet also:
Wenn jemand eine virtuelle Maschine oder einen Playstation-Emulator oder ein Betriebssystem oder einen Treiber erstellen oder einem Media-Player MP3-Unterstützung hinzufügen oder einen eigenen Dateityp erstellen würde, etc ... Wie? Ich kann nicht sehen, wie dies mit C # oder Java geschehen würde.
Mit anderen Worten, wenn ich ein Buch wie Professional C # von WROX oder Programming C # von OReilly lese, weiß ich dann, wie man diese Dinge macht? Oder müssen Sie Assemblersprache oder etwas niedrigeres wie C ++ lernen?
Antworten:
Interessante Frage! Sie werden feststellen, dass Sprachen wie Java und C # in der Tat eine relativ niedrige Programmierstufe unterstützen. Schauen Sie sich zum Beispiel einen Teil des E / A-Quellcodes im OpenJDK für Java an. Sie werden sehen, dass die Methoden der höheren Ebene mit Socket-Technologien der niedrigeren Ebene, Byte-Arrays und Bit-Twiddling implementiert werden.
In Bezug auf C # und Java werden diese Sprachen in Bytecode kompiliert, der auf einer virtuellen Maschine ausgeführt wird. Sie können den Bytecode sogar ganz einfach anzeigen und daraus lernen (z. B. sehen, wie Java mit der Verkettung von String-Objekten umgeht).
Wenn in der Umgebung, in der Sie sich entwickeln, keine dieser übergeordneten VMs gehostet wird (häufig aufgrund von Speicherplatz- und Leistungsanforderungen), müssen Sie eine Sprache mit einer niedrigeren Ebene verwenden.
Ich glaube, dass C / C ++ immer noch die Vorherrschaft im Bereich des Schreibens von Low-Level-Treibern usw. innehat, da Sie die Speicherverwaltung und die Datenstrukturen bis zum n-ten Grad optimieren können.
Die Montage ist heutzutage ziemlich spezialisiert. Es ist gut, zumindest einen kurzen Kurs zu belegen, um zu verstehen, was auf diesem Niveau passiert. Wenn Sie eine Assembly schreiben, um ein Register während des Entleerens rückwärts zu füllen, beginnen Sie, die Längen zu schätzen, die jeder Programmiersprachen-Layer haben muss.
HTH
quelle
Die meisten "Low-Level" -Programmierungen haben im Grunde genommen eine direkte Schnittstelle zum Betriebssystem. Der Grund, warum es für Sie nicht so scheint, als gäbe es einen "offensichtlichen" Weg, dies zu tun, ist, dass im Allgemeinen höhere Sprachen wie Java nach Benutzerfreundlichkeit und Portabilität streben. Code, der direkt mit dem Betriebssystem verbunden ist, ist im Allgemeinen viel weniger portabel als Code höherer Ebenen, sofern er nicht in eine Abstraktion eingeschlossen ist.
In untergeordneten Sprachen wie C und C ++ kann direkt auf die Betriebssystem-API zugegriffen werden (hauptsächlich aufgrund der Tatsache, dass die meisten Betriebssysteme in C geschrieben sind, sodass sie eine API über die C-Sprache verfügbar machen). In C auf einem UNIX-System können Sie beispielsweise die
ioctl
Funktion aufrufen , um eine direkte Schnittstelle mit einem Gerät herzustellen.Natürlich müssen auch übergeordnete Sprachen wie Java und C # mit dem Betriebssystem kommunizieren können. Jedes Mal, wenn Sie eine Datei öffnen oder von einem Netzwerk-Socket lesen, wird eine Verbindung zum Betriebssystem hergestellt. Es ist nur so, dass Java und C # die Betriebssystemaufrufe auf niedriger Ebene wie ein
Socket
Objekt in Abstraktionen auf höherer Ebene umschließen . Dieser übergeordnete Ansatz hat den Vorteil, dass derselbe Java-Code auf verschiedenen Plattformen funktioniert. Die Art und Weise, wie Sie unter UNIX einen Socket in C öffnen, unterscheidet sich erheblich von der unter Windows.Je höher die Sprache ist, desto weniger Kontrolle haben Sie im Allgemeinen darüber, wie Ihr Programm mit dem Betriebssystem kommuniziert. Das sei gesagt, eine Menge Dinge , die Sie erwähnen , ist möglich , in einer höheren Sprache zu tun. Es gibt beispielsweise keinen Grund, warum Sie eine virtuelle Maschine nicht in Java oder C # schreiben können.
quelle
Die gute Nachricht ist, es kann mit Java oder C # erfolgen. Das einzige Problem, das Sie wissen müssen, ist, wie . Grundsätzlich müssen Sie diese netten kleinen Dinge über Hardware-Architektur wissen (nicht notwendiger PC, aber Playstation, wenn Sie das emulieren möchten). Und ich fürchte, Sie müssten tief gehen, wie Assembler und Maschinensprache.
Alle ALUs, Register, MMUs und Sachen konnten mit Hochsprache abstrahiert und emuliert werden. Sie können sogar Funktionen auf niedriger Ebene aufrufen, um Hardware-Unterstützung zu erhalten (zum Beispiel Informationen zu PInvoke und JNA).
Da Sie jedoch Anfänger sind, würde ich nicht empfehlen, mit einer solch enormen Aufgabe zu beginnen. Ich würde vorschlagen, dass Sie C / C ++ lernen, ein bisschen über Linux (oder ein anderes Unix-ähnliches Betriebssystem, z. B. FreeBSD), Computerarchitektur, dann Assembler ... Es könnte ein paar Jahre dauern, also ...
Was Sie wirklich brauchen, ist Motivation und Geduld.
quelle
Was ich getan habe, was eine Hochsprache (Java) gelernt hat, hat sich dann, wie Sie, mehr für Niedrigsprachen und Hardware interessiert. Im primitivsten Zustand ist ein Computer Elektronik. Einsen und Nullen sind nur Zahlen für elektrische Ladungen (ein und aus). Als ich die Logik hinter den Prozessoren und das, was sich in einer Arithmetic Logic Unit befindet, zu verstehen begann, passten die Dinge wirklich zusammen.
Ich denke, Sie sollten Ihr Studium beginnenMit Dingen wie boolescher Logik (AND, OR, XOR usw.) können Sie dann kleine ALUs entwerfen und untersuchen, wie Speicher und Register in die Dinge eingehen. Lernen Sie danach eine Assemblersprache und Sie werden feststellen, wie eine Kompilierung funktioniert. Schon bald werden Hochsprachen langweilig! :) Ich mache nur Spaß. Es ist schön, wie alles zusammenpasst, und es sollte Spaß machen, es zu lernen. Sobald Sie dem Pfad der Neugierde folgen, werden Sie die Dinge in kürzester Zeit aufgreifen.
quelle
Während Sie mit C # oder Java (oder den meisten anderen Sprachen) einfache Aufgaben erledigen können, tun dies die meisten Leute nicht. Aus diesem Grund wird jedes recht beliebte Buch, das Sie in die Hand nehmen, Dinge auf niedriger Ebene auslassen. Sie decken wahrscheinlich die Sprachfunktionen ab, die Sie benötigen, wenden sie jedoch nicht so an, wie Sie es möchten. Ebenso werden Bücher über Low-Level-Sachen wahrscheinlich in C sein, vielleicht mit einer kleinen Assemblersprache.
Das Erlernen von C selbst wird für einen C # -Programmierer, abgesehen von der Zeiger-Manipulation, nicht schwierig sein, obwohl das Erlernen der darin enthaltenen Aufgaben länger dauert. Da C eine weniger ausdrucksstarke Sprache als C # ist, müssen einige Dinge, die Sie in C # effizient erledigen können, in C auf eine ganz andere und oft schwerfällige Weise erledigt werden.
Was Sie als nächstes suchen sollten, sind Bücher über die untergeordneten Dinge, die Sie lernen möchten. Es gibt zum Beispiel Bücher über den Linux-Kernel, aber die Kernel-Programmierung wird ohne Hintergrundwissen schwierig zu verstehen sein. Unter Umständen möchten Sie sich zuerst mit den Grundlagen des Betriebssystems befassen.
quelle
Sie müssen herausfinden, ob es möglich ist, die Low-Level-Funktion mit der verwendeten Plattform / Sprache auszuführen oder nicht:
Hm, klingt, dass die Auswahl einer Sprache zufällig sein sollte.
quelle
Die Frage hat mehrere Antworten: 1. Java und C # sind Hochsprachen, die für die Anwendungsentwicklung auf einem vorhandenen Betriebssystem entwickelt wurden, das den Speicher verwaltet (dies ermöglicht auch die Erstellung von Hybridprogrammen, die auf verschiedenen Systemen ausgeführt werden können). 2. Die Bereiche, in denen Low-Level-Programmierung erforderlich ist, sind Betriebssystementwicklung, Treiberentwicklung, AAA-Spieleentwicklung usw. Normalerweise wird Low-Level-Programmierung nicht in Java oder C # ausgeführt, sondern unter Verwendung von C / C ++ und der Assemblersprache.
Mit nur diesen zwei Punkten können wir sagen, dass die Low-Level-Programmierung separat durchgeführt wird und es bei der High-Level-Programmierung keine Notwendigkeit für Low-Level-Programmierung gibt. Die Teile, in denen eine niedrige Programmierstufe wie die E / A erforderlich ist, werden vom Interpreter ausgeführt, der selbst in einer niedrigen Programmiersprache geschrieben ist (zum Beispiel ist Javas JVM in C geschrieben).
Die Hauptantwort auf Ihre Frage ist, dass diese Dinge nicht mit Java und C # entwickelt werden. Diese Dinge werden in C und Assembly ausgeführt. Statt Möglichkeiten zu finden, dies in Java und C # zu tun, sollten Sie C und Assembly lernen, da dies die größten Typen von sind programmierung und ja der große vorteil ist, dass die in low level geschriebenen programme klein und schnell sind.
quelle