=head1 TITLE Обзор Паррота =head1 Интерпретатор Паррота Этот документ является введением в структуру и концепцию, используемые Паррот совместно системой компилятор байт-кода - интерпретатор. Мы сначала поговорим об интерпретаторе, потом это - целевая платформа для которох все внешние компиляторы будут компилировать свой код. =head1 Программный CPU Подобно всем инрепретирующим системам этого рода, Паррот интерпретатор представляет собой виртуальную машину; другими словами - программный процессор (CPU). Однако, в отличие от других виртуальных машин (VMs), Паррот интерпретатор задуман как более близкое отражение твердых CPUs. Например, виртуальная машина Паррота будет иметь регистровую архитектуру, которая более предпочтительна, чем стековая. Она будет также иметь очень низкоуровневые операции, более похожие на Java'ские, чем на на среднего уровня операции Перла и Питона, и тому подобных. Аргументация этого решения первоначальна заключалась в том, что используя, в некоторой мере, аналогию с базового оборудования, возможно скомпилировать бай-код Паррота в эффективный родной машинный язык. Это также позволяет нам использовать доступную литературу по оптимизации компиляторов для твердых CPUs, в значительной большей степени, чем сравнительно незначительный объем информации по оптимизации для макрооперационных (макрокомандных) основных стековых машин. Более точно, программный процессор будет содержать большое число регистров. Настоящий дизайн предоставляет для четырех групп 32 регистра; каждая группа будет хранить особый тип данных: целое, число с плавающей запятой, строка и PMCs. (Parrot Magic Cookies, о них подробней говориться ниже.) Регистры будет сохраняться в регистровых фреймах, который могут быть записаны и прочитаны из регистрового стека. на пример, для подпрограммы или блок необходимы свои собственные регистровые фреймы. =head1 Действия (операции) Паррот интерпретатор имеет большое число очень низкоуровневых инструкций, и ожидается, что высокоуровневые языки будет компилироваться в язык промежуточного уровня перед выводом чистого машинный кода Паррота. Действия будет представлены несколькими байтами машинного кода Паррота; во первых C будет точно определять номер действия, и оставшиеся аргументы будет зависеть от действия. Действия обычно будет целевыми для специфического типа данных и типа регистра; так, например, C принимает два C аргумента, и уменьшает содержимое целого регистра, указанного первым, C на значение во втором регистре C. Естественно, действия, которые выполняются над C регистрами, будут использовать для величин Cs типы; однако, так как первый аргумент почти всегда является B<номером> регистра, а не реальными данными, то даже операции над строковыми и PMC регистрами будет получать C в качестве первого аргумента. Как и в Перле, Паррот операции будут возвращать указатель на следующие действие в байт-кодовом потоке. Хотя операции будут иметь предопределенное число и размер аргументов, легче сделать, чтобы некоторые операции перепрыгивали через свои аргументы, возвращая следующее действие, это лучше, чем поиск в таблице числа байтов для перескока на заданный код операции. Будет глобальные и личные таблицы кодов операций; это как сказать, область байт-кода может определять совокупность обычных операций, которые будут использоваться. Эта область будет приблизительно распределяться на единицы компиляции оригинального исходного кода; каждый предкомпилируемый модуль будет иметь с вою собственную таблицу кодов операций. Что бы завершить обзор операций Паррота, смотри L. =head1 PMCs PMCs приблизительно аналогичны C, C и C (и в большей степени комплексным типам) определенным в Перле 5, и почти в точности аналогичны C типам в Питоне. Они являются всецело абстрактным типом данных; они могут быть строкой, целым, кодом или чем-то другим. Как мы увидим вскоре, они, можно ожидается, будут вести себя определенным образом, когда обучатся выполнять определенные действия - такие как инкрементирование чем-то, преобразование своих значений в целое число и так далее. Их абстрактность позволяет нам трактовать PMCs как, примерно, стандартное API для действий с данными. Если мы исполняем код Перла, мы можем изготовить PMCs, которые ведут себя подобно скалярам Перла, и действия, которые мы совершаем над ними, будет делать Перловые вещи; если мы выполняем код Питона, мы можем изготовить PMCs с действиями Питона, и один и тот же, лежащий в основе, байт-код будет сейчас выполнять Питонистую деятельность. Документацию о специфических PMCs, которые поставляются с Парротом, смотри в каталоге docs/pmc. =head1 Виртуальные таблицы (Vtables) Способ, которым мы достигаем эту абстракцию, - это назначение каждой PMC набора указателей на функции, которые определяют как она должна вести себя, когда ее просят сделать различные вещи. До известной степени мы можем рассматривать PMC как объекты в абстрактных виртуальных классов; PMC нуждаются в наборе методов, определенных по порядку, для ответа на вызовы методов. Эти наборы методов называются B<виртуальные таблицы>. Vtable представляет собой, более строга говоря, структуру, которая, предполагается, заполняется указателя на функции. PMC содержит указатели на vtable структуру, которая обеспечивает их поведение. Поэтому, когда мы запрашиваем у PMC его длину, мы по существу вызываем C метод PMC; это обеспечивается просмотром C слота (сегмента) в виртуальной таблице (vtable), к которая указывает PMC, и вызываем указатель результирующей функции с PMC в качестве аргумента: (pmc->vtable->length)(pmc); Если наш PMC является строкой и имеет виртуальную таблицу, которая выполняет Перл-подобные действия над строками, она вернет длину строки. Если, с другой стороны, PMC это массив, мы должны получить назад число элементов в массиве. (Если это то, что мы хотим сделать.) Так же, если мы вызываем инкрементный оператор для строки Перла, мы должны получить следующую строку в алфавитной последовательности; если мы вызываем его для значения Питона, мы можем получить ошибку, в следствии того, что Питон не имеет инкрементного оператора, и которая намекает на ошибку внешнего компилятора. Или он должен использовать "супер-совместимые Питоновские виртуальные таблицы", делающие правильные вещи, каким бы то ни было образом, чтобы сделать совместимость данных между программой Питона и других языков более легкой. Во всяком случае, виртуальные таблицы позволяют нам выделить общий блок базовых операций в всех языках программирования - добавление, длина, объединение и так далее - из специфического поведения требуемого конкретными языками. Перл 6 будет Перлом при помощи интегрированного в Паррот набора Перловских виртуальных таблиц; Паррот в равной степени сможет запускать Python, Tcl, Ruby или другие языки при помощи слинкованного набора виртуальных таблиц, которые обеспечат поведение величин в этих языках. Комбинируя это с таблицами обычных операций, упомянутых выше, вы можете увидеть, как Паррот, по существу, языково-независимый базис для построения среды выполнения компилируемых в байт-код языков. Одна интересная вещь о виртуальных таблицах есть то, что мы можем конструировать их динамически. Мы можем найти больше информации о виртуальных таблицах в L. =head1 Операции над строками Парррот предоставляет дружелюбный для программистов просмотр строк. Подсекция манипулирования строками Паррота сама полностью управляет распределением памяти, ее увеличением, как бы за кулисами. Это также решает задачу с некоторыми проблемами кодировок, которые могут досаждать языкам, знающими об Unicode. Это достигается главным образом симуляцией виртуальных таблиц для системы, что применяется при помощи PMCs; каждая кодировка будет точно определять функции таки как максимальное количество байтов для размещения символов, длина строки в символах, смешение заданного символа в строке и так далее. Они будут, конечно, предоставлять функции для перекодировки в другую кодировку и (или) прямо в Unicode для использования как основной. API для манипуляции со строками разъясняется в L. =head1 Формат байт-кода Мы уже объяснили формат основного направления байт-кода; действия будут следовать одно за другим при помощи аргументов, упакованных в таком формате, который необходим конкретному действию. Это делает третья секция файла с байт-кодом Паррота; фиксированное представление Паррот программ имеет следующею структуру. Во-первых, присутствует магический номер для идентификации файла с байт кодом представленный как код Паррота. Следующим следует сегмент адресной привязки, который содержит указатели на глобальную непостоянную память и другую необходимую локальную память при помощи сегмента кодов основных операций. На диске, реальные указатели будет обнуляться, и загрузчик байт-кода будет заменять их на адреса памяти, назначенные при запуске экземпляра интерпретатора. Подобным образом, следующий сегмент определяет все строки и PMC константы, используемые в коде. Загрузчик будет воспроизводить (восстанавливать) эти константы, фиксировать ссылки на константы в сегментах кода операций с адресами недавно воспроизведенными (восстановленными) данными. Как мы знаем, сегмент кода операций идет следующим. Это необязательно следует за сегментом кода для целей отладки, которые содержат munged формы оригинального файла программы. Формат байт-кода полностью документирован в L.