Целевой компилятор для произвольной архитектуры

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

Мне интересно, есть ли компиляторы, которые могут нацеливаться на архитектуру, указав такие функции, как доступные регистры и набор инструкций процессора (то есть, как каждая инструкция изменяет состояние процессора) и макет памяти в архитектуре.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
315
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Некоторое время назад я слушал подкаст, в котором говорилось о виртуальной машине 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

Другие вопросы по теме