{"id":1382,"date":"2012-06-24T11:53:03","date_gmt":"2012-06-24T09:53:03","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=1382"},"modified":"2012-06-24T11:53:03","modified_gmt":"2012-06-24T09:53:03","slug":"primitiv-und-verweis-typ-und-der-vergleich-mit-smalltalk-und-net","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2012\/06\/primitiv-und-verweis-typ-und-der-vergleich-mit-smalltalk-und-net\/","title":{"rendered":"Primitiv- und Verweis-Typ und der Vergleich mit Smalltalk und .NET"},"content":{"rendered":"<p>Die Datentypen in Java zerfallen in zwei Kategorien:<\/p>\n<ul>\n<li>Primitive Typen: Die primitiven (einfachen) Typen sind die eingebauten Datentypen f\u00fcr Zahlen, Unicode-Zeichen und Wahrheitswerte.<\/li>\n<li>Referenztypen: Mit diesem Datentyp lassen sich Objektverweise etwa auf Zeichenketten, Datenstrukturen oder Zwergpinscher verwalten.<\/li>\n<\/ul>\n<p>Warum sich damals Sun f\u00fcr diese Teilung entschieden hat, l\u00e4sst sich mit einem einfachen Grund erkl\u00e4ren: Java ist als Programmiersprache entworfen worden, die kleine schwache Ger\u00e4te unterst\u00fctzen sollte, und auf denen musste die Java-Software, die am Anfang noch interpretierte wurde, so schnell wie m\u00f6glich laufen. Unterscheidet der Compiler zwischen primitiven Typen und Referenztypen, so kann der er relativ leicht Bytecode erzeugen, der ebenfalls zwischen den beiden Typen unterscheidet. Damit kann die Laufzeitumgebung auch den Programmcode viel schneller ausf\u00fchren, und das mit einem relativen einfachen Compiler. Das war f\u00fcr die Anfangszeit ein wichtiges Kriterium.<\/p>\n<p>Sprachvergleich mit Smalltalk und .NET<\/p>\n<p>In Smalltalk ist alles ein Objekt, auch die eingebauten Sprachdatentypen. F\u00fcr Zahlen gibt es einen Basistyp Number und Integer, Float, Fraction als Untertypen. Immer noch gibt es arithmetische Operatoren (+, -, *, \/, \/\/, \\\\ um sie alle aufzuz\u00e4hlen), aber das sind nur Methoden der Klasse Number.<a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftn1_2532\" name=\"_ftnref1_2532\">[1]<\/a> F\u00fcr Java-Entwickler sind Methodennamen wie + oder &#8211; ungew\u00f6hnlich, doch in Smalltalk ist es das nicht. Syntaktisch unterscheidet sich ein 1 + 2 in Java und Smalltalk nicht, nur in Smalltalk ist die Addition ein Nachrichtenaufruf an das Integer-Objekt 1 an die Methode + mit dem Argument 2, was wiederum ein Integer-Objekt ist \u2013 die Objekte baut der Compiler selbst\u00e4ndig aus den Literalen auf. Eine Klasse Integer f\u00fcr Ganzzahlen besitzt weitere Methoden wie asCharacter, floor usw.<a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftn2_2532\" name=\"_ftnref2_2532\">[2]<\/a> Es ist wichtig zu verstehen, dass dies nur das semantische Modell auf der Sprachseite ist; das hat nichts damit zu tun, wie sp\u00e4ter die Laufzeitumgebung diese speziellen Nachrichtenaufrufe optimiert. Moderne Smalltalk-Laufzeitumgebungen mit Just-In-Time-Compilation sind bei arithmetischen Operationen auf einen \u00e4hnlichen Level wie C oder Java. Durch die Einteilung von Java in primitive Datentypen und Referenztypen haben die Sprachsch\u00f6pfer einen objektorientierten Bruch in Kauf genommen, um die interpretierte Laufzeit Anfang der 1990er zu optimieren \u2013 eine Optimierung, die aus heutiger Sicht unn\u00f6tig war.<\/p>\n<p>In .NET ist es eher wie in Java. Der Compiler kennt eingebauten Datentypen und gibt ihnen eine Sonderbehandlung, es sind keine Methodenaufrufe. Auch im Bytecode (Common Intermediate Language, kurz CIL in .NET genannt) finden sich Anweisungen wie Addition, Subtraktion wieder. Doch es gibt noch einen Unterschied zu Java. Der Compilder bildet Datentypen der .NET-Sprachen auf .NET-Klassen ab, und diese Klassen haben Methoden. In C# ist der eingebaute Datentyp float mit dem Datentyp Single (aus dem .NET-Paket System) identisch und es ist egal, ob Entwickler float f oder Single f schreiben. Doch Single (respektive float) hat im Vergleich zu Smalltalk keine mathematischen Operationen, aber dennoch ein paar wenige Methoden wie ToString()<a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftn3_2532\" name=\"_ftnref3_2532\">[3]<\/a>. In .NET verhalten sich folglich die eingebauten Datentypen wie Objekte, sie haben Methoden, haben aber die gleiche Wertsemantik zum Beispiel bei Methodenaufrufen wie in Java, und sehen auch im Bytecode \u00e4hnlich aus, was ihnen die gleiche gute Performance gibt.<\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftnref1_2532\" name=\"_ftn1_2532\">[1]<\/a> Die Dokumentation f\u00fcr das GNU Smalltalk zeigt auf: <a href=\"http:\/\/www.gnu.org\/software\/smalltalk\/manual-base\/html_node\/Number_002darithmetic.html#Number_002darithmetic\">http:\/\/www.gnu.org\/software\/smalltalk\/manual-base\/html_node\/Number_002darithmetic.html#Number_002darithmetic<\/a><\/p>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftnref2_2532\" name=\"_ftn2_2532\">[2]<\/a> <a href=\"http:\/\/www.gnu.org\/software\/smalltalk\/manual-base\/html_node\/Integer.html\">http:\/\/www.gnu.org\/software\/smalltalk\/manual-base\/html_node\/Integer.html<\/a>.<\/p>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Insel\/#_ftnref3_2532\" name=\"_ftn3_2532\">[3]<\/a> Siehe <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/system.int32_members(v=vs.71).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/system.int32_members(v=vs.71).aspx<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Datentypen in Java zerfallen in zwei Kategorien: Primitive Typen: Die primitiven (einfachen) Typen sind die eingebauten Datentypen f\u00fcr Zahlen, Unicode-Zeichen und Wahrheitswerte. Referenztypen: Mit diesem Datentyp lassen sich Objektverweise etwa auf Zeichenketten, Datenstrukturen oder Zwergpinscher verwalten. Warum sich damals Sun f\u00fcr diese Teilung entschieden hat, l\u00e4sst sich mit einem einfachen Grund erkl\u00e4ren: Java ist [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-1382","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1382","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=1382"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1382\/revisions"}],"predecessor-version":[{"id":1383,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/1382\/revisions\/1383"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=1382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=1382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=1382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}