Wie ist die Vertrautheit mit dem LLP an der ITMO University: der Kurs "Low-Level-Programmierung"


Published on October 03, 2018

Wie ist die Vertrautheit mit dem LLP an der ITMO University: der Kurs "Low-Level-Programmierung"


    Die beliebtesten Programmiersprachen sind Hochsprachen. Zum Beispiel Java, Python oder C #. Natürlich ist es möglich, darauf zu programmieren und nur schwach darzustellen, wie verschiedene Abstraktionsebenen tatsächlich funktionieren. Für einen guten IT-Spezialisten ist es jedoch wichtig zu verstehen, wie die Plattform organisiert ist, mit der er interagiert, wie die Entwicklungsumgebung, der Compiler und der Debugger funktionieren. Dies führt dazu, dass wir über Low-Level-Programmierung sprechen.

    LLP (Low-Level-Programmierung) ist eine bequeme Methode, um zuverlässige, schnelle, kompakte und effiziente Programme zu schreiben. Unsere Schüler lernen Assembler und C in erster Linie, um die Funktionsweise von Software besser zu verstehen.

    Foto von Pablo BD CC BY-SA

    Warum musst du wissen?


    Die IT-Branche entwickelt sich rasant und unterliegt Modetechnologien und -sprachen. Grundlegende Konzepte - zum Beispiel Rechenmodelle, virtueller Speicher, Kompilierung und Programmassemblierung - ändern sich viel seltener. Wenn Sie wissen, wie sich die Grundprinzipien solcher Konzepte in einer einzigen Programmiersprache manifestieren, können Sie schnell eine ähnliche Sprache lernen, wenn dies für die Arbeit erforderlich ist. LLP macht in diesem Fall deutlich, wie das Programm aus dem Quelltext zu einem Satz von Maschinenbefehlen wird und wie diese auf dem Computer ausgeführt werden. Die Kenntnis der Mechanismen der Speicherverwaltung und der Prinzipien des Compilers wird wiederum dazu beitragen, Code zu schreiben, der weniger Rechenressourcen erfordert.

    Klarstellung:Wir müssen uns oft mit der These befassen, dass LLP nur Hardware-Programmierung und ähnliche Aufgaben ist. Es ist nicht so.

    Wo finde ich LLP in der Praxis:

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

    • Robotik . Die Rechenressourcen sind hier begrenzt, daher sind die Anforderungen an Softwarequalität und Code-Kompaktheit hoch. Konventionelle Softwareentwicklungsansätze funktionieren hier nicht immer und oft kann die Entwicklung in C oder einer anderen Systemsprache erfolgen.

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

    Wie wir uns darauf vorbereiten


    Unsere Schüler der Richtungen 09.03.01 "Informatik und Computertechnik" und 09.03.04 "Software Engineering" studieren eine Reihe von Disziplinen, die mit der Low-Level-Programmierung zu tun haben. Dies sind Betriebssysteme, Systemsoftware (auch in der Unix-Umgebung), Entwicklung von Compilern, Virtualisierungstechnologien usw. Der

    Ausgangspunkt ist der Kurs „Low Level Programming“. Hier müssen die Schüler mit Assembler und C arbeiten. Parallel dazu lernen sie das Kompilieren und Ausführen von Programmen. Der Kurs hat das Format "von 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 verändert:

    • Code schreiben;
    • Vorverarbeitung und Kompilierung;
    • verknüpfen;
    • Ausführung und Debugging.


    Foto hackNY.org CC BY-SA

    Von Studenten, die an dem Kurs teilnehmen, erwarten wir minimale Programmiererfahrung in Hochsprachen (beispielsweise Java oder C #). Und empfehle folgende Online-Kurse:


    Der Kurs „Low-Level-Programmierung“ wird hauptsächlich von einem Buch gelesen , das speziell für unsere Studenten geschrieben wurde. Das Buch wird auf Englisch veröffentlicht und in Japanisch und Portugiesisch übersetzt. Wir arbeiten auch häufig mit dem Handbuch für Intel64-Softwareentwickler und System V AMD64 ABI.

    Was ist im Kurs?


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

    • Das Schreiben von Code . Dies bedeutet fließend Assembler für Intel 64 (NASM, Linux) und C11. Hier untersuchen wir Rechenmodelle und geben ausführliche Empfehlungen zur Schreibweise von Code.

    • Vorverarbeitung und Kompilierung . Die NASM- und C-Vorprozessoren werden untersucht, formale Grammatiken sind üblich, die Optimierung des allgemeinen Codes durch den Compiler sowie die Mechanik einer typischen Implementierung von C-Konstrukten auf Assembler-Ebene (mit anderen Worten, die Demonstration der Idee, dass C ein Assembler auf hoher Ebene ist).

    • 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 genau tun. Übrigens war dazu ein eigener Minikurs gewidmet.

    • Führen Sie das Programm aus und debuggen Sie es . Hier verstehen wir, wie diese Aufgaben mit der Computerarchitektur, dem virtuellen Speichergerät und dem privilegierten Modus, Interrupts und Systemaufrufen zusammenhängen. Darüber hinaus prüfen wir, wie gdb verwendet wird (ein leistungsfähiger Debugger, mit dem Sie in jedes Programm "hineinschauen" können).

    Wichtige organisatorische Nuancen


    Wir unterbrechen Vorlesungen, indem wir Code zusammenschreiben und kompilierte Dateien mit Tools von binutils (objdump, readelf) oder gdb untersuchen. Während der Vorlesung (und nicht nur) stellen die Schüler in einem berühmten Kurier Fragen sowohl verbal als auch in den Kanal des Kurses und werden von den Lehrern so schnell wie möglich beantwortet.

    In der praktischen Ausbildung führen die Studenten 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 des Roboters, ein Compiler usw.).

    Daher können die Schüler als Ersatz für die Prüfung ein individuelles Projekt zu dem mit dem Lehrer vereinbarten Thema erstellen. Nachdem sie die Codeüberprüfung durchlaufen und auf GitHub veröffentlicht haben, nehmen sie ein Video auf, das das Projekt demonstriert. (Dieser Kanal enthält Projekte, die seit 2014 implementiert wurden, Links zu GitHub sind in der Beschreibung enthalten).

    Beispiel eines Kursteilnehmers: analoges Levitron (eine detaillierte Geschichte über das Projekt auf Habré )

    Einige andere Projekte, die auf Basis des Kurses abgeschlossen wurden:



    Über den Lehrer


    Während des Kurses interagiert ein ganzes Team von Lehrern mit Schülern, die Vorlesungen halten, im Labor arbeiten und die Schüler beraten. Ältere Studenten nehmen an Diskussionen teil und helfen den derzeitigen Studenten, die Feinheiten des Low-Level-Programms zu verstehen.

    Die Hauptarbeit an der Vorbereitung der Materialien für den Kurs wurde von Igor Zhirkov, dem Autor des Lehrbuchs, gemacht. Igor hat an der ITMO University und der Academic University studiert und im Jahr 2016 einen Master in ITMO gemacht. Seine Interessengebiete sind Typentheorie, mathematische Logik, Programmiersprachen und Low-Level-Programmierung. Sein aktuelles Hauptprojekt betrifft die formale Verifizierung von C-Refactorings mit Coq und dem CompCert Verified C-Compiler.



    Dieser Kurs hilft zu lernen, wie man eine Aufgabe von einem angemessenen Abstraktionsniveau aus betrachtet und, wenn wir sagen, bedingt, nicht versuchen, "Webanwendungen in Assembler zu schreiben". Wir versuchen, das Studium von C und Assembler in Bezug auf das Verständnis der mit diesen "Tools" verbundenen Konzepte und ihrer Umgebung - Betriebssysteme und CPUs - zu untersuchen.

    Übrigens finden wir hier ein Buch, das vom Unterricht dieses Kurses inspiriert wurde (es wurde auf Englisch, Japanisch und Portugiesisch veröffentlicht).