Mire, hogyan jók a típusok?

Régóta tervezgettem már ezen blog megírását, de az utolsó lökést ez a bejegyzés adta meg:

én típusmentes rendszerekben (PHP4, ES3) írtam baromi nagy dolgokat, amiket mások szerint anélkül nem is lehetett volna (dehogyisnem, többmillió soros rendszereink futottak benne stabilan).

Ez a bejegyzés alapvetően igaz!

A valóságban tényleg nem sokkal jobbak a statikus típusos nyelvekben írt programok; amilyen kevéssel több munka a típusok kiírása, annyi kevéssel teljesít jobban a dokumentálás, unit teszt és a hibaszám terén.

Miért van ez? Lehet ezt jobban, sokkal jobban?

A válaszokat megtaláljátok ezen blogomban.

Update: További kapcsolódó web oldalak:
C# and F# approaches to illegal states
One case of making illegal states unrepresentable

Hozzászólások

Egyébként ha már változók: utóbbi időben a programozási nyelveknél további 2 dolog keltette fel a figyelmemet.

1. nyelvi szinten tud-e komplex számokkal műveletet? Elektronikai számításoknál, jelfeldolgozásnál nekem jól jön. C esetén is a C99-től jött be. Python is alapból viszi.


Python:
>>> a = 2 + 3j
>>> b = 3 + 4j
>>> a/b
(0.72+0.04j)

C:
#include <complex.h>

complex double divtest(complex double a, complex double b) {
    return a/b;
}

2. nyelvi szinten mit csinál például egy 1<<500 kiértékeléssel. Túlcsordul és hülyeséget ad vissza vagy kiszámolja. Python például kiszámolja.


>>> 1<<500
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376L
>>> 1. / (1<<500)
3.054936363499605e-151

"nyelvi szinten"

Nem biztos, hogy ezeket nyelvi szinten kellene megoldani. Egy általános programozási nyelv esetén (mint a C vagy a Python) a legtöbb programban se komplex számokra, se abszolút pontos számításokra nincs szükség, ezért a nyelvnek nem is kell erre beépített támogatást adnia. Azt kell támogatnia, hogy a típusrendszere könnyen bővíthető legyen, így implementálni lehessen megoldásokat a fenti problémákra, ha azokra szükség van.

Pl. a Scala képes erre:

1. egy gyors Google keresés a Breeze libraryt dobta ki, ebben a fenti példa így néz ki (commentben az utasítás eredménye):


import breeze.math.Complex.i

val a = 2 + 3*i		// a: breeze.math.Complex = 2.0 + 3.0i
val b = 3 + 4*i		// b: breeze.math.Complex = 3.0 + 4.0i
a / b			// res0: breeze.math.Complex = 0.72 + 0.04i

2. erre használható a beépített BigInt vagy BigDecimal típus, ami JVM-en a Java-s BigIntegert és BigDecimalt használja a háttérben:


val x = BigInt(1) << 500	// x: scala.math.BigInt = 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
val y = 1 / BigDecimal(x)	// y: scala.math.BigDecimal = 3.054936363499604682051979393213618E-151

Nezegettem a repodat es latom, hogy te is a Scala + Akka vonalon mozogsz. :)
Plusz amit ezekkel szokas mostanaban meg hasznalni, Kafka, stb...

Jo latni, hogy van mas olyan is a kozvetlen kornyezetemen kivul aki eszrevette, hogy van elet a JVM-ben a Java-n tul is.

Mondjuk en meg elegge kezdo vagyok, csak most kostolgatom az olyan dolgokat, hogy hogyan lehet idiomatic Scala kodot irni, mi a Reactiv Manifesto, Stream-ek (Akka Streams, RxJava, Reactor), Messaging, Event-Loop stb...

Es brutal sok topic es projekt van amivel lehet foglalkozni.

Egyebkent ha szabad kerdeznem hol dolgozol, hogy ilyen temakkal foglalkozhatsz? Nem ismerek jelenleg olyan magyarorszagon levo ceget, akik ezeket a topicokat toljak.

Sajnos csak side projekteknél tudom használni, ahol jelenleg dolgozom ott is a fő csapás irány a Java.
Ez azonban nem gátol meg abban, hogy fejlesszem magam! ;-)

Ha nincs is sok, de időnként keresnek Scala fejlesztőket.

Néha elfog a hév, hogy másoknak is megmutassak egy-egy területet, amit érdemes megismerni, de a nagyfokú érdektelenség után egy ideig megint jegelem az ez irányú törekvéseim.