2015-04-03 2 views
4

Я должен упомянуть, что я генерирую код в C, а не вручную. Я говорю это, потому что это не имеет большого значения, если за ним много кода, потому что компилятор должен все это обойти. Во всяком случае, как бы я пошел вокруг эмуляции лямбды в C? Я думал, что могу просто сгенерировать функцию с каким-то случайным именем где-то в исходном коде, а потом позвонить? Я не слишком уверен. Я пока еще ничего не пробовал, так как хотел довести эту идею до ее реализации.Эмуляция lambdas в C?

Есть ли какая-то препроцессорная директива, которую я могу сделать, или какой-то макрос, который сделает этот чист? Я был вдохновлен Джоном Билом, чтобы попробовать разработку компилятора, и он, казалось, использовал Лямбдаса на своем языке Джаи. Однако, я думаю, он делает что-то там, где он генерирует байт-код, а затем в C? Я не уверен.

Редактировать: Я работаю над компилятором, компилятор - это просто мой проект, чтобы держать меня занятым, а также хотел узнать больше о компиляторах. Я в основном использую clang, я на Ubuntu 14.10. У меня нет коллекции мусора, но я хотел попробовать свои силы в какой-то умной модели памяти с указателем-у/ржавцем/ARC для сбора мусора, т. Е. Мало накладных расходов. Я выбрал C, потому что я хотел больше в него погладить. Мой проект - бесплатное программное обеспечение, просто проект для хобби.

+0

В каком контексте вы генерируете код C? С какой операционной системой и компилятором? Почему C и не что-то лучше (Common Lisp или Ocaml)? Вы внедряете какой-то компилятор? У вас есть сборщик мусора? Измените свой вопрос, чтобы улучшить его. –

+0

Что такое проект, каков его URL? –

+0

Слишком плохо, что на вашем языке нет GC или закрытий. –

ответ

8

Существует несколько способов сделать это («наличие» лямбда в C). Важно понять, что lambdas дают closures и что замыкатели смешивают «код» с «данными» (закрытые значения); обратите внимание, что объекты также смешивают «код» с «данными», и есть сходство между объектами и замыканиями. См. Также this answer на Programmers.

Традиционно, в C, вы не только используете указатели функций, но и используете соглашение относительно callbacks. Это, например, имеет место с GTK: каждый раз, когда вы передаете указатель на функцию, вы также передаете с ней некоторые данные. Вы можете просмотреть обратные вызовы (соглашение с указанием указателя функции C с некоторыми данными void*) в качестве способа реализации замыканий.

Поскольку вы создаете код C (это мудрая идея, я делаю аналогичные вещи в MELT, который в Linux генерирует код C++ во время выполнения, компилирует его в общий объект и dlopen -s) принять соглашение об обратном вызове и передать некоторые закрытые значения для каждой функции, которую вы создаете.

Вы также можете рассматривать закрытые значения как переменные static, но этот подход, как правило, неразумный.

В прошлом была некоторая некоторая lambda.h библиотека заголовков, которая генерирует код trampoline, предназначенный для блокировки (по существу генерирующий код, который выталкивает некоторые закрытые значения в качестве аргументов, а затем вызывает некоторую процедуру). Вы можете использовать некоторые методы JIT compilation (используя libjit, GNU lightning, LLVM, asmjit, ....), чтобы сделать то же самое. См. Также libffi для звонка произвольно функция (подписи, известной по адресу времени выполнения).

Обратите внимание, что существует сильная бут indirect- соотношение между затворами и garbage collection (читать GC handbook для более), и это не случайно, что каждый functional language имеет GC. C++ 11 лямбда-функции являются исключением из этого (и трудно понять все сложности управления памятью на закрытиях C++ 11).Поэтому, если вы генерируете код C, вы можете и, вероятно, должны использовать Boehm's conservative garbage collector (который обертывает dlopen), и у вас будут закрытые значения GC-ed. (Вы могли бы использовать некоторые другие библиотеки GC, например, Ravenbrook's MPS или мой unmaintained Qish ...) Тогда вы могли бы иметь соглашение, согласно которому каждая сгенерированная функция C принимает свое закрытие в качестве первого аргумента.

Я хотел бы предложить, чтобы прочитать Scott's book on Programming Language Pragmatics и (предполагая, что вы знаете, чуть-чуть Scheme или Lisp, если вы не вы должны узнать немного Scheme и читать SICP) Queinnec's book Lisp In Small Pieces (если вам случится читать по-французски, читать последний французский variant).

+0

Отлично, спасибо! :) –

+0

@ user3839220: Однако, пожалуйста, отредактируйте свой вопрос, чтобы улучшить его. Мне очень интересно, что вы делаете, почему вы спрашиваете, и как вы создаете код C? Является ли ваше проект бесплатным программным обеспечением? –

+0

Уверенная вещь, отредактированная для ya :) –

Смежные вопросы