Hallo, es kommt immer häufiger vor, dass Software einfach eine Qualität nahe dem Müllniveau hat. Man kann Dinge programmieren, die prinzipiell falsch sind. Also Speicher explizit anfordern und nicht mehr freigeben, Speicher benutzen aber nicht anfordern, Datenbankeinträge verwerfen, die doch noch gebraucht werden, implizite Datenoperationen durchführen, ... Beispiel - implizites Modulo: long long korrektur(long long x) { return 10000019/10000079*x; } Multiplikation erzeugt Überlauf und Division Auflösungsverlust. Der Compiler führt die Operationen stur der Reihe nach aus. Eine Lösung wäre die manuelle Aufteil in kleine Multiplikationen und Divisionen, im Beispiel sind aber Nenner und Zähler Primzahlen... Anderes Beispiel: char array[500]; float sum; double i; for(i=0;i<123;i++){ sum += array[i]; } Hier sind viele "Fehler" drin, der Code sollte aber dennoch funktionieren. Viele Konstrukte scheinen nur dazu da zu sein, damit der Entwickler des Compilers nicht mehr so viel denken muss. Sollten Datentyp sich nicht lieber auf dem Zweck, statt auf die interne Speicherung beziehen: value(warn_if_complex) array[warn_if_exceed(500)]; value(warn_if_complex) sum; index(error_if_modified_out_of_loophead) i; for(i=lower(array); i<upper(array); i.step(single|upward)){ sum += array[i]; } Zusätzlich sollten Größen unterstützt werden: länge s; fläche A; s = 30 meter + 5 zoll - 5 ellen; A = s^2; print(A.hektar); Gibt es denn keine Software-Entwurfs-Werkzeuge, die so komfortabel sind?
Ich ham mir Deine Ausführungen jetzt nicht zu 100% durchgelesen, aber hast Du schon mal Python angeschaut?
Ja ich habe Python leider mal benutzen müssen. Da sind fiese logische "Bugs" drin. Beispiel: globale Variable - wird in Funktion mit Rechenergebnis überschrieben -> geht; wird in Funktion mit Konstante überschrieben -> entspricht Definition einer lokalen Variable.
Stefan Helmert schrieb: > Hallo, > > es kommt immer häufiger vor, dass Software einfach eine Qualität nahe > dem Müllniveau hat. Man kann Dinge programmieren, die prinzipiell falsch > sind. Also Speicher explizit anfordern und nicht mehr freigeben, > Speicher benutzen aber nicht anfordern, Datenbankeinträge verwerfen, die > doch noch gebraucht werden, implizite Datenoperationen durchführen, ... > > Multiplikation erzeugt Überlauf und Division Auflösungsverlust. Der > Compiler führt die Operationen stur der Reihe nach aus. Eine Lösung wäre > die manuelle Aufteil in kleine Multiplikationen und Divisionen, im > Beispiel sind aber Nenner und Zähler Primzahlen... > > Hier sind viele "Fehler" drin, der Code sollte aber dennoch > funktionieren. Viele Konstrukte scheinen nur dazu da zu sein, damit der > Entwickler des Compilers nicht mehr so viel denken muss. Sollten > Datentyp sich nicht lieber auf dem Zweck, statt auf die interne > Speicherung beziehen: > > Zusätzlich sollten Größen unterstützt werden: > > Gibt es denn keine Software-Entwurfs-Werkzeuge, die so komfortabel sind? Ada kennt div. Typeinschränkungen
1 | subtype ArrayIndex is Integer range -250 .. 250; |
2 | type Hash is mod SomePrimeNumberHere; |
3 | type Float is digits 10 range -1.0 .. 1.0; |
4 | subtype FloatPos is Float range 0.0 .. 1.0; |
5 | array (1 .. 10) Vector of FloatPos; |
6 | Vector1(4 .. 6) := Vector2(5 .. 7); |
F# kennt bspw. Maßeinheiten oder die vorgeschlagenen Schleifenkonstrukte, die anderen Punkte werden schon bei/vor der Übersetzung angemeckert bzw. sind Fehler (was richtig Spaß macht ist der altbekannte read-evaluate-print-loop d.h. man kann ähnlich wie in Python direkt ausprobieren was geht und wie das Ergebnis aussieht...)
1 | [<Measure>] type kg |
2 | [<Measure>] type m |
3 | [<Measure>] type s |
4 | [<Measure>] type J = kg m^2/s^2 |
5 | |
6 | let Ekin (m : float<kg>) (v : float<m/s>) = 0.5 * m * v * v |
7 | let a : float<J> = Ekin 10.0<kg> 10.0<m/s> |
8 | |
9 | let res a skip = |
10 | for b in 1 .. skip .. 100 do ... |
11 | |
12 | let list = [ (1, 11); (2, 13); (3, 17); (4, 19); (5, 23); (6, 29) ] |
13 | let res2 a skip = |
14 | for b in list do ... |
15 | |
16 | let c = Array.create numElements initialValue |
17 | let lb1 = c.GetLowerBound(1) |
18 | bzw. würde man bei Arrays meistens kein for verwenden, sondern mit Array.map, fold, iter etc. arbeiten |
> Zusätzlich sollten Größen unterstützt werden: http://blogs.msdn.com/b/andrewkennedy/archive/2008/08/29/units-of-measure-in-f-part-one-introducing-units.aspx Denkst du an sowas wie F# mit seinen units of measure oder die Zitate für Haskell oder Fortress?
Das RPL auf den HP48ern und deren Nachfolgern kann mit Einheiten rechnen und wirft einen Fehler, wenn man z.B. 1m+1s rechen will. Und das schon seit über 20 Jahren...
Stefan Helmert schrieb: > Zusätzlich sollten Größen unterstützt werden: Und wie berechnet man dann z.B. die Determinante einer Matrix dessen Matrixelemente unterschiedliche physikalische Einheiten haben?
Joe G. schrieb: > Stefan Helmert schrieb: >> Zusätzlich sollten Größen unterstützt werden: > > Und wie berechnet man dann z.B. die Determinante einer Matrix dessen > Matrixelemente unterschiedliche physikalische Einheiten haben? Dann macht das Berechnen doch genausoviel Sinn wie 1m+1s...
Stefan Helmert schrieb: > es kommt immer häufiger vor, dass Software einfach eine Qualität nahe > dem Müllniveau hat. Ach? Allgemeiner gehts nicht? Eine Software ist genau dann gut, sprich: hat Qualität, wenn sie die jeweiligen Anforderungen erfüllt. Wenn an eine Software keine Anforderungen an Wartbarkeit gestellt werden, kann der größte Müllniveau-Code gut sein! > Zusätzlich sollten Größen unterstützt werden: > Gibt es denn keine Software-Entwurfs-Werkzeuge, die so komfortabel sind? Mein 20 Jahre alter HP Taschenrechner. Anders Beispiel C++: Das bietet Dir alle Möglichkeiten Dir Laenge-, Flaeche-, Sonstwas-Klassen mit Einheiten und entsprechenden Operatoren zu schreiben. RAD-Werkzeuge mit Garbagecollcetor gibt es auch zu hauf..
Lukas K. schrieb: > Dann macht das Berechnen doch genausoviel Sinn wie 1m+1s... Die Mathematik kennt nicht nur A + B. Bei jedem Eigenwertproblem werden Determinanten berechnet. Differentialgleichungssysteme in Zustandsraumdarstellung beinhalten sehr viele unterschiedliche Einheiten in der Matrix.
>> Dann macht das Berechnen doch genausoviel Sinn wie 1m+1s... > Die Mathematik kennt nicht nur A + B. Oha! Vielen Dank für die Erkenntnis. Allerdings habe ich nicht den Eindruck, dass Lukas Belehrung solcher Art von dir nötig hat... > Bei jedem Eigenwertproblem werden Determinanten berechnet. > Differentialgleichungssysteme in Zustandsraumdarstellung beinhalten sehr > viele unterschiedliche Einheiten in der Matrix. Und wenn du die Matrizen aufdröselst und zu Fuß rechnest, dann wirst du feststellen, wie sich die ganzen Einheiten auf wundersame Weise zusammenfügen, eliminieren, neue Einheiten bilden und letztlich ein sinnvolles Ergebnis bilden. Oder glaubst du etwa im Ernst, dass Einheiten keine Rolle mehr spielen, wenn man sie in Matrizen packt?!
Joe G. schrieb: > Die Mathematik kennt nicht nur A + B. Ja, aber vieles lässt sich darauf zurückführen. Die Determinanten einer 2x2-Matrix z.B.
Wenn die Einheiten von ab und bc unverträglich sind, wirds unsinnig.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.