Подтвердить что ты не робот

В Julia, почему @printf вместо макроса вместо макроса?

В Julia синтаксис для печати форматированной строки выглядит следующим образом:

@printf("Hello %d\n", 5)

Почему @printf макрос вместо функции? Это значит, что он может принимать различное количество аргументов?

4b9b3361

Ответ 1

Взятие переменного числа аргументов не является проблемой для обычных функций Джулии [1]. @printf - это макрос, чтобы он мог анализировать и интерпретировать строку формата во время компиляции и генерировать собственный код для этой конкретной строки форматирования. Люди могут не понимать, что функция C printf повторно анализирует и повторно интерпретирует строку формата каждый раз, когда вы вызываете printf. Тот факт, что он так же быстро, как и представляет собой небольшое чудо безумного программирования указателей. Серьезно, просто взгляните на свою ближайшую реализацию libc printf. Он полностью гаснет.

Julia использует другой подход: @printf - это макрос, который преобразует строки формата в эффективный код, специфичный для этой спецификации формата. Если вы думаете об этом, строка формата в формате printf - это просто способ выразить функцию, которая принимает фиксированное количество и тип аргументов и печатает их определенным образом. Обратите внимание, что я сказал, что строка формата является функцией, а не самой printf, которая концептуально является генератором функций, превращая форматы в formatters. Тот факт, что все это забито во временную функцию в C, является немного несоответствием из-за того, что это единственный разумный вариант в C. На самом деле из-за этого, до недавнего времени, было довольно легко застрелить себя в ногу, передав неправильный номер или тип аргументов в C printf. Это теперь только лучше, потому что компиляторы были специально обследованы, чтобы понять семантику форматов printf.

В теории, Julia @printf может быть сделана быстрее, чем C, поскольку она генерирует пользовательский код, но на практике у меня было достаточно сложное время, соответствующее C, не говоря уже о его избиении. Но я думаю, что из-за существующего дизайна нашей системы ввода-вывода и того, как я ее использую, это не присущее ограничение. Однако материал ввода-вывода требует капитального ремонта, и, когда это произойдет, мы могли бы фактически превзойти C при форматированной печати, используя тот факт, что @printf является макросом.

Ответ 2

Это для производительности. Макрос printf принимает постоянную строку формата (например, "Hello %d\n") и генерирует оптимизированный код для этой строки.