Search

Programmiersprachen: Durchstarten mit D - Golem.de - Golem.de

Wenn ich an die Programmiersprache D denke, fallen mir drei Wörter ein: leicht, schnell, ausdrucksstark. Passt zu meinem Auto.

Eine Anleitung von Dylan Graham
Der Autor des Textes ist ein Fan der Programmiersprache D.
Der Autor des Textes ist ein Fan der Programmiersprache D. (Bild: D Language Foundation/Montage: Golem.de)

Dieser Text ist eine Übersetzung. Das Original des Programmierers Dylan Graham ist hier zu finden.

Mein täglicher fahrender Begleiter ist ein Holden VZ Ute. Ich schätze ihn sehr, allerdings wurde er ab Fabrik mit einem sehr schlechten Viergang-Automatikgetriebe ausgestattet. Allein in den ersten 18 Monaten, die ich ihn hatte, habe ich vier Getriebe kaputtgemacht. Ein neues Fahrzeug konnte ich mir nicht leisten, also musste ich kreativ werden.

Ich kaufte ein solides Sechsgang-Automatikgetriebe eines anderen Autos, wusste aber erst mal nicht, wie ich das mit meinem eigenen Auto zusammenbringen sollte. Damit es funktionierte, musste ich meine eigene Leiterplatte, mein eigenes Computersystem und meine eigene Firmware bauen. Damit sollten die Magnetspulen, die Hydraulik und die Kupplungen im Getriebe gesteuert, Benutzereingaben verarbeitet, Schaltvorgänge umgesetzt und eine Schnittstelle zu meinem Auto geschaffen werden, die vorgeben sollte, eine Viergang-Automatik zu sein.

Ich habe für all das eine Lösung gefunden und bin ziemlich stolz darauf: Ein Schaltvorgang kann in 250 Millisekunden umgesetzt werden, was für schnelles Fahren großartig ist. Der erste Gang ist recht stramm, wodurch das Auto gut beschleunigt und mitunter selbst stärkere Autos abhängt. Es gibt eine Schaltwippen-Gangschaltung, Diagnosedaten auf dem Bildschirm und die Möglichkeit, alles neu einzustellen, wann immer ich will.

Hier ist ein sehr altes Video dazu. In dem aktuellen System ist der grässliche blaue Bildschirm nicht mehr da, der Tacho funktioniert und das Schalten ist besser geworden.

Der Rechner besteht aus zwei Teilen: der Platine für die Benutzeroberfläche, die ein OLED-Display ansteuert und einen STM32F042 verwendet, und der Hauptplatine, die alles andere übernimmt und einen STM32F407 hat. Beide arbeiten über einen CAN-Bus (Controller Area Network) zusammen. Die gesamte Firmware dafür ist in D geschrieben.

Ich habe mich für D (wie -besseresC) entschieden, weil es diese großartige einheitliche Funktionsaufruf-Syntax (Uniform Function Call Syntax, UFCS) hat, Metaprogrammierung ermöglicht und eine einfache Schnittstelle zu C bietet; außerdem habe ich es wegen der Unit-Tests, der Portabilität, wegen shared und @safe ausgesucht. Darüber hinaus gibt es eine sehr hilfsbereite, offene Community für die Sprache. Es war eine Freude, in den Foren über D zu diskutieren.

Die Vorteile von D

Die Uniform Function Call Syntax

Die UFCS hat meinen Code deutlich übersichtlicher gemacht. Er folgt genau dem Datenfluss, ohne meinen Stack mit temporären Variablen, verschachtelten Funktionsaufrufen oder anderem Kram zu belasten.

Hier ist zum Beispiel Code, den ich in meinem kommenden ECU-Projekt (Engine Control Unit) verwende:


  1. 1 immutable injectorTime = airStoich(100.kpa, 25.degCelsius)
  2. 2 .airMass
  3. 3 .fuelMass((14.7f).afr)
  4. 4 .fuelMol
  5. 5 .calculateInjectorWidth;

Diesen Code muss niemand rückwärts lesen, um ihn besser zu verstehen, es müssen keine Klammern gezählt oder Unmengen von Zwischenvariablen verwendet werden. Er ist einfach auf den Punkt.

Handbuch für Softwareentwickler: Das Standardwerk für professionelles Software Engineering

Metaprogrammierung

Viele Programmierer schwören auf das Don't Repeat Yourself-Prinzip (DRY). Die Metaprogrammierung von D ist ein tolles Tool, um das zu erreichen. Ich verwende es in meiner CAN-Bus-Implementierung, etwa so:


  1. 1 struct CANPacket(ushort ID) {
  2. 2 enum id = ID;
  3. 3 ubyte[8] data;
  4. 4 }
  5. 5 alias HeartbeatPacket = CANPacket!10;
  6. 6 alias BeepHornPacket = CANPacket!140;

Ich habe spezifische Alias-Typen wie HeartbeatPacket und BeepHornPacket, aber ich muss keinen Code wiederholen. Sie alle folgen der gleichen zugrundeliegenden Struktur. Wenn ich also CANPacket ändere, wird jeder Alias-Typ ebenfalls aktualisiert.

Schnittstellen zu C

Ich muss häufig mit dem HAL und dem RTOS meines Microcontrollers kommunizieren; mit der C-Schnittstelle von D ist das ganz einfach. Einfach extern(C) hinzugefügt und schon kann es losgehen.


  1. 1 extern(C) c_setPwm(int solenoid, void* userData); // declaration
  2. 2 c_setPwm(4, null); // usage, pretty easy!

Unit-Tests

Die eingebauten Unit-Tests von D haben mich ein paarmal gerettet. Ich kann alle Unit-Tests unter Windows laufen lassen, um die logische Korrektheit zu garantieren und dann für den Microcontroller ein Build-Ziel zu bauen.

Portabilität

Außerdem unterstützt D eine überraschend große Anzahl von Zielsystemen - über GDC und LDC. Wäre D nicht so portabel, hätte ich mein Projekt in C++ schreiben müssen (uff). Ich verwende LDC und das Cross-Compiling kann durch einfaches Anpassen meiner Kommandozeilenargumente durchgeführt werden.

Shared

Shared ist ein D-Sprachkonstrukt zum Umgang mit Multithreading-Zugriff auf Code. Es ist nicht perfekt, aber für mich funktioniert es gut. Ich habe mehrere Threads in meinem Programmcode und sie müssen Daten synchronisieren.

Ich markiere bestimmte Variablen als shared, was bedeutet, dass ich beim Zugriff auf diese Daten besondere Sorgfalt walten lassen muss. Das funktioniert ganz gut mit Systemsperren und Mutex.

Golem Akademie
  1. Python kompakt - Einführung für Softwareentwickler
    28.-29. Oktober 2021, online
  2. Advanced Python - Fortgeschrittene Programmierthemen
    16./17. September 2021, online
Weitere IT-Trainings

Während sie gesperrt ist, kann ich die Variable von der gemeinsamen Nutzung ausschließen und sie wie eine normale Variable verwenden. Das ist bei structs und Klassen praktisch.


  1. 1 shared int sensorValue;
  2. 2 sensorValue = 4; // using it like a single-thread variable, error
  3. 3 atomicStore(sensorValue, 4); // works with atomics

@safe

@safe dient dazu, fragwürdige Speicheraktivitäten zu unterbinden und ein optimales Speicherverhalten zu erzwingen. Ich hatte noch nicht viel mit @safe zu tun, weil ich nichts Schlimmes mit meinem Speicher anstelle. Es ist aber gut zu wissen, dass, wenn ich einen Fehler mache, der Compiler mir helfen kann, ihn zu beseitigen.

Handbuch für Softwareentwickler: Das Standardwerk für professionelles Software Engineering

Wenig Reibungsverluste

Adam D. Ruppe bringt es auf den Punkt: Mit D gibt es wenig "mentale Reibungsverluste". Die Flexibilität und Ausdruckskraft der Sprache machen es einfach, die eigenen Gedanken in geschriebenen Code zu übersetzen und die Produktivität hoch zu halten. Ich muss mit D nicht viel herumkämpfen, es ist für mich die Sprache, in der ich am produktivsten bin.

D ist die perfekte Lösung für diese Art von Projekten - ich denke, es wird eine große Zukunft in der Embedded-Welt haben. Ich werde D weiterhin für meine Projekte verwenden und arbeite bereits an einem weiteren D-betriebenen Autoprojekt, das ich hoffentlich bald vorstellen kann.

Auch interessant:

Adblock test (Why?)

Artikel von & Weiterlesen ( Programmiersprachen: Durchstarten mit D - Golem.de - Golem.de )
https://ift.tt/3z7EWfM
Wissenschaft & Technik

Bagikan Berita Ini

0 Response to "Programmiersprachen: Durchstarten mit D - Golem.de - Golem.de"

Post a Comment

Powered by Blogger.