Мне любопытно услышать мнение людей о том, как трудно было бы реализовать компилятор на ПЛИС.Это может быть просто компилятор backend , например, LLVM, а реализация будет просто принимать LLVM IR и выводить машинный код.
Цель этого - позволить - так сказать- выполнение в реальном времени исходного кода (или промежуточного кода представления) в том смысле, что вы:
- Сконфигурируете FPGA для компиляции для определенного языка (например, C)
- Подайте компилятору исходный код вашей программы
- Вывод (машинного кода) компилятора поступает непосредственно в ЦП и выполняется
Для данной системы:более или менее статической частью FPGA может быть серверная часть LLVM, т.е.часть, которая решает, какой тип машинного кода выводить, например, x86-64 с SSE4.Или ARM Thumb-2 с инструкциями NEON и VFP.Если у вас нет системы с несколькими процессорами, это не изменится.Это не должно быть полностью статичным, и, следовательно, не должно реализовываться аппаратно, потому что оптимизация компилятора выполняется постоянно, и время от времени его нужно будет обновлять.Более часто изменяемой частью FPGA будет интерфейсная часть, часть, которая производит IR LLVM из заданного языка: C, C ++, Vala и т. Д.
Изящная вещь в этой системе заключается в том, чтокод всегда оптимизирован для процессора в системе под рукой.В текущей ситуации лишь немногие сборки используют все дополнительные функциональные возможности процессоров: SSE, AVX, 3DNow !, Neon, VFP.Используя этот (полностью гипотетический) подход, можно использовать весь потенциал процессоров, компилируя для конкретной архитектуры в режиме реального времени и выполняя полученные инструкции сразу после этого.Это было бы особенно полезно в системах на основе ARM, где нам нужен весь сок, который мы можем выжать из процессоров, а сам процессор очень медленно выполняет компиляцию.
Я знаю, что можно настроить gccиспользовать потоки, и я бы предположил, что распараллеливание компилятора было бы относительно легко.Т.е., просто компилируя все исходные файлы параллельно.
Мы также могли бы отказаться от внешнего интерфейса - специфичной для языка программирования части компилятора - и просто распространять программы в виде промежуточного кода представления, такого как LLVM IR.
Возможно ли это как-нибудь?