Frage

Ich kann in Haskell so etwas tun:

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

Dann kann ich es mit ./hello.hs laufen

Meine Frage ist, warum wird die erste Zeile ignoriert? Kommentare in Haskell beginnen mit -- aber die erste Zeile scheint immer noch ignoriert werden. Es gibt sogar Lasten in GHCI. Der Trick funktioniert auch mit Python und Perl.

Aber wenn ich etwas ähnliches in Java:

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

Javac gibt mir einen Compiler-Fehler.

So wie funktioniert das und wie würde ich es mit Java zu arbeiten?

Danke.

War es hilfreich?

Lösung

#! „ shebang “ benannt und ist ein Unix-Weg-Skripte auszuführen. Wenn Sie das O bitten, eine Datei auszuführen, wird es herausfinden, dass dies nicht eine normale EXE-Datei ist, und die #! am Anfang dient als Magic Marker, die das OS weist den Befehl nach dem # auszuführen! und verdrahten, die so diese Datei Befehl wird ein Argument dieses Befehls

Wenn myfile.py enthält

#!/usr/bin/python

diese Datei ausgeführt wird ist nicht sehr verschieden von läuft

$ /usr/bin/python myfile.py

Mein Haskell Wissen ist schlecht. Aber für Ihren speziellen Fall scheint es den runghc Befehl liest einfach die erste Zeile analysiert, da alle Argumente auf diesem #! Linie, schreibt den Rest der Datei in eine temporäre Datei und läuft ghc auf dieser temporären Datei (die die erste lien abgestreift haben wird -. runghc.hs in den ghc Quellen für weitere Informationen siehe)

Wenn Sie die gleiche Sache mit javac tun wollte man den gleichen Ansatz wie runghc nutzen könnten. Schreiben Sie einen Wrapper, der die erste Zeile der Datei isst, schreibt den Rest der Datei in eine temporäre Datei und führt javac auf diese Datei.

Andere Tipps

Wenn Ihre Datei ist hello.hs, und die erste Zeile "# / usr / bin / runghc!", Dann wird die Shell ausführen:

/usr/bin/runghc hello.hs

Die erste Zeile weist im Grunde die Schal, was das Skript zu verwenden, auszuführen.

Wie für das Java-Beispiel sollte die erste Zeile die ausführbare Datei sein, dass läuft das Skript, nicht, dass kompiliert das Skript.

  

Meine Frage ist, warum wird die erste Zeile ignoriert? Kommentare in Haskell beginnen mit - aber die erste Zeile scheint immer noch ignoriert werden. Es gibt sogar Lasten in GHCI. Der Trick funktioniert auch mit Python und Perl.

Der ‚Trick‘ funktioniert in Python und Perl, weil # Kommentar in dieser Sprache beginnt, so dass der Interpreter sieht diese Zeile als Kommentar und ignoriert es. Also für sie, es ist nichts Besonderes.

In Haskell, # nicht startet einen Kommentar, so wäre es nicht normal arbeiten. Allerdings GHC (vielleicht auch andere Implementierungen, wenn der Speicher dient, hat umarmt es auch) einen Sonderfall für shebang Linien. Wenn die erste Zeile einer Datei mit #! beginnt, wird als Kommentar behandelt. Diese Abweichung von der Sprachspezifikation ist genau wurde eingebaut, um

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

Arbeit. Es funktioniert nicht mit javac arbeiten, weil es kein Sonderfall in die für shebang Linien gebaut ist.

Die shebang nur mit interpretierten Sprachen funktioniert .... es bedeutet in der Regel nichts zu einem Compiler, der in den meisten Fällen Fehler aus wird

Der Grund, dass dies funktioniert, ist, weil Python, Perl und scheinbar Haskell sind alle interpretierten Sprachen. Es ist der Standard-Unix-Weg, den Interpreter zu benennen, die das Skript ausgeführt wird. Java ist eine kompilierte Sprache, und nicht mit einem Interpreter ausgeführt werden.

Javac ist ein Compiler, nicht ein Dolmetscher.

Es fehlt interaktiven Modus, die ich glaube, ist, was die ‚Magie‘ verursacht. Das gleiche wird nicht mit GCC arbeiten, da es die gleiche Funktion fehlt.

DMD (Der D-Compiler) zum Beispiel ist ein Beispiel für einen Compiler, der interpertation hat diese Art der interaktiven Bearbeitung (#! / Usr / bin / AME -run).

unterstützt

Es ist der Ort der ausführbaren Datei auf Ihrem Computer das Skript zu interpretieren. Java ist eine Sprache übersetzt, so ist es nicht, eine solche Erklärung brauchen.

Darüber hinaus ist der Punkt, dass es ein besonderer Kommentar hier ist, der Aufbau in Java würde auf diese Weise nicht legal als # keine juristische Kommentarmarkierung ist. Wenn eine Konstruktion wie das würde Sinn machen ... die es nicht ... es würde so aussehen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top