Qual è la differenza tra un linguaggio di scripting e un normale linguaggio di programmazione?


20

Qual è la differenza tra un linguaggio di programmazione e un linguaggio di scripting? Ad esempio, considera C contro Perl.

L'unica differenza è che i linguaggi di scripting richiedono solo l'interprete e non richiedono la compilazione e il collegamento?


4
Temo che questo sia offtopico qui; quello che vuoi sapere è puramente una questione di implementazione del linguaggio. Sembra anche attrarre risposte superficiali / di opinione (non per colpa tua), che è sempre una bandiera rossa.
Raffaello

L'hardware è un "interprete" per i linguaggi compilati. L'unica differenza, quindi, è quanti interpreti stai attraversando. Se la macchina è equivalente a Turing e stai utilizzando una lingua equivalente a Turing, puoi scrivere un interprete compilato Anella lingua, quindi scrivere un interprete Bnella lingua che l'interprete Apuò eseguire, quindi un interprete Cnella lingua che l'interprete Bpuò eseguire , ecc. Essenzialmente, è tutta una questione di indiretta, che ha meno a che fare con basi teoriche di calcolo e più a che fare con preoccupazioni di ingegneria pratica.
Patrick87,

Stipendi (pre-DevOps)
Phil Lello,

Risposte:


21

Penso che la differenza abbia molto più a che fare con l'uso previsto della lingua.

Ad esempio, Python viene interpretato e non richiede compilazione e collegamento, come Prolog. Classificherei entrambi come linguaggi di programmazione.

I linguaggi di programmazione sono pensati per la scrittura di software. Sono progettati per gestire grandi progetti. Probabilmente possono chiamare programmi, leggere file, ecc., Ma potrebbero non essere altrettanto bravi come un linguaggio di scripting.

I linguaggi di scripting non sono pensati per lo sviluppo di software su larga scala. La loro sintassi, funzionalità, libreria, ecc. Sono focalizzate maggiormente sulla realizzazione rapida di piccoli compiti. Ciò significa che a volte sono più "hacker" della programmazione di lingue, e potrebbero non avere tutte le stesse belle funzionalità. Sono progettati per rendere automatiche le attività più comuni, come l'iterazione attraverso un mucchio di file o l'esecuzione di attività sysadmin.

Ad esempio, Bash non fa bene l'aritmetica, il che probabilmente renderebbe la scrittura di software su larga scala un incubo.

Come una specie di punto di riferimento: non scriverei mai un lettore musicale in perl, anche se probabilmente potrei. Allo stesso modo, non proverei mai a usare C ++ per rinominare tutti i file in una determinata cartella.

Questa linea sta diventando più sfocata e più sfocata. JavaScript, per definizione un linguaggio di "scripting", viene sempre più utilizzato per sviluppare "app web" che sono più nel regno del software. Allo stesso modo, Python inizialmente si adatta a molti dei tratti di un linguaggio di scripting ma sta vedendo sempre più software sviluppato utilizzando Python come piattaforma principale.


1
+1 per l'esempio della vita reale: non riesco a immaginare di essere costretto a usare C ++ per eseguire compiti di rinominazione in batch!
Casey Kuball,

3
Non si affermano differenze concettuali, ma solo l'opinione popolare sui rispettivi casi d'uso.
Raffaello

3
Vuoi anche "non scrivere" il più grande social network del mondo in linguaggio di scripting (FB in PHP), uno dei primi servizi di blogging che ha promosso l'intero trend (LJ in Perl), il sistema di controllo della versione che consente facilmente a migliaia di sviluppatori di lavorare insieme (Mercurial in Python)? Ci dispiace, ma questo "scripting è per piccoli compiti" è solo spazzatura popolare.
Oleg V. Volkov,

1
@Raphael Penso che le differenze concettuali siano nel migliore dei casi sfocate. La differenza principale sta nell'uso popolare, IMO. La maggior parte di queste lingue saranno tutte complete di Turing e seguiranno un modello di calcolo simile. Non ho mai incontrato una distinzione o definizione formale, ma sentiti libero di modificare la mia risposta se ne hai una.
jmite,

3
@Raphael Questo è parte del punto: non ci sono differenze concettuali. Ciò che è possibile fare in fase di compilazione o di runtime è principalmente una questione di interpretazione o compilazione, e questa è una proprietà dell'implementazione, non del linguaggio (sebbene la progettazione del linguaggio possa rendere difficile un particolare modello di implementazione).
Gilles 'SO- smetti di essere malvagio' il

6

L'articolo classico sui linguaggi di scripting è lo scripting di John K. Ousterhout : programmazione di alto livello per il 21 ° secolo , pubblicato su Computer 31 (3), 1998. Ha tracciato una distinzione tra linguaggi di scripting, da un lato, e linguaggi di programmazione del sistema su l'altro.

Ousterhout ha caratterizzato i linguaggi di programmazione del sistema come evoluti per sostituire i linguaggi della macchina per la programmazione. Nascondono dettagli noiosi come l'assegnazione dei registri e le sequenze di chiamate di subroutine, forniscono semplici costrutti per scrivere loop e altri idiomi comuni del flusso di controllo e applicare una disciplina di battitura. Di solito sono implementati da un compilatore (in anticipo). Queste lingue sono pensate per scrivere software da zero. Esempi sono C, C ++ e Java.

Al contrario, i linguaggi di scripting, secondo Ousterhout, partono dal presupposto che ci sono già programmi utili là fuori, di solito scritti in linguaggi di programmazione del sistema. I linguaggi di scripting, come Perl, Python, Tcl, Visual Basic e le shell Unix, forniscono strumenti per combinare questi programmi esistenti in nuovi programmi. Ousterhout ha definito i linguaggi di scripting come "senza tipo" (incluso ciò che molti chiamano tipizzazione dinamica) e enfatizzando il rapido sviluppo; di solito sono implementati da interpreti.

Ora, bisogna stare attenti a non presumere che il modello concettuale di un singolo autore sia autorevole. Anche se a noi informatici piace far finta di essere matematici che danno definizioni precise a tutti i termini, in pratica la maggior parte della terminologia informatica è socialmente costruita con significati sfocati ed eterogenei; c'è un consenso approssimativo a un livello molto alto sulla maggior parte dei termini, ma i dettagli spesso dipendono da chi sta scrivendo. Quindi, prendi il suo articolo, la mia risposta e tutte le altre risposte qui con un grande mucchio di sale.

Personalmente contesterei l'esistenza di un linguaggio di programmazione "normale", mentre lo pronunci nella tua domanda. Tuttavia, penso che il concetto che stai cercando di comunicare corrisponda approssimativamente ai linguaggi di programmazione del sistema di Ousterhout.


2

Tutti i linguaggi di scripting sono anche linguaggi di programmazione. Il contrario non è vero. Le lingue che "richiedono solo l'interprete" sono lingue interpretate (al contrario di una lingua compilata - si noti che alcune lingue, come Java, rientrano in entrambe le categorie).

Un linguaggio classificato come linguaggio di scripting implica che è utile come linguaggio "colla". Gli script non tendono ad essere programmi con funzionalità complete, ma riempiono invece gli spazi tra gli altri software.

Gli script vengono generalmente utilizzati per connettere più programmi insieme, per eseguire attività mentali molto rapidamente / facilmente o anche in un ambiente incorporato in cui i problemi di prestazioni e sicurezza sono stati astratti in un linguaggio di livello inferiore. L'enfasi dei linguaggi di scripting tende a ridurre i tempi di sviluppo, quindi la ragione per cui la maggior parte sono interpretati e di altissimo livello.


Non si affermano differenze concettuali, ma solo l'opinione popolare sui rispettivi casi d'uso.
Raffaello

1

Il set "linguaggi di scripting" è un sottoinsieme del set "linguaggi di programmazione". La differenza tra C e Perl è la differenza tra linguaggio di programmazione del sistema e linguaggio applicativo e tra linguaggio interpretato e linguaggio compilato.

I linguaggi di programmazione del sistema sono di basso livello e orientati alla gestione della memoria, all'IO prevedibile e così via. I linguaggi delle applicazioni sono orientati alla rapida risoluzione di problemi di livello superiore, come "leggere le impostazioni dal file, aprire socket e elaborare le richieste in base alle impostazioni".

Pertanto, i linguaggi di applicazione tendono ad essere di livello molto più elevato, quindi i linguaggi di sistema, ovvero forniscono una grande quantità di astrazione e strutture di supporto integrate e spesso aggiungono una gestione automatica della memoria di qualche tipo.

I programmi in lingue compilate vengono elaborati completamente in alcuni codici prima dell'esecuzione del programma. I linguaggi di scripting vengono tradotti dinamicamente in fase di esecuzione e spesso includono funzionalità per la generazione di codice dinamico e inclusi file con codice sorgente.

Pertanto, tutti i linguaggi di scripting sono linguaggi di applicazione, ma non è vero il contrario. I linguaggi di sistema sono sempre linguaggi compilati, poiché i linguaggi di scripting di solito includono funzionalità che non sono pragmatiche da implementare in termini di linguaggio stesso. Si noti, tuttavia, che la differenza di script (interpretata) / compilata riguarda maggiormente l'implementazione: per alcuni linguaggi possono esistere entrambi i tipi di implementazioni, come per haskell.


Penso che sia un errore disegnare questa dicotomia interpretata / compilata. Inoltre non penso che sia una relazione di sottoinsieme, anche se certamente gli insiemi hanno un'intersezione non vuota. Allo stesso modo, alto e basso livello non sanno descrivere accuratamente la distinzione. Prolog è di altissimo livello, ma non è un linguaggio di scripting come lo è bash o java script.
jmite,

1

Altri hanno coperto attributi che tendono ad essere associati ai linguaggi di scripting e ai linguaggi non di scripting. È utile per avere un'idea di cosa intendono le persone quando usano il termine "linguaggio di scripting", ma ritengo sia più importante capire che semplicemente non esiste un confine ben definito: due persone ben informate potrebbero non essere d'accordo sul fatto che un particolare linguaggio X sia un linguaggio di scripting. Il termine "linguaggio di scripting" ha tuttavia utilità perché esiste un ampio consenso sulle lingue che sono molto al di fuori o al di fuori dei confini.

Confronta "auto di famiglia" con "auto sportiva" o "rivista" con "giornale". Oserei dire che sarebbe difficile trovare una regola affidabile al 100% per differenziare ogni auto di famiglia da ogni auto sportiva che sia generalizzabile (il che significa che non equivale sostanzialmente a elencare tutte le auto esistenti in ciascuna categoria) e almeno potenzialmente obiettivo ( nel senso che sarebbe accettabile per tutti). Ma questi termini sono ancora utili nella pratica, perché anche se ci sono alcuni casi difficili da decidere, molte auto sono chiaramente in una categoria e non nell'altra.


0

Una differenza che non ho ancora visto menzionato è che quando usato come previsto, il tempo di esecuzione della maggior parte degli script sarà dominato da operazioni "macroscopiche" e le prestazioni delle operazioni microscopiche non avranno un effetto significativo sul tempo complessivo di esecuzione. Ad esempio, se un programma di animazione ray-tracing potrebbe includere un linguaggio di scripting con un'istruzione "render image", uno script per produrre 240 fotogrammi di animazione potrebbe impiegare quattro ore nell'istruzione "render image" e un totale di quattro secondi tutto il resto. Anche se si dovesse accelerare qualsiasi cosa al di fuori del motore di rendering di un fattore di un milione, ciò avrebbe un effetto minore sulle prestazioni complessive rispetto all'accelerazione del motore di rendering dello 0,1%.

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.