Sulla base della mia esperienza nella compilazione di compilatori e strumenti correlati in C e lingue simili, NON sceglierei di scrivere un compilatore in C se avessi altre scelte migliori. E nel 2016, ci sono molte scelte migliori. Ma è il tuo compilatore e YMMV.
Il passato di TL; DR:
"We should forget about small efficiencies, say about 97% of the
time:
premature optimization is the root of all evil."
— Donald Knuth
Continua dicendo "Eppure non dovremmo perdere le nostre opportunità in quel 3% critico". Supponendo che tu prenda il consiglio del Dr. Knuth in tali questioni (e dovresti davvero), la domanda chiave è quindi: sei in quel 3%?
Sembra dubbio. C può eseguire più velocemente su un codice di basso livello rispetto a qualsiasi altro Python, Perl o PHP. È un ottimo linguaggio di medio livello, eccellente per il rendering del codice strutturato nelle istruzioni della macchina. Per coloro che scrivono compilatori, database e middleware di base, C è una scelta solida. Ma per un linguaggio di scripting? È ancora in sviluppo? Questo ... sembra prematuro.
Nella mia esperienza, Python ha una velocità adeguata anche per il lavoro incentrato sulle prestazioni. Eseguo programmi che analizzano, analizzano e trasformano milioni di record di testo. Se tutto fosse scritto in "Python puro", probabilmente non sarebbe abbastanza veloce. Ma molti compiti: analizzare il testo o l'XML, sfornare cumuli di dati, ecc. - quelli sono quasi sempre gestiti in C già. Moduli come Pandas, NumPy e LXML fanno il loro lavoro pesante al livello più basso e ottimizzato possibile. Python sfrutta le sue ottimizzazioni, ma in un linguaggio molto pulito, standardizzato e di alto livello. Raramente ho trovato il bisogno di andare altrove. Quando ho, ottimizzazioni mirate in C o Cython, con il flusso del programma principale gestito in Python, sono state eccellenti.
Dopo aver osservato tonnellate di C nel corso degli anni (sistemi operativi, compilatori, middleware, applicazioni, utility) e averne scritto alcune, sfido l'idea che C sia particolarmente portatile. È comparato all'era da cui è emerso. Ma erano gli anni '70 e '80. La competizione era quasi del tutto non portatile. C rimane straordinariamente esposto alle differenze nell'ordine dei byte della piattaforma, nella lunghezza delle parole, nella semantica dell'indirizzamento e nelle versioni / versioni dei sistemi operativi. Il codice pensato per eseguire molte piattaforme è spesso disseminato di #ifdef
e conoscenza diretta della piattaforma. È brutto. Alla fine, C è non molto portabile rispetto ai linguaggi più moderni come Java, Go, Python e JavaScript.
Quindi se ti piace C, vuoi studiarlo o vuoi lavorare lì, Dio benedica. Ma come già stai scoprendo, non è un ambiente particolarmente favorevole per gli standard moderni. Classi, dizionari, liste flessibili, buona e semplice corrispondenza delle stringhe, strutture dati orientate ai problemi come set
e Counter
, facile gestione delle eccezioni, strong supporto dei moduli .... L'elenco delle cose preziose che C manca è molto lungo. Potresti essere in grado di recuperare alcune funzioni di livello superiore se utilizzi un framework come Violoncello . Tuttavia, C è il miglior design di 45 anni fa; manca di molti progressi in termini di facilità, flessibilità, robustezza e struttura rispetto a quelli che sono emersi successivamente.
Dovresti valutare i vantaggi della maggiore velocità di esecuzione di C rispetto all'ambiente meno favorevole, i tempi di sviluppo più lunghi, la minore affidabilità probabile e altri fattori. Nel 1970 o 1980, le risorse di sistema erano estremamente rigide, quindi ottimizzare-ottimizzare-ottimizzare aveva senso. In questo giorno di processori multicore e memorie gigabyte anche su smartphone, puoi legittimamente considerare l'ottimizzazione di attributi diversi dalle prestazioni. Time-to-market, sofisticatezza del programma, affidabilità, manutenibilità - ci sono molte cose che puoi ragionevolmente ottimizzare in Python (o in un altro linguaggio di alto livello) che non puoi facilmente ottimizzare in C.