Wie gehen Programmierer mit Low-Level-Softwareentwicklung in Hochsprachen um?

20

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?

fender1901
quelle
7
Ein Trick, um zu verstehen, was "unter der Haube" vor sich geht, besteht darin, sich zu konzentrieren und Absätze zu verwenden, um das Lesen und Verstehen der Dinge zu vereinfachen. Bitte bearbeiten Sie diese Frage, um sie besser lesen zu können.
S.Lott
1
Aufgrund Ihres Interesses möchten Sie vielleicht eine Kopie von Charles Petzolds Code: Die verborgene Sprache von Computerhardware und -software abholen. Es ist eine gute Lektüre. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S.Lott Zur Rettung :-)
Martin Wickman
@Martin Wickman: Hat es @ fender1901 bei der Bearbeitung oder Fokussierung geholfen, während sehr gute Arbeit geleistet wurde?
S.Lott
1
@ Martin Wickman: Änderungen rückgängig zu machen ist nicht der Punkt. Es ist mein Punkt, andere zum Lernen zu ermutigen. Du weißt es eindeutig schon. @fender1901 muss dabei lernen. Meine Frage lautet: "Hat es @ fender1901 geholfen, zu bearbeiten oder zu fokussieren?" Was denkst du?
S.Lott

Antworten:

9

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

Martijn Verburg
quelle
Können Sie tatsächlich mit den Zwischensprachen programmieren oder sind sie nur zum Überprüfen da?
Fender1901
Fragen Sie sich, ob Sie 'Bytecode'-Quellcode schreiben können?
Martijn Verburg
Ich glaube. Ich frage mich, ob Sie einfach anfangen können, mit Bytecode oder so zu codieren, wie Sie es mit Java oder C # tun würden.
Fender1901
Ob Java oder C #, nur sehr wenige Menschen befassen sich mit der Manipulation von Bytecode. Eine größere Gruppe von Menschen untersucht jedoch, auf welchen Bytecode sich ihr Code auf höherer Ebene beschränkt
Martijn Verburg,
4

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 ioctlFunktion 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 SocketObjekt 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.

Charles Salvia
quelle
2

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.

Paweł Dyda
quelle
2

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.

Trevor Arjeski
quelle
2

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.

David Thornley
quelle
Ich denke, mein größtes Problem im Moment ist, dass viele dieser Themen schwer zu verstehen sein werden, weil ich nicht den Hintergrund habe. Ich brauche wohl eine Brücke in diese Gebiete.
Fender1901
@fender1901: Das könnte ein Problem sein. Der Linux-Kernel macht einige Dinge, die für jemanden, der nicht versteht, was Betriebssysteme tun, wirklich seltsam aussehen würden. Der Emulator von den Dingen, die Sie erwähnt haben, ist wahrscheinlich am einfachsten zu verstehen, und es gibt einfache Emulatoren, häufig für frühe Mikrocomputer.
David Thornley
1

Sie müssen herausfinden, ob es möglich ist, die Low-Level-Funktion mit der verwendeten Plattform / Sprache auszuführen oder nicht:

  • Speichern eines Bytes in einer Variablen,
  • Dateien byteweise lesen / schreiben,
  • Einrichten eines Bytearrays, Zugreifen auf Elemente,
  • Verwenden Sie echte prozedurale Funktionen, OOP,
  • Zugriff auf Bildschirm, Tastatur und Anschlüsse.

Hm, klingt, dass die Auswahl einer Sprache zufällig sein sollte.

ern0
quelle
-2

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.

mur2501
quelle
dies scheint nicht zu bieten alles wesentliche über gemacht Punkte und erläutert vor 6 Antworten , die vor einigen Jahren geschrieben wurden
gnat