/ Software-Entwicklung / Erlang/OTP 20 erschienen: Eine runde Nummer

Erlang/OTP 20 erschienen: Eine runde Nummer

Gerfried Steube on June 23, 2017 - 10:50 pm in Software-Entwicklung

Eine hohe Versionsnummer mag nicht zwingend die Reife einer Software ausdrücken, doch wenn wie bei Erlang/OTP 30 Jahre Entwicklungsgeschichte auf die neue Versionsnummer 20 treffen, dann spricht das schon für sich.

Das frisch erschienene Erlang-Release trägt die stolze Versionsnummer 20. Bei so hohen Zahlen ist keine Revolution mehr zu erwarten. Vielmehr strebt das Team rund um Erlang/OTP kontinuierlich eine höhere Qualität und und schrittweise Verbesserung an. So auch mit dieser Version. Eine der wichtigsten befindet sich dabei unter der Haube.

Erlang/OTP ist als Near-Realtime-Plattform gedacht: Scheduler verteilen die leichtgewichtigen Prozesse auf die virtuellen Kerne. Die Wechsel zwischen den Aufgaben werden mit sehr niedriger Latenz im unteren Millisekundenbereich durchgeführt. Solange sich der Code dabei in der reinen Erlang-Welt bewegt, funktioniert das wunderbar, ist jedoch für ein vollständiges System nicht hinreichend.

Kontakt zur Außenwelt

So kennt die Umgebung neben den reinen Erlang-Bibliotheken die sogenannten Built-in Functions (BIF), die nativ implementiert sind und die die Laufzeitumgebung zur Verfügung stellt. Zudem existieren die Natively Implemented Functions (NIF), in denen native C-Funktionen durch Erlang/OTP genutzt werden können. Jedoch halten sich diese nicht an das saubere Scheduler-Verhalten der Erlang-Prozesse. Im ungünstigen Fällen blockieren sie den Scheduler mehrere hundert Millisekunden. Das kann wiederum zu einem Scheduler-Kollaps führen, der seine Arbeit einstellen muss.

Die Macher haben dagegen im aktuellen Release eine Lösung gefunden, die aus zwei speziellen Thread-Gruppen betseht, jeweils für I/O- und für CPU-gebundene Aufgaben. Als dirty gekennzeichnete NIFs werden nun der jeweils für sie passenden Gruppe zugewiesen. Ohne die Arbeit der regulären Scheduler zu beeinflussen, reihen sie sich hier in die Schlange ausstehender Funktionsaufrufe ein. Während der aufrufende Prozess dabei blockiert ist, bleibt der entsprechende Scheduler frei für andere Prozesse. Nach entsprechender Ressourcenzuweisung werden die NIFs dann in ihrer jeweiligen Thread-Gruppe ausgeführt.

Ihr Status wechselt von schedule_dirty_io_nif respektive schedule_dirty_cpu_nif zu execute_dirty_nif. Ist dieser externe Aufruf abgeschlossen, wird sein Prozess wieder einem regulären Scheduler zugewiesen und kann dort seine Arbeit fortsetzen. Diese Fähigkeit steht nun voll auf der VM mit SMP-Unterstützung zur Verfügung, die Non-SMP-VM gilt als veraltet und wird regulär nicht kompiliert. Neben den NIFs nutzen auch die BIFs sowie das Garbage Collecting das Dirty Scheduling, und die Ausgabe von erlang:statistics/1 wurde um die Dirty Scheduler ergänzt.

Allerdings gibt es bezüglich NIFs nun auch eine Inkompatibilität: Das Nachladen von Modulen ist eine Stärke der Plattform, jedoch bei NIF Libraries nun nicht mehr möglich. Andere Inkompatibilitäten sind das Entfernen von erlang:hash/2 sowie einiger Module und Funktionen in Asn1.

Positive Entwicklungen

Die weiteren Änderungen sind jedoch, wie es sich für die hohe Versionsnummer gehört, positiv. Die in der Sprache wichtigen Literale werden beim Versand von Nachrichten nicht mehr teuer kopiert, und die Nutzung große ETS-Tabellen (Erlang Term Storage) konnte beschleunigt werden. Der Compiler übersetzt Guards nun besser in den darunterliegenden Code, und auch die noch jungen Maps reifen heran. Bei der mehrfachen Verwendung eines Key in einem Ausdruck wirft der Compiler neuerdings eine Warnung aus, was Flüchtigkeitsfehler verringert. Darüber hinaus hat das Team das Pattern Matching für Maps optimiert.

Für exotischen Code ist mit der Version 20 auch Unicode in Atoms erlaubt. Auch das string-Modul hat im Umgang mit Unicode eine starke Verbesserung erfahren. Weitere Pflege haben dict, orddict und gb_trees erhalten. Und für die Freunde von Zustandsautomaten gilt gen_fsm nun als offiziell als überholt (deprecated); Nachfolger ist das leistungsfähigere gen_statem.

Alles in allem haben die Entwickler solide Arbeit geleistet. Die Plattform Erlang/OTP bleibt ihrem Ruf als solide Laufzeitumgebung treu, Optimierungen sind behutsam aber stetig und der Funktionsumfang wächst nur dort, wo es benötigt wird. So kann es auch bis zur Version 30 und darüber hinaus weiter gehen. (rme)

Read more on: Source

Comments are disabled