Forum: PC-Programmierung Programmieren in der Zukunft


von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

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?

von blubb (Gast)


Lesenswert?

Ich ham mir Deine Ausführungen jetzt nicht zu 100% durchgelesen, aber 
hast Du schon mal Python angeschaut?

von Stefan H. (Firma: dm2sh) (stefan_helmert)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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

von Krapao (Gast)


Lesenswert?

> 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?

von Lukas K. (carrotindustries)


Lesenswert?

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...

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

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?

von Lukas K. (carrotindustries)


Lesenswert?

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...

von Michael S. (schiko)


Lesenswert?

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..

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

>> 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?!

von Lukas K. (carrotindustries)


Lesenswert?

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
Noch kein Account? Hier anmelden.