Ответы пользователя по тегу Трансляторы
  • Как эмуляторы транслируют клиентский код в машинный?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Когда эмулятор собирает и компилирует код jit, то как он этот код в машинных инструкциях составляет.

    Если ты посмотришь на QEMU, то у него есть фронт-енды (https://github.com/qemu/qemu/tree/v8.1.0/target), каждый из которых транслирует инструкции эмулируемой машины в промежуточный код. И есть бэк-енды (https://github.com/qemu/qemu/tree/v8.1.0/tcg), каждый из которых транслирует инструкции промежуточного кода в инструкции хостовой машины. Каждая гостевая инструкция может превратиться во множество промежуточных, а каждая промежуточная -- во множество хостовых. У разработчиков есть правило, что если на гостевую инструкцию требуется больше 20 промежуточных, то вместо прямой трансляции такая инструкция реализуется как вызов функции на C. Инструкции транслируются базовыми блоками, с заданного адреса и до достижения одного из следующих условий: 1) встречена инструкция выполняющая переход (условный или безусловный, вызов функции, возврат из функции, сюда же относятся инструкции гарантированно вызывающие исключение), или 2) PC переходит через границу страницы виртуальной памяти, или 3) количество инструкций в базовом блоке превышает заданный предел. Вдобавок с каждым оттранслированным базовым блоком ассоциируется дополнительный набор флагов, определяемый фронт-ендом, который кодирует состояние, в котором была машина при трансляции этого кода. Это позволяет иметь несколько вариантов трансляции для кода начинающегося с одного и того же адреса, например для разных уровней привилегий. Оттранслированные базовые блоки помещаются в кеш с функцией поиска по комбинации адреса и дополнительного набора флагов. В цикле выполнения эмулятор ищет транслированный базовый блок кода в кеше (а если не находит его, то транслирует и помещает в кеш), запускает его и получает контроль после завершения его выполнения.

    надо к примеру Перед выполнением каждой инструкции проверять наличие прерывания

    Вовсе не каждой, даже в 100% точной эмуляции нужно проверять IRQ только когда прерывания разрешены. QEMU обычно проверяет запрос на прерывание только перед входом в оттранслированный базовый блок.

    Или же есть несколько блоков, где линейно выполняется весь блок, а последняя инструкция прыгнет в другой блок.

    Да, QEMU выполняет трансляцию базовыми блоками.

    к примеру для вот такого примера графа, сколько базовых блоков можно построить?

    В этом графе не обозначены безусловные переходы, если их нет, то QEMU мог бы выделить такие базовые блоки: 0-1-2-3, 4-5-6, 7-8-1-2-3, 9-10, 11-12-13, 14-15-16-2-3, 17, всего 7 блоков.
    Если безусловные переходы -- это все переходы от узлов с бОльшими номерами к узлам с меньшими, то картина была бы такой: 0-1-2-3, 4-5-6, 7-8, 1-2-3, 9-10, 11-12-13, 14-15-16, 2-3, 17. Да, фрагмент 2-3 оттранслирован три раза: сам по себе и в составе других блоков.
    Ответ написан
    2 комментария
  • Что такое грамматики в оптимизирующих компиляторах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Грамматика -- формальное описание языка с которого производится компиляция. Читать можно начать отсюда.

    Какие преимущества разработчикам могут обеспечить грамматики?

    Грамматику можно преобразовать в парсер задаваемого ею языка. Классический пример программы выполняющей такое преобразование -- yacc.
    Ответ написан
    2 комментария
  • Как скомпилировать СИ проект под armv5 процессор?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    "Проект" и armv5 -- это очень расплывчатая формулировка.

    Для начала нужно понять, что проект ожидает от компилятора. А именно: нужно ли проект собирать под какую-либо ОС, а если нет, то нужна ли ему библиотека С и стартовые файлы. После этого можно будет искать правильный компилятор.
    Так, например, если на устройстве будет Linux, или если проект содержит в себе всё (как, например, U-Boot или ядро Linux) и ему нужен голый компилятор, то можно взять готовый кросс-компилятор. Например на debian это можно сделать командой apt-get install gcc-arm-linux-gnueabi.

    Дальше всё зависит от системы сборки проекта. Надо будет указать ей каким компилятором пользоваться и передать компилятору опцию, заставляющую его генерировать код для ARMv5. Так, например, если там autoconf, конфигурировать его со следующими опциями:
    --host=arm-linux-gnueabi CC='arm-linux-gnueabi-gcc -march=armv5' LD='arm-linux-gnueabi-gcc -march=armv5'

    Если это Linux или U-Boot, передать им в окружении CROSS_COMPILE=arm-linux-gnueabi- и сконфигурировать для armv5 через menuconfig.
    Ответ написан
    Комментировать
  • Какие оптимизации используются в языках С и С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Мне не нужен полный список низкоуровневых оптимизаций, таких как размещение переменных в регистры, а нужны такие, как вычисление константных выражений или раскрытие простых методов (get/set). Какие оптимизации в C и C++ различаются? В частности, рассматриваю gcc.

    gcc -Q --help=optimizers выведет список всех включенных в настоящий момент (другими опциями командной строки) оптимизаций. Что каждый из -f* ключей означает можно посмотреть тут: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Option...
    Ответ написан
    1 комментарий
  • Как в yacc описать WHILE?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чём заключается ваш вопрос?
    Если в "не могу понять - как тут описать цикл", то в этом месте вам нужно создать узел AST (или какое у вас внутреннее представление структуры программы), описывающий цикл, ссылающийся на тело цикла (line, $2) и условие окончания (condition, $4).
    Ответ написан
    Комментировать
  • Можете подсказать какую нибудь книгу про bison+flex на русском?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    https://translate.google.ru/translate?sl=auto&tl=r...

    А лучше учите английский прямо за чтением мануалов.
    Ответ написан
    Комментировать
  • Как создать парсер AST допускающий синтаксические ошибки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Для начала как вооще строятся AST (абстрактное синтаксическое дерево) деревья? Что почитать?

    Книгу дракона.

    Как создать парсер для языка, например SQL, который генерирует AST дерево и прощает синтаксические ошибки?

    Предусмотреть в грамматике правила описывающие синтаксические ошибки и восстановление после них. В bison, например, для этого есть токен "error".
    Ответ написан
    Комментировать
  • Реально ли найти работу, связанную с разработкой компиляторов?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Найти -- реально, но как именно искать не подскажу. Знаю, что занимаются компиляторами питерский офис oracle и (бывший) питерский офис АМД.
    По части вклада в opensource, если вы приложитесь к свежей архитектуре, за которой стоит не очень крупная компания, вас 100% заметят. Обычно компиляторная команда полностью занята и приоритет открытых инструментов для них, как правило, наименьший. Поэтому они всегда будут рады помощи со стороны, а там глядишь, и пригласят к себе.
    Ответ написан
    Комментировать
  • Почему реализовать C настолько сложно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Компилятор С написать несложно. Сложно написать его так, чтобы он генерировал качественный код. Подавляющее большинство багов gcc связано с оптимизацией.
    Ответ написан
    5 комментариев