I compilatori vengono utilizzati al di fuori dello sviluppo?


14

Per quanto ne so, i compilatori sono pensati per gli sviluppatori che compilano il loro codice in file eseguibili (codice macchina). I compilatori non si estendono alla macchina di un client o al sistema dell'utente finale.

Invece, gli sviluppatori usano semplicemente il compilatore per convertire il loro codice in codice macchina, che viene quindi trasportato su altre macchine per essere utilizzato come applicazioni.

I compilatori hanno una funzione al di fuori di questo processo? In tal caso, quando vengono utilizzati?


21
Sì, i compilatori compilano il codice.
Tom Squires,

@ Tom: ho letto da qualche parte che i compilatori C sono installati su varie macchine, comprese le console di gioco. Questo significa che scriviamo il codice in C, che viene quindi inviato a questi dispositivi, dove vengono compilati dal compilatore e quindi eseguiti dall'interprete?
Pankaj Upadhyay,

3
@Pankaj Upadhyay: è possibile che il codice possa essere inviato a una macchina e quindi compilato da un processo interno. È improbabile che l'utente del dispositivo possa mai vedere questo accada o saperlo. Potrebbe essere fatto se parti del codice devono essere compilate per hardware specifico e le soluzioni che testano l'hardware in fase di esecuzione sono troppo lente, portando alla necessità di distribuire codice e compilare durante l'installazione. Forse ...
FrustratedWithFormsDesigner il

3
@Pankaj Nessuna console di gioco viene fornita con compilatori, ma alcuni possono essere installati su di essi. Sony ha fornito una versione di Linux e GCC che potrebbe essere installata su PS2 per esempio. Altre persone hanno tentato di violare altri sistemi operativi e software su console.
IronMensan,

4
@Stargazer: volevi dire: "No, i compilatori traducono da una lingua di partenza in una lingua di destinazione"? Se si omette la virgola, la frase indica l'opposto del significato desiderato.
Daniel Pryden,

Risposte:


19

Sì e no. Sì, lo scenario classico è uno sviluppatore che utilizza un compilatore per generare il codice macchina dal codice sorgente e il codice macchina viene quindi distribuito agli utenti.

Ci sono alcune eccezioni a questo però. Innanzitutto, molti progetti open source sono distribuiti principalmente (o anche esclusivamente) in forma di codice sorgente e si aspettano che l'utente finale li installi digitando un paio di comandi come makee poimake intall. Questo invocherà il compilatore, il linker, ecc. Per generare il codice macchina dal codice sorgente per quel computer dell'utente. In questi casi, tuttavia, il processo di costruzione e installazione è (almeno destinato a essere) automatizzato al punto che l'utente raramente ha bisogno di molta conoscenza al di là del fatto che se non ha mai installato un pacchetto di solo codice sorgente in precedenza , il gestore dei pacchetti in genere elencherà alcuni pacchetti di "sviluppo" come prerequisito per l'installazione dell'applicazione a cui tengono davvero (anche se alcuni lo considerano ancora ostile agli utenti finali).

Un'altra eccezione (che è stata accennata, ma non spiegata molto bene nelle altre risposte che ho visto) sono i compilatori just-in-time (JIT). Un paio di ovvi esempi di compilatori JIT sono Microsoft Common Language Runtime (CLR) e Java Virtual Machine (JVM). In questi casi, normalmente ci sono due compilatori completamente separati coinvolti nella traduzione del codice sorgente in codice macchina. Uno è utilizzato dallo sviluppatore. Tuttavia, anziché generare direttamente il codice macchina, genera un codice byte indipendente dalla macchina. Il CLR / JVM include quindi un secondo compilatore, completamente separato dal primo, che converte quei codici byte in codice macchina per il computer di destinazione.

Dovrei aggiungere che il secondo compilatore non è strettamente necessario. Le prime versioni di JVM (per un esempio) hanno semplicemente interpretato i codici byte anziché compilarli. Tuttavia, ciò comporta spesso una penalizzazione delle prestazioni abbastanza grave, quindi le JVM più recenti relativamente recenti destinate all'uso in produzione includono un compilatore JIT.


24

Sì, i compilatori sono utilizzati principalmente dagli sviluppatori, con un paio di notevoli eccezioni. Gli utenti finali a volte usano i compilatori per compilare e installare il software open source più recente, anche se non apportano modifiche al codice. Inoltre, alcuni linguaggi di programmazione non hanno compilatori. Usano interpreti invece che "compilano" al volo. In tal caso, gli utenti finali devono avere l'interprete installato sui loro computer.


4
Se dovessimo limitare la definizione di "compilatori" per indicare i programmi che generano file eseguibili, questa sarebbe una buona risposta. Tuttavia, questo è semplicemente un sottoinsieme della vera definizione di "compilatore"
riwalk del

16
@ Jan Soltis: non sono d'accordo. Ho compilato il kernel Linux dal sorgente: significa che sono uno sviluppatore del kernel Linux ? Non ho mai modificato il codice del kernel Linux né inviato una patch - direi che significa che non sono uno sviluppatore del kernel. Inoltre, per diversi anni in cui ho usato Gentoo come sistema operativo principale, ho compilato ogni singolo software sulla macchina. Tuttavia, la stragrande maggioranza di questi sono stati compilati automagicamente dal sistema di gestione dei pacchetti di Portage. Direi che in quel caso agivo come utente finale ma non come sviluppatore .
Daniel Pryden,

8
@ Jan Soltis: sono consapevole che questa è la tua opinione. Rispetto rispettosamente. Ho fornito controargomentazioni a supporto della mia posizione, mentre continui a fare affermazioni non supportate. Sembra che ci sia una linea netta tra "sviluppatore" e "utente finale" che non credo esista.
Daniel Pryden,

6
Scaricare fonti e quindi eseguire "make install" non è uno sviluppatore. È sicuramente un'operazione dell'utente finale.
Kristopher Johnson,

3
@Jan: Potrei accettare che l'utilizzo di una distro come Gentoo che compila i pacchetti si fa almeno un potere utente, ma che è ancora chiaramente un tipo di utente. Compilare il codice di altre persone, senza modificarlo, aggiungerlo o persino leggerlo, non ti rende uno sviluppatore.
Carson63000,

10

Un compilatore è definito come un programma che traduce il codice da una lingua in un'altra (vedi Wikipedia ). L'uso più comune dei compilatori è tradurre la lingua di origine in codice macchina, ma questo definisce la parola "compilatore".

Ad esempio, Python genera un codice byte quando importa un modulo e quindi rientra nella definizione di un compilatore (perché converte dalla lingua di origine, Python, nella lingua di destinazione, codice byte Python).

Un altro esempio è il motore JavaScript V8. Si converte JavaScript in codice macchina 86 , e si inserisce quindi nella definizione di un compilatore pure. V8 non solo si adatta alla definizione di compilatore, ma è incluso in Chrome ed è ampiamente utilizzato sui computer client.


4

Un caso sarebbe per un'applicazione che generava dinamicamente codice in fase di esecuzione e quindi eseguiva il codice generato. Questo codice dovrebbe essere compilato in fase di esecuzione.

Modifica: ci sono altre eccezioni, ma erano già state menzionate in altre risposte.


+1 dì solo JIT
moscerino

1
Il motore V8 in Chrome non fa eccezione.
riwalk

Aggiornato per chiarire. Mi rendo conto che ci sono altre eccezioni.
Morgan Herlocker,

3

i compilatori sono pensati solo per gli sviluppatori per la compilazione del loro codice del linguaggio di programmazione in file eseguibili (codice machin)

Direi "i compilatori sono pensati principalmente per gli sviluppatori ...". Ma ho visto esempi in cui i programmi generano al volo un nuovo codice del linguaggio di programmazione e quindi necessitano di un compilatore da installare sul computer degli utenti finali. Ciò non significa che l'utente finale debba lavorare da solo con il compilatore.

Possibili ragioni per questo progetto del programma:

  • prestazioni: pensa a un'applicazione basata su regole in cui le regole sono archiviate in una sorta di archivio di dati dell'utente finale e hai alcuni dati di massa che devono essere elaborati da tali regole. Invece di interpretare le regole ancora e ancora, un programma genera prima il codice di elaborazione, lo compila e lo esegue in base ai dati da elaborare

  • pensa a un programma in cui l'utente finale può aggiungere una sorta di formula matematica e lo sviluppatore del programma non vuole implementare il proprio parser / interprete per questo. Invece, il programma prende questa formula, fa alcune aggiunte per trasformarlo in un pezzo di codice di programma valido, lascia che il compilatore lo compili e lo esegua in seguito.


hmm .... Ciò non significa che l'utente finale debba lavorare da solo con il compilatore . Questo praticamente spiega e chiarisce.
Pankaj Upadhyay,

2

Esatto: i compilatori compilano il codice sorgente in forma eseguibile, che viene quindi collegato in un file binario eseguibile da un linker. Il codice sorgente può anche essere eseguito direttamente da un interprete come una delle tante shell della riga di comando (C-shell, bash, zsh, ecc.), Awk, sed e così via.

Può essere difficile tracciare una linea chiara tra "sviluppatore" e "utente finale" a meno che non si limiti la discussione a un prodotto specifico. Gli sviluppatori sono tutti "utenti finali" degli strumenti che usano e "utenti finali" possono avere strumenti di sviluppo come compilatori e interpreti installati sui loro computer.


2
Ok, vado a -1 questo, perché ci sono molti malintesi qui sui compilatori. I compilatori traducono il codice da una lingua di origine in una lingua di destinazione. Dire che generano codice macchina è simile a dire che i veicoli hanno 4 ruote (sì, la maggior parte dei veicoli ha 4 ruote, ma anche una motocicletta è un veicolo. Allo stesso modo, la maggior parte dei compilatori genera codice macchina, ma un convertitore C # -> VB è anche un compilatore)
riwalk

1
@ Stargazer712, ti assicuro che non ci sono malintesi - So benissimo cosa fanno i compilatori, grazie. Ma se qualcuno che non sa mi chiede cos'è un'auto, probabilmente direi che un'auto ha quattro ruote, nonostante alcuni non lo facciano . Una definizione pedante confonde spesso più di quanto non spieghi a una persona che cerca di capire un concetto. "Compilatore" può anche essere una descrizione del lavoro, ma menzionando che non sarebbe d'aiuto qui.
Caleb,

1

Gli amministratori possono inoltre avere la necessità di utilizzare i linguaggi di programmazione nella scrittura di script per eseguire varie attività automatizzate. Ad esempio, avere uno script che elimina i vecchi file di registro da un server dopo 90 giorni per liberare spazio su disco. Il linguaggio utilizzato per scrivere lo script deve essere interpretato o compilato in modo che possa essere eseguito sul sistema.


1

Alcuni programmi sono meta-programmi : durante l'esecuzione potrebbero generare altri programmi (o alcuni codici sorgente), compilarli e quindi eseguirli in qualche modo. Leggi anche sulla programmazione in più fasi .

Quindi, per utilizzare questo tipo di programmi, sarebbe necessario un compilatore, anche se l'utente non fosse in grado di programmare se stesso (poiché il computer genererebbe del codice che deve essere compilato).

Per un esempio, vedere MELT (che genera il codice C ++ per estendere GCC ) o il sistema di intelligenza artificiale CAIA di J.Pitrat (che genera il codice C, in particolare il proprio codice, per risolvere problemi combinatori).

Inoltre, alcune lingue e alcune implementazioni richiedono quasi che un compilatore sia presente ovunque (in ogni programma codificato in quella lingua e implementazione). Innanzitutto, diversi browser Web contengono un motore JIT Javascript (come V8 ). Inoltre, la maggior parte delle implementazioni comuni di Lisp -eg SBCL - contiene un compilatore (utile anche per l'esecuzione di applicazioni, che potrebbe generare e valutare espressioni). Leggi anche su lingue omoiconiche e programmi Qine .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.