Misgepost in de contest thread, over te grote klassen:
Ah, als we het over te grote source files hebben, weet ik ook nog wel een mooi staaltje.
Een aantal universiteiten werken aan een XML database met XQuery support; genaamd
MonetDB. Het ding werkt heel aardig (mits je genoeg geheugen hebt) en is modulair opgezet: de basis is een relationele in-memory database server (MonetDB) die alleen binaire tabellen ondersteunt en zorgt voor transacties, persistence, et cetera. De voor gebruikers bedoelde functionaliteit wordt in modules geïmplementeerd die code uitvoeren op de database, waarvoor een low-level (interpreted) taal bestaat (MIL).
Zo is er bijvoorbeeld een module die SQL queries kan vertalen naar MIL code en tabellen omzet in een formaat dat MonetDB efficient kan opslaan. Met die module als front-end en MonetDB als back-end hebben ze dus een efficiënte SQL server gebouwd.
Maar er is dus ook een XML module, genaamd
Pathfinder. Die is behoorlijk geavanceerd, vooral waar het optimalisatie van XQuery queries betreft. Voor het verwerken van zo'n query wordt de query eerst geparst in een concrete syntax tree, dan worden er een aantal optimaliserende transformaties overheen gehaald, en tenslotte wordt MIL code gegenereerd om de query daadwerkelijk uit te voeren, en terug te transformeren naar XML.
Ik moet er bij vertellen dat het hele gebeuren geschreven is in C. Er wordt intensief gebruik gemaakt van lex en yacc om allerlei talen (MIL, XQuery, XML, SQL, et cetera) te parsen. Verder wordt er nogal veel gebruik gemaakt van een wat obscure tool genaamd
BURG om transformaties op een boomstructuur uit te voeren, wat dus wordt gebruikt om een concrete syntax tree om te zetten in een abstract syntax tree en om alle optimalisaties uit te voeren. Ik had er voor ik dit project tegenkwam ook nooit van gehoord.
Anyway, dit alles om een beetje context te geven. Waar ik naar toe wilde, was de grootte van de broncode. Als ik de handgeschreven broncode van alleen de Pathfinder
compiler (nog niet eens de runtime) bekijk, zonder Makefiles of gegenereerde source files, dan tel ik
137603 regels; dat is voor een groot project niet zo schrikbarend, ware het niet dat deze regels verspreid zijn over
103 bestanden. Nu zou je zenuwachtig moeten worden, want dit betekent dat een gemiddelde source file al
1336 regels bevat (bijna 1337

).
Neem de top 10 grootste bestanden:
11792 ./MonetDB4-XQuery/pathfinder/compiler/mil/milprint_summer.c
9631 ./MonetDB4-XQuery/pathfinder/compiler/mil/milgen.brg
6008 ./MonetDB4-XQuery/pathfinder/compiler/sql/lalg2sql.brg
5832 ./MonetDB4-XQuery/pathfinder/compiler/algebra/builtins.c
4551 ./MonetDB4-XQuery/pathfinder/compiler/algebra/logical.c
4082 ./MonetDB4-XQuery/pathfinder/compiler/core/fs.brg
3623 ./MonetDB4-XQuery/pathfinder/compiler/algebra/physical.c
3536 ./MonetDB4-XQuery/pathfinder/compiler/algebra/planner.c
3466 ./MonetDB4-XQuery/pathfinder/compiler/algebra/core2alg.brg
3152 ./MonetDB4-XQuery/pathfinder/compiler/algebra/map/intro_proxy.c
Holy shit! Duizenden regels broncode per bestand!
milprint_summer.c heet zo omdat gebaseerd is op code die een student in een zomerproject geschreven heeft. Bijna twaalfduizend regels! Ik moet er niet aan denken al die code te moeten lezen, laat staan schrijven!
Het is overigens behoorlijk nette code. Er staat ook regelmatig zinnig commentaar in (maar minder dan de helft van de tekst; d.w.z. het merendeel is wel echt code) en er zijn geen
TheDailyWTF-waardige constructies waarbij een stukje tekst duizend keer gecopypaste wordt omdat de auteur niet bekend is met het fenomeen for-loop.
Overigens zijn dit alleen handgeschreven source files; tools als lex, yacc en BURG genereren hiervan weer C source files die nog véél groter zijn; zo erg zelfs dat ik de boel met GCC niet mét optimalisaties kan compileren omdat de tussentijdse datastructuren niet in mijn 1 GB geheugen passen. (GCC houdt dan alle functies in het geheugen om inter-functie optimalisaties als inlining te kunnen toepassen.)
De moraal van dit verhaal: ik weet niet precies wanneer een source file té groot wordt, maar ik vermoed dat rond een regel of 5000 de grens van het betaambare wel overschreden is.