Поддельные анонимные функции в C

Самый простой способ - использование обратных кавычек или qx():

my $value = qx(ls);
print $value;

Вывод аналогичен ls.

13
задан Community 23 May 2017 в 12:10
поделиться

3 ответа

См. ответ, который я только что отправил на этот вопрос. Вы можете использовать библиотеку callback (3) для создания новых функций во время выполнения. Он не соответствует стандартам, поскольку включает в себя множество уродливых хаков, связанных с конкретной платформой, но он работает на большом количестве систем.

Библиотека заботится о выделении памяти, обеспечении ее исполняемости и очистке кеша инструкций. при необходимости, чтобы гарантировать, что код, который генерируется динамически (т. е. закрытие), является исполняемым. По сути, он генерирует заглушки кода, которые на x86 могут выглядеть так:

  pop %ecx
  push $THUNK
  push %ecx
  jmp $function
THUNK:
  .long $parameter

, а затем возвращает адрес первой инструкции. Эта заглушка сохраняет адрес возврата в ECX (временный регистр в соглашении о вызовах x86), помещает дополнительный параметр в стек (указатель на преобразователь), а затем повторно отправляет адрес возврата. Затем происходит переход к самой функции. Это приводит к тому, что функцию вводят в заблуждение, заставляя думать, что у нее есть дополнительный параметр, который является скрытым контекстом закрытия.

На самом деле все сложнее (фактическая функция, вызываемая в конце заглушки, __ vacall_r , а не саму функцию, и __ vacall_r () обрабатывает дополнительные детали реализации), но это основной принцип.

6
ответ дан 2 December 2019 в 01:31
поделиться

I don't believe you can do that with C99 -- there's no partial application or closure facility available unless you start manually generating machine code at runtime.

Apple's recently proposed blocks would work, though you need compiler support for that. Here's a brief overview of blocks. I have no idea when/if any vendor outside apple will support them.

2
ответ дан 2 December 2019 в 01:31
поделиться

Невозможно сгенерировать обычные функции во время выполнения ни на C, ни на C ++. Предложение Брайана основано на большом «если»: «... если вы можете подделывать анонимные функции ...». И ответ на это «если»: нет, нельзя. (Хотя неясно, что он имел в виду под «фальшивкой».)

(В C ++ можно создавать функционально-подобные объекты во время выполнения, но не обычные функции.)

Вышесказанное относится к стандартному C и Языки C ++. Конкретные реализации могут поддерживать различные предоставляемые реализацией расширения и / или реализованные вручную хаки, такие как «замыкания», «делегаты» и тому подобное. Ничего из этого, конечно, не имеет ничего общего со стандартными языками C / C ++.

1
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: