Флуд - были Ваши рассуждения - что компилятор С++ лучше, когда компилятора нет.
Читайте внимательнее - речь изначально шла о том, что стандарт C++ включает в себя синтаксически улучшенный вариант языка C, поэтому некоторым (включая меня) удобнее писать C-программы на этом "правильном C". Т.е. речь не про то, что у C++ компилятор лучше, а про то, что синтаксис удобнее. Что же до генерации кода, то по определению - для любого алгоритма существует единственное оптимальное отображение в процессорный код, поэтому чем ближе результат компиляции некого конкретного алгоритма любым компилятором с любого языка к такому оптимальному процессорному коду - тем лучше компилятор. От компилируемого языка это зависит лишь в той степени, насколько просто реализовать для этого конкретного языка оптимальную компиляцию.
Моя практика реальной разработки компилятора для С-подмножества C++ однозначно говорит за то, что для C-подмножества C++ это ничуть не сложнее, чем для ванильного C.
Об том и речь. Нет разницы, какой вариант C компилируется, "ванильный" или "правильный" - архитектура LLVM настолько заточена под современные реалии, что сделать на базе LLVM нормальный кросс-компилятор для PDP-11 весьма непросто.
Для примера. Самый простенький и невинный (по затратам на преодоление) затык с LLVM возникает из-за того, что весь движок LLVM построен в априорном предположении, будто индексная адресация выгоднее автоинкрементной.
Чтобы заставить LLVM использовать автоинкрементную адресацию в нулевом базовом блоке - нужно изменить относительно немного кода компилятора и результат компиляции такой:
Код:extern "C" void post_5ac( int x, int *pi16 )
{
*pi16++ = x;
*pi16++ = x;
*pi16++ = x;
}
Код:.globl post_5ac ; -- Begin function post_5ac
post_5ac: ; @post_5ac
; BB#0: ; %entry
Mov R0, (R1)+
Mov R0, (R1)+
Mov R0, (R1)
Return
; -- End function
Но чтобы заставить LLVM использовать автоинкрементную адресацию в нескольких базовых блоках подряд - нужно полностью переделать весьма большой кусок компилятора, на что у меня пока запала нет. А без этого результат плачевен:
Код:extern "C" int post_6a( int x, int *pi16 )
{
x |= *pi16++;
x |= *pi16++;
x |= *pi16++;
if( !x )
{
x += *pi16++;
x += *pi16++;
x += *pi16++;
}
else
{
x -= *pi16++;
x -= *pi16++;
x -= *pi16++;
}
return x;
}
Код:.globl post_6a ; -- Begin function post_6a
post_6a: ; @post_6a
; BB#0: ; %entry
Mov R1, R2
BiS (R2)+, R0
BiS (R2)+, R0
BiS (R2)+, R0
Tst R0
BEq .LBB0_2
; BB#1: ; %if.else
SUB (R2), R0
SUB 8(R1), R0
SUB 10(R1), R0
Br .LBB0_3
.LBB0_2: ; %if.then
ADD (R2), R0
ADD 8(R1), R0
ADD 10(R1), R0
.LBB0_3: ; %if.end
Return
; -- End function
Напомнило первоапрельскую шутку. :)
А зачем эмулировать если можно сделать реплику ?
например : эмулятор можно заставить работать на очень большой скорости, но по правилам оригинала (натива), т.о. компилятор macro-11 (запущенный на эмуляторе) собирает исполняемые файлы в нативной среде за пару секунд, а реплика? Будет работать 1 в 1 с оригиналом? Это можно и от хорошего эмулятора получить.