Существуют ли компиляторы для языков высокого уровня (например, C), которые могут быть нацелены на различные архитектуры, указав аппаратные ресурсы целевого устройства?
Мне интересно, есть ли компиляторы, которые могут нацеливаться на архитектуру, указав такие функции, как доступные регистры и набор инструкций процессора (то есть, как каждая инструкция изменяет состояние процессора) и макет памяти в архитектуре.
Я знаю, что компиляторы, такие как gcc, могут быть нацелены на несколько архитектур, но я хотел бы знать, есть ли компиляторы, которые могут компилироваться для новых архитектур, заменяя, скажем, файлы конфигурации, чтобы ориентироваться на новую архитектуру.





Некоторое время назад я слушал подкаст, в котором говорилось о виртуальной машине Java, написанной (в основном) на Java, которая нацелена на несколько разных платформ с каким-то файлом определения платформы. Я считать, я слушал Java Posse, а я считать, возможно, это был Виртуальная машина Maxine Research.
AFAIK, gcc действительно работает именно так. проверьте «Описание машин» в документации gcc. Конечно, создание этих файлов .md представляет собой серьезную задачу в программировании.
Основная проблема заключается в том, что характеристики разных процессоров не особенно одинаковы. Посмотрите на объединение на IA64, двойные наборы инструкций на ARM / Thumb, окна регистров на SPARC, регистр счетчика на PPC. Даже функции, которые могут быть на разных архитектурах (например, предикация на ARM и Itanium), могут быть настолько разными, что вы не будете делиться реализацией. Все это очень уникальные функции, которые вам нужно понять, чтобы написать хороший компилятор, это не просто разные конфигурации, выбранные разработчиками. Учитывая тот факт, что они, как правило, уникальны для данного процессора, любой переключатель, который у вас будет в компиляторе, чтобы включить их, будет фактически конкретным кодом в компиляторе для поддержки этого процессора, скрывающим его за некоторыми параметрами конфигурации, чтобы вы могли его включить. это просто запутывание этого.
При этом существует ряд общих функций, с которыми приходится иметь дело множеству процессоров. Таким образом, вы обнаружите, что большинство современных компиляторов определяют такие вещи, как кодирование инструкций, файлы регистров (и псевдонимы) и различные другие лакомые кусочки в файлах конфигурации, которые они затем используют для генерации части исходного кода компилятора, которая интегрируется с написанными вручную битами.
Если посмотреть на бэкенд LLVM X86, значительную часть (~ 30%) составляют файлы .td (определение цели).
Phoenix:X86 louis$ ls -al | grep cpp
-rw-r--r-- 1 louis louis 27627 Nov 1 03:32 X86CodeEmitter.cpp
-rw-r--r-- 1 louis louis 661 Oct 29 18:56 X86ELFWriterInfo.cpp
-rw-r--r-- 1 louis louis 46558 Oct 29 18:56 X86FastISel.cpp
-rw-r--r-- 1 louis louis 43660 Oct 29 18:56 X86FloatingPoint.cpp
-rw-r--r-- 1 louis louis 59915 Oct 29 18:56 X86ISelDAGToDAG.cpp
-rw-r--r-- 1 louis louis 312709 Nov 1 03:32 X86ISelLowering.cpp
-rw-r--r-- 1 louis louis 109229 Oct 29 18:56 X86InstrInfo.cpp
-rw-r--r-- 1 louis louis 17396 Oct 29 18:56 X86JITInfo.cpp
-rw-r--r-- 1 louis louis 44111 Nov 1 03:32 X86RegisterInfo.cpp
-rw-r--r-- 1 louis louis 10369 Oct 29 18:56 X86Subtarget.cpp
-rw-r--r-- 1 louis louis 15265 Oct 29 18:56 X86TargetAsmInfo.cpp
-rw-r--r-- 1 louis louis 9365 Oct 29 18:56 X86TargetMachine.cpp
Phoenix:X86 louis$ ls -al | grep td
-rw-r--r-- 1 louis louis 6870 Oct 29 18:56 X86.td
-rw-r--r-- 1 louis louis 13480 Oct 29 18:56 X86CallingConv.td
-rw-r--r-- 1 louis louis 77361 Nov 1 03:32 X86Instr64bit.td
-rw-r--r-- 1 louis louis 31517 Oct 29 18:56 X86InstrFPStack.td
-rw-r--r-- 1 louis louis 11690 Oct 29 18:56 X86InstrFormats.td
-rw-r--r-- 1 louis louis 156188 Oct 29 18:56 X86InstrInfo.td
-rw-r--r-- 1 louis louis 32971 Oct 29 18:56 X86InstrMMX.td
-rw-r--r-- 1 louis louis 183502 Oct 29 18:56 X86InstrSSE.td
-rw-r--r-- 1 louis louis 23653 Nov 1 03:32 X86RegisterInfo.td