Se qualcosa può essere generato, allora quella cosa sono i dati, non il codice.
Nella misura in cui stipuli in seguito che il codice è costituito da dati, la tua proposta si riduce a "Se qualcosa può essere generato, allora quella cosa non è codice". Diresti quindi che il codice assembly generato da un compilatore C non è codice? Cosa succede se succede che coincida esattamente con il codice assembly che scrivo a mano? Puoi andarci se lo desideri, ma io non verrò con te.
Iniziamo invece con una definizione di "codice". Senza essere troppo tecnici, una definizione abbastanza buona ai fini di questa discussione sarebbe "istruzioni utilizzabili dalla macchina per eseguire un calcolo".
Detto questo, questa intera idea della generazione del codice sorgente non è un malinteso?
Bene sì, la tua proposta iniziale è che il codice non può essere generato, ma io rifiuto questa proposta. Se accetti la mia definizione di "codice", non dovrebbe esserci alcun problema concettuale con la generazione del codice in generale.
Cioè, se esiste un generatore di codice per qualcosa, allora perché non fare di quel qualcosa una funzione adeguata che può ricevere i parametri richiesti e fare la giusta azione che avrebbe fatto il codice "generato"?
Bene, questa è una domanda completamente diversa, sul motivo per cui si utilizza la generazione di codice, piuttosto che sulla sua natura. Stai proponendo l'alternativa che invece di scrivere o usare un generatore di codice, si scrive una funzione che calcola direttamente il risultato. Ma in che lingua? Sono finiti i giorni in cui qualcuno scriveva direttamente nel codice macchina, e se scrivi il tuo codice in qualsiasi altra lingua, dipendi da un generatore di codice sotto forma di compilatore e / o assemblatore per produrre un programma che effettivamente viene eseguito.
Perché, quindi, preferisci scrivere in Java o C o Lisp o altro? Anche assemblatore? Affermo che è almeno in parte perché quelle lingue forniscono astrazioni per dati e operazioni che facilitano l'espressione dei dettagli del calcolo che si desidera eseguire.
Lo stesso vale anche per la maggior parte dei generatori di codice di livello superiore. I casi prototipici sono probabilmente generatori di scanner e parser come lex
eyacc
. Sì, potresti scrivere uno scanner e un parser direttamente in C o in qualche altro linguaggio di programmazione a tua scelta (anche codice macchina grezzo), e talvolta lo fa. Ma per un problema di qualsiasi complessità significativa, l'uso di un linguaggio di livello superiore e per scopi speciali come lex o yacc rende il codice scritto a mano più facile da scrivere, leggere e mantenere. Di solito anche molto più piccolo.
Dovresti anche considerare cosa intendi esattamente con "generatore di codice". Considererei la preelaborazione C e l'istanza di modelli C ++ come esercizi per la generazione di codice; ti opponi a questi? Altrimenti, penso che dovrai eseguire qualche ginnastica mentale per razionalizzare l'accettazione di quelli ma rifiutare altri gusti di generazione del codice.
Se è stato fatto per motivi di prestazioni, allora sembra un difetto del compilatore.
Perché? Fondamentalmente stai postulando che si dovrebbe avere un programma universale a cui l'utente fornisce i dati, alcuni classificati come "istruzioni" e altri come "input", e che procede per eseguire il calcolo ed emettere più dati che chiamiamo "output". (Da un certo punto di vista, si potrebbe definire un tale programma universale un "sistema operativo".) Ma perché supponi che un compilatore dovrebbe essere tanto efficace nell'ottimizzare un programma per scopi generali quanto nell'ottimizzare un più specializzato programma? I due programmi hanno caratteristiche e capacità diverse.
Se si sta eseguendo il bridge per due lingue, allora sembra una mancanza di libreria di interfacce.
Dici che come se avere una libreria di interfaccia universale in qualche modo sarebbe necessariamente una buona cosa. Forse lo sarebbe, ma in molti casi una biblioteca del genere sarebbe grande e difficile da scrivere e mantenere, e forse anche lenta. E se una tale bestia in realtà non esiste per servire il particolare problema in questione, allora chi sei tu per insistere che ne venga creato uno, quando un approccio alla generazione di codice può risolvere il problema molto più rapidamente e facilmente?
Mi sto perdendo qualcosa qui?
Diverse cose, penso.
So che anche il codice è un dato. Quello che non capisco è, perché generare codice sorgente? Perché non trasformarlo in una funzione che può accettare parametri e agire su di essi?
I generatori di codice trasformano il codice scritto in una lingua in codice in una lingua diversa, generalmente di livello inferiore. Stai chiedendo, quindi, perché le persone vorrebbero scrivere programmi usando più lingue e soprattutto perché potrebbero voler mescolare lingue di livelli soggettivamente diversi.
Ma l'ho già toccato. Uno sceglie una lingua per un compito particolare basato in parte sulla sua chiarezza ed espressività per quel compito. Dal momento che un codice più piccolo ha in media meno bug ed è più facile da mantenere, c'è anche una propensione verso linguaggi di livello superiore, almeno per il lavoro su larga scala. Ma un programma complesso comporta molti compiti e spesso alcuni di essi possono essere affrontati in modo più efficace in una lingua, mentre altri vengono affrontati in modo più efficace o più conciso in un'altra lingua. L'uso dello strumento giusto per il lavoro a volte significa utilizzare la generazione di codice.