PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : D: Da hat sich jemand mal Gedanken gemacht


aths
2013-08-12, 16:51:32
Als ich einen Quelltext kompilieren wollte, meckerte er rum dass eine Variable falsch geschrieben sei. Der Compiler brachte auch gleich noch einen Vorschlag, welche Variable richtig sei.


Gut finde ich die Präfixe in und out für Funktionen. "in" deklariert die Variable für die Funktion als Konstante. Richtiger Einsatz erspart einem sicherlich eine Menge Programmierfehler. Mit "ref" und "out" wird die Variable hingegen geändert, was effiziente Programmierung ermöglicht. "out" ignoriert den übergebenen Wert und setzt die Variable zunächst auf den Standardwert (Null für Integer-Datentypen, NaN für Float-Datentypen.) Da hat man schon bei der Programmierung gute Kontrolle über das Verhalten von Variablen, zumal Floats mit NaN und nicht mit 0 initialisiert werden.

Was mir gut gefällt, ist, dass selbst int ein Objekt ist und Eigenschaften hat wie .sizeof oder .init.


Folgender Code:

int anzahl=10;
foreach (a; 0..anzahl)

Hier wird NICHT von 0..10, sondern 0..9 gerechnet. ENDLICH fällt das lästige -1 weg!!!

Die vermutlich zwei besten Dinge an D ist für mich die einfache Größenänderung eines Arrays mit Zuweisung der .length-Eigenschaft. Endlich muss ich nicht mehr statische Arrays deklarieren welche für den schlimmsten Fall dimensioniert wurden. Und man kann Arrays-Inhalte ohne Schleife kopieren. ENDLICH.

Kampf-Sushi
2013-08-12, 17:17:52
Schon mal C# ausprobiert?

Watson007
2013-08-12, 17:19:27
Und man kann Arrays-Inhalte ohne Schleife kopieren. ENDLICH.

in Java und C# geht das doch schon lang, zumindest das gesamte Array. Oder meinst du Teile eines Arrays? Das wüsste ich nicht aus dem Kopf.

Marscel
2013-08-12, 17:51:30
Du hast davor noch nie über den Tellerrand geguckt, oder?

Grundkurs
2013-08-12, 17:56:44
Du hast davor noch nie über den Tellerrand geguckt, oder?

Ich denke er bezieht sich auf die Unterschiede zu C/C++

Marscel
2013-08-12, 18:10:19
Ich denke er bezieht sich auf die Unterschiede zu C/C++

Glaube ich nicht. Dazu ließt sich seine Beschreibung zu entfernt von C/C++: Was für eine -1? Statische Initialisierung von Array mit Größe für Worst-Case? :freak:

Kampf-Sushi
2013-08-12, 18:37:10
Glaube ich nicht. Dazu ließt sich seine Beschreibung zu entfernt von C/C++: Was für eine -1? Statische Initialisierung von Array mit Größe für Worst-Case? :freak:
Er meint bestimmt sowas for(i=0; i <= ary.count -1; i++);
Dass das in der Form vollkommener Quatsch so ist, sei mal dahin gestellt. (Das weiß ich selber ;))
Oder er meint halt ne andere Stelle wo sich das -1 wirklich nicht vermeiden lässt ich denk mal Du weißt was ich mein. Aber das kommt halt auf das Objekt an welche Methoden/ Attribute es bietet. Hat eigentlich weniger mit der Sprache zu tun.

aths
2013-08-12, 18:48:46
Schon mal C# ausprobiert?
Ja, aber nur kurz da sich keine nativen Executables erstellen lassen.


in Java und C# geht das doch schon lang, zumindest das gesamte Array. Oder meinst du Teile eines Arrays? Das wüsste ich nicht aus dem Kopf.
In C++ und Pascal darf ich immer mit einer Schleife das Array kopieren.


Glaube ich nicht. Dazu ließt sich seine Beschreibung zu entfernt von C/C++: Was für eine -1? Statische Initialisierung von Array mit Größe für Worst-Case? :freak:
Statische Array-Erstellung nutze ich oft in Pascal (Delphi) weil es einfach ist. Also nix mit Pointern und Speicherplatz anfordern.

Die -1 nervt zum Beispiel, wenn man eine Listbox durchnudelt.

for i:=0 to Listbox1.Count-1 do begin

Immer das vermaledeite -1.

Watson007
2013-08-12, 19:02:13
Die -1 nervt zum Beispiel, wenn man eine Listbox durchnudelt.

for i:=0 to Listbox1.Count-1 do begin

Immer das vermaledeite -1.

kein Iterator verfügbar?

PatkIllA
2013-08-12, 19:05:18
Ja, aber nur kurz da sich keine nativen Executables erstellen lassen.Definiere nativ und warum das so einschränkend ist.
In C++ und Pascal darf ich immer mit einer Schleife das Array kopieren.Da gibt es ja Hilfmethoden oder wenn man möchte kann man da ja sogar stumpf den Speicher kopieren.
Statische Array-Erstellung nutze ich oft in Pascal (Delphi) weil es einfach ist. Also nix mit Pointern und Speicherplatz anfordern.
Das hast du in den ganzen verwalteten Sprachen auch nicht. Da gibt es dann auch diverse Schnittstellen und Implementierungen im Framework dabei.
Die -1 nervt zum Beispiel, wenn man eine Listbox durchnudelt.

for i:=0 to Listbox1.Count-1 do begin

Immer das vermaledeite -1.Sowas kann man a mit der IDE auch ohne viel Tippen automatisch machen und bei anderen SPrachen kann man auch eine for (int i = 0;i < list.Count;i++) machen.
Oder meinst du Teile eines Arrays? Das wüsste ich nicht aus dem Kopf.Geht auch mit Teilen.
Die vermutlich zwei besten Dinge an D ist für mich die einfache Größenänderung eines Arrays mit Zuweisung der .length-Eigenschaft. Endlich muss ich nicht mehr statische Arrays deklarieren welche für den schlimmsten Fall dimensioniert wurden. Dann werden das aber keine low level Arrays sein, wie man sie klassischerweise kennt. Das kann man dann eigentlich in allen Sprachen mit den passenden Hilfsklassen haben.

Watson007
2013-08-12, 19:15:42
in Java kann man ja mit Iteratoren durch Datenmengen gehen welche das List-Interface implementieren:

int gesamtLänge( List<String> strings )
{
int gesamt = 0;

for ( String s : strings )
{
gesamt += s.length();
}

return gesamt;
}

Quelle: http://openbook.galileodesign.de/javainsel5/javainsel11_001.htm#Rxx747java110010400038D1F032100

Java und C# sind schon komfortabel aus Programmierersicht.
Man muss aber schon sagen dass man Java-Programmen ihre Herkunft anmerkt, sie wirken immer etwas träge.
Dennoch, aus programmiertechnischer Sicht habe ich kaum etwas an Java zu bemängeln; ich programmiere gern damit.

Ich kam vor ein paar Jahren von Pascal/Delphi, heute würde ich das nicht mehr empfehlen. Zu veraltet.
Als Einstieg würde ich eher Java oder C# empfehlen, dort lernt man das objektorientierte Paradigma besser. Speziell bei Delphi/Pascal war die Objektorientierung zu sehr nachträglich drangefrickelt fand ich.

Außerdem hatte ich zuviele Fehler in der Delphi-VCL gefunden als dass ich das noch empfehlen könnte....

Marscel
2013-08-12, 19:22:30
In C++ und Pascal darf ich immer mit einer Schleife das Array kopieren.

Pascal kenn ich schwach nur aus dem vergilbtem Buch aus der Uni-Zeit von meinem Vater, aber zu C++:

* Du kannst memcpy nutzen, wenn es sich um ein reguläres Array handelt.
* Wenn du irgendeinen STL-Container nutzt, führen die Kopien bei Zuweisung durch.
* Der auf x86 reguläre Fall verlangt, dass du bei Speicherkopien den Quellwert innerhalb einer Schleife erst in ein Register lädst und dann wieder in den Speicher kopierst. Etwas anders kann man es bei Strings machen.


Statische Array-Erstellung nutze ich oft in Pascal (Delphi) weil es einfach ist. Also nix mit Pointern und Speicherplatz anfordern.

Nagut, wenns stets auf Überlauf geprüft wird.

Die -1 nervt zum Beispiel, wenn man eine Listbox durchnudelt.

for i:=0 to Listbox1.Count-1 do begin

Immer das vermaledeite -1.

So gut wie jede von C entwickelte Sprache kann for(<init>;<cond>;<after-each>), das ist nun bei weitem keine Innovation von D. Und wenn dich das immer so stört, wieso nicht?

i := 0
while i < Listbox1.Count do
i := i + 1

aths
2013-08-12, 19:52:07
Definiere nativ und warum das so einschränkend ist. In C# kann man meines Wissens keinen Inline-Assembler nutzen. Und nicht alle Systeme haben die jeweils erforderliche virtuelle Maschine installiert. Einen C- oder D-Quelltext kann man auch für Linux kompilieren, ohne dass Mono installiert sein muss, oder bei Java entsprechend Java.

Man muss bei D nicht zwingend das Binary des Programms haben. Um D zum Beispiel als Shellscript-Sprache zu "installieren" kopiert man es ins Dateisystem und stellt dem D-Quelltext ähnlich wie in Bash-Scripten statt einem #!/bin/sh den Pfad zu rdmd voran und kann dann D-Quelltexte direkt vor der Ausführung kompilieren lassen. Man hat mit D die Möglichkeit, Quelltexte statt Binaries zu nutzen.
Dann werden das aber keine low level Arrays sein, wie man sie klassischerweise kennt. Das kann man dann eigentlich in allen Sprachen mit den passenden Hilfsklassen haben.Wenn ich D richtig verstehe, sind Arrays C-speicherkompatibel abgelegt, so dass man auf Wunsch Pointerarithmetik nutzen kann. Doch es gibt nur "Arrays", die aus D-Sicht immer Objekte sind und auch die Length-Eigenschaft haben. Das finde ich ja so gut, dass das direkt mit Bordmitteln geboten wird.

aths
2013-08-12, 19:53:56
Ich kam vor ein paar Jahren von Pascal/Delphi, heute würde ich das nicht mehr empfehlen. Zu veraltet.
Als Einstieg würde ich eher Java oder C# empfehlen, dort lernt man das objektorientierte Paradigma besser. Speziell bei Delphi/Pascal war die Objektorientierung zu sehr nachträglich drangefrickelt fand ich.

Außerdem hatte ich zuviele Fehler in der Delphi-VCL gefunden als dass ich das noch empfehlen könnte....
In Pascal muss man zur Implementierung eine Menge tippen. Ich nutze es noch wegen Delphi und Lazarus. In C# ist es für mich als Noob ein Krampf, bei einem Button-Klick das Label eines anderen Forms des gleichen Projekts zu ändern.

Pascal kenn ich schwach nur aus dem vergilbtem Buch aus der Uni-Zeit von meinem Vater, aber zu C++:

* Du kannst memcpy nutzen, wenn es sich um ein reguläres Array handelt.
* Wenn du irgendeinen STL-Container nutzt, führen die Kopien bei Zuweisung durch.
* Der auf x86 reguläre Fall verlangt, dass du bei Speicherkopien den Quellwert innerhalb einer Schleife erst in ein Register lädst und dann wieder in den Speicher kopierst. Etwas anders kann man es bei Strings machen.
Der Aufruf von Funktionen ist mir aus Syntax-Sicht zu umständlich. So mache ich es zwar mangels besserer Methoden oft in Pascal, noch dazu gerne mit bösen globalen Variablen. Ich finde es in D zum Beispiel gut, a.sizeof nutzen zu können statt sizeof(a) tippen zu müssen. Aus Syntax-Sicht halte ich das für eleganter.

Nagut, wenns stets auf Überlauf geprüft wird.

So gut wie jede von C entwickelte Sprache kann for(<init>;<cond>;<after-each>), das ist nun bei weitem keine Innovation von D. Und wenn dich das immer so stört, wieso nicht?

i := 0
while i < Listbox1.Count do
i := i + 1
Weil ich der Übersicht wegen mit For-Schleifen arbeite. Das inc(i) ist eine Rechenoperation, die das Sprachkonstrukt einer Durchzähl-Schleife selbst implizieren soll. Ich will mit dem Programmieren ein Problem lösen und mich nicht mit der Implementierung von Schleifen beschäftigen.

Kenny1702
2013-08-12, 20:04:36
Ich frage mich derzeit, wann ich das letzte Mal ein for-Schleife benutzt habe, aber ich weiß es nicht. So gut wie alles was ich mache wird mit foreach(var element in typedcollection) erschlagen, daher fehlt mir irgendwie die Begeisterung.

aths
2013-08-12, 20:08:50
Ich frage mich derzeit, wann ich das letzte Mal ein for-Schleife benutzt habe, aber ich weiß es nicht. So gut wie alles was ich mache wird mit foreach(var element in typedcollection) erschlagen, daher fehlt mir irgendwie die Begeisterung.
Du bist ja toll.

PatkIllA
2013-08-12, 20:32:19
Wenn ich D richtig verstehe, sind Arrays C-speicherkompatibel abgelegt, so dass man auf Wunsch Pointerarithmetik nutzen kann. Doch es gibt nur "Arrays", die aus D-Sicht immer Objekte sind und auch die Length-Eigenschaft haben. Das finde ich ja so gut, dass das direkt mit Bordmitteln geboten wird.Dann wird da im Hintergrund aber auch umkopiert werden müssen und der Pointer zeigt nicht auf das erste Element.
Der Aufruf von Funktionen ist mir aus Syntax-Sicht zu umständlich.:confused:
noch dazu gerne mit bösen globalen Variablen.:down:
Ich finde es in D zum Beispiel gut, a.sizeof nutzen zu können statt sizeof(a) tippen zu müssen. Aus Syntax-Sicht halte ich das für eleganter.Sowas kann man ja in den allermeisten Sprachen haben.
Weil ich der Übersicht wegen mit For-Schleifen arbeite.Der Übersicht wegen? Da ist so ein foreach wo man dann auch direkt das jeweilige Item hat doch sehr viel besser lesbarer und es verhindert auch, dass man in der Schleife noch böse Dinge macht.
Das inc(i) ist eine Rechenoperation, die das Sprachkonstrukt einer Durchzähl-Schleife selbst implizieren soll. Ich will mit dem Programmieren ein Problem lösen und mich nicht mit der Implementierung von Schleifen beschäftigen.Und genau deshalb ist so ein foreach sehr viel schöner.

del_4901
2013-08-12, 20:49:56
Als ich einen Quelltext kompilieren wollte, meckerte er rum dass eine Variable falsch geschrieben sei. Der Compiler brachte auch gleich noch einen Vorschlag, welche Variable richtig sei.
Das kann clang auch

aths
2013-08-12, 22:27:53
Das kann clang auch
Das ist schön für dich.

Sry, bin gerade etwas gereizt. (Ich sollte mir mal ein Bier genehmigen.)

Es ging um D vs C#, nicht C.

Dann wird da im Hintergrund aber auch umkopiert werden müssen und der Pointer zeigt nicht auf das erste Element.
:confused:
:down:
Sowas kann man ja in den allermeisten Sprachen haben.
Der Übersicht wegen? Da ist so ein foreach wo man dann auch direkt das jeweilige Item hat doch sehr viel besser lesbarer und es verhindert auch, dass man in der Schleife noch böse Dinge macht.
Und genau deshalb ist so ein foreach sehr viel schöner.
Wie D die Arrays genau speichert, weiß ich nicht. Ich vermute, dass die Objekt-Eigenschaften eigentlich nur Syntax-Sugar sind und intern nur entsprechende Funktionen aufgerufen werden. Dann hätte man weiterhin Pointer-Arithmetik verfügbar.

Foreach zähle ich im weiteren Sinne mit zu den For-Schleifen. Mein Beispiel war For im Vergleich zu While.

aths
2013-08-12, 23:28:01
kein Iterator verfügbar?
Was ist ein Iterator?

Ich habe ein Buch zu D gekauft und raffe da etliche Quellcode-Beispiele nicht. Im einer handvoll Zeilen zum Beispiel wird ein Programm vorgestellt, das die Wörter einer Textdatei (hamlet.txt) auf Häufigkeit analysiert und sortiert ausgibt.

Es macht mir trotzdem Spaß, mich damit zu beschäftigen, weil im Vergleich zu C++ offenbar viel entschlackt wurde ohne Funktionalität einzubüßen. Die Standard-Bibliotheken bieten eine Reihe an Funktionen, die man wirklich brauchen kann. Sowohl was String-Operationen angeht, da sollte man mit D elegant einen Parser programmieren können, als auch was nummerische Datentypen auf Bitebene angeht. Und man kann einfach prüfen, ob ein Float Subnormal ist (also bereits Präzision verliert.)

Als ich im Internet von der Unterstützung komplexer Zahlen las, hätte ich beinahe abgespritzt.

PatkIllA
2013-08-12, 23:30:35
Was ist ein Iterator?Ein absolutes Grundkonstrukt, um über die Elemente einer Datenstruktur zu laufen.
Würde ich so in die erste Woche eines Programmierkurses erwarten. Zumindest das Benutzen.
Ich habe ein Buch zu D gekauft und raffe da etliche Quellcode-Beispiele nicht. Im einer handvoll Zeilen zum Beispiel wird ein Programm vorgestellt, das die Wörter einer Textdatei (hamlet.txt) auf Häufigkeit analysiert und sortiert ausgibt.Kein Problem auch in anderen Sprachen. Ich glaube das kann man mit LinQ in eine Zeile packen.

Watson007
2013-08-12, 23:33:21
Was ist ein Iterator?

das was ich in Post 11 geschrieben habe ist ein Beispiel für einen Iterator in Java.

man bewegt sich nicht mit einem Zähler und indexbasiertem Zugriff durch eine Datenmenge sondern mit einem Zeiger: http://de.wikipedia.org/wiki/Iterator
natürlich braucht man trotzdem hin und wieder Zählschleifen...

naja das sind ja nur Kleinigkeiten. Was gibt es denn an größeren Fortschritten in D?

aths
2013-08-12, 23:54:57
das was ich in Post 11 geschrieben habe ist ein Beispiel für einen Iterator in Java.

man bewegt sich nicht mit einem Zähler und indexbasiertem Zugriff durch eine Datenmenge sondern mit einem Zeiger: http://de.wikipedia.org/wiki/Iterator
natürlich braucht man trotzdem hin und wieder Zählschleifen...

naja das sind ja nur Kleinigkeiten. Was gibt es denn an größeren Fortschritten in D?
Funktionen zur Datenkomprimierung? Weitestgehende IEEE754-konforme Float-Rechnungen, genaue Abfrage der Eigenschaften der verschiedenen Float-Typen und Support von 80-Bit-Floats, (inklusive Zugriff auf Komponenten wie Mantisse, Exponent, Sign) anstatt maschinenabhängig mal dies, mal jenes zu bekommen?

Monger
2013-08-12, 23:59:00
Zumindest von dem was ich hier im Forum bisher lesen konnte, ist das exotischste an D dass der Compiler Binärcode erzeugt. Allzu viele Sprachen die das machen gibt es ja nicht mehr. Viele laufen mittlerweile in irgendeiner Form von Runtime oder Sandbox. Deshalb kann man D wohl fairerweise nur mit C++ vergleichen, und da fehlt mir die Erfahrung.
Aber mal davon abgesehen davon...


"in" deklariert die Variable für die Funktion als Konstante.

In Java gibt es für solche Zwecke - sowohl Felder als auch Variablen - das Schlüsselwort const. Das erzwingt, dass der Wert genau einmalig gesetzt wird. Bin jetzt nicht sicher ob das bereits in den Methodenparametern geht, aber es geht in die Richtung. In .Net gibt es eine etwas zahnlose Variante davon namens ReadOnly, die erzwingt das Felder nur im Konstruktor gesetzt werden dürfen.

Richtiger Einsatz erspart einem sicherlich eine Menge Programmierfehler. Mit "ref" und "out" wird die Variable hingegen geändert, was effiziente Programmierung ermöglicht. "out" ignoriert den übergebenen Wert und setzt die Variable zunächst auf den Standardwert (Null für Integer-Datentypen, NaN für Float-Datentypen.)

Ref kennen die größeren .NET Sprachen alle, gilt aber dort zurecht als böse. Out ist in C# sehr populär, und auch sehr vernünftig. Allerdings erzwingt der Compiler, dass Out Variablen nicht vorab initialisiert werden dürfen, und nicht implizit irgendwelche Standardwerte angenommen werden.


Was mir gut gefällt, ist, dass selbst int ein Objekt ist und Eigenschaften hat wie .sizeof oder .init.

Ist wohl in nahezu allen modernen Hochsprachen so, nur in Java nicht. Die Scharte hat man später versucht mit Autoboxing der nativen Typen in die jeweiligen Objekt-Äquivalente zu erschlagen, was aber mMn etwas unglücklich geraten ist.


Folgender Code:

int anzahl=10;
foreach (a; 0..anzahl)

Hier wird NICHT von 0..10, sondern 0..9 gerechnet. ENDLICH fällt das lästige -1 weg!!!

Wie ja hier schon öfters geschrieben: die althergebrachten For-Schleifen sind nicht zuletzt wegen Index Fehlern ohnehin etwas veraltet. Für sowas gibt es Iteratoren. Je nach Anwendungsfall und Collection Typus können Enumeratoren sogar noch ne Ecke schneller sein, nicht alle Datenstrukturen kennen einen Index.

Ich finde, .NET ist da mit den Extension Methods schon vorbildlich, vor allem weil die im Gegensatz zu der oben gezeigten Schleife auch Index Fehler vermeiden:

foreach (var el in Elemente.Skip(3).Take(5))

next



Die vermutlich zwei besten Dinge an D ist für mich die einfache Größenänderung eines Arrays mit Zuweisung der .length-Eigenschaft.

In anderen Sprachen kennt man solche dynamischen Listen entweder als List oder ArrayList - in aller Regel mit generischem Parameter bzw. als Template. In .NET ist z.B. die List so leichtgewichtig, dass der Overhead zum Array kaum ins Gewicht fällt. Ergo wachsen da mittlerweile Entwickler auf die in der Praxis noch nie ein Array gesehen haben, sondern immer nur die List verwenden.

Endlich muss ich nicht mehr statische Arrays deklarieren welche für den schlimmsten Fall dimensioniert wurden. Und man kann Arrays-Inhalte ohne Schleife kopieren. ENDLICH.
Da Listen Konstruktoren haben können, passiert das in manchen Sprachen gerne über einen Copy Construktor:
List<String> l = new List<String>(oldList);

Oder um wieder .NET zu zitieren, via Extension method:
List<String> l = old.ToList();



Ich kenn C++ jetzt nicht wirklich, aber meines Wissens hat sich auch da ja die Welt in den letzten zehn Jahren weitergedreht. Zumindest C++/CLI ist dem ja wohl auch sehr ähnlich. Ich seh da grad noch kein Alleinstellungsmerkmal für D. Immerhin haben sie gut bei etablierten Sprachen abgekupfert. Besser gut kopiert als schlecht erfunden.

Marscel
2013-08-13, 00:10:31
Ich will mit dem Programmieren ein Problem lösen und mich nicht mit der Implementierung von Schleifen beschäftigen.

Bei irgendeinem RAD/Frontend/Bytecode-Zeug sicher nicht. Bei allem, was an Rechnerzeit nagt, sollte das aber vollständig berücksichtigt werden.

Gast
2013-08-13, 18:41:13
In Java gibt es für solche Zwecke - sowohl Felder als auch Variablen - das Schlüsselwort const. Das erzwingt, dass der Wert genau einmalig gesetzt wird. Bin jetzt nicht sicher ob das bereits in den Methodenparametern geht, aber es geht in die Richtung.
Du meinst "final" nehme ich an?
Ja, geht auch für Methodenparameter, ist aber oft irreführend: Bei Objekten bedeutet "final" nur, dass der Zeiger auf das Objekt konstant bleibt. Da auf dem Objekt weiterhin Methoden aufgerufen werden können, kann sich der Inhalt des Objekts problemlos ändern (außer es ist immutable designed natürlich).
Genau aus diesem grundlegenden Design heraus würde "in" und "out" aber auch semantisch nicht in die Sprache passen imho.

johla
2013-08-13, 20:19:18
Hast du schon einmal C++11 betrachtet?

PatkIllA
2013-08-13, 20:36:39
Ref kennen die größeren .NET Sprachen alle, gilt aber dort zurecht als böse. Out ist in C# sehr populär, und auch sehr vernünftig. Allerdings erzwingt der Compiler, dass Out Variablen nicht vorab initialisiert werden dürfen, und nicht implizit irgendwelche Standardwerte angenommen werden. Leider kann die CLR kein Out. Da gibt es nur ref und deswegen geht die mit C# 4 eingeführte Contravarianz nicht mit out-Parametern. Wie sieht es denn in D mit Generics aus?
Sehr praktisch sind auch die automatisch implementieren Iteratoren in C#/VB.NET. Selbst implementieren möchte man die ja meistens nicht.

Wie ja hier schon öfters geschrieben: die althergebrachten For-Schleifen sind nicht zuletzt wegen Index Fehlern ohnehin etwas veraltet. Für sowas gibt es Iteratoren. Je nach Anwendungsfall und Collection Typus können Enumeratoren sogar noch ne Ecke schneller sein, nicht alle Datenstrukturen kennen einen Index.Relativ gesehen ist das bei den meisten deutlich langsamer, da dort noch ein Objekt erzeugt wird und noch mehr Checks laufen. Je nach Datentyp gibt es aber noch ein paar Compileroptimierungen. Bei den ohne Index gibt es ja meist erst keinen Indexzugriff.
Allgemein finde ich die mitgelieferten Collection-Klassen sehr mächtig. Auch wenn es kein Sprachfeature ist finde ich das deutlich angenehmer als in C++ wo man nicht mal wirklich einen string Datentyp hat.

Ich finde, .NET ist da mit den Extension Methods schon vorbildlichDie haben auch noch ganz andere Vorteile. Mein Lieblingsfeature ist, dass man sich sein Interface-Design nicht durch Conviencemethoden aufblähen muss.
Weitestgehende IEEE754-konforme Float-Rechnungen, genaue Abfrage der Eigenschaften der verschiedenen Float-Typen und Support von 80-Bit-Floats, (inklusive Zugriff auf Komponenten wie Mantisse, Exponent, Sign) anstatt maschinenabhängig mal dies, mal jenes zu bekommen?Wie oft brauchst du das denn, die Floats in ihre Einzelheiten zu zerlegen?
Was meinst du denn mit maschinenabhängig?

PatkIllA
2013-08-14, 11:22:01
Noch als Nachschlag zu den Arrays.
http://dlang.org/arrays.html
Es gibt also verschiedene Typen von Arrays. Die statischen Arrays funktionieren genauso wie man sie kennt und das was hinter dynamischen und assoziativen Arrays steckt gibt es genauso in praktische allen Sprachen/Frameworks und heißt da nur anders.

aths
2013-08-14, 11:59:45
Interessanter Link, ich hatte kürzlich eine Frage zu Arrays aber nun ist es mir klar. Solange Performance nicht das Hauptproblem ist, sollte ich wohl dynamische Arrays nutzen.

Gast
2013-08-14, 16:41:38
Interessanter Link, ich hatte kürzlich eine Frage zu Arrays aber nun ist es mir klar. Solange Performance nicht das Hauptproblem ist, sollte ich wohl dynamische Arrays nutzen.

Du solltest die Arrays nutzen, die du für die jeweilige Aufgabe brauchst, PUNKT! Performance ist bei den dynamischen Arrays gar nicht mal so sehr das Problem. Erstens kann man bei den meisten Sprachen den Speicher für dynamische Arrays vorbelegen und zweitens allozieren diese bei vollem Speicher in der Regel die doppelte Menge Speicher als Reserve. D.h., es wird nicht bei jedem Hinzfügen eines neuen Elementes Speicher reserviert und umkopiert. In C++ funktioniert das sogar mit allen Datentypen, selbst wenn diese Konstruktoren und Destruktoren besitzen.