Haskell - управляемый язык?

Я полный новичок в Haskell. Одна вещь, которая всегда меня пугает, - это двусмысленность в том, является ли Haskell управляемым (термин, заимствованный из MS) языком, например Java, или скомпилированным кодом, например C?

На странице GHC говорится, что "GHC компилирует код Haskell либо непосредственно на собственный код, либо используя LLVM в качестве исходного кода".

В случае "скомпилированного для собственного кода", как можно использовать такие функции, как сбор мусора, без чего-то вроде JVM?

/Update/

Большое спасибо за ваш ответ. Концептуально, можете ли вы, пожалуйста, указать, какое из моих следующих понятий сбора мусора в Haskell является правильным:

GHC компилирует код Haskell в собственный код. При обработке компиляции в исходный программный код будут добавлены подпрограммы сбора мусора?

ИЛИ

Есть программа, которая работает вдоль программы Haskell для выполнения сбора мусора?

Ответ 1

Насколько мне известно, термин "управляемый язык" конкретно означает язык, который предназначен для .NET/Common Language Runtime. Итак, нет, Haskell не является управляемым языком, и ни одна из них не является Java.

Относительно того, что Haskell скомпилировано: Как говорится в цитированной вами документации, GHC компилирует Haskell в собственный код. Это можно сделать либо с помощью прямого испускания собственного кода, либо с помощью первого кода LLVM, а затем с помощью LLVM скомпилировать его с помощью собственного кода. В любом случае конечным результатом запуска GHC является собственный исполняемый файл.

Помимо GHC существуют также другие реализации Haskell - в первую очередь Hugs, который является чистым интерпретатором, который никогда не создает исполняемый файл (native или иначе).

как можно использовать такие функции, как сбор мусора, без чего-то вроде JVM?

Точно так же, как это возможно с JVM: каждый раз, когда выделяется память, он регистрируется сборщиком мусора. Затем время от времени сборщик мусора запускается, следуя шагам данного алгоритма сбора мусора. Скомпилированный код GHC использует коллекцию мусора для генерации.


В ответ на ваше редактирование:

GHC компилирует код Haskell в собственный код. При обработке компиляции в исходный программный код будут добавлены подпрограммы сбора мусора?

В принципе. За исключением того, что высказывание "подпрограммы сбора мусора будет добавлено к исходному программному коду", может нарисовать неправильную картинку. Процедуры GC являются частью библиотеки, с которой связана каждая программа Haskell. Скомпилированный код просто содержит вызовы этих подпрограмм в соответствующих местах.

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

Просто посмотрите на любую библиотеку GC для C и как она будет использоваться: все, что вам нужно сделать, - это включить # заголовок библиотеки и ссылку на библиотеку, а также заменить каждое появление malloc функцией распределения библиотеки GC (и удалить все звонки на free) и bam, ваш код - сбор мусора.

Есть программа, которая работает рядом с программой Haskell для выполнения сбора мусора?

Нет.

Ответ 2

используется ли Haskell для управления (термин, заимствованный из MS), например Java

GHC-скомпилированные программы включают сборщик мусора. (Насколько я знаю, все реализации Haskell включают сбор мусора, но это не является частью спецификации.)

или код с компилятором, например C?

GHC-скомпилированные программы скомпилированы в собственный код. Hugs интерпретирует программы и не компилирует собственный код. Существует несколько других реализаций, которые, насколько мне известно, составляют собственный код, но я перечисляю их отдельно, потому что я не уверен в этом.

В случае "скомпилированного для собственного кода", как можно использовать такие функции, как сбор мусора, без чего-то вроде JVM?

GHC-скомпилированные программы включают в себя систему времени выполнения, которая предоставляет некоторые базовые возможности, такие как M-to-N green threading, сбор мусора и менеджер ввода-вывода. В некотором смысле это немного напоминает "нечто вроде JVM" в том, что оно предоставляет многие из тех же функций, но оно очень отличается в реализации: нет общего байт-кода для всех архитектур (и, следовательно, нет "виртуальной машины" ).

какое одно из моих следующих понятий сбора мусора в Haskell правильное:

  • GHC компилирует код Haskell в собственный код. При обработке компиляции в исходный программный код будут добавлены подпрограммы сбора мусора?
  • Есть программа, которая работает рядом с программой Haskell для выполнения сбора мусора?

Случай 1 верен: во время компиляции код программной среды добавляется к программному коду.

Ответ 3

"Управляемый язык" - это перегруженный термин, поэтому здесь приведены ответы на одно слово, а затем некоторые детали для обычных разных значений, которые приходят (моему) разуму:

Управляемый как в целевой среде CLR

Нет, Haskell не компилируется в Microsoft CLI IL.
Ну, я читал, что есть некоторые решения, которые могут это сделать, но imo, не.. CLR не построен для FP и будет серьезно лишен оптимизаций, вероятно, приведя к изучению языковой производительности. Если бы я лично действительно хотел бы настроить таргетинг на CLR, я бы использовал F # - это не функциональный язык, но он близок.

N.B. Это наиболее точное и актуальное значение для термина "управляемый язык". Следующие значения, ну, неправильно, но, тем не менее, и, к сожалению, общие.

Управляемый как в автоматическом сборе мусора

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

Он также обеспечит применение примеси и модели памяти.

Управляемый как в скомпилированном байт-коде, который запускается VM

Нет (обычно).
Это зависит от вашего сервера: Сегодня у нас не так много компиляторов Haskell, некоторые компиляторы имеют разные backend - есть даже бэкенды для JavaScript!

Итак, если вы хотите настроить таргетинг на виртуальную машину, вы можете использовать существующий/сделать для нее бэкэнд. Но Хаскелл этого не требует. Так что, как вы можете скомпилировать исходный двоичный файл raw-metal, вы можете скомпилировать что-нибудь еще.

В отличие от языков CLR, таких как С# 1 VB.NET, и в отличие от Java и т.д. вам не нужно настраивать JVM, CLR, Mono и т.д. как Haskell не требует виртуальной машины вообще.

GHC - хороший пример. Когда вы компилируете в GHC, он не компилирует вас прямо в двоичный файл, он компилируется на промежуточный язык под названием Core, а затем несколько раз оптимизируется с Core на Core, прежде чем он перейдет к другому языку STG, и только затем переходит к коду (он может остановиться там, если вы сообщите об этом). 2 И в эти дни вы также можете использовать его для компиляции в байт-код LLVM (который подлежит некоторым потрясающим оптимизации). Благодаря серверу LLVM GHC может создавать более быстрые дикие. Для получения дополнительной информации об этом и о серверах GHC, перейдите здесь.

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

The GHC compilation pipeline

Посмотрите на вилку внизу для трех разных целей? это бэкенды, о которых я говорил.


1 Будущее исключение и забавный факт: Microsoft в настоящее время работает над собственным .NET! хитро названное: Microsoft.NET Native.

Ответ 4

Что для вас является определяющей чертой "управляемого языка"? Фраза "GHC компилирует код Haskell либо непосредственно на собственный код, либо использует LLVM в качестве back-end", который вы цитируете, совершенно ясно о том, что делает GHC, поэтому я подозреваю, что "двусмысленность", которая вас беспокоит, скорее относится к термину "управляемый язык" ", чем в документах GHC.

В случае "скомпилированного для собственного кода", как можно использовать такие функции, как сбор мусора, без чего-то вроде JVM?

Как вы думаете, что "что-то вроде JVM" реализует такие функции, как сбор мусора? JVM не волшебство, это просто программа, как и все остальное. На каком-то уровне вам нужно иметь собственный код для того, чтобы процессор мог его выполнить, поэтому в собственном коде могут быть доступны как сборка мусора .

Ответ 5

Для того, где вы сейчас находитесь, лучше всего подумать (GHC) Haskell как "управляемый", но что платформа GHC компилируется в не нацелена ни на что другое. Конечно, больше к нему чем это, но это достаточное объяснение вместо опыта Хаскелла.