Влияет ли определение всех новых синтаксисов на производительность в Scheme, Racket? - PullRequest
3 голосов
/ 12 февраля 2020

Я создаю новый язык с помощью Racket define-syntax-parser. Множество новых синтаксисов и даже замена фундаментальных форм.

Я намерен использовать новый язык в работе, но не знаю, слишком ли много новых синтаксисов ухудшают производительность.

Должен ли я скомпилировать в двоичный файл или отсортировать этого?

1 Ответ

4 голосов
/ 12 февраля 2020

TL; DR: нет потери производительности

Синтаксис, который вы вводите, расширяется во время расширения макроса. Это означает, что если вы сделаете raco make, это заменит все использование макросов их расширенными формами.

Иногда при создании функций ваш расширенный код может быть более сложным, чем то, как вы написали бы код изначально. Это также может быть удалено компилятором jit, как это было бы с другим неоптимизированным кодом.

Иногда ваша функция требует большей сложности, которая не может быть сведена к простейшей форме. В этом случае вы можете потерять производительность.

В качестве примера можно было бы переопределить #%app для доступа к массиву и списку там, где вы обычно делаете (vector-ref vec 3), где синтаксис (vec 3) может означать как доступ к массиву, так и приложение. Расширение может стать (if (racket:#%app vector? vec) (racket:#%app vector-ref vec 3) (racket:#%app vec 3)), и если система не может сделать вывод, что это не vector?, она выполнит тест для каждого приложения. Если бы кто-нибудь изменил бы значения [ и ] так, чтобы они просто имели доступ к массиву, [vec 5] можно легко превратить в (vector-ref vec 3), при этом (vec 5) не будет иметь проблем с производительностью, но это также означает, что синтаксис говорит вам, что это такое и есть менее общий.

...