В моём любимом Perl мне часто не хватает одной, казалось бы, простой, вещи: макрорасширений.
Для чего они нужны в моём случае?
Для того, чтобы объяснить компилятору, что данный кусок кода не нужно всякий раз вызывать как полноценную процедуру, а можно его просто копипастить, подставляя по месту соотв. статические, то есть вычисляемые на этапе компиляции, параметры.
Собственно, такая штука была в чудесном MASM'е, и она позволяла сэкономить немало тактов процессора на отсутствии ненужных вызовов процедур там, где их параметры были известны уже на этапе компиляции.
Думаю, что хотя оптимизирующие компиляторы и умеют разворачивать циклы и вообще удалять целые «ненужные» куски кода, но вряд ли они сумеют сами догадаться о том, что данной процедуре совершенно не обязательно пихать в стек параметры-константы и делать лишние malloc'и для локальных переменных (ну или пихать их в стек, если они туда помещаются), а можно просто сгенерировать соотв. копию кода процедуры и выполнить потом этот код в общем потоке исполнения.
Пожалуй, трудно поспорить с тем, что те же преобразования «строк-цифр» в «цифры-цифры» и обратно - занятие для процессора куда более утомительное, но... одно дело - принципиальные конструктивные недостатки языка, а другое - отсутствие в нём полезной функциональности.
Вопрос: в каких языках, кроме собственно макроассемблеров, есть механизм генерации кода?