Snelheid is een pre, maar geen vereiste. Correctheid en integriteit van je data is veel belangrijker. Als performance alles was dan zou als een vervanging voor een DB in veel gevallen iets banaals als een grote hashmap oid veel sneller zijn. Een DB is echter veel meer dan een snelle methode om data op te halen (voor een simpele select zal een DB dan ook altijd langzamer zijn).
Databases en operating systems zijn dus niet in strong typed talen geschreven alleen en enkel vanwege de performance, maar ook vanwege de beheersbaarheid van de source code. Niet alles is natuurlijk zwart/wit. C kent veel loopholes in het type system maar wordt toch uitsluitend gebruikt voor de linux kernel. De rest van de lagen in een typisch OS worden dan meer in het sterkere (qua typing) C++ geschreven.
De backends van de grote financiele systemen zijn in het algemeen al behoorlijk oud; bovendien is snelheid daar ook een belangrijk punt.
Af en toe zijn die behoorlijk oud, maar veel van dergelijke systemen die nu of in de afgelopen jaren zijn gebouwd maken overwegend gebruik van .NET en Java (EE). Een verondersteld populaire 'dynamically-typed' taal als PHP zie je daar bijna niet terug.
Nee, het is nadenken over wat er 'volgens het boekje' fout is, daar over nadenken en dan bepalen wat je doet.
Het is een combinatie van beiden. Je eigen (jarenlange) ervaring met hetgeen er in boeken staat geschreven. In al die jaren dat ik nu software ontwikkel (en dan is vrij lang, ik begon al op m'n 6de met rommelen in basic op de c64) hebben types me altijd geholpen. In talen waar types ontbraken heeft het me altijd tegengewerkt. Daarbij is het zeker geen geval van het geen aanhangen wat je gewent bent. Ik groeide op met Basic (slecht begin eigenlijk), ging daarna over op assembly (een natuurlijk groei pad destijds) en kwam pas op latere leeftijd echt in aanraking met types.
Daarom maak je unit tests die ELKE regel en ELKE case beschrijven. Da's nou net de hele grap: je gaat op functieniveau checken of elke functie wel precies doet wat je wilt.
Dat is een illusie. Je kunt niet bewijzen dat een programma een ander programma uitputtend kan testen. Met uitputtend bedoel ik dan elke mogelijke case. Dit is een onmogelijkheid. Ik zal beloven dat ik me eens inlees over python, maar lees jij je dan eens in op het onderwerp theoretische informatica en dan met name turing machines en het halting probleem. Lees je daarnaast ook eens in over het onderwerp formal correctness proofs. Uit jouw comment kan ik weer opmaken dat je daar misschien wel eens iets over gehoord hebt, maar dat je nog nooit echt een stukje code formeel hebt moeten bewijzen.
Ik kan je alvast verklappen dat een unit test -geen- vervanging is voor een formeel bewijs van de correctheid (wat je hier lijkt te impliceren). De checks die een compiler uitvoert zijn dat overigens (natuurlijk) ook niet, maar zijn -wel- volledig in het geen er gecheckt wordt.
Daar zit dus de truc van het maken van goede unit tests. Na je compile run weet je misschien dat in alle gevallen een correct type wordt teruggegeven, maar dat is al helemaal geen uitsluitende garantie: je hebt nog steeds geen flauw idee of je in alle gevallen de goede return value terug krijgt.
Je maakt hierbij de denk fout dat het een de ander uitsluit. Dat is echter onzin. In een gecompileerde taal met type checking waarop ik daarna mijn unit tests laat lopen heb ik -en- de garantie dat de types kloppen en ik heb een steek proef gedaan die hopelijk een goede indruk geeft over de correctheid van het functioneren. De
alle gevallen die je boven noemt is echt onzin. Serieus, no offence, maar als je denkt dat unit testen je die garantie geven moet je echt eens je iets meer in het onderwerp gaan verdiepen.
Het probleem is echter dat je die uitkomst niet kan garanderen met compile-time checks, maar wel met unit tests.
Maar lieve schat, ik heb het toch ook nooit gehad over de uitkomst? Compile-time checks vangen een bepaalde classe van bugs af, zoals ik al eerder zei:
flowerp schreef op zaterdag 22 september 2007 @ 22:20:
Je weet dus voor 100% dat een stuk code die door een compiler heen gegaan is volledig voldoet aan de constraints die gelden voor een taal. Dit geeft je een grote zekerheid over je code en zorgt ervoor dat een gehele klasse van bugs simpelweg niet kan bestaan.
Net zoals b.v. een garbage collector niet -alle- memory leaks voor je oplost (maar alleen de sub classe van leaks veroorzaakt door unreferenced objecten) zo vangt een compiler niet alle errors voor je af maar alleen die veroorzaakt door verkeerde typing. Dat is zeker geen onbelangrijke klasse (verre van dat) en een aantal (script) talen laten deze mogelijkheid leggen.
Ik heb het ook niet over het afschaffen van functies, types, klasses en weet ik niet wat. Ik geef alleen aan dat het afdwingen van types vaak niet zinvol is.
Ik denk eerder dat het andersom is. In verreweg de meeste gevallen is het gewoon duidelijker als je als programmeur aangeeft met welk type je te maken hebt. Dat geeft niet alleen de mogelijkheid tot een betere type checking, maar is ook gewoon duidelijker voor de programmeur die de code moet lezen.
Bij talen die types 'afdwingen' zijn er altijd wel wegen om het type systeem heen als je echt vindt dat dat nodig is. In Java kun je alles als Object declareren en dan later casten naar iets wanneer je er een operatie op wilt oproepen. 1 stapje verder is dan nog het type systeem helemaal links laten leggen en operaties op een object aanroepen d.m.v. naamgeving (via reflection). Dit zijn echter expliciete mogelijkheden voor special cases die gebruikt kunnen worden door mensen die (hopelijk) precies weten wat ze aan het doen zijn.
De default is echter gewoon dat types gebruikt worden. In het overgrote gedeelte van de business code wil je dat ook gewoon. Via (abstracte) base types en interfaces kun je nog steeds heel flexibel opereren zonder aan explicietheid in te boeten. Voor hele funky dynamische stukjes code kan het wel eens aardig zijn dat types 'opeens' kunnen wisselen al gelang naar het gebruik. Een professionele programmeur zal daar zeker bepaalde algoritmes elegant mee kunnen uitdrukken. Voor de meerderheid van de mensen is het echter een manier om gewoon sloppy te zijn en zit er helemaal geen verhelderende gedachte achter.
"Niet denken, niet beredeneren, maar gewoon proggen!" Je kent het soort types (no pun intended) vast wel.
Nee. Static typing betekent dat een variabele een vast type heeft (itt dynamic typing waarbij een variabele een ander type kan krijgen). Strong typing betekent dat je geen stringfuncties op een int kan uitvoeren (str.strip(1) gaat niet werken in python),
Ik zei dat Static typing in feite een sub classe van Strong typing is omdat dat 1 van de manieren is om Strong typing te bereiken. Dit om type safeness te kunnen garanderen @ compile time. Static typing is niets meer of minder dat je het type aangeeft. b.v.
Java:
1
2
| String foo = "foo"; // static typing, we actually declare foo as a String
foo.myFunction(); // Type safeness; compiler rejects this; Strongly typed semantics |
Daarbij zijn we door polymorphisme natuurlijk niet gebonden aan alleen dat ene type:
Java:
1
2
3
4
| List<Integer> list = new ArrayList<Integer>():
list.add(1);
list = new LinkedList<Integer>();
list.add(2); |
Ook kan simpele type inference voorkomen, zoals in C++0x of wellicht in Java 7:
Java:
1
2
| var list = new ArrayList<Integer>(): // "var" referers to an ArrayList<Integer> now, not to a dynamic type.
list.myFunction(); // still strong typing; rejected by compiler |
Een belangrijk punt is natuurlijk dat de termen nergens super eenduidig gedefinieerd zijn (zoals meerdere dingen in CS, neem bv termen als "module", "component", "procedure", "functie", etc). De eigenschap die we echter allemaal willen (of allemaal zouden moeten willen) is dat voor dat we een programma draaien we een lijst van alle fouten krijgen te zien.
Voor weakly typed talen (of weakly typed elementen in talen) is dat minder goed mogelijk dan in strongly typed talen.
Ik zal binnenkort eens wat meer gaan lezen over Python, het is nu net even te laat daarvoor
It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.