Wie ist die Bekanntschaft mit LLP an der ITMO University: der Kurs "Low-Level Programming"

Die beliebtesten Programmiersprachen sind Hochsprachen. Zum Beispiel Java, Python oder C #. Natürlich können Sie darauf programmieren und sich schlecht vorstellen, wie die verschiedenen Abstraktionsebenen tatsächlich funktionieren. Für einen guten IT-Spezialisten ist es jedoch wichtig zu verstehen, wie die Plattform, mit der er interagiert, aufgebaut ist, wie die Entwicklungsumgebung, der Compiler und der Debugger funktionieren. Dies führt uns dazu, über Low-Level-Programmierung zu sprechen.

LLP (Low-Level-Programmierung) ist eine bequeme Methode, um herauszufinden, wie zuverlässige, schnelle, kompakte und effiziente Programme geschrieben werden. Unsere Schüler lernen Assembler und C in erster Linie, um ein besseres Gefühl für die Funktionsweise der Software zu bekommen.

Foto Pablo BD CC BY-SA

Warum müssen Sie wissen


Die IT-Branche entwickelt sich rasant und unterliegt einer Mode für Technologie und Sprachen. Grundlegende Konzepte - zum Beispiel Rechenmodelle, virtueller Speicher, Kompilierung und Programmzusammenstellung - ändern sich viel seltener. Wenn Sie verstehen, wie sich die Grundprinzipien solcher Konzepte in einer Programmiersprache manifestieren, können Sie schnell eine ähnliche Sprache lernen, wenn Sie sie zum Arbeiten benötigen. In diesem Fall macht LLP deutlich, wie das Programm aus dem Quelltext zu einer Reihe von Maschinenanweisungen wird und wie diese auf dem Computer ausgeführt werden. Wenn Sie mit den Speicherverwaltungsmechanismen und den Prinzipien des Compilers vertraut sind, können Sie Code schreiben, der weniger Rechenressourcen beansprucht.

Klarstellung: Wir müssen oft auf die These stoßen, dass LLP nur Eisen und ähnliche Aufgaben programmiert. Es ist nicht so.

Wo finde ich LLP in der Praxis:

  • Handel Der Handel an der Börse stellt Programme mit unglaublich hohen Anforderungen an die Reaktionszeit auf Marktschwankungen. Aufgrund der „Entfernung“ von Hochsprachen von „Hardware“ ist es sehr schwierig, die Reaktionszeit eines Programms auf ein externes Ereignis vorherzusagen. Daher ist LLP hier beteiligt, um die Geschwindigkeit von Transaktionen zu steuern.

  • Robotik . Die Rechenressourcen sind hier begrenzt, daher sind die Anforderungen an Softwarequalität und Codekompaktheit hoch. Die hier allgemein akzeptierten Ansätze zum Erstellen von Software funktionieren nicht immer und oft kann die Entwicklung in C oder einer anderen Systemsprache erfolgen.

  • Systemsoftware . Dies sind Betriebssysteme, Compiler (JIT, AOT) und Browser (heute sind sie eine Plattform zum Erstellen komplexer Anwendungen geworden). Seine Arbeit fällt dem Laien nicht immer auf, sondern schafft eine Infrastruktur für Anwendungssoftware.

Wie bereiten wir uns darauf vor?


Unsere Studenten der Richtungen 09.03.01 "Informatik und Computertechnik" und 09.03.04 "Software Engineering" studieren eine Reihe von Disziplinen im Zusammenhang mit Low-Level-Programmierung. Dies sind Betriebssysteme, Systemsoftware (einschließlich Unix), Compilerentwicklung, Virtualisierungstechnologien usw.

Ausgangspunkt - Kurs "Low-Level-Programmierung". Hier warten die Schüler auf die Arbeit mit Assembler und C. Parallel dazu untersuchen sie den Prozess des Kompilierens und Ausführens von Programmen. Der Kurs hat das Format "Vom Einstellen der Aufgabe bis zum fertigen Programm". Das Hauptziel des Kurses ist es, eine Vorstellung davon zu bekommen, wie sich die Präsentation des Programms während der Übergänge zwischen:

  • Code schreiben;
  • Vorverarbeitung und Zusammenstellung;
  • Verknüpfen
  • Ausführung und Debugging.


Foto hackNY.org CC BY-SA

Von Studenten, die an dem Kurs teilnehmen, erwarten wir nur minimale Programmiererfahrung in Hochsprachen (z. B. Java oder C #). Wir empfehlen folgende Online-Kurse:


Der Kurs "Low-Level-Programmierung" wird hauptsächlich aus einem Buch unterrichtet , das speziell für unsere Schüler geschrieben wurde. Das Buch wird auf Englisch veröffentlicht und ins Japanische und Portugiesische übersetzt. Wir arbeiten auch häufig mit dem Intel64-Softwareentwicklerhandbuch und System V AMD64 ABI.

Was ist in dem Kurs


In einfachen Worten kann dieser Kurs wie folgt detailliert beschrieben werden (in Bezug auf die oben genannten Themen):

  • Rechtschreibcode . Nehmen Sie eine freie Assemblersprache für Intel 64 (NASM, Linux) und C11 an. Hier untersuchen wir Rechenmodelle und geben erweiterte Empfehlungen zum Schreiben von Code.

  • Vorverarbeitung und Kompilierung . Die NASM- und C-Präprozessoren werden untersucht, formale Grammatiken, allgemeine Codeoptimierungen durch den Compiler und die Mechanik einer typischen Implementierung von C-Sprachkonstruktionen auf Assembler-Ebene (mit anderen Worten, eine Demonstration der Idee von "C ist ein Assembler auf hoher Ebene") angesprochen.

  • Verknüpfen (Verknüpfen) . Statisch und dynamisch. In der Praxis wird das ELF-Format untersucht - die Schüler untersuchen, was der Linker und der dynamische Lader tun. Hierfür war übrigens ein separater Minikurs vorgesehen.

  • Ausführen und Debuggen eines Programms . Hier verstehen wir, wie diese Aufgaben mit der Architektur des Computers, dem virtuellen Speichergerät und dem privilegierten Modus, den Interrupts und dem Systemaufrufmechanismus zusammenhängen. Darüber hinaus überlegen wir, wie gdb verwendet wird (ein leistungsstarker Debugger, mit dem Sie jedes Programm "unter die Haube schauen" können).

Wichtige organisatorische Nuancen


Wir unterbrechen die Vorlesungen, indem wir gemeinsam Code schreiben und kompilierte Dateien mit Tools von binutils (objdump, readelf) oder gdb studieren. Während der Vorlesung (und nicht nur) stellen die Schüler Fragen sowohl mündlich als auch im Kanal des Kurses in einem bekannten Boten, und die Lehrer beantworten sie so schnell wie möglich.

Als praktische Lektion führen die Schüler Laborarbeiten durch. Manchmal möchten Schüler im Lernprozess etwas Eigenes entwickeln, das für sie persönlich interessant ist (ein Spiel, ein Programm zur Steuerung eines Roboters, eines Compilers usw.).

Als Ersatz für die Prüfung können die Schüler daher ein individuelles Projekt zu einem mit dem Lehrer vereinbarten Thema durchführen. Nach einer Codeüberprüfung und Veröffentlichung auf GitHub zeichnen sie ein Video auf, das das Projekt demonstriert (dieser Kanal enthält Projekte, die seit 2014 implementiert wurden, Links zu GitHub finden Sie in der Beschreibung).

Ein Beispiel für die Arbeit eines Schülers: Analoges Levitron (eine detaillierte Geschichte über das Projekt auf Habr )

Einige andere Projekte, die am Ende des Kurses abgeschlossen wurden:



Über den Lehrer


Während des Kurses interagiert ein ganzes Team von Lehrern mit Schülern, die Vorlesungen halten, Laborarbeiten durchführen und Schüler beraten. Ältere Studenten nehmen an Diskussionen teil und helfen aktuellen Kursteilnehmern, die Feinheiten der Programmierung auf niedriger Ebene zu verstehen.

Die Hauptarbeit zur Vorbereitung der Materialien für den Kurs wurde von Igor Zhirkov geleistet, dem Autor eines Lehrbuchs darüber. Igor studierte an der ITMO University und der Academic University und erhielt 2016 einen Master in ITMO. Sein Interessengebiet ist Typentheorie, mathematische Logik, Programmiersprachen und Low-Level-Programmierung. Sein aktuelles Hauptprojekt bezieht sich auf die formale Verifizierung des Refactorings der C-Sprache mit Coq und dem verifizierten CompCert-Compiler für C.



In diesem Kurs lernen Sie, wie Sie ein Problem von einer angemessenen Abstraktionsebene aus betrachten und beispielsweise unter bestimmten Bedingungen nicht versuchen, "Webanwendungen in Assembler zu schreiben". Wir versuchen, uns der Untersuchung von C und Assembler zu nähern, um die Konzepte zu verstehen, die mit diesen „Tools“ und ihrer Umgebung verbunden sind - Betriebssysteme und CPUs.

Übrigens finden Sie hier ein Buch, dessen Schreiben von der Lehre dieses Kurses inspiriert wurde (es wurde in Englisch, Japanisch und Portugiesisch veröffentlicht).

Source: https://habr.com/ru/post/de425249/


All Articles