If something can be generated, then that thing is data, not code.
Dato che in seguito si stabilisce che il codice è costituito da dati, la tua proposizione 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 è un codice? E se accadesse che coincidesse esattamente con il codice assembly che scrivo a mano? Sei libero di andarci se lo desideri, ma non verrò con te.
Iniziamo invece con una definizione di "codice". Senza essere troppo tecnico, una buona definizione per gli scopi di questa discussione sarebbe "istruzioni utilizzabili dalla macchina per eseguire un calcolo."
Given that, isn't this whole idea of source code generation a misunderstanding?
Ebbene sì, la tua proposta di partenza è che il codice non può essere generato, ma io rifiuto quella proposta. Se accetti la mia definizione di "codice", non ci dovrebbero essere problemi concettuali con la generazione di codice in generale.
That is, if there is a code generator for something, then why not make that something a proper function which can receive the required parameters and do the right action that the "would generated" code would have done?
Questa è una domanda completamente diversa, sulla ragione per l'utilizzo della generazione di codice, piuttosto che sulla sua natura. Stai proponendo un'alternativa che invece di scrivere o utilizzare un generatore di codice, uno scrive una funzione che calcola direttamente il risultato. Ma in che lingua? Sono finiti i tempi in cui chiunque scriveva direttamente in codice macchina e se scrivete il vostro codice in qualsiasi altra lingua, dipendete da un generatore di codice sotto forma di compilatore e / o assemblatore per produrre un programma effettivamente eseguito.
Perché, allora, preferisci scrivere in Java o C o Lisp o altro? Anche assemblatore? Asserisco che è almeno in parte perché tali linguaggi forniscono astrazioni per dati e operazioni che rendono più facile esprimere i dettagli del calcolo che si desidera eseguire.
Lo stesso vale per la maggior parte dei generatori di codice di livello superiore. I casi prototipici sono probabilmente generatori di scanner e parser come lex
e yacc
. Sì, è possibile scrivere uno scanner e un parser direttamente in C o in un altro linguaggio di programmazione di propria scelta (anche codice macchina grezzo), e talvolta lo si fa. Ma per un problema di qualsiasi complessità significativa, l'uso di un linguaggio di alto livello, 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 per "generatore di codice". Prenderò in considerazione la preelaborazione in C e l'istanziazione di modelli C ++ come esercizi nella generazione del codice; ti opponi a questi? Altrimenti, penso che dovrai eseguire alcuni esercizi di ginnastica mentale per razionalizzare l'accettazione di quelli, ma rifiutare altri sapori della generazione del codice.
If it is being done for performance reasons, then that sounds like a shortcoming of the compiler.
Perché? In pratica, si presuppone che si debba avere un programma universale a cui l'utente alimenta 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 chiamare un tale programma universale un "sistema operativo".) Ma perché si suppone che un compilatore debba essere altrettanto efficace nell'ottimizzare un programma di questo tipo per scopi generali quanto nell'ottimizzare un sistema più specializzato programma? I due programmi hanno caratteristiche e capacità diverse.
If it is being done to bridge two languages, then that sounds like a lack of interface library.
Lo dici come se avere una libreria di interfaccia universale a qualche grado sarebbe necessariamente una buona cosa. Forse lo sarebbe, ma in molti casi una tale biblioteca sarebbe grande e difficile da scrivere e mantenere, e forse anche rallentare. E se una tale bestia in effetti non esiste per servire il particolare problema in questione, allora chi sei tu per insistere affinché venga creato, quando un approccio di generazione del codice può risolvere il problema molto più rapidamente e facilmente?
Am I missing something here?
Molte cose, penso.
I know that code is data as well. What I don't understand is, why generate source code? Why not make it into a function which can accept parameters and act on them?
I generatori di codice trasformano il codice scritto in una lingua in codice in un linguaggio diverso, di solito di livello inferiore. Stai chiedendo, quindi, perché le persone vorrebbero scrivere programmi che utilizzano più lingue e, soprattutto, perché potrebbero voler mescolare linguaggi di livelli soggettivamente differenti.
Ma l'ho già toccato. Si sceglie una lingua per un particolare compito basato in parte sulla sua chiarezza ed espressività per quel compito. Dato che il codice più piccolo ha in media meno errori ed è più facile da mantenere, c'è anche un pregiudizio verso i 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 più efficacemente in una lingua, mentre altri sono affrontati in modo più efficace o più conciso in un'altra. Utilizzare lo strumento giusto per il lavoro a volte significa impiegare la generazione del codice.