Domanda

posso fare qualcosa di simile in Haskell:

#!/usr/bin/runghc
main=putStrLn "Hello World"

Allora posso eseguirlo con ./hello.hs

La mia domanda è, perché si ignora la prima linea? Commenti a Haskell iniziano con -- ma la prima linea sembra essere ancora ignorato. Si carichi anche in ghci. Il trucco funziona anche con Python e Perl.

Ma quando faccio qualcosa di simile a Java:

#!/usr/local/jdk1.6.0_13/bin/javac
...

Javac mi dà un errore del compilatore.

Quindi, come fa questo lavoro e come vorrei farlo funzionare con Java?

Grazie.

È stato utile?

Soluzione

#! si chiama " baracca " ed è un modo Unix di esecuzione di script. Quando si chiede al sistema operativo di eseguire un file che sarà capire che questo non è un file exe normale, e il #! all'inizio serve come un pennarello, che istruisce il sistema operativo per eseguire il comando dopo il #! e il cablaggio up che comanda quindi questo file diventa un argomento di tale comando

se myfile.py contiene

#!/usr/bin/python

l'esecuzione di quel file non è molto diverso da corsa

$ /usr/bin/python myfile.py

La mia conoscenza Haskell è scarsa. Ma per il vostro caso particolare sembra che il comando runghc semplicemente si legge la prima linea, analizza eventuali argomenti forniti su quel #! Linea, scrive il resto del file in un file temporaneo e corre GHC su quel file temporaneo (che avrà il primo pegno spogliato fuori -. vedi runghc.hs nelle fonti ghc per maggiori informazioni)

Se si voleva fare la stessa cosa con javac è possibile utilizzare lo stesso approccio runghc. Scrivere un wrapper, che mangia la prima riga del file, scrive il resto del file in un file temporaneo e corre javac su quel file.

Altri suggerimenti

Se il file è hello.hs, e la prima riga è "# / usr / bin / runghc!", Allora la shell eseguire:

/usr/bin/runghc hello.hs

Quella prima linea dice in sostanza il guscio cosa usare per eseguire lo script.

Per quanto riguarda l'esempio Java, la prima linea dovrebbe essere l'eseguibile che corre lo script, non è che compila lo script.

  

La mia domanda è, perché si ignora la prima linea? Commenti a Haskell iniziano con - ma la prima linea sembra essere ancora ignorato. Si carichi anche in ghci. Il trucco funziona anche con Python e Perl.

Il 'trucco' funziona in Python e Perl perché # inizia un commento in tali lingue, quindi l'interprete vede che la linea come un commento e lo ignora. Così per loro, non è niente di speciale.

In Haskell, # non si avvia un commento, così non sarebbe lavorare normalmente. Tuttavia, GHC (forse anche altre implementazioni, se la memoria non serve, abbracci lo ha fatto troppo) ha un caso speciale per le linee shebang. Se la prima riga di un file inizia con #!, viene trattato come un commento. Questa deviazione dalla specifica del linguaggio è stata incorporata esattamente a fare

$ chmod +x hello.hs
$ ./hello.hs

lavoro. Non funziona con javac perché non c'è nessun caso speciale integrata in quella per le linee baracca.

La faccenda funziona solo con linguaggi interpretati .... generalmente significa niente per un compilatore che errore fuori nella maggior parte dei casi

La ragione per cui questo funziona è perché Python, Perl, e apparentemente Haskell, sono tutti i linguaggi interpretati. E 'il modo standard di Unix per designare l'interprete che verrà eseguito lo script. Java è un linguaggio compilato, e non può essere eseguito con un interprete.

Javac è un compilatore, non un interprete.

Gli manca la modalità interattiva che credo è ciò che sta causando la 'magia'. Lo stesso non funziona con GCC dal momento che manca la stessa caratteristica.

DMD (Il D compilatore), ad esempio, è un esempio di un compilatore che supporta interpertation ha questo tipo di modifica interattiva (#! / Usr / bin / DMD-run).

E 'la posizione del file eseguibile sul computer per interpretare lo script. Java è un linguaggio compilato, quindi non ha bisogno di una tale affermazione.

Inoltre, il punto è che si tratta di un commento speciale, la costruzione in Java non sarebbe legale in quel modo come un # non è un indicatore di commento legale. Se una costruzione del genere avrebbe senso ... che non è così ... sarebbe simile:

//!/usr/local/jdk1.6.0_13/bin/javac

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top