Dynamische Typisierung
Dynamische Typisierung (engl. dynamic typing) bezeichnet ein Schema der Typisierung von Programmiersprachen, bei der Typ-Prüfungen (etwa des Datentyps von Variablen) vorrangig zur Laufzeit eines Programms stattfinden. Im Gegensatz dazu wird bei der statischen Typisierung die Typ-Prüfung bereits zum Zeitpunkt der Kompilierung durchgeführt.
Skriptsprachen wie JavaScript, Python und Ruby verwenden die dynamische Typisierung.
Beispiele
Python
Hier eine interaktive Python-Sitzung:
<syntaxhighlight lang="python"> >>> a = 1 # a enthält durch Zuweisung eine ganze Zahl >>> a += 1.0 # addiert die Gleitkommazahl 1.0 und legt neuen Wert (mit anderem Typ) in a ab >>> a.upper() # Scheitert: a ist keine Zeichenkette Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'upper' >>> a # gibt den Wert von a aus 2.0 >>> a = "jetzt ist a ein String" >>> a += 1 # Scheitert: Inhalt von a ist jetzt ein String Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects >>> a.upper() 'JETZT IST A EIN STRING' </syntaxhighlight>
In Python haben Variablen keinen Typ, lediglich die Objekte, auf welche die Variablen referenzieren. Die Fehlermeldung „has no attribute 'upper' “ illustriert, dass der Python-Interpreter nicht unbedingt einen String verlangt, sondern mit einem beliebigen Objekt mit einer Methode upper zufrieden wäre (siehe Duck-Typing).
Boo
Beispiel von der Projektseite<ref><templatestyles src="Webarchiv/styles.css" />{{#if:20070203042305
| {{#ifeq: 20070203042305 | *
| {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20070203042305}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20070203042305}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| 9 = {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }} ({{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: Boo-Projektseite | {{#invoke:WLink|getEscapedTitle|Boo-Projektseite}} | {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing}} }}
}}}}}}}}{{#if:
| Vorlage:Webarchiv/archiv-bot
}}{{#invoke:TemplatePar|check
|all = url=
|opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
|cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
|errNS = 0
|template = Vorlage:Webarchiv
|format = *
|preview = 1
}}{{#ifexpr: {{#if:20070203042305|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
}}{{#if:
| {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
| web.archive.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}}
| webcitation.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}}
| archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
}}{{#if:
| {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
}}
}}{{#if:{{#invoke:URLutil|isHostPathResource|http://boo.codehaus.org/Part+18+-+Duck+typing}}
|| {{#if: || }}
}}{{#if: Boo-Projektseite
| {{#if: {{#invoke:WLink|isBracketedLink|Boo-Projektseite}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://boo.codehaus.org/Part+18+-+Duck+typing%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://boo.codehaus.org/Part+18+-+Duck+typing%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://boo.codehaus.org/Part+18+-+Duck+typing }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
}}
}}
}}, Stand 19. April 2006, 19.52 Uhr</ref>
<syntaxhighlight lang="javascript" line> d as duck
d = 5 // Derzeitig als Integer definiert. print d d += 10 // Es kann alles, was ein Integer kann. print d d = "Hi there" // Wird zu einem String gesetzt. print d d = d.ToUpper() // Jetzt kann es alles, was ein String kann. print d </syntaxhighlight>
Ausgabe:
5 15 Hi there HI THERE
Erläuterung des Beispiels
Es wird die Variable d angelegt und ihr wird der Datentyp duck zugewiesen. Dies ist kein richtiger Datentyp, sondern nur eine Art Container, der andere Datentypen annehmen kann. In der dritten Zeile wird d der Integerwert 5 zugewiesen.
In Zeile 7 wird die Zeichenkette Hi there zugewiesen. In anderen Programmiersprachen wie beispielsweise C# oder C++ würde dies jetzt zu einem Compiler-Fehler führen.
Der Boo-Compiler hingegen erkennt am Datentyp duck, dass sich der Datentyp der Variable d ändern kann.
Siehe auch
Weblinks
- Golo Roden – Programmierkonzepte, Teil 4: Dynamische Typisierung vom 25. Januar 2016 auf heise online
Einzelnachweise
<references />