Question

Je peux faire quelque chose comme ça dans Haskell:

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

Ensuite, je peux courir avec ./hello.hs

Ma question est, pourquoi est la première ligne ignoré? Commentaires à haskell commencent par -- mais la première ligne semble encore être ignoré. Il a même des charges en ghci. L'astuce fonctionne aussi avec Python et Perl.

Mais quand je fais quelque chose de similaire à Java:

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

Javac me donne une erreur de compilation.

Alors, comment cela fonctionne et comment pourrais-je obtenir de travailler avec Java?

Merci.

Était-ce utile?

La solution

#! est nommé « tralala » et est un moyen Unix d'exécuter des scripts. Lorsque vous demandez à l'OS d'exécuter un fichier, il va comprendre que ce n'est pas un fichier .exe normal, et le #! au début sert de marqueur magique qui indique à l'OS d'exécuter la commande après le #! et de câblage jusqu'à cette commande si ce fichier devient un argument de cette commande

si myfile.py contient

#!/usr/bin/python

l'exécution de ce fichier n'est pas très différent de courir

$ /usr/bin/python myfile.py

Ma connaissance Haskell est pauvre. Mais pour votre cas particulier, il semble que la commande runghc lit simplement la première ligne, parse des arguments donnés sur ce #! ligne, écrit le reste du fichier dans un fichier temporaire et exécute GHC sur ce fichier temporaire (qui aura le privilège de premier rang dépouillé -. voir runghc.hs dans les sources GHC pour plus d'informations)

Si vous voulez faire la même chose avec javac, vous pouvez utiliser la même approche que runghc. Écrire un wrapper, qui mange la première ligne du fichier, écrit le reste du fichier dans un fichier temporaire et fonctionne javac sur ce fichier.

Autres conseils

Si votre fichier est hello.hs, et la première ligne est "# / usr / bin / runghc!", Le shell exécutera:

/usr/bin/runghc hello.hs

Cette première ligne indique essentiellement la coquille ce qu'il faut utiliser pour exécuter le script.

En ce qui concerne l'exemple java, la première ligne devrait être l'exécutable que exécute le script, pas compile le script.

  

Ma question est, pourquoi est la première ligne ignoré? Commentaires à haskell commencent par - mais la première ligne semble encore être ignoré. Il a même des charges en ghci. L'astuce fonctionne aussi avec Python et Perl.

Le « truc » fonctionne en Python et Perl parce que # commence un commentaire dans ces langues, l'interprète voit cette ligne comme un commentaire et ignore. Donc, pour eux, il n'y a rien de spécial.

Dans Haskell, # ne démarre pas un commentaire, il ne fonctionnerait pas normalement. Cependant, GHC (peut-être aussi d'autres implémentations, si ma mémoire est bonne, câlins fait aussi) a un cas particulier pour les lignes de Shebang. Si la première ligne d'un fichier commence par #!, il est traité comme un commentaire. Cet écart par rapport à la spécification du langage a été incorporé exactement à faire

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

. Il ne fonctionne pas avec javac parce qu'il n'y a pas de cas particulier construit dans ce pour les lignes Shebang.

Le tralala ne fonctionne qu'avec des langages interprétés .... cela signifie généralement rien à un compilateur qui erreur dans la plupart des cas

La raison pour que cela fonctionne parce que Python, Perl, et apparemment Haskell, sont toutes les langues interprétées. Il est le moyen standard Unix pour désigner l'interprète qui exécutera le script. Java est un langage compilé, et ne peut pas être exécuté avec un interprète.

Javac est un compilateur, pas un interprète.

Il manque mode interactif que je crois est la cause de la « magie ». La même chose ne fonctionne pas avec GCC car il n'a pas la même fonction.

DMD (Le compilateur D), par exemple, est un exemple d'un compilateur qui prend en charge interpertation a ce genre d'édition interactive (#! / Usr / bin / DMD -run).

Il est l'emplacement de l'exécutable sur votre ordinateur pour interpréter votre script. Java est un langage compilé, il n'y a donc pas besoin d'une telle déclaration.

Par ailleurs, le point est qu'il est un commentaire spécial, la construction en Java ne serait pas légal de cette façon comme # est un marqueur non légal de consultation. Si une construction comme cela aurait du sens ... ce qui ne est pas ... il ressemblerait à ceci:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top