Molti sono ossessionati dal performance a tutti i costi, di conseguenza programmano con lo stesso linguaggio del sistema operativo.In un sistema operativo se non vuoi overhead nelle chiamate di sistema devi scrivere le applicazioni nello stesso linguaggio.
Per TheKaneB:http://brinch-hansen.net/memoirs/photos ... c4000.htmlLui impiegò quasi due anni per assemblarselo, pensi di competere con un nerd del genere?
Un esempio che mi viene in mente è quella porcata di GTK: un framework a oggetti realizzato in C. Un autentico abominio, insomma, e si vede a colpo d'occhio:
Onestamente l'ho detto giusto per dare una motivazione a Z80Fan e non sembrare il solito estremista, diciamo che è un luogo comune che il C vada bene per i sistemi operativi e per il low-level, distruggere i luoghi comuni è difficile, per questo motivo l'ho detto.
Allora non vedo alcun vantaggio a usare il C, se non per la sintassi concisa (ma ben poco leggibile).
Usare gli interi come stringa, una figata eh?
La vera differenza tra strong e weak typing è questa. Di conseguenza in Pascal un intero ha un significato nettamente diverso dal C. Magari con una funzione che ritorna un intero io in realtà sto ritornando una stringa, un carattere o qualsiasi altra cosa sia e in Pascal non ho alcun modo per leggerla.
Per esempio getchar() torna un intero per carattere perché in C (vedi che furbi) usano il valore di ritorno anche per la gestione degli errori, non hai alcun modo di utilizzarlo in Pascal come carattere. Potresti forzare l'importazione cambiando il valore di ritorno con il char del Pascal, ma quando getchar() ti ritorna -1 perché l'EOF è stato raggiungo, il programma ti va in runtime error.
var = getcharC();if var = -1 then gestisciGliErroriComeSiFaInPascal();else return convertiInCarattere(var);
Diciamo che quello descritto sopra era il calling convention di default prima che il C fosse così diffuso.
i puntatori non sono il massimo dell'efficienza
Come mai a te piace il C/C++?
Fare la comparazione di una stringa byte per byte è più lento di farlo word per word. Word per word ne compari 4 al volo in una piattaforma 32 bit. Ovviamente non sempre si può fare e qui il compilatore può venirti in aiuto. Se la stringa è di 7 byte non puoi fare la comparazione word per word, se lo lasci fare al compilatore lui in realtà alloca 8 byte (lo filla di byte dummy) e poi fa la comparazione word per word. Non ricordo come si chiama, per-word allocation boundary o aligned word allocation.
In assembly x86 se il compilatore ti aiuta può usare rep cmpsw (compsw = comparison word).
Diciamo di sì, ma questo devi considerarlo un caso semplice e soprattutto c'è il fatto che nessuno andrebbe a cambiare la funzione getchar() del C, ma tu non puoi affidarti alla buona fede dei programmatori.Prendiamo altri casi molto realistici, in cui un software viene esteso sempre. Il fatto che un intero venga usato per la gestione degli errori, tu domani non sai se ci sarà da gestire anche un -2 e il tuo programma andrà in runtime error perché chr() si ritrova a converire il valore -2 che è fuori range [0 .. 255].Dovresti fare un design migliore e wrappare la funzione in modo più sicuro (e che in futuro tu possa estendere), immagina un modulo separato che riceve caratteri dal getchar, tipo così:Codice: [Seleziona]type GetResult = (char, eof, unexpected);[...]intres : integer; (* getchar's integer result value *)realch : char; (* pascal character *)mean : GetResult; (* result's meaning *)intres := getcharC();if intres = -1 then [...] mean := GetResult.eofelsif intres in [0 .. 255] then (* oppure ch >= 0 and ch <= 255, ma usare l'in è più veloce in Pascal *) realch := chr(intres); mean := GetResult.charelse mean := GetResult.unexpected; [...] furthercondition(intres)end
type GetResult = (char, eof, unexpected);[...]intres : integer; (* getchar's integer result value *)realch : char; (* pascal character *)mean : GetResult; (* result's meaning *)intres := getcharC();if intres = -1 then [...] mean := GetResult.eofelsif intres in [0 .. 255] then (* oppure ch >= 0 and ch <= 255, ma usare l'in è più veloce in Pascal *) realch := chr(intres); mean := GetResult.charelse mean := GetResult.unexpected; [...] furthercondition(intres)end
Infatti Modula-3 (che è molto UNIX-centric, cioè è stato sviluppato per essere programmato su questa piattaforma) usa un layer di interfaccia per le chiamate.
Comunque ricordavo male, il C può tornare valori strutturati per le strutture ma non per gli array (che concettualmente è anche structured).
Infatti l'ottimizzazione consiste nell'evitare di deferenziare continuamente la memoria quando leggi o scrivi molto in una struttura dati.
Dovrebbe invece. I memory leak avvengono sempre, basta guardare il changelog di qualsiasi progetto opensource, i distruttori vanno bene per robette semplici e risorse limitate. In strutture (o classi) davvero complesse i casini si combinano ugualmente. Se fosse tutto così semplice, non esisterebbero i GC ;-)Il GC non è il male, soprattutto quando i vantaggi superano i suoi svantaggi. (Uno di questi è la deframmentazione con il copying collector)
Tempo fa quando i developer di FreeBSD decisero di adottare lo static analyzer di Coverity, scoprirono circa un centinaio di bug nelle expression dovuti a mistyping di == con = nelle expression, e stiamo parlando di developer con anni di coding alle spalle. Inoltre il codice viene sempre revisionato da una o più persone e sono sfuggiti ai loro occhi. Magicamente sparirono bug che da anni si presentavano raramente.I bug trovati da Coverity erano bug del tutto leciti nel C code, se non ricordo male i bug fixati furono sul migliaio in totale.
Brainfuck (esiste davvero)
gli OS sono tutti in C :-) dal mio punto di vista perdono di tantissimo l'interesse da parte di curiosi.
Perché non provi Go? Scopiazzato interamente da Oberon-2, però ha la sintassi del C (se adotti una sintassi diversa, non ha diffusione).Ha tutto ciò che serve per il system programming.
Immagina il lavoro che deve fare il generatore di uno stub / interface per un determinato linguaggio, partendo dall'header scritto in C: non sapendo quale tipo utilizzare effettivamente per quel linguaggio, dovrà optare per qualcosa di simile all'int, lasciando poi al programmatore a sbrogliare la matassa.
Usando il compilatore SNC (una roba di Sony) il problema non sussisteva, probabilmente perchè allineava in automatico in modo intelligente (il codice era anche mediamente più prestante e compilava 4 volte più velocemente).
E' veramente affascinante leggere tutto ciò Continuate pure, io vi ascolto (=leggo) in silenzio religioso
SN Systems sforna compilatori per Sony già dagli inizi della PS2.Il motivo è molto più prosaico... il kit incluso nel prezzo è basato su GCC e pensavano fosse sufficiente, poi gli ingegneri dell'engine si sono :obscene-birdiered: .... e hanno :angry-screaming: "compratelo sto :music-tool: di SNC". E così fu luce, e vidi che ciò era :obscene-sexualdoggy: .