У меня возникли проблемы с пониманием того, как Haskell (GHC) компилирует программы и как эти программы запускаются.
- GHC - это канонический пример нетривиальной программы, написанной в Haskell. Однако части GHC, похоже, не записываются в Haskell, а именно среда выполнения (в C/C -). Почему это? Почему? (Я знаю этот сайт и его друзей, но не может их сильно понять.)
- Говоря о среде выполнения: зачем нужен компилируемый язык? Должна ли компилированная программа быть машинным кодом и ничем другим? Из того, что я понимаю, среда выполнения несколько похожа на виртуальную машину или интерпретатор байт-кода, который имеет дело с какой-то формой мета-кода и делает фактические расчеты на основе этого. Итак: что делает время выполнения GHC точно и почему это необходимо в первую очередь?
- Что касается FFI: как обрабатываются вызовы C? Первоначально я думал, что использование FFI генерирует один исполняемый файл, где Haskell и C скомпилируются вместе. Тем не менее, я несколько раз читаю, что программы GHC делают вызов из программы функции C. Это особенно важно для понимания проблемы, с которой FFI имеет параллельное программирование. Итак: как функции FFI отличаются от обычных функций Haskell?