LINUX.ORG.RU

Какие языки поддерживают макросы-генераторы кода?

 , ,


0

1

В моём любимом Perl мне часто не хватает одной, казалось бы, простой, вещи: макрорасширений.

Для чего они нужны в моём случае?

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

Собственно, такая штука была в чудесном MASM'е, и она позволяла сэкономить немало тактов процессора на отсутствии ненужных вызовов процедур там, где их параметры были известны уже на этапе компиляции.

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

Пожалуй, трудно поспорить с тем, что те же преобразования «строк-цифр» в «цифры-цифры» и обратно - занятие для процессора куда более утомительное, но... одно дело - принципиальные конструктивные недостатки языка, а другое - отсутствие в нём полезной функциональности.

Вопрос: в каких языках, кроме собственно макроассемблеров, есть механизм генерации кода?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Я чувствую возмущение в Силе. Как будто бы кто-то хочет сказать «LISP»!

luke ★★★★★
()

Вопрос: в каких языках, кроме собственно макроассемблеров, есть механизм генерации кода?

C, C++, '.*Lisp.*', из того, что сразу приходит в голову.

Deleted
()

Любой компилятор, умеющий инлайнить.

hateyoufeel ★★★★★
()

В моём любимом Perl
а можно его просто копипастить, подставляя по месту соотв. статические, то есть вычисляемые на этапе компиляции, параметры.

Похоже что ты подробно описал поведение прагмы constant: «When a constant is used in an expression, Perl replaces it with its value at compile time, and may then optimize the expression further».

$ perl -MO=Deparse -wE 'use constant {X => 2, Y => 4}; use constant Z => X * Y; say Z;'
$ BEGIN { $^W = 1; }
use constant ({'X', 2, 'Y', 4});
use constant ('Z', 8);
say 8;
outtaspace ★★★
()
Ответ на: комментарий от Deleted

C, C++, '.*Lisp.*', из того, что сразу приходит в голову.

Главное забыл - Forth.

KRoN73 ★★★★★
()

Вообще да, константы в perl подставляются на этапе компиляции. Удалять целые «ненужные» куски кода он тоже может.

Функции инлайнить он сам не умеет, но ты уверен что на этом много сэкономишь?

disarmer ★★★
()
Ответ на: комментарий от backburner

eval отработает в компайл-тайме?

loz ★★★★★
()

но вряд ли они сумеют сами догадаться о том, что данной процедуре совершенно не обязательно пихать в стек параметры-константы и делать лишние malloc'и для локальных переменных

Ещё как догадаются, gcc -finline-*, -fipa-*.

GAMer ★★★★★
()

Если бы не обилие звезд в треде, подумал бы, что вброс. Хотя...

Общемта если не западло юзать мейкфайлы, то можно генерить перловые исходники из метасорцов, прогоняя их через m4 или тот же cpp, для последнего придется грепать -v инфу о номерах строк при инклудах и еще кое-что. Собственно владея любимым перлом ты должен бы был прочитать perlfilter еще на стадии хеловордов.

anonymous
()

Если не хватает констант:

http://perldoc.perl.org/perlfilter.html - ультиматное решение, парсишь любой перловый код любым перловым кодом. Пример - http://search.cpan.org/~chorny/Switch-2.17/Switch.pm

http://perldoc.perl.org/perl5120delta.html#Pluggable-keywords - добавление кастомных ключевых слов из XS

annulen ★★★★★
()
Ответ на: комментарий от anonymous

можно генерить перловые исходники из метасорцов, прогоняя их через m4

Изврат

или тот же cpp

категорически не рекомендуется для языков, отличных от С и С++

annulen ★★★★★
()
Ответ на: комментарий от anonymous

Ололошечки, так даже на C можно (libclang, tcc, а с недавних пор и даже gcc научился, назло ребе Штольману).

anonymous
()
Ответ на: комментарий от anonymous

Процитируй оттуда утверждение, где говориться о том, что си может генерировать код в рантайме, а затем исполнять его.

anonymous
()
Ответ на: комментарий от annulen

парсишь любой перловый код любым перловым кодом

Можно подумать это меньший изврат. Можно даже прикинуться, что это вообще не изврат и не кривой лисапед.

cpp категорически не рекомендуется для языков,

но используется первым примером в perlfilter. Не показатель, но иронично ж)

anonymous
()

Кложура например.

Hertz ★★★★★
()
Ответ на: комментарий от anonymous

Может генерировать статик байт аррэй и выполнять его как функцию. За пруфами в гугл.

sambist ★★
()
Ответ на: комментарий от anonymous

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

loz ★★★★★
()

Если я правильно тебя понял, ты говоришь о атрибуте :const, введённом в perl 5.22.

Введен обсуждаемый ранее новый атрибут ":const", который может быть применен к анонимным функциям, что приведёт к немедленному выполнению подпрограммы в месте её определения с последующей подстановкой сохранённого результата в моменты обращений к ней в коде. Атрибут имеет экспериментальный статус. Детали perlsub, секция «Constant Functions».

shell-script ★★★★★
()
Ответ на: комментарий от loz

Можем остановиться на сабже и не нырять в глубины своих психических расстройств.

anonymous
()

Любой язык, если его сначала прогнать через интерпретатор рнр.

PolarFox ★★★★★
()
Ответ на: комментарий от anonymous

Можно подумать это меньший изврат

Конечно, меньший, у m4 синтаксис непростой, да и с перлом сочетается фигово

annulen ★★★★★
()
Ответ на: комментарий от DRVTiny

Код выглядит не по-перловому, особенно рвет шаблон комментарий # include

annulen ★★★★★
()
Ответ на: комментарий от DRVTiny

Синтаксис из модуля Macro на первый взгляд кажется более перловым

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.