In Julia, warum ist @printf eines Makros statt einer Funktion?
In Julia, die syntax zum drucken eines formatierten string ist wie folgt:
@printf("Hello %d\n", 5)
Warum ist @printf
eines Makros statt einer Funktion? Ist es so, dass es kann akzeptieren eine unterschiedliche Anzahl von Argumenten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehmen eine variable Anzahl von Argumenten ist nicht ein problem für normal-Julia-Funktionen [Eins].
@printf
ist ein makro, so dass es kann analysieren und interpretieren der format-string zur compile-Zeit und generieren von benutzerdefinierten code für das jeweilige format-string. Die Menschen können nicht erkennen, dass die Cprintf
Funktion re-analysiert und neu interpretiert die format-string - jedes mal, wenn Sie anrufenprintf
. Die Tatsache, dass es so schnell, wie es ist, stellt ein kleines Wunder der wahnsinnigen Zeiger-Programmierung. Ernsthaft, schauen Sie einfach bei Ihrem nächsten libc istprintf
Umsetzung. Es ist völlig verrückt.Julia verwendet einen anderen Ansatz:
@printf
ist ein makro, welches übersetzt format-strings in effizienten code, der format-Spezifikation. Wenn Sie darüber nachdenken, eine printf-format-string ist wirklich nur ein Weg, um auszudrücken, eine Funktion, die eine Feste Anzahl und Typ der Argumente und druckt diese in einer bestimmten Art und Weise. Beachten Sie, dass ich sagte, dass die format-string ist eine Funktion, nicht printf selbst, das ist im Prinzip eine Funktion generator, wodurch die Formate, in Formatierer. Die Tatsache, dass hier alle zusammengepfercht in einem run-time-Funktion in C ist ein bisschen von einer Abweichung durch, dass die einzige vernünftige option in C. In der Tat, weil dieser, bis vor kurzem, war es ziemlich einfach, um zu Schießen selbst in den Fuß durch die übergabe der falschen Anzahl oder Typ der Argumente zu C ist printf. Dies ist nur besser, weil die Compiler wurden special-cased zu verstehen, die Semantik von printf-Formate.In der Theorie, Julias
@printf
vorgenommen werden können schneller als C, da es generieren Sie die benutzerdefinierten code verwenden, aber in der Praxis, ich hatte eine harte genug Zeit, die passende C, geschweige denn, es zu schlagen. Aber ich denke, das ist durch das aktuelle design von unseren I/O-system und wie verwende ich es, nicht eine inhärente Einschränkung. Die I/O-Zeug ist durch eine überarbeitung ist aber, und wenn das passiert, könnten wir tatsächlich in der Lage sein zu schlagen C formatiert drucken durch die Nutzung der Tatsache, dass@printf
ist ein makro.x = @sprintf "My lucky number is %d" 42
.value = big(pi); N = 100; @sprintf("%.$Nf", value)
. Dies scheitert in Julia 0.6.3 mitERROR: ArgumentError: @sprintf: format must be a plain static string (no interpolation or prefix)
.Es ist für die Leistung. Die
printf
makro nimmt einen Konstanten string format (zB."Hello %d\n"
) und erzeugt optimierten code für die Zeichenfolge.