Pergunta

Eu posso fazer algo parecido com isso em Haskell:

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

Então eu posso executá-lo com ./hello.hs

A minha pergunta é, por que é a primeira linha ignorado? Comentários em Haskell começar com -- mas a primeira linha ainda parece ser ignorado. Ele ainda carrega em ghci. O truque também funciona com Python e Perl.

Mas quando eu faço algo semelhante em Java:

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

Javac me dá um erro do compilador.

Então, como isso funciona e como é que eu obtê-lo para trabalhar com Java?

Graças.

Foi útil?

Solução

#! é chamado de " shebang " e é uma maneira Unix da execução de scripts. Quando você pergunta o sistema operacional para executar um arquivo ele vai descobrir que este não é um arquivo .exe normal, e o #! no começo serve como um marcador mágico que instrui o sistema operacional para executar o comando após o #! e fiação até que o comando de modo que este arquivo se torna um argumento do comando

Se myfile.py contém

#!/usr/bin/python

executar esse arquivo não é muito diferente da execução

$ /usr/bin/python myfile.py

Meu Haskell conhecimento é pobre. Mas para o seu caso particular, parece o comando runghc simplesmente lê a primeira linha, analisa quaisquer argumentos dados em que #! linha, escreve o resto do arquivo para um arquivo temporário e corre GHC naquele arquivo temporário (que terá o primeiro lien retirados -. ver runghc.hs nas fontes ghc para mais informações)

Se você queria fazer a mesma coisa com javac você poderia usar a mesma abordagem que runghc. Escrever um invólucro, que se alimenta a primeira linha do arquivo, escreve o resto do arquivo para um arquivo temporário e corre javac nesse arquivo.

Outras dicas

Se o arquivo for hello.hs, ea primeira linha é "# / usr / bin / runghc!", Em seguida, o shell irá executar:

/usr/bin/runghc hello.hs

Essa primeira linha, basicamente diz ao shell o que usar para executar o script.

Quanto ao exemplo java, a primeira linha deve ser o executável que runs o script, não que compila do script.

A minha pergunta é, por que é a primeira linha ignorado? Comentários em Haskell começar com - mas a primeira linha ainda parece ser ignorado. Ele ainda carrega em ghci. O truque também funciona com Python e Perl.

O 'truque' funciona em Python e Perl porque # começa um comentário nessas línguas, por isso o intérprete vê essa linha como um comentário e ignora-lo. Então, para eles, não é nada especial.

Em Haskell, # não inicia um comentário, por isso não faria normalmente trabalho. No entanto, GHC (talvez também outras implementações, se a memória serve, abraços fiz isso também) tem um caso especial para linhas shebang. Se a primeira linha de um arquivo começa com #!, ele é tratado como um comentário. Este desvio da especificação da linguagem foi incorporada exatamente a make

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

trabalho. Ele não funciona com javac porque não há nenhum caso especial incorporado que para as linhas shebang.

O shebang só funciona com linguagens interpretadas .... geralmente significa nada para um compilador que irá erro fora na maioria dos casos

A razão que isso funciona é porque Python, Perl, e, aparentemente, Haskell, são todas as linguagens interpretadas. É a forma padrão Unix para designar o intérprete que irá executar o script. Java é uma linguagem compilada, e não pode ser executado com um intérprete.

Javac é um compilador, não um intérprete.

Ela carece de modo interativo que, creio, é o que está causando a 'magia'. O mesmo não vai funcionar com o GCC, uma vez que não tem a mesma característica.

dmd (O compilador D), por exemplo, é um exemplo de um compilador que suporta interpertation tem esse tipo de edição interativa (#! / Usr / bin / DMD -run).

É o local do executável em seu computador para interpretar o seu script. Java é uma linguagem compilada, portanto, ele não precisa de tal declaração.

Além disso, o ponto é que é um comentário especial, a construção em Java não seria legal dessa forma como um # não é um marcador de comentário legal. Se uma construção como essa faria sentido ... o que não acontece ... ele ficaria assim:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top