vak: (Default)
[personal profile] vak
Я подрихтовал маленько компилятор LCC. Теперь он нормально собирается и не глючит. Попробуем приспособить для БЭСМ-6.

Исходники на Гитхабе: github.com/besm6/lcc/

Сам компилятор качественно описан в книжке:

Date: 2022-08-06 08:25 (UTC)
x86128: (Default)
From: [personal profile] x86128
Здорово!
А как принято решать в компиляторах Си проблему что типы данных не кратны байту?

Date: 2022-08-06 16:29 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Как проблему размеров типов данных, и прочие проблемы портирования Си на машину со словной архитектурой, адресными регистрами и пр. решили в своё время для CDC/Cyber, похоже, не сохранилось. Народ искал, но не нашёл.

У меня есть опасение, что у этого "retargetable" компилятора слишком много встроенных предвзятостей по отношению к таргет-архитектуре, чтобы процесс портирования был приятным.

Строго говоря, добавление к существующему Паскаль-компилятору понятия "указатель на packed char" сделает его равномощным Си-компилятору, а синтаксические различия можно будет устранять постепенно.

Упомяну, кстати о синтаксических различиях, почему в бэсмовском Паскале аналоги break и continue были сделаны с помощью "структурных меток". Дело в том, что в стиле break/continue потенциальная необходимость делать continue будет заставлять компилятор на всякий случай выравнивать начало каждого цикла на слово, что - для однопроходного компилятора без оптимизации на уровне кодогенератора - теряет в среднем полслова на цикл, а со структурными метками сразу видно, надо выравнивать или нет.

И таких мелочей, о которых lcc в принципе не заморачивается, наверное, многие десятки.

Date: 2022-08-10 17:50 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
У Сей своё собственное определение байта, чей размер согласно этому определению равен 1 (а если в битах, то CHAR_BIT бит). И всё всегда кратно. :)

На практике кратно должно быть тому, чем железка умеет манипулировать. Это может быть и 16 бит, и 17.

Но если очень хочется поддержать 8 бит, когда железка умеет манипулировать только 16 или 96 битами, тогда нужно генерировать дополнительный код для упаковки-распаковки данных (16=8*2 или 96=8*12), и Си позволяет делать указатели разного размера, в зависимости от типа, на который они указывают.

Т.е. указатель на октет будет толще, чем указатель на машинное слово, и в первом указателе будут храниться и указатель на всё машинное слово и некоторый селектор, говорящий, где в этом слове находится нас интересующий кусочек. Это как если бы на 8086 использовали обычные указатели (только смещение, без сегмента) на типы размера кратного машинному слову и дальние указатели (сегмент:смещение) на типы размеров меньше машинного слова.
Edited Date: 2022-08-10 17:52 (UTC)