Original-URL des Artikels: https://www.golem.de/news/das-andere-how-to-deutsch-lernen-fuer-programmierer-1905-141006.html    Veröffentlicht: 08.05.2019 12:05    Kurz-URL: https://glm.io/141006

Das andere How-to

Deutsch lernen für Programmierer

Programmierer schlagen sich ständig mit der Syntax und Semantik von Programmiersprachen herum. Der US-Amerikaner Mike Stipicevic hat aus der Not eine Tugend gemacht und nutzt sein Wissen über obskure Grammatiken, um Deutsch zu lernen.

Ich lerne seit zwei Jahren Deutsch, und ich bin Programmierer. Programmierer müssen sich jeden Tag mit ungewöhnlicher Grammatik herumschlagen - warum also keinen Vorteil daraus ziehen? Also nutzte ich bekannte Konzepte, um mir fremde anzueignen. Oder anders gesagt: Ich habe mir Teile der deutschen Grammatik mit vertrauten Programmierkonzepten erschlossen.

Eingebaute Fehlerkorrektur: Substantive haben ein Geschlecht

Die wohl erste Schwierigkeit für Deutschlernende ist es, sich das Genus jedes Substantivs zu merken und wie er korrekt in einem Satz dekliniert wird. Die zugrunde liegende Grammatik ist zwar einheitlich, aber ein Umstand ist eine Herausforderung: Die Zuordnung des Genus eines Substantivs zum Geschlecht des jeweiligen Gegenstands ist oft unlogisch. Der Junge ist maskulin, das Mädchen hingegen ein Neutrum, die Männlichkeit ist feminin. Da hilft nur massives Auswendiglernen, um die korrekte Deklination anwenden zu können.

Es ist unmöglich, diesen Prozess zu vereinfachen oder das Wissen herzuleiten. Ich habe meinen Frieden mit dem Genus geschlossen, indem ich die ganze Sache als Vorwärtsfehlerkorrektur betrachte. Bei dieser Kodierungstechnik werden zusätzliche, redundante Informationen in eine Nachricht eingefügt. Gehen Teile der Nachricht verloren oder sind verrauscht, dann kann mit Hilfe dieser zusätzlichen Informationen die ursprüngliche Nachricht rekonstruiert werden, ohne dass der Absender um eine neue Übermittlung gebeten werden muss.

Wer jemals in schwierigen Fällen am Telefon Wörter statt Buchstaben zum Buchstabieren benutzt hat (T wie Theodor, P wie Paula, C wie Cäsar...), verwendet ebenfalls eine Vorwärtsfehlerkorrektur. Das funktioniert auf Basis einer (impliziten) Vereinbarung zwischen Sender und Empfänger: Ich sage ein Wort, das wir beide kennen, und der zu übertragende Buchstabe ist der erste Buchstabe dieses Wortes. Beide könnten sich auch auf eine formale Variante dieses Codes einigen, etwa das Nato-Alphabet. Wenn dieser Code benutzt wird und ich höre: "[krächz]-elta", kann ich vermuten, dass der Sender Delta meint. Die Regeln sehen vor, dass er nichts anderes gemeint haben kann, denn kein anderes Wort endet mit -elta.

Computer benutzen aufwendigere, aber ähnliche Methoden, um Datenströme gegen Übertragungsfehler zu schützen. Diese dem Sender und Empfänger bekannten Regeln sind zum Beispiel Hamming-Matrizen, Reed-Solomon-Codes und Markow-Ketten.

Das Genus eines individuellen Substantivs und die Grammatikregeln zur Genus-Deklination von Artikeln und Adjektiven bilden jenes gemeinsame Regelwerk, das Sender und Empfänger kennen. Es mag nicht die Shannon-Grenze erreichen, trotzdem ist das deutsche Genus-System eine natürlich entstandene, überraschende Form der Vorwärtsfehlerkorrektur.

Das folgende Beispiel klingt künstlich, aber stellen wir uns den akustischen Unterschied zwischen den Wörtern Rat und Rad über eine schlechte Telefonverbindung vor. In einem Satz wie "Gib mir das Ra(d/t)" würde ein deutscher Hörer sofort das (Fahr-)Rad erkennen - einfach weil es richtig klingt, "das Rat(-schlag)" hingegen falsch. Das Gehirn nimmt solche Rekonstruktionen unbewusst ständig vor. Genus und Deklination fungieren als Paritätbits im Satz. "Klingt richtig" ist das Erkennen der Fehlerfreiheit nach einer Paritätsprüfung.

Context Manager: Trennende Verben ersetzen die Ausnahmebehandlung

Ein weiteres Phänomen der deutschen Grammatik, mit dem Deutschlernende früh konfrontiert werden, ist das trennbare Verb. Im Englischen gibt es ein vergleichbares Konstrukt: "Turning on a switch" meint etwas anderes als "Turning a switch". Während im Englischen aber der Rest des Satzes dem "on" folgt, taucht das deutsche Äquivalent zu "on" erst am Ende des Satzes wieder auf. Während der Engländer also sagt "I'm calling up a friend with my new phone", teilt uns sein deutscher Bekannter mit: "Ich rufe einen Freund mit meinem neuen Telefon an."

Dass bei der Konjugation des Verbes "anrufen" das "an" am Ende des Satzes steht, erinnert an die Funktionsweise von Pythons Context Manager. Ähnliche Konstrukte gibt es auch in anderen Sprachen wie Go, Rust, C++ und Scheme.

Context Manager sind erklärungsbedürftig. Sie erfüllen eine spezielle Aufgabe, insbesondere im Umgang mit Systemressourcen, und vereinfachen die Fehlerbehandlung. Das bekannteste Beispiel ist der Einsatz des Context Managers mit einem File-Objekt in Python:

with open('workfile') as f: read_data = f.read()

Es wird versucht, die Datei "workfile" zu öffnen und auszulesen. Wir müssen uns hier weder um eine Fehlerbehandlung noch um das Schließen der Datei kümmern. Das übernimmt der zugehörige Context Manager. Mit "with" wird ein Sichtbarkeitsbereich (Scope) für die Variable f definiert. Endet der Scope von f, wird das entsprechende Objekt vom Context Manager korrekt aufgeräumt, hier inklusive des Schließens der Datei.

Ohne Einsatz des Context Managers müssen wir Fehler mithilfe des Exception-Mechanismus von Python selbst abfangen und über das Finally-Schlüsselwort sichergehen, dass die Datei auf jeden Fall geschlossen wird: f = open('workfile') try: read_data = f.read() finally: f.close()

Ohne Context Manager muss der Programmierer also selbst an den Aufräum-Code denken. Gerade bei verschachtelten Aufrufen spielt aber nicht nur die Existenz der Finally-Schlüsselwörter eine Rolle, sondern auch deren Ausführungsreihenfolge und die jeweilige Sichtbarkeit der Variablen. Context Manager vereinfachen hier die Programmierung deutlich. Werden sie verschachtelt, folgen sie einem einfachen Last-in-First-out-Prinzip (LIFO). Der Abschlusscode des innersten Context Managers wird zuerst ausgeführt, danach folgt der nächstinnere bis zum äußersten im Aufruf-Stack.

Die LIFO-Sortierung wird auch bei komplizierteren Verbkonstruktionen im Deutschen deutlich. Die Denkweise in Form von Context Managern hilft dabei, solche Konstrukte besser zu verstehen und auch selber zu bilden. Zum Beispiel, wenn ein Modalverb wie "können" mit einem indirekten Fragesatz kombiniert wird, der durch "ob" eingeleitet wird. Sowohl "können" als auch "ob" zwingen das relevante Verb an das Ende des Satzes:

1. Ich weiß nicht, ob der Zug kommt.

2. Er kann seinen Fahrschein bezahlen.

Will der Deutschlernende den englischen Satz "I don't know if she can dance to my favorite band" übersetzen, ist der erste Teil einfach: "Ich weiß nicht, ...". Doch wie verhält es sich mit dem "ob"-Nebensatz? Welches der beiden Verben gehört im Deutschen an das Ende des Satzes? "Tanzen" aufgrund Regel 2 oder "kann" entsprechend Regel 1? Wo kommt die Lieblingsband hin?

Mit Hilfe des LIFO-Prinzips ist die Frage zu beantworten. Es wird durch "ob" nach dem Können gefragt und leitet damit den äußeren Sichtbarkeitsbereich ein (Regel 1). "Kann" gehört also an das Ende des Nebensatzes. Der Ausdruck "sie tanzen" bildet hingegen den inneren Sichtbarkeitsbereich. Als Pseudo-Code formuliert würde das so aussehen:

Der übersetzte Satz lautet deshalb: "Ich weiß nicht, ob sie zu meiner Lieblingsband tanzen kann."

Im Deutschen gibt es keine Grenze für diese Art von Verschachtelung und Extrembeispiele für solche Sätze sind selbst für Muttersprachler schwer zu verstehen. Der Softwareentwickler Matthias Görner illustriert das LIFO-Prinzip mit folgendem, grammatikalisch vollkommen korrekten Satz: "Ich stimme dem Maler, der die Meinung, dass Rot keine Farbe ist, vertritt, zu."

Eine eigene semantische Welt: Präpositionen

2010 führte Randall Munroe in seinem Comic XKCD eine Umfrage durch, um herauszufinden, wie Menschen Farben benennen. Spätere, umfangreichere Analysen zu Farbbegriffen im amerikanischen Englisch und im Japanischen stammen von US-Wissenschaftlern der Ohio State University-Mansfield und der Tohoku-Universität in Japan (danke an Alice Boxhall für die Hinweise zu diesen wissenschaftlichen Arbeiten). Zu meiner Überraschung zeigt sich dort, dass im Japanischen Hellblau als eigenständige Grundfarbe bezeichnet wird, im Gegensatz zum englischsprachigen Raum.

Das englische Wort "blue" umfasst aus japanischer Sicht sowohl Blau als auch Hellblau - das kann zu Missverständnissen führen. Genauso verhält es sich mit der Zuordnung von englischen zu deutschen Präpositionen und umgekehrt. Laut Pons kann "bei" die gleiche Funktion erfüllen wie die englischen Wörter "with", "for", "in", "to", "near", "by", "among" und "during". Der Python-Code

with open('workfile') as f: for line in f: print(line)

würde in einer deutschen Pseudo-Übersetzung also zu:
bei öffne('workfile') als f: bei zeile bei f: drucke(zeile)

Mit "auf" gibt es das gleiche Problem. Und es wird nicht dadurch einfacher, dass "auf" zu jenen Präpositionen gehört, die mit dem Kasus des zugehörigen Substantivs auch noch die Bedeutung ändern können.

Ich habe versucht, mir all die Übersetzungen der Präpositionen einzuprägen. Nur um dann bei der erstbesten Gelegenheit von "auf" wieder überrumpelt zu werden. Sowohl bei "The paper is on the table" als auch "We speak in Englisch" erfordert die deutsche Übersetzung das Wort "auf" für "on" und "in". Wo ist da der Zusammenhang? Das ergibt keinen Sinn!

Meine Empfehlung ist daher, den Sinn gar nicht erst zu suchen und sich gar nicht erst die Übersetzungen einprägen und ihren englischen Bedeutungen zuordnen zu wollen. "Um" ist nicht einfach das englische "around", es hat eine komplett eigenständige semantische Bedeutungsvielfalt und sollte auch so behandelt werden. Statt Übersetzungen und vermeintlich ähnliche Wörter für das Verständnis oder die Herleitung heranzuziehen, sollten die Präpositionen von Grund auf neu gelernt werden. Am besten zusammen mit den entsprechenden Verben und typischen Wendungen wie "[es liegt] auf der Hand".

Kwargs: Artikel werden dekliniert

Die Artikel zu deklinieren, hält ebenfalls einiges an Mühsal für den Anfänger bereit. Wie oben bereits gezeigt, ist das Genus eines Substantivs oft bereits eine Herausforderung. Die Deklinationsregeln zu lernen, braucht genauso viel Zeit. Die Artikeldeklination hat aber eine wichtige Bedeutung, denn dadurch ist die Satzstruktur im Deutschen nicht festlegt.

Die Reihenfolge der Wörter im englischen Satz "The man gives the ball to the dog" kann nicht verändert werden, ohne den Sinn zu verändern. "The ball gives the dog to the man" sagt etwas komplett anderes aus. Soll der Satz seinen Sinn behalten, müssen Wörter ergänzt oder die Zeichensetzung geändert werden: "To the dog, the man gives the ball." Aber schon das zusätzliche Komma verändert die Struktur ein wenig.

Im Deutschen hingegen sind zwar alle drei Substantive maskulin: der Mann, der Ball und der Hund. Doch je nachdem, ob das Wort als Subjekt (Nominativ), direktes Objekt (Akkusativ) oder indirektes Objekt (Dativ oder Genitiv) auftritt, verändert sich der Artikel. Die direkte Übersetzung des obigen Satzes lautet deshalb "Der Mann gibt dem Hund den Ball." Da das "der" jedes Mal dekliniert wird, ist die Satzstellung im Deutschen wesentlich freier darin, wo das Subjekt und die Objekte um das Verb herum platziert werden.

Einige Regeln schränken die Variationsmöglichkeiten ein, trotzdem bleiben drei Varianten übrig:

1. Der Mann gibt dem Hund den Ball.

2. Den Ball gibt der Mann dem Hund.

3. Dem Hund gibt der Mann den Ball.

Der Unterschied zwischen diesen Sätzen liegt allein in der Betonung, ihre inhaltliche Aussage und die Grammatik ist stets die gleiche.

In Python gibt es ein ähnliches Prinzip. Je nachdem, wie eine Funktion definiert wurde, müssen die Argumente für diese Funktion in einer festen Reihenfolge übergeben werden, oder über Schlüsselwörter. Grundsätzlich ist die Anzahl der übergebenen Argumente dabei nicht limitiert.

Argumente, die nicht in der Funktionsdeklaration aufgeführt wurden, können über die vordefinierten Variablen *args und **kwargs abgefragt werden. Praktisch ist dabei auch, dass beim Aufruf der Funktion und der Übergabe von Argumenten per Schlüsselwort die Reihenfolge in der Deklaration nicht eingehalten werden muss.

Damit können wir ein einfaches Programm schreiben, das den Unterschied zwischen der deutschen und englischen Grammatik demonstriert:

def giver_pos(subject, direct_object, indirect_object): """Argumentstruktur analog zur englischen Satzstruktur""" print(f'The {subject} gives the {direct_object} to the {indirect_object}.') def giver_kwargs(**kwargs): """Mögliche Argumentstruktur analog der deutsche Satzstrukturen""" subject = kwargs['subject'] direct_object = kwargs['direct_object'] indirect_object = kwargs['indirect_object'] print(f'The {subject} gives the {direct_object} to the {indirect_object}.') # Gibt dieselbe Aussage aus giver_pos('man', 'ball', 'dog') giver_kwargs(subject='man', direct_object='ball', indirect_object='dog') giver_kwargs(direct_object='ball', indirect_object='dog', subject='man') giver_kwargs(indirect_object='dog', subject='man', direct_object='ball') giver_kwargs(subject='man', indirect_object='dog', direct_object='ball') # Ist nicht identisch zu obigem giver_pos()-Aufruf giver_pos('ball', 'man', 'dog')

Der Aufruf der giver pos()-Funktion ist schneller getippt, erfordert aber Wissen über die Argument-Reihenfolge. Die Funktion giver_kwargs() erfordert mehr Tipparbeit, ist zugleich aber auch flexibler und selbstdokumentierend. Die englische Grammatik bevorzugt eine einfache, feste Satzordnung und verliert dabei an Flexibilität. Die deutsche Grammatik leistet sich eine aufwendige Deklination, um einen flexiblen Satzbau zu ermöglichen.



Delay Slot: Das Verb steht immer an zweiter Stelle

Trotz aller Flexibilität steht in der deutschen Alltagssprache das Verb üblicherweise an der zweiten Stelle, direkt nach dem ersten Satzteil:

1. Der Hund geht morgen zum Tierarzt.

2. Morgen geht der Hund zum Tierarzt.

In der wörtlichen Übersetzung klingt der zweite Satz für nichtdeutsche Muttersprachler irritierend:

3. Tomorrow goes the dog to the vet.

Obwohl es für den dritten Satz durchaus noch Überreste im modernen Englisch gibt, klingt diese englische Übersetzung für den zweiten Satz eher korrekt:

4. Tomorrow, the dog goes to the vet.

Das Verb stets an die zweite Stelle zu setzen - mit diesem Aspekt der deutschen Sprache zurechtzukommen, verlangt einiges an Gewöhnung. Mir hat es geholfen, an Delay Slots zu denken, wie es sie in älteren Prozessor-Architekturen gibt, zum Beispiel bei Suns SPARC. Diese arbeiten mit einer Pipeline. Dabei läuft die Verarbeitung von aufeinanderfolgenden Befehlen leicht versetzt nacheinander ab. Während der erste Befehl ausgeführt wird, wird der zweite Befehl im gleichen Zyklus dekodiert und parallel der dritte Befehl in die Pipeline geladen, und so weiter. Das erhöht die Verarbeitungsgeschwindigkeit des Prozessors enorm.

Allerdings wirken sich Pipelines negativ auf die Geschwindigkeit aus, wenn der Prozessor nicht weiß, welche Befehle als nächstes zu laden sind. Und das passiert, wenn er eine Verzweigung aufgrund einer Prüfbedingung verarbeiten muss:

Solange der Prozessor z + 4 in Zeile 2 nicht berechnet hat, weiß er nicht, ob er Zeile 4 oder 6 in die Pipeline laden soll. Diese Wartezeit blockiert den Zyklus der gesamten Pipeline. Erst wenn z + 4 berechnet (ausgeführt) wurde, wird der Befehl y = 5 + 6 in der ersten Zeile auch tatsächlich beendet und verlässt die Pipeline.

In späteren Prozessor-Generationen wird dieses Problem mithilfe der Out-of-Order-Execution gelöst. Doch davor mussten sich Entwickler mit einer anderen Lösung behelfen: Delay Slots. Einer oder mehrere "leere" Befehle werden nach der bedingten Verzweigung eingefügt und sorgen dafür, dass im Pipeline-Mechanismus keine Lücke auftritt und die Befehle in der Pipeline weiter vorrücken können:



Zum einen kann jetzt der Befehl x = 5 + 6 vollständig die Pipeline durchlaufen, auch wenn das Ergebnis von z + 4 noch nicht bekannt ist, denn die Pipeline wird durch einen Delay Slot aufgefüllt. Zum anderen ist im darauffolgenden Zyklus das Vergleichsergebnis bekannt und der Prozessor weiß, welche Zeile er in die Pipeline laden muss.

Erinnern wir uns an den obigen Satz: "Ich stimme dem Maler, der die Meinung, dass Rot keine Farbe ist, vertritt, zu". Selbst ein Muttersprachler versteht den Satz erst, wenn er die Verben am Ende liest. Bis dahin wird auch sein Gehirn blockieren und den Sinn des Satzes nicht erfassen. Ziehen wir die Verben hingegen nach vorn, ist er flüssig verständlich: "Ich stimme dem Maler zu, der die Meinung vertritt, dass Rot keine Farbe ist." Das zeitige Auftreten des Verbs hilft dem Gehirn, sich auf die nachfolgenden Satzteile einzustellen, ganz gleich wie lang sie sind. Sie übernehmen eine ähnliche Funktion wie die Delay Slots.

Der Text ist eine Übersetzung eines Beitrags auf Stipicevics Blog.

 (msi)


© 1997–2019 Golem.de, https://www.golem.de/