Схема к C переводчику - PullRequest
       48

Схема к C переводчику

2 голосов
/ 31 января 2020

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

(define f
  (lambda(n)
     (if (= n 0) 1
         (* n (f (- n 1))))))

(display (f 10))
(newline)

Я попытался использовать gambit (gs c), и она генерирует файл C, который выглядит просто как файл для загрузки в некотором интерпретаторе, а не файл, содержащий функцию main, которая может быть выполнена.

Существует ли какое-либо приложение, генерирующее код C, который может быть выполнен непосредственно? Функции из стандартной библиотеки схем, такие как display, должны быть связаны с некоторым объектным файлом.

РЕДАКТИРОВАТЬ:

Моя цель - понять алгоритмы, используемые профессиональными переводчиками.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Есть много таких переводчиков, начиная с 1980-х годов, я думаю, CHICKEN является хорошим текущим.

Если вы хотите использовать это:

  1. get CHICKEN;
  2. собрать и установить его с соответствующим make заклинанием (для меня это было безболезненно на OSX, поэтому на Linux это должно быть очень безболезненно, хотя, возможно, это будет сложнее Windows);
  3. sta sh ваш код в файле, который я назову f.scm.
  4. , если вы хотите увидеть код C, скомпилируйте с chicken f.scm которая выдаст несколько сотен строк непонятного C;
  5. , если вам нужен только исполняемый файл, используйте csc для его создания.

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


Не зная, что вы ищете, это пахнет, как будто это может быть XY проблема . В частности:

  • если вам нужна система Scheme, которая позволит вам общаться с кодом, написанным на C, то вам, вероятно, нужна система с FFI, а не та, которая компилируется в C;
  • если вам нужна система Scheme, которая будет создавать собственные исполняемые файлы, то вам, вероятно, нужна система Scheme, которая будет создавать собственные исполняемые файлы, а не ту, которая компилируется в C.

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

Наконец, если вы хотите понять, как компиляторы Scheme предназначены для C работает (или как компиляторы Scheme нацелены на любой язык, включая ассемблер), тогда традиционный подход, вероятно, все еще работает лучше: найдите хорошо написанный, для которого доступен исходный код, и прочитайте и повозитесь с его исходным кодом.

2 голосов
/ 01 февраля 2020

По сути, никакой схемы для C переводчиков не будет делать то, что вы хотите. Они создают отвратительный код, который не предназначен для чтения, и полагаются на базовый компилятор C для выполнения большей части оптимизации. Курица и Гамбит используют заголовочные файлы, в то время как у меня есть Сталин, который не использует R4RS вместо R5RS и более поздних версий.

Вероятно, вам лучше почитать статью Абдулазиза Гулума Поэтапный подход к построению компилятора (PDF) или, возможно, статьи Мэтта Маитса о разборе, продолжении и компиляции. Дольше он фактически имеет схему до C и схему до Java с различными подходами к соглашениям о закрытии. В конце концов, ничто не сравнится с тем, чтобы делать это самостоятельно, так что имейте go!

...