CoJaC ist unser Werkzeug zur Konvertierung von historischen COBOL-Applikationen in moderne Java-Lösungen. CoJaC generiert wartbaren und performanten Java-Code, welcher semantisch äquivalent zum COBOL-Code ist.
Das Werkzeug erreicht bei der Konvertierung einen Automatisierungsgrad von 95–99 %. CoJaC verbindet wissenschaftliches Know-how im Compilerbau mit Kernkompetenz aus erfolgreichen Migrationsprojekten.
CoJaC-TECHNOLOGIE
Für komplexe Übersetzungsvorgänge wird der Einsatz spezieller Konvertierungswerkzeuge, sogenannter Translatoren notwendig. Translatoren arbeiten in Analogie zu einem Compiler, der Quellprogramme über verschiedene Zwischenstufen in ausführbaren Zielcode übersetzt.
CoJaC ist ein Translator zur Konvertierung von historischen COBOL-Applikationen in moderne Java-Lösungen. Für die Belange der Sprachkonvertierung wurde dazu von uns das allgemeine Compiler-Modell zum Translatormodell weiterentwickelt:
- FRONT-END: Liest das COBOL-Programm einschließlich der dazugehörigen Copybooks ein und erzeugt daraus einen internen Syntaxbaum, der das vollständige COBOL-Programm repräsentiert.
- TRANSFORMATOR: Überführt den COBOL-Syntaxbaum in einen äquivalenten Java-Syntaxbaum. Die eigentliche Konvertierung erfolgt auf der Basis von Syntaxbäumen und nicht auf Basis von Quellcode.
- POSTPROZESSOR: Zerteilt den komplexen Java-Syntaxbaum in einzelne Syntaxbäume, welche die Programmstruktur des zukünftigen Java-Programmes repräsentieren.
- GENERATOR/FORMATIERER: Generiert Java-Klassen und ‑Packages aus einzelnen Java-Syntaxbäumen und formatiert automatisch den Sourcecode laut Kundenvorgaben.
- LAUFZEITSYSTEM: Ermöglicht die Nutzung der COBOL-Datentypen und ‑Funktionen im konvertierten Java-Code, welche in Java nicht 1:1 existieren.
FEATURES
Quelltextkommentare werden automatisch in den Zielcode eingebunden.
Der Zielcode wird durch unser Werkzeug JPackage nach Kundenvorgabe in Java-Klassen und ‑Packages strukturiert.
Der generierte Java-Code wird nutzerspezifisch formatiert.
CoJaC unterstützt verschiedene COBOL-Dialekte (IBM, HPE NonStop, BS2000).
MIGRATIONSASPEKTE
Die Migration geht weit über eine reine Programmtransformation hinaus und beinhaltet ebenso eine Architekturmigration. Dabei ist es möglich, die Zielarchitektur so zu wählen, dass sie sowohl auf einem lokalen Server als auch in der Cloud eines kommerziellen Anbieters betrieben werden kann:
Die Grafik skizziert beispielhaft die Architektur einer typischen COBOL-Applikation und das daraus resultierende Java-Zielsystem.
- COBOL-Server-Programme werden als Webservices im Java-Zielsystem bereitgestellt.
- COBOL-Batch-Programme werden in autonome Java-Programme transformiert.
Das Laufzeitsystem stellt in der Java-Zielumgebung Klassen für die Abarbeitung der migrierten Programme zur Verfügung. Dazu gehören Klassen für die COBOL-Datentypen (numerische und alphanumerische Daten) und Basisklassen für Arrays und Strukturen. Weiterhin existieren Methoden, welche die Funktionalität von COBOL-Anweisungen implementieren, für die in Java keine nativen Anweisungen existieren (z.B. STRING
und INSPECT
). Weitere Bestandteile sind statische Methoden zur Abbildung der Intrinsic Functions, Methoden für die Typkonvertierung und Klassen, welche die Funktionalität der Schnittstellen (Files, SQL, Middleware) bereitstellen. Das Laufzeitsystem bildet die Grundlage für einen kompakten, wartbaren Java-Code.
Beispiele für die Anwendung des CoJaC-Laufzeitsystems:
COBOL-Server, die unter der Steuerung einer Middleware (eines Transaktionsmonitors) arbeiten, werden von CoJaC in Java-Webservices übersetzt und in einen Application Server integriert. Dabei werden Middleware-spezifische Daten und Anweisungen entfernt bzw. durch entsprechende Webservice-Funktionalität ersetzt. Die Schnittstelle ändert sich dabei inhaltlich nicht. Die Webservices verarbeiten die gleichen Messages wie vorher die COBOL-Server. Notwendige Konvertierungen kapselt das Laufzeitsystem, welches auch die Verwaltung der Transaktionen übernimmt. Unser Werkzeug MidaS (Middleware as a Service) ist eine schlanke Alternative zu kommerziellen Systemen. MidaS stellt ein genau auf die migrierten Online-Programme zugeschnittenes Interface bereit und ist leicht in eine Java-Serverlandschaft integrierbar.
Beispiel für die Middleware-Migration:
Die in COBOL verwendeten Datenfiles werden bei der Migration mit unserem Werkzeug FiRe in relationale Datenbanktabellen umgesetzt. Dabei werden die verschiedenen Organisationsformen und Zugriffsmethoden berücksichtigt. In den konvertierten Java-Programmen wird unter Nutzung von Methoden, welche das Laufzeitsystem bereitstellt, auf die Datenbanktabellen zugegriffen. Die Laufzeitmethoden emulieren die originalen COBOL-Anweisungen zur File-Arbeit (OPEN
, READ
, READ NEXT
, CLOSE
, …).
Beispiele für die File-Migration:
Statische SQL-Anweisungen, die in den COBOL-Quelltext eingebettet sind, werden von CoJaC in dynamische SQL-Anweisungen konvertiert. In das Java-Laufzeitsystem wurden Methoden zur Verwaltung der Datenbankverbindung, zum Datenbankzugriff, zum Lesen und Schreiben von Daten in die Hostvariablen sowie zur Fehlerbehandlung integriert, welche die im Basissystem vorhandene Funktionalität abbilden. Mit dem Übergang zu dynamischem SQL sind erfahrungsgemäß keine Laufzeitnachteile verbunden. Gleichzeitig wird die flexible Erstellung und Änderung von SQL-Anweisungen ermöglicht.
Beispiele für die Migration von Embedded SQL:
FAQ ZUR SPRACHMIGRATION
GO TO
-Anweisungen sind komplett automatisiert migrierbar. Dabei wird zunächst versucht, sie durch Java-typische Anweisungen zu ersetzen. Sprünge an das Ende einer Section werden z.B. durch eine return
-Anweisung in Java übersetzt. Ist das nicht möglich, übernimmt das CoJaC-Laufzeitsystem die Ablaufsteuerung. Im Programm wird dann das GO TO
durch den Aufruf einer skip()
-Methode realisiert.while
, for
) oder if
-Anweisungen. PROCEDURE DIVISION
werden die Klassen-Methoden. Dabei bleibt die Reihenfolge im Quelltext bestehen. COPY
mit REPLACING
-Klausel oder bei COPY
in der PROCEDURE DIVISION
. Wir verfügen mit JPackage über ein Werkzeug, mit dem so entstandene Klone wieder zusammengeführt werden können. Neben den dabei anfallenden, wesentlich höheren Kosten sollten Sie bei dieser Entscheidung auch die Projektdauer beachten. Wenn über 95% des Java-Codes automatisch generiert werden, ist ein Programm natürlich schneller umgesetzt als von Hand. “Code freezes” und eventuelle Sperrzeiten bei der Weiterentwicklung/Wartung des Programmes werden damit minimiert. Unsere Erfahrungen besagen, dass sich eine Software-Migration zu einer Neuentwicklung im Verhältnis von 1:8 verhält, d.h., wenn Sie 5 Personenjahre für ein Migrationsprojekt unter Nutzung von Transformationswerkzeugen veranschlagen, dann benötigen Sie für eine Neuentwicklung ein- und desselben Programmsystems 40 Personenjahre.
Für eine Neuentwicklung existieren zwei alternative Ansätze: Entweder, Sie schreiben das originale Programm 1:1 in Java um. Dann wird der Code dem automatisch migrierten Code ähnlich sein, so dass Sie auch automatisch migrieren können. Oder Sie extrahieren die Business-Logik des Programmes, erstellen daraus eine Spezifikation und entwickeln dann das Programm neu. Die Extraktion der Business-Logik ist jedoch ein sehr aufwendiger und fehleranfälliger Prozess.
“Jedes COBOL-Java-Migrationsprojekt birgt neue Überraschungen“
Abstract zum 24. Workshop “Software-Reengineering & Evolution” am 02.–04. Mai 2022 in Bad Honnef, erschienen in:
Softwaretechnik-Trends, Band 42, Heft 2, Mai 2022
Success Story: “Erfolgreiche COBOL-Java-Migration bei Südleasing GmbH”
Success Story: “Erfolgreiche BS2000-Migration bei ITZBund”