Целью проекта является разработка простой и удобной в использовании платформы для машинно-независимого исполнения программного кода с возможностью JIT-компиляции в машинный код процессора Intel x86_64. Платформа выполнена в соответствии с модульно-конвейерным подходом. При разработке платформы было спроектировано и разработано ядро, реализующее межмодульные интерфейсы, а также простой и удобный пользовательский интерфейс. Разработка велась таким образом, чтобы каждому этапу преобразований соответствовал отдельный модуль. Помимо удобности в использовании и доработке такая система позволяет отследить весь путь трансляции исходного текста, что позволяет вести подробную распечатку преобразований и, при необходимости, прерывать трансляцию на необходимом этапе. Например, при прерывании трансляции во время обнаружения ошибки, такая система позволит быстро найти, в каком месте она была допущена. Работа с необходимым к исполнению исходным текстом ведется в два этапа. Первым шагом является загрузка исходного текста и его сохранение во внутреннее представление. Разбор исходного текста производится с использованием изменяемого командного набора, что, фактически, позволяет загружать и сохранять исходный текст, написанный на любом языке подобного рода, чей командный набор известен модулю считывания и сохранения. После этого работа с внутренним представлением считанного исходного текста передается к одному из модулей исполнения. В платформе присутствуют два взаимозаменяемых модуля исполнения. Первым является виртуальная стековая машина, напрямую выполняющая переданный ей исходный текст. Этот вариант удобен своей кроссплатформенностью. Если же скорость исполнения исходного текста не соответствует предъявляемым требованием, а кроссплатфоменность не является основной целью, то модуль виртуальной стековой машины можно заменить модулем JIT-компиляции в машинный код процессора intel x86_64. Этот вариант является более быстрым, но не является кроссплатформенным, он зависит как от машины, так и от OC. Целевым процессором является семейство Intel x86_64, а целевой ОС является Linux. Этап JIT-компиляции подразделяется на два шага. Во время первого шага происходит трансляция внутреннего представления загруженного исходного текста в язык ассемблера. После этого работа с исходным текстом на языке ассемблера передается модулю, реализующему JIT-компиляцию языка ассемблера в машинный код процессора intel x86_64. Внутри этого модуля реализована генерация результирующих байт машинного кода для некоторого количества вариантов операндов у обрабатываемой инструкции (r/m64 & reg64, imm32, disp32 и т.д), что в совокупности с созданной базой машинных кодов инструкций дает JIT-компилятор языка ассемблера. После трансляции исходного текста на языке ассемблера в машинный код создается область памяти с правами для выполнения, в которую записывается весь сгенерированный машинный код. Таким образом, на выходе, после JIT-компилятора мы получаем функцию, которую впоследствии уже можно будет вызывать. В текущий момент на базе разработанной платформе реализован язык, поддерживающий работу со стеком, базовую арифметику, условные и безусловные переходы, работу с переменными, работу с функциями, работу с указателями на переменные и указателями на функции. Работа выполнена на языке C++, в среде KDevelop, в операционной системе Linux. ЛИТЕРАТУРА 1. Intel 64 and IA 32 Software Developers manual 2. Материалы с сайта stackoverflow.com 3. С. В. Зубков. Assembler для DOS, Windows и UNIX Работа была выполнена в рамках учебного задания экспериментальной площадки по проектной деятельности И. Р. Дединского. Репозиторий проекта Материалы доклада
|