it-swarm.com.ru

Почему на llvm нет хорошей схемы/LISP?

Существует Схема Гамбита, Схема MIT, Схема PLT, Схема Цыпленка, Биглоо, Воровство, ...; тогда есть все гадости.

Тем не менее, нет (насколько мне известно) единой популярной схемы/LISP на LLVM, хотя LLVM предоставляет много приятных вещей, таких как:

  • проще генерировать код, чем x86
  • легко делать звонки C FFI ...

Так почему же на LLVM нет хорошей схемы/LISP?

38
anon

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

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

22
Pascal Cuoq

Здесь есть очень маленький и явно не оптимизированный компилятор Scheme:

http://www.ida.liu.se/~tobnu/scheme2llvm/

Принимая ваш вопрос буквально,

  • Писать компиляторы сложно.
  • Плохая реализация, подобная приведенной выше, может блокировать новые реализации. Люди, заходящие на страницу LLVM, видят, что Схема уже есть, и не пишут ее.
  • Есть ограниченное количество людей, которые пишут и используют Scheme (кстати, я один, а не ненавистник).
  • Существует много существующих интерпретаторов и компиляторов Scheme, и нет нужды кричать о необходимости нового.
  • Нет непосредственного и очевидного преимущества написания нового интерпретатора с использованием LLVM. Будет ли это быстрее, проще, гибче, лучше, чем другие десятки реализаций Scheme?
  • Проект LLVM пошел с другим языком (C), чтобы продемонстрировать свою технологию, и не видел необходимости внедрять множество других.

Я думаю, что кому-то может быть весело создавать компилятор Scheme на основе LLVM. Компиляторы Scheme в SICP и PAIP являются хорошими примерами.

12
Evan P.

Для CL: Clasp является реализацией Common LISP в LLVM, а mocl реализует подмножество Common LISP в LLVM. 

Для Схемы: есть Самостоятельная Схема-> Демонстрация LLVM и Прототип LLVM-бэкенда для Схемы Биглоо .

Для Clojure: есть Рейн , который является вдохновленным Clojure LISP.

8
Wilfred Hughes

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

7
Pillsy

Может быть, я совершенно не понимаю вопроса или контекста, но я считаю, что вы можете использовать ECL , который является Common LISP, который компилируется до C, и использовать Clang compiler для нацеливания на LLVM ( вместо GCC).

Я не уверен, какую (если есть) выгоду это даст вам, но это даст вам LISP, работающий на LLVM =].

6
andrew

CL-LLVM предоставляет общие привязки LISP для LLVM. Он использует подход FFI, а не пытается выводить сборку LLVM или битовый код напрямую.

Эта библиотека доступна через Quicklisp.

3
masukomi

mocl - компилятор для относительно статического подмножества Common LISP. Компилируется через LLVM/Clang.

3
Rainer Joswig

нет (насколько мне известно) ни одного популярная схема/LISP на LLVM

В настоящее время llvm-gcc является ближайшей к популярной реализации языка any в LLVM. В частности, существуют no зрелые языковые реализации на основе LLVM с сборкой мусора. Я уверен, что LLVM будет использоваться в качестве основы для множества захватывающих реализаций языка следующего поколения, но на это потребуется много времени и усилий, и в этом контексте для LLVM пока рано.

Мой собственный проект HLVM является одной из единственных реализаций на основе LLVM с сборкой мусора, и его GC поддерживает многоядерные процессы, но имеет слабую привязку: я использовал теневой стек для «неработающей среды», а не для взлома кода C++. в LLVM интегрировать реальную прогулку по стеку.

2
Jon Harrop

GHC экспериментирует с бэкендом схемы и получает действительно интересные предварительные результаты по сравнению со своим собственным компилятором кода. Конечно, это Haskell. Но недавно они внесли новые изменения в LLVM, упрощая хвостовые вызовы IIRC. Это может быть полезно для реализации некоторых схем.

0
Golias