Sto per iniziare una distro Linux basata su LFS solo per un progetto di hobby. Ho in programma di eseguire alcune attività non standard, e la maggior parte di esse comporterà il cambiamento di quasi tutti gli script nella distribuzione. (principalmente script di init, ma scriverò anche un semplice set di script per il gestore dei pacchetti.) Dal momento che sto andando così lontano dalla norma, e dal momento che non sono mai stato un fan delle lingue con dattilografia dinamica (perl, python, bash e il resto sono buoni, ma non è il mio forte), mi stavo chiedendo se qualcuno fosse a conoscenza di un linguaggio interpretato che in realtà ha dichiarato delle variabili.Qualcuno sa di linguaggi di scripting tipizzati in modo statico?
risposta
Esaminare il comando "typeset" nella shell preferita. bash e ksh93 possono entrambi imporre numeri interi e stringhe, usare riferimenti (variabili variabili), ecc. Con ksh93, puoi anche fare matematica a virgola mobile e usare oggetti con attributi. La tipizzazione statica in realtà non ti compra nulla di utile negli script di init e simili. Principalmente stai leggendo i file e eseguendo i comandi di sistema, il che è il vero vantaggio della shell. Prenditi un po 'di tempo con il libro O'Reilly "apprendi il guscio di Korn" prima di decidere che tutti quegli altri Unix sono stupidamente progettati ...;)
e "set -o nounset" all'inizio dello script ... – dannysauer
Questo è un terribile suggerimento. Se l'OP non ha linguaggi dinamici, sta per * odiare * lo scripting della shell. Sono molto più dinamici di qualsiasi altro linguaggio di scripting. –
Questa risposta fornisce un suggerimento per enfatizzare i tipi in una lingua che l'OP ha già familiarità con una quale gli script di init sono probabilmente già scritti. Credo che otterrei voti più alti se avessi appena detto "questo è impossibile" o "qui, usa questo linguaggio di cui hanno sentito parlare tre persone" :) – dannysauer
In genere le lingue tipizzate in modo statico sono lingue compilate. Suppongo che la ragione sia che l'analisi statistica dei tipi è piuttosto costosa e devi avere un esame approfondito di tutto il codice che stai elaborando. Dopo averlo fatto, ti sembra uno spreco non scrivere tutte queste informazioni in un file, in modo da non doverlo ripetere la volta successiva. Così finisci rapidamente con un linguaggio compilato.
D'altra parte, trasformare un linguaggio compilato in uno "non-compilato" è piuttosto semplice. Basta non archiviare i risultati della compilation da nessuna parte, ma eseguirli direttamente. Un compilatore che conosco che fornisce tale wrapper è GHC, il compilatore standard Haskell. È possibile aggiungere #!/usr/bin/runhaskell
ai file di origine e quindi eseguirli direttamente. E dal momento che hai intenzione di essere di gran lunga fuori dalla norma, Haskell sembra un perfetto adattamento;). Ma aspettatevi un tempo di avvio piuttosto ampio per i vostri script, perché tutte le analisi e l'ottimizzazione del "tempo di compilazione" non sono gratuite.
Haskell non è progettato per lo scripting di shell ed è un linguaggio funzionale, quindi se non lo hai mai visto prima, potrebbe essere necessario un po 'di tempo per abituarsi. Ma ha pochissimo overhead sintattico e la forza dei linguaggi funzionali è l'astrazione, quindi non vedo perché non è possibile creare una libreria che rende divertente lo scripting di shell. C'è anche un po 'di experimental Haskell shell, ma sembra essere più una prova di concetto che una soluzione reale.
In generale, direi che il sovraccarico di tutte le analisi di tipo è significativo, ma ti suggerisco di scegliere il tuo linguaggio compilato tipicamente staticamente preferito e cercare un wrapper come runhaskell
per eseguire script scritti in esso.
Non esiste una lingua * compilata *. Ogni lingua può essere implementata da un compilatore o da un interprete. E, in effetti, la stragrande maggioranza dei linguaggi di programmazione ha almeno un'implementazione di ciascuno. Inoltre, la maggior parte delle implementazioni linguistiche moderne hanno effettivamente * sia * un compilatore * che * un interprete. Poiché menzioni Haskell: Hugs è un interprete Haskell. V8 è un compilatore JavaScript. PowerShell di Microsoft è un compilatore. Un paio di anni fa, gli sviluppatori di Bash stavano pensando di passare a un'implementazione compilata. HotSpot JVM è sia un interprete che un compilatore –
google veloce. F3, lo script JavaFX, Linden Scripting Language (scripting per Second Life), a differenza del commento alla prima risposta F # può essere utilizzato come un linguaggio di scripting http://blogs.msdn.com/chrsmith/archive/2008/09/12/scripting-in-f.aspx
Felix, Tuga, CFGScript, Talco, AngelScript, e indovinando c'è più di quella ricerca veloce.
Douglas
Groovy. Di default è dinamico, a forma di anatra. Ma supporta anche la digitazione statica.
Python è fortemente digitato. Non dinamico. Non è possibile aggiungere un numero e una stringa in silenzio senza conversione esplicita. – George
@gdivos: Python è sia fortemente tipizzato * che * dinamico.È dinamico perché puoi provare a chiamare qualsiasi funzione con qualsiasi argomento di tipo e un tipo di parametro non corrispondente non verrà rilevato fino al runtime. Un linguaggio statico rileverà quel problema in fase di compilazione (o almeno, prima del tempo di esecuzione). –
Non esiste una lingua interpretata. Ogni lingua può essere implementata da un compilatore o da un interprete. E, in effetti, la stragrande maggioranza dei linguaggi di programmazione ha almeno un'implementazione di ciascuno. Inoltre, la maggior parte delle implementazioni linguistiche moderne hanno in realtà sia un compilatore che un interprete. Poiché menzioni Haskell: Hugs è un interprete Haskell. V8 è un compilatore JavaScript. PowerShell di Microsoft è un compilatore. Un paio di anni fa, gli sviluppatori di Bash stavano pensando di passare a un'implementazione compilata. HotSpot JVM è sia un interprete che un compilatore. –