ChatGPT und der GGT

Als Software-Entwickler habe ich bei meinen Tests von ChatGPT bisher auch einiges in Richtung Programmierung getestet. Und ChatGPT hat auf meine Anforderungen hin verschiedene Codestückchen in C++ und Python hervorgezaubert. Die Antworten waren für mich erst einmal faszinierend, denn ein Mensch oder ein Programmieranfänger hätten es sicher nicht geschafft, mir in einigen wenigen Sekunden kompilierbaren Code vorzulegen. Allerdings hat ChatGPT es meist nicht geschafft auf Anhieb eine funktionierende Lösung zu liefern. Manchmal konnte ich mit ein- oder zweimaligem Nachfragen seine Ausgaben verbessern. Oft aber auch verschlimmbessern. Trotzdem war ich wirklich beeindruckt davon, dass mir eine Maschine so konkrete und zumindest teilweise funktionsfähige Programm erstellen konnte. Als Beispiel mag meine Anforderung gelten, mir einen Matrix Screensaver für das TTGO T-Display (ESP32) unter Einsatz der TFT_eSPI Bibliothek zu programmieren. Tatsächlich bekam ich einen, bis auf eine Winzigkeit, funktionierenden Code, der mir ohne ein einziges Mal das Display wieder auf Schwarz zu setzen, unendlich lange grüne Zeichen an zufälligen Positionen auf das Display zu malte. Mit dem Matrix Screensaver hatte das allerdings nichts zu tun.

Nun gibt es aber im Internet unzähligen Code in allen möglichen (C++, Java, JavaScript, PHP, Python,  Object Pascal und viele mehr) oder unmöglichen (z.B.: Brainfuck) Programmiersprachen zu lesen und vielleicht hat ChatGPT da einfach ein paar Stückchen mehr oder weniger intelligent verknüpft. Darum habe ich mir überlegt, ChatGPT Code für einen einfachen Computer erstellen zu lassen, den es im Internet gar nicht gibt! Allerdings ähneln die beschriebenen Funktionen des virtuellen Computers stark denen von alten Taschenrechnern wie dem HP-25 von Hewlett-Packard bzw. sehr alten Computern.

Stellt Euch vor, ich würde folgendes von Euch verlangen:

Es gibt einen Computer mit einem einzeiligen Display zur Darstellung von Fließkommazahlen. Er besitzt ein einfaches Rechenwerk mit 2 Arbeitsregistern mit der Bezeichnung X und Y. Im Display wird immer das Rechenregister X angezeigt. Immer wenn eine Rechnung durchgeführt wird, werden die Operanden aus X und Y gemäß der mathematischen Funktion wird das Ergebnis in das Rechenregister X geschrieben. Wenn eine Zahl aus einem Speicherregister abgerufen wird, so wird sie in das Rechenregister X geschrieben. Der Wert der vorher in X stand wird automatisch in das Rechenregister Y kopiert. Der Computer kann Listen mit Befehlen automatisch hintereinander abarbeiten. Er versteht folgende Befehle:

• ‚INPUT‘ kopiert den Wert von Rechenregister X in das Rechenregister Y.

• ‚X<>Y‘ vertauscht den Inhalt der Rechenregister X und Y

‘ADD’ addiert die Beiden Rechenregister X und Y und zeigt das Ergebnis im Rechenregister X an.

‘SUB’ subtrahiert das Rechenregister X vom Rechenregister Y und zeigt das Ergebnis im Rechenregister X an.

‘MLT’ multipliziert die Rechenregister X und Y miteinander und zeigt das Ergebnis im Rechenregister X an.

‘DIV’ subtrahiert das Rechenregister Y durch das Rechenregister X und zeigt das Ergebnis im Rechenregister X an.

‘INT’ entfernt die Nachkommastellen einer Zahl im X-Register.

‘STO Nbr’ zum Speichern einer Zahl aus dem Rechenregister X in das Speicherregister Nbr.

‘RCL Nbr’ um die im Speicherregister Nbr gespeicherte Zahl wieder in das Rechenregister X zu holen.

‘X != 0’ prüft den in der Anzeige stehenden Wert und führt den direkt dahinter liegenden Befehl aus, wenn der Wert im Anzeigeregister X ungleich 0 ist, andernfalls überspringt er diesen Befehl.

‘GOTO Nbr’ springt direkt an die mit Nbr bezeichnete Stelle in der Liste.

Wie würde eine Liste mit Befehlen aussehen, die beim Starten des automatischen Ablaufs der Liste, in den Rechenregistern X und Y zwei Zahlen enthält, den GGT über den euklidischen Algorithmus ausrechnen soll und der GGT am Ende der Berechnung im Rechenregister X stehen soll?

Das habe ich ChatGPT vorgesetzt und es hat daraufhin tatsächlich eine Liste mit den von mir definierten Befehlen ausgegeben! Beim flüchtigen Betrachten sieht das Ergebnis tatsächlich so aus, als ob ChatGPT verstanden hätte was ich von ihm will und es hat versucht die Anforderungen umzusetzen:

Analyse

Bei den Speicherbefehlen geht ChatGPT von einem zusätzlichen Parameter für das zu verwendende Rechenregister aus, den die von mir definierte Maschine nicht verarbeiten könnte.

In Schritt 5 wird ein Vergleich durchgeführt und abhängig vom Ergebnis der ‚DIV‘-Befehl übersprungen. Was keinen Sinn ergibt.

Die Folge von ‚DIV‘ und ’INT’ scheint die in vielen Programmiersprachen verwendet Modulo-Funktion nachbauen zu wollen, wird so aber nicht funktionieren, da nach dem ‚INT‘ eine Multiplikation mit dem vorherigen Divisor und anschließend eine Subtraktion des Ergebnisses vom vorherigen Dividenten erfolgen müsste, um tatsächlich den für den euklidischen Algorithmus notwendigen Rest berechnen zu können.

Der Test mit nachfolgendem Sprung in den Zeilen 8 und 9 würde Sinn machen, wenn tatsächlich der Rest berechnet worden wäre, so ist er aber genauso falsch, wie der komplette von ChatGPT gelieferte Algorithmus.

In den Zeilen 11 und 13 gibt es jeweils ein GOTO, zu dem ChatGPT als Kommentar schreibt, dass es ein Schritt zurück ist, um den nächsten Rest zu berechnen. Bei einem korrekt funktionierenden Algorithmus, wäre dies tatsächlich notwendig, aber nur ein einziges Mal!

Interessant ist noch die letzte Zeile, da dort scheinbar das Ergebnis aus dem Speicherregister 1 zur Anzeige geholt werden soll. Das deutet darauf hin, dass ChatGPT verstanden hat, dass es einen im Verlauf des Algorithmus berechneten und gespeicherten Wert erst durch einen Zugriff auf das Speicherregister zur Anzeige in das Rechenregister X bringen muss.

Ich breche die weitere Analyse ab, da ja in einem Algorithmus auch nur eine einzige fehlerhafte Zeile das Ergebnis komplett zerstört und der von ChatGPT gelieferte Algorithmus so viele Fehler enthält, das er auch nicht mit einer einfachen Korrektur zum Laufen zu bringen wäre.

Ein funktionierender Code würde so aussehen:

01. STO 2
02. x <> y
03. STO 1
04. DIV
05. INT
06. RCL 1
07. MLT
08. RCL 2
09. x <> y
10. SUB
11. x = 0?
12. GOTO 15
13. RCL 1
14. GOTO 01
15. RCL 1

Beim Vergleich des von ChatGPT gelieferten und dem tatsächlich funktionierenden Code fällt die optische Ähnlichkeit auf! Wie schon geschrieben scheint der Code beim flüchtigen Betrachten tatsächlich eine mögliche Lösung zu sein, die allerdings bei einem Test auf dem von mir beschriebenen Computer gnadenlos durchfallen würde. Der Code erinnert eher an ein nachgemaltes Bild von einem Code und würde von einem echten Programmierer niemals so abgeliefert werden, da dieser den Code gemäß den von mir definierten Bedingungen logisch konstruieren und testen würde.

Fazit

Es ist faszinierend zu sehen wie ChatGPT meine Anfrage scheinbar verstanden und daraus eine Lösung gemalt hat, aber es zeigt auch dass es von einem richtigen Verstehen und konstruktivem Arbeiten noch weit entfernt ist.

Abschließend ist noch zu erwähnen, dass die Antworten von ChatGPT auf die oben beschrieben Fragestellung schon bei einem zweiten Aufruf oder geringfügigen Änderungen des Textes völlig verschiedenen sein kann. Es also sein kann, dass Ihr beim Ausprobieren unterschiedliche Ergebnisse erhalten könntet.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert