Ассемблер - это все очень хорошо…
Предлагаю вам перевод цикла The EightThirtyTwo ISA Part 5: Assembly language is all very well… автора Alastair M. Robinson.
Прежде чем продолжить работу с дизайном EightThirtyTwo, я хотел бы иметь какой-то способ генерации кода для него с языка более высокого уровня, просто чтобы лучше понять, какие инструкции полезны для компиляторов, какие будут редко неиспользуемы и где я могу найти какие-либо пробелы, которые делают сгенерированный код излишне неуклюжим. Самый очевидный путь к этой цели-найти компилятор языка Си, который можно легко перенастроить на новую архитектуру. (Любой, кто пытался сделать это раньше, вероятно, сейчас смеется над моим употреблением слова "легко"!)
Мои предубеждения при старте заключались в том, что у меня есть два варианта: GCC и LLVM (это оказалось очень далеко от истины) – и что с последним будет легче работать. Находясь в идеальном мире у меня была бы поддержка GCC, я знаю, работая с toolchain ZPU, что это быстрый путь к цели, и если поддержка архитектуры не обновляется, она, как правило, страдает от медленной деградации становится трудной для построения с развитием экосистемы. Так что на данный момент я не учитываю GCC.
Я еще не изучал LLVM вообще, но это вполне может оказаться долгосрочным решением. Однако сейчас мне хотелось чего-нибудь попроще. Оказывается, на самом деле существует целый ряд других компиляторов языка Си – некоторые из них я никогда не слышал, некоторые из них я знаю давно, и вполне возможно, многие я еще не нашел. Я искренне удивлен тем, как много вариантов существует!
- PCC – Portable C Compiler. (Лицензия BSD). Это восходит к тому времени, когда я еще не родился, и все еще находится в стадии активного развития. Он специально разработан для перенацеливания на разные архитектуры, но я еще не понял, как найти правильные –target параметры –для mips и m68k все, что угодно, кроме <arch> – netbsdelf, похоже, выдает ошибку. На этом этапе любые пробуксовки заставляют меня перейти к рассмотрению следующего варианта, но к нему я вполне могу вернуться.
- TCC – the Tiny C Compiler. (GNU LGPL). Очень маленький, легкий и быстрый компилятор – в основном нацелен на x86, но имеет другие бэкэнды, и теоретически должен делать то, что мне нужно, но интерфейс бэкэнда выглядит так, как будто он имеет крутую кривую обучения.
- SDCC – The Small Device C Compiler. Ориентирован на 8-битные процессоры и микроконтроллеры, но может быть применим и здесь. Однако документация кажется неполной.
- TACK – The Amsterdam Compiler Kit. Еще один компилятор с бэкэндами для нескольких архитектур. Этот компилятор изначально был коммерческим продуктом, частью MINIX, а затем открытым исходным кодом. В текущем сопровождении написано, что “очень легко портировать на новую архитектуру… но сгенерированный код ужасен.” ... так что, возможно, на данный момент это не лучший вариант, однако причина такой оценки заключается в том, что он не очень хорошо использует многочисленные регистры, которых у нас нет, так что его все равно стоит изучить.
- 8CC – лицензированный MIT проект одного человека для создания компилятора, совместимого с C11. В настоящее время нацелен только на x86-64, но, несомненно, может быть использован в качестве отправной точки для переноса на другие архитектуры.
- DICE – Dillon’s Integrated C Environment (собственная лицензия – может использоваться для создания коммерческого кода, но сам компилятор, его исходные и производные работы не могут быть проданы.) Это компилятор, который я помню со времен Amiga и снова использовал, когда участвовал в проекте Minimig. Предназначен только для m68k, но может быть использован в качестве отправной точки для новой архитектуры, если генератор кода будет заменен.
- LCC – the Little C Compiler. (Необычная лицензия, бесплатная для личного использования). Опять же, написанный специально с учетом нескольких архитектур и предмет книги Фрейзера и Хансона "Переназначаемый компилятор C: дизайн и реализация". Однако генератор кода текущей версии отличается от описанного в книге – и я обесценил его после того, как (а) прочитал комментарии в Интернете о качестве его генерации кода и (б) наткнулся на попытку Дэвида Гивена создать бэкэнд Z-машины – он говорит: “Интерфейс бэкэнд lcc довольно глуп и документирован лишь частично, поэтому я так ничего и не закончил”. Он действительно что-то закончил, но для другого компилятора. Исходя из этого, для моих первоначальных экспериментов я выбрал:
- VBCC – Volker Barthelmann’s C Compiler. (Необычная лицензия, бесплатная для личного использования, разрешение требуется для коммерческого использования. Исходник может быть распространен, но только в неизмененном виде.) В своем блоге о создании бэкенда Z-machine, Дэвид говорит, что vbcc “...действительно опрятен, кстати; у него отличная глобальная оптимизация, простой для понимания интерфейс, он маленький и невероятно быстрый”.
В прошлом я использовал VBCC, так как это широко используемый и популярный компилятор для запуска на Amiga, но ранее я не изучал его возможности генерации кода. Начать работу невероятно легко – нет необходимости редактировать Makefiles или заголовки – просто скопируйте существующий бэкэнд, введите make TARGET=<newtarget>, и у вас будет новый компилятор. Существует даже “универсальный risc” бэкэнд, который служит идеальной отправной точкой. Документация тоже хорошая.
[На данный момент я также должен почетно упомянуть ArchC – если позволит время, я обязательно изучу его позже. По-видимому, это основа для исследований ISA с инструментами, которые автоматически создают симуляторы, ассемблеры на основе binutils и компиляторы на основе clang для моделей процессоров. Очень интересный материал, который стоит исследовать, но слишком глубокая кроличья нора для настоящего времени.]
Адрес для контактов : imax9@narod.ru
Если вам понравились мои работы и вы желаете поддержать сайт - сделайте дотацию.
При копировании статьи – обязательна ссылка на авторство и источник. Без разрешения автора копирование запрещено.
© Максим Ильин 2022г.