Creazione di un linguaggio script compilato metaforico.

0

Sto studiando per un esame finale e mi sono imbattuto in questa domanda che ho trovato piuttosto interessante. Mi stavo chiedendo quale comunità di stackExchange abbia più esperienza nei linguaggi di script di quanto abbia dovuto dire.

If you were asked to design a scripting language which was compiled, how would you achieve this without losing the benefits of being interpreted.

Un punto che ho pensato è stato quello di creare una versione compilata di Read-eval-print per testare le mini funzioni più velocemente rispetto alla compilazione di un intero programma per facilità di test. Cos'altro potrei aggiungere?

    
posta reemq8 23.11.2016 - 05:09
fonte

3 risposte

2

One point I thought of was to create a compiled version of a Read-eval-print to test mini functions faster than compiling a whole program for ease of testing.

In che modo accelererebbe tutto? Praticamente tutto il tempo della CPU sta per "eval" anziché "read" e "print".

If you were asked to design a scripting language which was compiled, how would you achieve this without losing the benefits of being interpreted.

Bene, quali sono i vantaggi di una lingua interpretata? (1) Non è necessario compilare il codice per eseguirlo e (2) È possibile implementare facilmente "eval".

Per mantenere (1), puoi compilare al volo (come fa Java). Ma in realtà è piuttosto difficile da mantenere (2) perché sei in grado di accettare costantemente più codice che deve collegarsi perfettamente con il codice che hai già compilato. Ciò che rende difficile questo è, ad esempio, il caso in cui un'istruzione "eval" fornisce una definizione di una funzione successivamente invocata all'esterno di "eval"). Questi problemi possono essere risolti non avendo un linker convenzionale e mantenendo invece una tabella globale di funzioni e, forse, mantenendo semplice il sistema di tipi (ad es. Stringhe e interi).

    
risposta data 23.11.2016 - 05:51
fonte
3

La domanda è priva di senso.

L'interpretazione e la compilazione sono proprietà dell'implementazione , non della lingua. In altre parole, sono proprietà dell'interprete o del compilatore (duh!). Ogni lingua può essere implementata con un compilatore e ogni lingua può essere implementata con un interprete. Parlare di "linguaggio compilato" o "linguaggio interpretato" non è nemmeno sbagliato, è privo di senso. Se l'inglese fosse una lingua tipizzata, il "linguaggio interpretato" sarebbe un errore di tipo.

Inoltre, impacchettare il programma insieme all'interprete in un singolo file eseguibile non è distinguibile dalla compilazione, e la compilazione e l'esecuzione immediata sono indistinguibili dall'interpretazione.

es. l'interprete di Scala è in realtà solo il compilatore che esegue immediatamente il codice. Allo stesso modo, il tcc (piccolo compilatore C) ha una modalità di scripting, che semplicemente compila il file e lo esegue.

One point I thought of was to create a compiled version of a Read-eval-print to test mini functions faster than compiling a whole program for ease of testing.

Questo non ha nulla a che fare con il design della lingua. Questo è un problema di implementazione. La tua domanda riguardava la progettazione di un linguaggio, non l'implementazione di uno. Queste sono cose molto diverse. Per uno, la progettazione di una lingua avviene in inglese, l'implementazione di una lingua avviene in un linguaggio di programmazione.

What else could I add?

Bene, cosa significa "scripting"? Fondamentalmente significa interagire dinamicamente con oggetti che non controlli. Questo è il succo dello scripting: interagisci con "qualcos'altro". Quel "qualcos'altro" fornisce i tipi di dati, gli oggetti e anche la maggior parte delle operazioni. Un linguaggio di scripting della shell interagisce con il sistema operativo; il sistema operativo fornisce gli oggetti (file, processi, prese, fili, dispositivi, ...) e le operazioni (lettura, scrittura, copia, ...). Un linguaggio di scripting web interagisce con il documento e il browser; il browser fornisce gli oggetti (nodi DOM, ...) e le operazioni (DOM API, ...). AutoLisp interagisce con AutoCAD, Photoshop ha un linguaggio di scripting (credo?), Ecc., Quelle lingue interagiscono con modelli o foto 3D, e le operazioni sono fornite dall '"host".

Quindi, uno script interagisce con oggetti il cui tipo non controlla e le cui vite sono indipendenti dallo script attraverso le operazioni fornite dall'host. Questo è ciò che significa "scripting".

Che cosa significa "linguaggio di scripting"? Beh, nessuno lo sa, esattamente. È un linguaggio con cui puoi fare scripting? Puoi farlo con qualsiasi linguaggio, non è una definizione utile. (Proprio come si può fare programmazione funzionale o programmazione orientata agli oggetti con qualsiasi linguaggio.) Personalmente, io lo definirei come un linguaggio che facilita lo scripting e lo semplifica.

Secondo quanto scritto sopra, un linguaggio di scripting richiede flessibilità. Un sistema di tipo dinamico o un sistema di tipo statico espressivo consentono al linguaggio di trattare con garbo il fatto che la maggior parte dei tipi e degli oggetti provengono dall'esterno. Una forma di gestione automatica delle risorse è altamente auspicabile, dal momento che il linguaggio interagisce principalmente con oggetti le cui vite non controllano, e il tentativo di farlo con la gestione manuale delle risorse può diventare disordinato. (Sia che tu scelga regioni monadiche, garbage collection o qualsiasi altra cosa dipende interamente da te.)

E una piccola cosa: per essere utile in Unix come linguaggio di scripting, ha bisogno di essere in grado di affrontare il fatto che quella prima riga dello script sarà qualcosa di simile

#!/usr/bin/env mycoollanguagecompilerimmediate

Vedi Scala per un esempio: in Scala, che sarebbe un errore di sintassi (a differenza di molti linguaggi di scripting, Scala non usa # per i commenti). Tuttavia, in modalità di scripting, Scala ignora tutto fino a includere una riga composta da !# , che ti consente di scrivere qualcosa del tipo:

#!/usr/bin/env ruby

ENV['SCALA_HOME'] ||= '/opt/scala'

# some code to locate the most recent JDK version
# some code to locate the most recent Scala version
# …

exec("#{scala} #{ARGV[0]}")

# Ruby code ends here
!#
// Scala code starts here

Questo è tutto ciò che posso pensare: un sistema di tipo flessibile e potente (vedi PowerShell o Mondrian per esempi) e il supporto per le linee shebang. Entrambi non hanno nulla a che fare con la compilazione.

    
risposta data 24.11.2016 - 11:34
fonte
2

È una domanda trabocchetto o molto scortese, perché non esiste una definizione esatta di "linguaggio di scripting", e quindi nessuna chiara distinzione tra scripting e linguaggi compilati.

O forse la domanda è davvero vecchia, perché tradizionalmente i "linguaggi di scripting" si riferivano a linguaggi interpretati, mentre il "linguaggio compilato" si riferiva a linguaggi tipizzati staticamente che venivano compilati in binari stand-alone. Ma negli ultimi 25 anni ci sono stati così tanti nuovi approcci alla compilazione che offuscano la distinzione che questi termini raramente vengono usati.

Ad esempio JavaScript è stato concepito come linguaggio di scripting (da cui il nome!) ma è spesso compilato oggi, mentre C # è stato concepito come linguaggio compilato ma oggi supporta l'esecuzione immediata del codice sorgente (attraverso il framework Roslyn) .

Quindi penso che potresti rispondere a "Python" o "C #" alla domanda.

    
risposta data 24.11.2016 - 20:17
fonte

Leggi altre domande sui tag