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