Software

Anwendungen und Tools rund um RISC OS

Alte Spiele, neues ADFFS

Jon Abbott hat das Release der neuesten Version von ADFFS, 2.55 beta, verkündet (hier das passende JASPP-Forum-Posting dazu mit allen Details).

Was ADFFS macht und kann, habe ich in einigen früheren Blogposts schon beschrieben.

Was gibt’s neues? Es ist das erste Release, das den Fokus auf den Raspberry Pi legt – das Original, also nicht die Versionen 2 und 3, da sich ADFFS zunächst um die Emulation auf ARMv5-Plattformen (also eben jenem Raspberry Pi 1 (A, B, B+, Zero) und quasi nebenbei als Abfallprodukt auch dem IYONIX pc) kümmert. ARMv7-Unterstützung ist rudimentär enthalten, hat aber noch viele Einschränkungen.

Voraussetzung für die neue ADFFS-Version ist eine aktuelle Version von RISC OS 5, namentlich 5.23 nach dem 6. April 2016, und zwar ein unveränderter Build mit High-Vector-Semantik und relocated zero page. Das gilt logischerweise nicht für die auch weiterhin unterstützten klassischen Plattformen wie Archimedes und Risc PC, da tut es jede alte schäbige RISC OS-Version.

Der “Game Count”, also die Zahl lauffähiger Spiele, liegt nun bei beeindruckenden 130 – vermutlich werden selbst eingefleischte RISC OS-Nutzer Probleme haben, mehr als 50 Spiele für die Plattform zu benennen. Im Rahmen des JASPP-Projekts wurden weitere 17 Spiele zum freien Download veröffentlicht, hauptsächlich alte Minerva-Titel aus den 80ern, aber auch ein paar bekanntere Spiele von den Portiermeistern von Krisalis (Lemmings 2, Manchester United, Pipe Mania).

Besonders die nun sauber unterstützten 50Hz-Modi (auch auf dem Pi, wenn der Monitor/Fernseher mitspielt) und die vielen Verbesserungen im Sound-Bereich lassen auf erhöhten Spielspaß hoffen. Vielleicht dann auch demnächst auf den ARMv7-Plattformen.

JavaScript-JIT für Otter und QupZilla

Die Portierung von Qt5 durch Lee Noar, die die Basis für Qt5WebKit und damit die Portierungen von Otter und QupZilla durch Chris Gransden ermöglichte, steht vor dem nächsten großen Schritt. Bisher konnte die JavaScript-Engine nur im Interpreter-Modus betrieben werden. Neben dem offensichtlichen Performance-Problem war auch zu sehen, dass der Interpreter-Modus eine Menge mehr Bugs und Unschärfen hatte, schlicht weil die anderen Plattformen ihn nicht (mehr) verwenden.

Nun ist es Lee Noar gelungen, die Probleme der JavaScript-JIT-Engine weitgehend zu beheben (für Detalverliebte: Revision 7074 im GCCSDK-SVN-Repo), wie Chris Gransden mitteilt. Sogar aufwändige JavaScript-basierte Seiten wie OpenStreetMap.org scheinen nun – genügend CPU-Power vorausgesetzt (Cortex-A15 empfohlen…) – anständig zu funktionieren. Zweifellos ein großer Schritt für die RISC OS Browsing Experience.

Testversionen sollen demnächst zur Verfügung stehen.

RISC OS Remote per VNC

Wer mehrere Rechner betreibt, wird früher oder später mit dem Thema “Remote Desktop” konfrontiert werden, also der Möglichkeit, auf einem Rechner den Desktop eines anderen Rechners im Netzwerk anzuzeigen. Einzige Ausnahme dürfe die Linux-Kommandozeilen-Fraktion sein, die mit einer ssh-Shell auskommt.

Prinzipiell gibt es drei Technologien, die Remote Desktop erlauben: RDP (“Remote Desktop Protocol”) aus der Microsoft-Ecke, X Window System als grundsätzlich netzwerkfähiges Fenstersystem auf unixoiden Systemen und VMS sowie last but not least VNC (“Virtual Network Computing”, Open Source seit 1998) als plattformübergreifende Lösung aus der Zeit, als man NCs für das nächste große Ding hielt. Die Historie und Details dieser Technologien soll hier nicht Thema sein, wer Lust hat kann da ein paar Stunden Wikipedia-Recherche betreiben.

Clients für die verschiedenen Technologien gibt es für RISC OS schon sehr lange – Avalanche von James Peacock ist der vermutlich beste VNC-Client gefolgt von ViNCe von Vincent Lefevre. VNCViewer von Leo White ist leider nicht 32bit-fähig, genauso wenig wie !VNC von Simon Truss. Für RDP ist der RDPClient von Andrew Sellors das Mittel der Wahl. Auch X-Server (ja, beim X Window System ist die Terminologie “Client” und “Server” durchaus erklärungsbedürftig…) gab es vereinzelt, eine ultrateure Kaufsoftware von Gnome (nein, nicht der GNU Object Model Environment-Desktop), etwas eher experimentelles von Vincent Sanders und schließlich RiscX von Leo White – allesamt älteren Datums und nicht 32bit-fähig.

Sehr viel dünner sieht es auf der Server-Seite aus. Anno 2002 gab es einen VNC-Server von Henrik Bjerregaard Pedersen (Autor von ProSound, StudioSound und CineWorks), der aber sehr experimentell und langsam war und den ich zudem nie richtig ans Laufen brachte. Dieser Server wurde inzwischen gründlich überarbeitet, zunächst von David Llewellyn-Jones und schließlich von Jeffrey Lee.

Und tatsächlich ist es mir mit der neuesten Version 0.13 von Jeffrey endlich gelungen, RISC OS einigermaßen vernünftig remote bedienbar zu machen, zunächst mal (damit es nicht an der Hardware scheitert) meinen ARMX6. Versuche mit Raspberry Pi (2) und PandaBoard ES werden folgen.

Was sind die Stolperfallen? Die Performance ist bescheiden, weil RISC OS keine vernünftige Schnittstelle hat, um Interessenten mitzuteilen, was sich denn auf dem Bildschirm geändert hat (Jeffrey Lee hat in diesem Thread im RISC OS Open-Forum angedeutet, dass er hier Verbesserungen anstrebt). Es wird letztlich immer direkt in den Framebuffer geblittet. Und so muss der VNC-Server den Framebuffer auf Änderungen scannen, was logischerweise nicht besonders effizient ist. Deshalb sollte man unterstützend eingreifen und einen Bildschirmmodus mit geringer Farbtiefe wählen (256 Farben bieten sich an). Der Redraw-Performance hilft es, wenn das Pinboard einfarbig ist, weil dann viel weniger Daten übertragen werden müssen.

Interessant ist, dass die verschiedenen VNC-Viewer, die ich unter Windows ausprobiert habe, ganz unterschiedlich gut mit dem RISC OS-VNC-Server harmonierten. TightVNC, den ich bisher für VNC unter Windows und Linux verwende, wollte überhaupt nichts darstellen, sondern stürzte direkt ab nach Eingabe des Passwortes. UltraVNC, normal meine zweite Wahl, verhielt sich sehr komisch bezüglich der Darstellung des Mauszeigers und hinterließ manchmal die schwarze Silhouette des Mauszeigers irgendwo auf dem Schirm. RealVNC, eigentlich das Original, ist inzwischen mehr oder weniger Kaufsoftware geworden – vor dem Download “darf” man erst mal ein paar persönliche Daten eingeben, um dann herauszufinden, dass die Software “for time limited evaluation only” ist. Als Alternativen habe ich jetzt TurboVNC und TigerVNC getestet, die beide sehr gut funktionieren, bei TurboVNC ist das Fullscreen-Handling aber deutlich besser. Also bekommt TurboVNC hier meine Empfehlung.

Ein Problem sind die drei Maustasten. Es ist mir nicht gelungen, einen Viewer so zu konfigurieren, dass er schlicht die drei Tasten meines Laptop-Touchpads durchreicht. Also braucht man Notlösungen. Ich habe dazu unter RISC OS 3rdButton von Thomas Milius installiert, in einer leicht gepatchten Form von Raik Fischer um nicht die Windows-Popup-Menü-Taste (die es auf meiner Laptop-Tastatur nicht gibt) sondern die rechte Strg-Taste als Menütaste umzukonfigurieren. Ich hatte kurz versucht, einfach auf die rechte Maustaste (aka “Adjust”) zu verzichten und im VNC-Server den Modus “zweite Maustaste ist die Menütaste” über vncserv_swap_adjust_menu 1 zu aktivieren. Aber ich habe schlicht festgestellt, dass ich ständig die rechte Maustaste verwende, insbesondere bei der Navigation durch Filer-Fenster.

Insgesamt bin ich mit der Lösung jetzt recht zufrieden, sie scheint besser zu funktionieren als über einen PC mit RPCEmu oder Virtual-RPC in Verbindung mit VNC unter Windows – RDP ist hier keine Option, weil merkwürdigerweise beide Emulatoren darüber nicht funktionieren. So richtig Spaß macht die Bedienung von RISC OS über Remote noch nicht, aber da setze ich meine Hoffnungen auf Jeffrey.

Und wer das Mausbutton-Problem besser gelöst bekommt, mag mir bitte eine Mail schreiben!

Connector-Comeback

Es war Anfang der Neunziger. Die ersten postzugelassenen Modems zu moderaten Preisen kamen auf den Markt – man wollte sich ja nicht auf die schiefe Bahn begeben durch den Betrieb dieser höchst illegalen Import-Modems – und so erstand ich ein Telejet 2400. 2400bps, MNP5, und ein wirklich schön klackerndes Relais für die damals übliche Pulswahl.

Auf dem A3000 war es gar nicht so einfach, ein anständiges (und am besten kostenloses) Terminal-Programm zu finden. Es gab Grapevine, das hatte nur partiell eine WIMP-Oberfläche für das Telefonbuch und Datei-Upload und -Download, aber die eigentliche Terminal-Emulation fand im Fullscreen statt. Und zur Dateiübertragung gab es auch nur XModem. ARCterm 3 gab es noch, lief aber nur begrenzt gut. Ich fing damit an, ein eigenes Terminal-Programm namens “LambdaComm” zu schreiben, wurde aber nie fertig. Es gab eine partielle ANSI-/VT100-Emulation und XModem/YModem sowie die Anfänge von ZModem.

Eine Zeitlang ärgerte ich mich noch mit ZAnsi rum, kaufte dann frustriert die “RISCOS Terminals+”. Aber dann kam die Erlösung aus deutschen Landen: Andreas Zieringer veröffentlichte den Connector, ein großartiges Terminalprogramm. Flexibel, mit ZModem, und kompetenter ANSI-/VT100-/VT102-Terminal-Emulation. Und sogar CEPT für die letzten Zuckungen von BTX.

Irgendwann kam die Zeit des Internets, und Terminal-Programme wurden nur noch selten gebraucht – in meinem Falle eigentlich nur, um beim ZyXEL-ISDN-TA per XModem eine neue Firmware hochzuladen. Konsequenterweise gab es auch nie eine 32bit-Version für den IYONIX pc. Aber mit dem BeagleBoard änderte sich plötzlich die Lage – es gab einen seriellen Port, der für Debugzwecke sehr gut geeignet ist (z.B. während des Boot-Prozesses, um Ausgaben zu erhalten bevor der Bildschirm hell wird). Und um den Output zu verarbeiten, käme ein Terminal-Programm natürlich gerade recht.

Nun schreiben wir 2016, und es ist passiert: Connector feiert sein Comeback. Ich weiß nicht ob das irgendwo verkündet wurde, ich habe es beim routinemäßigen Lesen der CVS-Historie bei RISCOS Open Ltd. bemerkt. Ab sofort ist im “Bonus Binaries”-Download Connector mit an Bord.

Es werden zusätzlich die “Serial Blockdrivers” benötigt. Ggf. auch noch der Blockdriver für den Pi.

RISC OS-Projekte: Ein kompetenter BASIC-Compiler

Im RISC OS Open-Forum läuft gerade eine Diskussion zum Thema BBC BASIC und der Verfügbarkeit von BASIC-Compilern. Eigentlich trage ich mich schon länger mit dem Gedanken, einen Blog-Eintrag mit dem Thema “BBC BASIC – Fluch und Segen für RISC OS” zu verfassen. Die Diskussion hat mich nun dazu motiviert, weniger negativ (“Fluch”) über die Sache zu denken, sondern die Chancen darin zu sehen.

In der RISC OS-Welt hat BBC BASIC eine besondere Stellung. Vom BBC Micro über den Acorn Archimedes bis zum neuesten Titanium oder Raspberry Pi steckt der BBC BASIC-Interpreter überall standardmäßig drin. Die Handbücher früher beschrieben ausführlich den Einstieg in die Programmierung mit BBC BASIC. Letztlich war also BBC BASIC für viele RISC OS-Benutzer der erste Kontakt mit Softwareentwicklung. Jemand, der für RISC OS programmiert und nicht BBC BASIC kennt, ist quasi undenkbar.

Regelmäßig auftauchende Fragen sind: Ich habe BBC BASIC nun gemeistert, wohin als nächstes? Ich will ein komplexes Stück Software entwickeln, BBC BASIC erscheint mir dafür nur begrenzt geeignet, was verwende ich stattdessen? Unglücklicherweise gibt es unter RISC OS mehr oder weniger nur eine Antwort: C. Mit Einschränkungen auch C++. Alternativen mit Exoten-Status sind Lua und Charm. Das war’s dann aber.

Nach meiner Erfahrung gibt es nur wenige, die den Sprung von BBC BASIC nach C vollziehen – zu unterschiedlich die Konzepte, die Syntax, dazu die Umstellung vom Interpreter zum Compiler. Man profitiert eben kaum von seiner gesammelten Erfahrung mit BBC BASIC.

Nun ist es leider so, dass der BBC BASIC-Interpreter noch stark in den 80ern verhaftet ist. Der leistungsfähigste unterstützte Datentyp ist das Array. Strings sind auf 255 Zeichen Länge limitiert (und single byte encoding natürlich). Records kann man nur quasi-händisch über Speicherblocks simulieren. Die Abstraktionsmöglichkeiten enden bei den Konstrukten Prozedur und Funktion. Die Verwendung von C-Bibliotheken ist faktisch nur möglich, wenn diese in ein Modul mit SWI-Interface überführt werden. Unnötig zu erwähnen, dass man keine RISC OS-Module in BASIC schreiben kann. Dazu die typischen Interpreter-Probleme wie suboptimale Performance und fehlender globaler Syntaxcheck – besonders lustig, wenn man im Error-Handler einen Syntaxfehler eingebaut hat.

Könnte man den BBC BASIC-Interpreter denn erweitern? Bisherige Erfahrungen zeigen: sehr schwierig, vor allem wenn man die Rückwärtskompatibilität erhalten will. Basalt von Steve Drain versucht sich an diversen Erweiterungen, m.E. aber mit syntaktisch schwer verdaulichem Ergebnis.

Ausgehend von diesen Überlegungen rege ich (nach dem großen Erfolg der Ideen “Ein kompetenter Browser” und “Qt portieren”) die Entwicklung eines BASIC-Compilers an. Das Potenzial der vielen kundigen BBC BASIC-Codern wird im Moment verschleudert durch die vielen Einschränkungen des Interpreters.

Wie könnte man dieses Projekt angehen? Am besten nicht nach der typischen RISC OS-Art, unter Vermeidung aller “not-invented-here”-Komponenten eine 100% hausgemachte Lösung zu brauen. Ziel muss es sein, eine dauerhafte Lösung zu bauen, die ohne größere Schmerzen es erlaubt, auch die nächsten paar ARM-Generationen zu überleben (man erinnere sich an die bisherigen Herausforderungen: StrongARM, 32bit, ARMv7). Also sollte man bestrebt sein, die Komplexität der eigentlichen ARM-Code-Erzeugung den Tools zu überlassen, die sowas schon seit langem beherrschen und aller Wahrscheinlichkeit nach das auch in Zukunft können werden.

Dazu gibt es prinzipiell zwei denkbare Wege: entweder, man übersetzt den BASIC-Code in C-Code und ruft dann einen C-Compiler auf, oder man implementiert ein neues Frontend für GCC. Für ersteres gibt es Beispiele für andere BASIC-Dialekte – BCX oder BaCon. Sogar in der RISC OS-Welt gibt es einen solchen Ansatz mit BBC_C32. Für letzteres gibt es meines Wissens keine frei verfügbaren Beispiele, aber jede Menge Dokumentation wie man derartige Frontends baut.

Was sollten die ersten Ziele sein? Die Unterstützung von etwas, was ich “well-formed BBC BASIC” nennen würde. Also für das, was vernünftige Menschen in BBC BASIC programmieren würden, nicht für Code, der aussieht, wie wenn er durch einen zu intelligenten BASIC-Cruncher gelaufen wäre. Sogar das Nachdenken über Unterstützung von EVAL sollte unter Strafe gestellt werden. Der ARM-Inline-Assembler ist IMHO zu Anfang ebenso verzichtbar. Über eine stringentere Fassung des Typsystems sollte man nachdenken. Unterstützung für beliebig lange Strings sollte automatisch abfallen. Konstanten sollten möglich sein. Also kurz: alles, was “programming in the small” ausmacht. Schleifen, Entscheidungen, Prozeduren, Funktionen.

Was stünde langfristig auf dem Plan? Unterstützung für Record-Strukturen, anständiges Speichermanagement (dynamische Allokation und auch Freigabe statt des statischen DIM-Zeugs), Unterstützung für weitergehende Abstraktion möglicherweise sogar objektorientierter Natur, sinnvolle Erweiterungen in punkto Sichtbarkeits- und Gültigkeitsregeln, Unterstützung für Modularisierung (Erweiterung des LIBRARY-Konzepts), Unterstützung zum Bau von RISC OS-Modulen, Integrationsmöglichkeit von C-Bibliotheken. Vielleicht sogar eigene Schlüsselwörter zur WIMP-Programmierung?

Also, die Vorarbeit ist geleistet, die Finalisierung überlasse ich wie immer gerne anderen. Für Syntaxvorschläge stehe ich gerne zur Verfügung.

Übrigens gab es über die Jahrzehnte durchaus bereits Versuche, BASIC-Compiler am Markt zu etablieren. ABC (“Archimedes BASIC Compiler”, bis heute Teil des RISC OS DDE), RiscBASIC, HelixBasic, WimpBasic. Die Ergebnisse waren wenig überzeugend – zu gering der Performance-Vorsprung, und der Versuch, BBC BASIC möglichst präzise zu emulieren, verurteilte die Versuche zum Scheitern. Mit Blick auf die Microsoft-Welt könnte man sagen: VisualBasic wurde nicht deshalb so erfolgreich, weil es möglichst weitgehend QBasic-kompatibel war.

Zum Otter der QupZilla

Chris Gransden, Meister der tausend Portierungen, hat wieder zugeschlagen. Basierend auf der Qt5-Portierung von Lee Noar hat er einen weiteren Browser zum Laufen gebracht: QupZilla. Auch dieser basiert letztlich auf WebKit bzw. der Qt-Integration davon namens QtWebKit, genau wie der Otter-Browser.

Download der Testversion hier.

Allerdings wird QupZilla ab Version 2.0.0 auf QtWebEngine umsatteln, die auf Chromium basiert. Da wird eine RISC OS-Portierung deutlich herausfordernder aufgrund der asynchronen Multi-Prozess-Architektur von Chromium. Da wird es sinnvoller sein, die Optimierungsbemühungen in die Qt-Portierung zu stecken und ggf. die WebKit-Innereien zu separieren und ein echtes RISC OS-Frontend drumrum zu bauen.

JPEG-Bounty: Testversion verfügbar

RISCOS Open Ltd. hat die Verfügbarkeit einer neuen Testversion des SpriteExtend-Updates zur Verbesserung des JPEG-Supports verkündet. Die Entwicklung erfolgt im Rahmen des Bounties “Update JPEG support”.

Worum geht es? RISC OS unterstützt nativ seit Anbeginn der Zeit nur ein einziges Bitmap-Format: das hauseigene “Sprite”-Format. Also das Äquivalent zu BMPs unter Windows. Mit RISC OS 3.6 änderte sich das: JPEG wurde ab da ebenfalls unterstützt. Und zwar mittels “on-the-fly-decoding”, also nicht wie frühere Tools wie ImageFS(2) per einmaliger Umwandlung ins Sprite-Format. Das hat besonderen Charme, weil es den Speicherverbrauch niedrig hält – das JPEG bleibt halt als JPEG im Speicher, und wann immer ein Redraw verlangt wird, wird dieser Bildschirmausschnitt aus den Originaldaten bepixelt. Man kann diesen Effekt schön sehen, wenn man in Draw einmal das JPEG reinzieht und einmal das in ein Sprite konvertierte JPEG verwendet – am Speicherverbrauch von Draw erkennt man sofort den Unterschied. Und auch bei der Redraw-Geschwindigkeit – da ist die native JPEG-Variante naturgemäß im Nachteil.

Wie so vieles in RISC OS (man denke an den Netzwerk-Stack) ist auch der JPEG-Support in die Jahre gekommen. Der Code basiert auf Version 4 der Library der Independent JPEG Group von 1993, also Steinzeit. Die neueste Version 9b dieser Bibliothek wurde gestern veröffentlicht. Nun ist alt nicht gleich schlecht, aber in diesem Falle sind eben alle JPEG-Weiterentwicklungen an RISC OS spurlos vorüber gegangen, z.B. die Unterstützung für andere Farbräume als YUV (RGB, CMYK), die progressive Codierung anstatt der normalen linearen (häufig genutzt auf Webseiten, so kann man schon während des Herunterladens eines Bildes dieses in zunehmend besserer Qualität darstellen), Interlace-Codierung, die neue arithmetische Codierung zur Verbesserung der Kompressionsrate, die neue lossless-Kompressionsvariante, vergrößerte Farbräume.

Die veraltete Unterstützung sorgte so für seltsame Blüten bei der Anwendungssoftware. In den allermeisten Fällen wurde entweder zuerst die JPEG-Decodierung dem Betriebssystem überlassen, und wenn das Format inkompatibel war, wurde auf eine eigene Implementierung zurückgegriffen. Oder es wurde gleich eine neuere Version der Referenzimplementierung verwendet. Irgendwann sind dann JPEGs aufgetaucht, die die OS-Implementierung in eine Endlosschleife geschickt haben statt einen Fehler zu produzieren. Kurz: die OS-Implementierung wurde eher hinderlich als nützlich.

Höchste Zeit also für den Frühjahrsputz. Den ersten Aktivitätsnachweis gab es Ende November letzten Jahres, gestern nun das Update. Viele Ziele des Updates sind bereits erreicht: Unterstützung für die Progressive- und Interlace-Codierung, andere Farbräume von RGB bis CMYK, die Arithmetic-Codierung. Das bereitgestellte Modul ist “softloadable” auf allen Maschinen ab ARMv4, also im Prinzip für alles ab Risc PC.

tl;dr: Neues SpriteExtend-Modul, viel besser als das alte. Runterladen und ausprobieren.

Übrigens: nach dem Update ist vor dem Update. JPEG XT, JPEP-LS, JPEG 2000, JPEG XR, JBIG…

Fireworkz 2 veröffentlicht

Stuart Swales hat Fireworkz 2 zum freien Download veröffentlicht. Sowohl in der Geschmacksrichtung Windows als auch natürlich RISC OS. Hier kann man detailliert die Versionshistorie nachlesen.

Ursprünglich war Fireworkz als Triumvirat aus Textverarbeitung, Tabellenkalkulation und Datenbank angelegt, die sowohl einzeln (Wordz, Resultz und Recordz) als auch integriert (eben Fireworkz) verkauft werden sollten. In der Neuzeit splittet sich das nun in die freie Variante Fireworkz (Textverarbeitung und Tabellenkalkulation) und die kommerzielle Version Fireworkz Pro (R-Comp, 39 UKP, Textverarbeitung und Tabellenkalkulation zusätzlich mit DataPower als Datenbanksystem).

Wer nun allerdings versucht herauszufinden, inwieweit Fireworkz Pro sich von der kostenlosen Variante wirklich unterscheidet, und auf welche Art und Weise die Datenbank denn nun in das Gesamtsystem integriert ist, läuft gegen die bekannte R-Comp-Geheimniskrämerwand. In Form einer der schlechtesten Webpräsenzen aller Zeiten. Vermutlich am aussagekräftigsten ist noch das Announcement im Usenet von 2011. Es ist ein Trauerspiel.

Was ist nun neu in Fireworkz 2? Hauptaugenmerk lag auf der Implementierung vieler neuer Spreadsheet-Funktionen, um eine gescheite Kompatibilitätsbasis für ODF- und Excel-Im- und -Export zu haben. Erste zarte Versuche beim Unicode-Support sind ebenfalls zu verzeichnen. Der verbesserte RTF-Import ist wohl momentan der Pro-Version vorbehalten.

Zero Page Relocation – Gedanken zur Rückwärtskompatibilität

RISC OS steht (zumindest auf den modernen post-Risc PC-Plattformen) vor einem erneuten Schritt, der potenziell Schmerzen bei der Rückwärtskompatibilität verursachen wird. Hier kann man die Gründe, die RISC OS Open Ltd. dafür anführt, nachlesen. In der GAG-News 141 wurde ebenfalls ein Artikel dazu veröffentlicht.

Kurz zusammengefasst geht es um den Speicherbereich der ersten paar KB, der traditionell “Zero Page” genannt wird und z.B. “Kernel Scratch Space” beinhaltet und die Prozessorvektoren. Und natürlich die Adresse 0, beliebtes Ziel aller nicht initialisierter Pointer der systemunabhängigen Assemblersprachen (vulgo C und Konsorten).

Die Development-Builds seit dem 5.Juli haben die Zero Page nun in den hohen Speicherbereich verschoben und für Userspace-Code unzugänglich gemacht. Alle Software, die absichtlich oder unabsichtlich auf die Zero Page, wir sich mit einem Data Abort verabschieden. Bzw. das wäre der Fall, wenn nicht gleichzeitig eine Analyse- und Logging-Modul namens “ZeroPain” aktiv ist. Dieses beantwortet Lesezugriffe in einer kompatiblen Art und Weise und loggt gleichzeitig diese Zugriffe, um dem Softwareentwickler eine Analysemöglichkeit an die Hand zu geben. Wenn es nach dem veröffentlichten Fahrplan geht, wird ZeroPain ab 1.1.2016 nicht mehr zur Verfügung stehen.

Historisch betrachtet gab es bei RISC OS schon einige Zäsuren bezüglich der Rückwärtskompatibilität, und einige Utilities, die versuchten die Rückwärtskompatibilität wieder zu verbessern oder gar vollständig wiederherzustellen. Von RISC OS 2 nach RISC OS 3 gab es einige Verwerfungen, zum einen aufgrund der althergebrachten Home-Computer-Entwicklungsidee “direkt auf die Hardware”, die an einem großflächigen Wechsel der Peripherie-Chips zerschellte (6551 nach 8250, ST506 nach IDE, 1772 nach 82C710/11). Dann diverse Unterschiede zwischen den Betriebssystemversionen selbst – einige APIs erfuhren subtile Änderungen, und wer nicht genau nach Spec implementiert hatte, wurde kalt erwischt.

Dann kam der Risc PC. Wieder gravierende Änderungen in der Chipsatzlandschaft, dazu ein umgekrempeltes Videosystem um die neuen Grafikfähigkeiten abzubilden. Zig Spiele scheiterten aufgrund der Änderungen des VIDC20 gegenüber dem VIDC1. Game On!, eine Software des ARM Club, stellte einen VIDC1-Kompatibilitätslayer zur Verfügung.

Bis zu diesem Zeitpunkt konnte man mit Fug und Recht behaupten, dass Kompatibilitätsprobleme halt durch unfähige Programmierer zustande kamen – die Doku nicht richtig gelesen, die Hardware direkt angesprochen – selber schuld.

Und dann wurde alles anders. Der StrongARM kam. Harvard- statt von-Neumann-Architektur beim 1st level cache und Writeback- statt Writethrough-Konfiguration, was selbstmodifizierenden Code aus der Bahn warf. 5-stufige statt 3-stufige Pipeline mit subtilen Änderungen beim Verhalten des PC. Und dazu der dramatische Geschwindigkeitsboost, der so manche Software aus dem Takt brachte. Dagegen war dann der Schritt RISC OS 3.7 nach RISC OS 4 ein Kindergeburtstag. Viele Softwarehersteller nutzten die Gelegenheit und machten mit Minimalupdates zur Herstellung der StrongARM-Kompatibilität zum letzten Mal Kasse. Mit StrongGuard des ARM Club stand eine Lösung für Spiele zur Verfügung, für Anwendungen gab es so etwas nie.

Aber die größte Zäsur kam erst danach. Von 26bit nach 32bit. Der IYONIX kam, dazu RISC OS 5, und das Ende des “legacy” 26bit-Adressmodus. Im Prinzip lief danach – außer den reinen BASIC-Erzeugnissen – keine Software mehr. Der geniale Aemulor linderte den Schmerz etwas, aber die Kompatibilität war begrenzt und die Anwesenheit von Aemulor im System hat diverse Nachteile für den regulären Betrieb.

Dann kam das BeagleBoard, und mit ihm die ARMv7-Architektur, wo ARM mal wieder das “nicht-ganz-rückwärtskompatibel”-Spiel spielte. Da das aber nur die relativ selten auftretenden “unaligned loads” betraf, hielt sich der Schaden in Grenzen – solange der Benutzer die “Alignment Exceptions” abschaltete. Was uns wieder zur “ZeroPain” führt, das ja letztlich denselben Ansatz fährt: Verstöße stillschweigend dulden.

Nun also “Zero Page Relocation”. Die Frage lautet wie immer: ist der Gewinn (durch höhere Systemstabilität, für mehr Freiheitsgrade für zukünftige Entwicklung) größer als der Verlust (Software läuft nicht mehr)? Die Antwort liegt vermutlich im Auge des Betrachters – setzt man unersetzliche Software ein, die dann nicht mehr läuft? Es gibt ja nun nicht besonders viele aktive RISC OS-Nutzer (geschweige denn -Entwickler), kann es sich die RISC OS-Welt leisten auch nur einen davon zu verlieren?

Ich muss gestehen: ich habe keine klare Meinung dazu. Endlose Rückwärtskompatibilität führt zu endlos steigenden Aufwänden, was sich ein System wie RISC OS, das nur wenige Entwickler hat, nicht leisten kann. Aber die Anwendersicht hat natürlich erhebliches Gewicht: was soll man mit einem System, das keine Nutzer mehr hat?

Aus meiner Sicht kann es nur einen Ausweg geben: wir brauchen in Zukunft eine wasserdichte Emulationslösung, die solche rückwärtskompatibilitätsbrechende Änderungen abfedert. Im Moment haben wir einen ganzen Zoo von Lösungen: ArcEm, ArchiEmu, ADFFS und Aemulor. Alle haben ihre Nischen und spezifischen Vorteile, sind aber allesamt für den Otto-Normalanwender viel zu kompliziert zu benutzen, bzw. dadurch ausgelöste Effekte sind nicht zu durchschauen. Es bräuchte eine modulare Lösung, zu der auch “normale” Entwickler beitragen können. Mir schwebt eine Art Hypervisor vor, in den man anwendungsspezifisch Kompatibilitäts-Handler einbauen kann, die z.B. bei SWI-Aufrufen wieder Kompatibilität herstellen können. Dazu muss pro Anwendung entschieden werden, ob sie codetechnisch nativ oder emuliert ausgeführt werden soll. Vollständige Emulation mit einer beliebigen RISC OS-Version muss möglich sein, die Fenster der Anwendung der Emulation müssen in das Host-Betriebssystem “seamless” eingebunden werden können. An der Prozessorkompatibilitätsfront könnte sowas wie LLVM durchaus helfen.

Was natürlich auch helfen würden: Open Source allüberall. Wird wohl nicht passieren, und braucht dann ja auch eine Menge Kümmerer, die die Software dann pflegen.

Software-Klassiker zum Nachlesen: Ovation

David Pilling hat heute verkündet, dass er den Source-Code eines seiner Frühwerke – dem DTP-Programm “Ovation” – veröffentlicht hat.

Hier geht es zur entsprechenden Seite mit Download-Möglichkeit. Nur für den Source-Code wohlgemerkt, denn die Rechte für die Software liegen derzeit bei APDL. Nach dem Tod von David Holden soll die dort vertriebene Software irgendwann zum freien Download bereitgestellt werden – ich vermute, dass deshalb David die Zeit gekommen sah, den Source-Code freizugeben.

Ich finde vor allem den Text, den David zu Ovation geschrieben hat, sehr interessant. Denn er enthält ein paar ewig gültige Weisheiten der Softwareentwicklung, die ich folgendermaßen zusammenfassen würde:

  • Software, die gut aussieht, verkauft sich besser
  • Nur Wahnsinnige schreiben einigermaßen komplexe Software in Assembler
  • Wofür man in Assembler ein ganzes Team benötigt, kann selbst in einer assemblerartigen Hochsprache wie C ein einziger Entwickler leisten
  • Auf lange Sicht ist Assembler-Code praktisch unwartbar (siehe auch: Impression-X)
  • Nur weil etwas auf lange bis sehr lange Sicht die richtige Entscheidung war, heißt das nicht, dass man langfristig auch den Erfolg dafür erntet
  • die Software-Entwicklung früher – langsame Maschinen, noch langsamere Massenspeicher, wenig Speicher, kein vernünftiges Tooling – war eine echte Qual (meine Programmierkarriere begann auf einem Schneider CPC 464 – zeilenbasierter Editor, BASIC mit Zeilennummer und GOSUB als einzigem Merkmal strukturierter Programmierung, Speichermedium Datasette)

Manchmal hat man das Gefühl, dass die Software-Entwicklung unter RISC OS immer noch auf dem Stand Ende der 80er Jahre verharrt. Dazu muss man nur mal Diskussionen in diversen Foren verfolgen, wo immer noch das Hohelied auf den Norcroft C-Compiler oder Acorn BBC BASIC gesungen wird. Wirklich professionelle Software-Entwicklung mit den heute gängigen Tools – moderne Versionsverwaltung mit Git oder Mercurial, Continuous Integration, Cross-Compilation auf leistungsfähigen Rechnern, echte Hochsprachen – findet unter RISC OS kaum statt. Stattdessen typische 1-Mann-Projekte in BASIC und C. Was natürlich trotzdem gute Software hervorbringen kann. Aber unter deutlich erhöhtem Aufwand und nicht nachhaltig. Und erhöhter Aufwand ist der Tod für eine Plattform, deren aktive Programmierer man an zwei Händen abzählen kann.

Aber das wäre ein Thema für einen anderen Blog-Beitrag. Oder auch hunderte.