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