julia-lang - language - julia lenguaje de programacion
En Julia, ¿por qué @printf es una macro en lugar de una función? (2)
Es por el rendimiento. La macro printf
toma una cadena de formato constante (por ejemplo, "Hello %d/n"
) y genera un código optimizado para esa cadena.
En Julia, la sintaxis para imprimir una cadena formateada es la siguiente:
@printf("Hello %d/n", 5)
¿Por qué @printf
es una macro en lugar de una función? ¿Es para que pueda aceptar un número variable de argumentos?
Tomar una cantidad variable de argumentos no es un problema para las funciones de Julia normales [ 1 ]. @printf
es una macro para que pueda analizar e interpretar la cadena de formato en tiempo de compilación y generar código personalizado para esa cadena de formato específica. La gente puede no darse cuenta de que la función printf
de C vuelve a analizar y reinterpreta la cadena de formato cada vez que llama a printf
. El hecho de que sea tan rápido como lo que representa representa un pequeño milagro de la programación del puntero loco. En serio, solo mira la implementación printf
tu libc más cercana. Está completamente loco.
Julia usa un enfoque diferente: @printf
es una macro que traduce las cadenas de formato en un código eficiente específico para esa especificación de formato. Si lo piensas, una cadena de formato de estilo printf es realmente solo una forma de expresar una función que toma un número fijo y tipo de argumentos y los imprime de una manera particular. Tenga en cuenta que dije que la cadena de formato es una función, no printf en sí, que es conceptualmente un generador de funciones, convirtiendo los formatos en formateadores. El hecho de que todo esto esté repleto en una función de tiempo de ejecución en C es un poco desigual debido a que es la única opción razonable en C. De hecho, debido a esto, hasta hace muy poco, era bastante fácil dispararse a sí mismo. en el pie pasando el número o tipo incorrecto de argumentos al printf de C. Esto solo es mejor ahora porque los compiladores han sido diseñados especialmente para comprender la semántica de los formatos printf.
En teoría, el @printf
de Julia se puede hacer más rápido que C ya que genera un código personalizado, pero en la práctica, tuve un tiempo suficientemente difícil para igualar a C, y mucho menos superarla. Pero creo que eso se debe al diseño actual de nuestro sistema de E / S y a cómo lo estoy usando, no a una limitación inherente. Sin embargo, las cosas de E / S deben ser revisadas, y cuando eso ocurra, podríamos ser capaces de vencer a C en la impresión formateada al aprovechar el hecho de que @printf
es una macro.