Последний раз редактировалось shurik-ua; 24.08.2018 в 20:02.
Читайте внимательнее - речь изначально шла о том, что стандарт 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
Последний раз редактировалось Patron; 24.08.2018 в 21:06.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Oleg N. Cher (20.01.2024)
Напомнило первоапрельскую шутку.
А зачем эмулировать если можно сделать реплику ?
например : эмулятор можно заставить работать на очень большой скорости, но по правилам оригинала (натива), т.о. компилятор macro-11 (запущенный на эмуляторе) собирает исполняемые файлы в нативной среде за пару секунд, а реплика? Будет работать 1 в 1 с оригиналом? Это можно и от хорошего эмулятора получить.
Последний раз редактировалось hobot; 27.08.2018 в 22:39.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)