Pregunta

Puedo hacer algo como esto en Haskell:

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

Entonces puedo ejecutarlo con ./hello.hs

Mi pregunta es, ¿por qué es la primera línea de ignorados?Comentarios en haskell empezar con -- pero la primera línea todavía parece ser ignorado.Cargas incluso en el intérprete.El truco también funciona con Python y Perl.

Pero cuando yo hago algo similar en Java:

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

Javac me da un error del compilador.

Entonces, ¿cómo funciona esto y cómo puedo conseguir que funcione con Java?

Gracias.

¿Fue útil?

Solución

#! se denomina " tinglado " y es una forma de ejecución de scripts de Unix. Cuando usted le pide al sistema operativo para ejecutar un archivo que va a darse cuenta de que esto no es un archivo .exe normal, y el #! al principio sirve como un marcador que indica al sistema operativo para ejecutar el comando después de la #! y el cableado hasta que mandan por lo que este archivo se convierte en un argumento de ese comando

Si myfile.py contiene

#!/usr/bin/python

ejecutar ese archivo no es muy diferente de la gestión

$ /usr/bin/python myfile.py

Mi conocimiento Haskell es pobre. Pero para su caso particular parece que el comando runghc simplemente lee la primera línea, analiza los argumentos dados en ese #! línea, escribe el resto del archivo en un archivo temporal y se ejecuta GHC en ese archivo temporal (que tendrá el primer derecho de retención despojado -. runghc.hs ver en las fuentes de GHC para obtener más información)

Si usted quería hacer lo mismo con javac se podría utilizar el mismo enfoque que runghc. Escribe una envoltura, que se alimenta de la primera línea del archivo, escribe el resto del archivo a un archivo temporal y se ejecuta javac en ese archivo.

Otros consejos

Si su archivo es hola.hs, y la primera línea es "#!/usr/bin/runghc", entonces el shell para que se ejecute:

/usr/bin/runghc hello.hs

Esa primera línea básicamente le dice al shell qué utilizar para ejecutar la secuencia de comandos.

Como por ejemplo en java, la primera línea debe ser el ejecutable que se ejecuta la secuencia de comandos, no se que compila la secuencia de comandos.

  

Mi pregunta es, ¿por qué se ignora la primera línea? Los comentarios en Haskell comienzan con - pero la primera línea todavía parece ser ignorado. Se carga incluso en ghci. El truco también funciona con Python y Perl.

El 'truco' funciona en Python y Perl porque # comienza un comentario en esos idiomas, por lo que el intérprete ve que la línea como un comentario y lo ignora. Así que para ellos, no es nada especial.

En Haskell, # no se inicia un comentario, por lo que normalmente no funcionaría. Sin embargo, GHC (quizás también otras implementaciones, si mal no recuerdo, abrazos lo hizo también) tiene un caso especial para líneas shebang. Si la primera línea de un archivo comienza con #!, se trata como un comentario. Esta desviación de la especificación del lenguaje se ha incorporado para hacer exactamente

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

trabajo. No funciona con javac porque no hay ningún caso especial incorporado en la que las líneas de shebang.

El tinglado sólo funciona con los lenguajes interpretados .... por lo general no significa nada para un compilador que el error en la mayoría de los casos

La razón de que esto funciona es porque Python, Perl, y al parecer Haskell, son todos los lenguajes interpretados. Es la forma estándar de Unix para designar al intérprete que se ejecutará la secuencia de comandos. Java es un lenguaje compilado, y no se puede ejecutar con un intérprete.

javac es un compilador, no un intérprete.

Carece de modo interactivo que creo que es lo que está causando la 'magia'. La misma no va a funcionar con GCC ya que carece de la misma característica.

DMD (El compilador D), por ejemplo, es un ejemplo de un compilador que apoya interpertation ha este tipo de edición interactiva (#! / Usr / bin / DMD -run).

Es la ubicación del ejecutable en el equipo para interpretar la secuencia de comandos. Java es un lenguaje compilado, por lo que no necesita tal declaración.

Por otra parte, el punto es que se trata de un comentario especial, la construcción de Java no sería legal de esa manera como # no es un marcador de comentario legal. Si una construcción de esa manera tendría sentido ... lo cual no es así ... que se vería así:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top