В Юлия, почему @е макрос, а не функция?


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

@printf("Hello %dn", 5)

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

2 54

2 ответа:

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

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

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

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