Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
но с какого-то момента словосочетание «программа для ПК» стало обозначать «программу для x86».
Так что даже пользователи Mac OC могут почувствовать себя несколько дискриминированными когда их, в данном случае, игровую платформу называют Mac OC (или просто Mac), а Windows — PC.Такая уж сложилась традиция наименования.
Вот вам внеайтишный пример: «соединённые штаты» — это вид государственного устройства, и, например, официальное название Мексики c 1824 — Estados Unidos Mexicanos. Но так уж сложилось, что название «Estados Unidos» (без уточнений) применяется к одному конкретному государству. Чувствуют ли себя мексиканцы от этого дискриминированными?Без понятия. В Мексиканцах плохо разбираюсь.
Intel генерирует исключение при делении на ноль; в процессорах ARM — возвращает в качестве результата ноль
Дело в том, что стек – это область памяти, которую адресуют регистры процессора.Это не обязательно так; стек может частично (как в Itanium) или полностью (как в 80x87) быть внутри процессора.
Это не обязательно так; стек может частично (как в Itanium) или полностью (как в 80x87) быть внутри процессора.Тут получается «вилка»: либо мы не используем, грубо говоря, половину «регистров процессора» (= быстрой дорогой внутрипроцессорной памяти, отведённой под стек) только из-за того, что стек дотуда «не дорос», либо перед каждой операцией что-то подгружаем из ОЗУ и после каждой операции что-то выгружаем в ОЗУ. Первое расточительно и из-за этого медленно, второе просто медленно.
При традиционной архитектуре мы можем когда угодно использовать какие угодно регистры. При стековой — только те, до которых дорос стек, и то только на хранение, а на запись — только верхушку стека.
Про «скользящие» регистры — идея интересная, не помню, чтоб была реализована аппаратно, но, может быть, кем-то когда-то воплощено, просто малоизвестно.
Не знаю, как в FORTH, а в JVM, которая стековая, помимо стека есть ещё и так называемые локальные переменные (по сути — регистры)Локальные переменные используются меньше, чем стек, нерационально использовать под них более быструю память, чем под стек.
Не уверен, что правильно уловил суть высказывания.Идея была про чисто аппаратную реализацию «прозрачного» маппинга верхушки стека на регистры при том, что глубина стека может быть какой угодно большой и располагаться он может где угодно — в регистрах, в кэше или в ОЗУ, или распределён по всем этим трём областям памяти.
При стековой — только те, до которых дорос стек
Про «скользящие» регистры — идея интересная, не помню, чтоб была реализована аппаратно
Хотелось бы дополнить автора в вопросе, почему стек-ориентированные виртуальные машины проигрывают регистровым. Потому что они медленнее. Дело в том, что стек – это область памяти, которую адресуют регистры процессора. Чтение из стека или запись в него – это работа с памятью.
Я так понимаю, LLVM проектировался с целью достичь быстрой генерации машинного кода, а JVM — с целью упростить работу создателям компилятора.
The way we do this in LLVM is by representing the machine state as a structure with registers as field members. For example:
struct RegisterState {
uint32_t eax;
uint32_t ebx;
…
uint32_t esp;
};
So each translation routine is a function that produces a transformation on struct RegisterState. This is what xchg esp, eax would look like:
void doXchg_ESP_EAX(struct RegisterState *state) {
uint32_t tmp = state->eax;
state->eax = state->esp;
state->esp = tmp;
return;
}
We use LLVM as a language to express the effects of instruction on a machine state. We model the machine state as an object in LLVM. We do this for registers and memory. The model doesn’t have a special type of memory, which matches the x86 model where there is no distinction between global memory, heap memory, and stack memory in the address space.
Между тем, Есть языки, которые активно используют стек. Самый известный их представитель – это язык FORTH.Ну и где сейчас FORTH?
Но преобразование x86 -> LLVM IR -> x86 дало бы в некоторых случаях, как мне кажется, к немалому увеличению кода на выходе. Будет ли программа на FORTH после преобразования x86 -> LLVM IR -> x86 столь же лаконична, как ранее?Конечно, нет. А зачем?
Есть немало унаследованного 16-битного кода, который не работает на 64-битных машинах. Есть у меня одна такая программка: нужная, но исходников к ней нет. Если преобразовать её с помощью McSema в 32-битный код x86, то было бы здорово.
Ну и где сейчас FORTH?
Между тем, Есть языки, которые активно используют стек. Самый известный их представитель – это язык FORTH. В программах на FORTH очень часто пишут «PUSH» и «POP». Было бы интересно посмотреть реализацию FORTH на LLVM.
Полвека «универсальным машинным языкам» (1966—2016): прошлое, настоящее, будущее