Programmieren in der Zukunft

OP (Firma: dm2sh) #2478383
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?
#2478459
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
#2478520
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..
Gast #2478578
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?!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren