В Julia синтаксис для печати форматированной строки выглядит следующим образом:
@printf("Hello %d\n", 5)
Почему @printf
макрос вместо функции? Это значит, что он может принимать различное количество аргументов?
В Julia синтаксис для печати форматированной строки выглядит следующим образом:
@printf("Hello %d\n", 5)
Почему @printf
макрос вместо функции? Это значит, что он может принимать различное количество аргументов?
Взятие переменного числа аргументов не является проблемой для обычных функций Джулии [1]. @printf
- это макрос, чтобы он мог анализировать и интерпретировать строку формата во время компиляции и генерировать собственный код для этой конкретной строки форматирования. Люди могут не понимать, что функция C printf
повторно анализирует и повторно интерпретирует строку формата каждый раз, когда вы вызываете printf
. Тот факт, что он так же быстро, как и представляет собой небольшое чудо безумного программирования указателей. Серьезно, просто взгляните на свою ближайшую реализацию libc printf
. Он полностью гаснет.
Julia использует другой подход: @printf
- это макрос, который преобразует строки формата в эффективный код, специфичный для этой спецификации формата. Если вы думаете об этом, строка формата в формате printf - это просто способ выразить функцию, которая принимает фиксированное количество и тип аргументов и печатает их определенным образом. Обратите внимание, что я сказал, что строка формата является функцией, а не самой printf, которая концептуально является генератором функций, превращая форматы в formatters. Тот факт, что все это забито во временную функцию в C, является немного несоответствием из-за того, что это единственный разумный вариант в C. На самом деле из-за этого, до недавнего времени, было довольно легко застрелить себя в ногу, передав неправильный номер или тип аргументов в C printf. Это теперь только лучше, потому что компиляторы были специально обследованы, чтобы понять семантику форматов printf.
В теории, Julia @printf
может быть сделана быстрее, чем C, поскольку она генерирует пользовательский код, но на практике у меня было достаточно сложное время, соответствующее C, не говоря уже о его избиении. Но я думаю, что из-за существующего дизайна нашей системы ввода-вывода и того, как я ее использую, это не присущее ограничение. Однако материал ввода-вывода требует капитального ремонта, и, когда это произойдет, мы могли бы фактически превзойти C при форматированной печати, используя тот факт, что @printf
является макросом.
Это для производительности. Макрос printf
принимает постоянную строку формата (например, "Hello %d\n"
) и генерирует оптимизированный код для этой строки.