СИСТЕМНОЕ И ПРИКЛАДНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Лекция 4. Интерпретация и компиляция программ. Виртуальные машины. Обеспечение переносимости программ. Интерпретация и компиляция Интерпретация и компиляция программ • Интерпретация – поэлементная (пооператорная, построчная) трансляция с одновременным исполнением программы • Компиляция – трансляция всей программы в целом на язык низкого уровня • разносятся фазы трансляции и исполнения 3 Интерпретация и компиляция программ • Интерпретатор - «станок с ЧПУ», буквальное исполнение инструкций • Компилятор – «станкостроительная машина», создаёт машину, выполняющую заданные инструкции картинки (с) Dan Pipony, http://blog.sigfpe.com 4 Компиляция программ • разбор (анализ) программы • лексический - текст разбивается на лексемы • синтаксический - проверяется корректность синтаксиса - строится дерево разбора • семантический - проверяется смысловая корректность - формируется промежуточное представление • оптимизация • удаление лишних конструкций, редукция • генерация кода на основе внутреннего представления • код на целевом языке • компоновка (для многомодульных программ) 5 Способы исполнения программ • компиляция • трансляция программного кода в машинный код целевой платформы • интерпретация • программный код исполняется без предварительной трансляции в машинный код («виртуальная машина») • смешанные подходы • интерпретатор перед исполнением транслирует код на промежуточный язык (байт-код) • компиляция в код виртуальной машины 6 Виртуальные машины Виртуальные машины • Виртуальная машина – уровень абстракции от аппаратной и/или программной платформы (ОС) • эмулирует физическую машину - обеспечивая переносимость программ с одной платформы на другую • или создаёт виртуальное окружение («песочницу») - ограничивая возможности исполняемых программ в целях безопасности 8 ВМ как исполняющая среда языка программирования • Эмулирует операции некоего процессора (набор инструкций) • Два основных способа реализации: • стековые ВМ - операнды команд процессора размещаются в стеке (LIFO) - результаты операций также помещаются в стек - проще механизм, короче код, но хуже оптимизируется • регистровые ВМ - операнды и результаты размещаются в явно адресуемых регистрах - больше возможностей для оптимизации, но длиннее код операций (включает указание адресов операндов) 9 Стековая и регистровая ВМ Стековая ВМ: POP 20 POP 7 ADD 20, 7, result PUSH result Регистровая ВМ: ADD R1, R2, R3; картинки: http://markfaction.wordpress.com/2012/07/15/stackbased-vs-register-based-virtual-machine-architectureand-the-dalvik-vm/ 10 Виртуальные машины: Java JVM vs. Dalvik • JVM – стековая • Dalvik – регистровая • может исполнять Java-байткод • но требуется дополнительный уровень трансляции и оптимизации картинка: http://markfaction.wordpress.com/2012/07/15/stackbased-vs-register-based-virtual-machine-architecture-and11 the-dalvik-vm/ Виртуальные машины: Java VM • JVM реализует набор команд: • операции над стеком • арифметика • управляющие инструкции (переход, ветвление, возврат, генерация исключений) • сохранение и загрузка локальных переменных • доступ к полям класса (в т.ч. статическим) • вызов методов (статических, виртуальных, закрытых, интерфейсных) • создание объектов (в т.ч. массивов) • преобразование и проверка типов 12 Виртуальные машины: Java Трансляция java-кода в байткод System.out.println(“some string”); транслируется в: getstatic java.lang.System.out Ljava/io/PrintStream; ldc “some string" invokevirtual java.io.PrintStream.println (Ljava/lang/String;)V То есть: 1. В стек помещается ссылка на объект потока ввода-вывода, 2. В стек помещается ссылка на строку, которую надо вывести 3. Происходит вызов метода (функции) println для заданных операндов 13 Виртуальные машины: CLR (.NET framework) • Common Language Runtime – исполняющая языковая среда языка CIL • Common Intermediate Language – похожий на asm промежуточный язык картинки: (с) Wikipedia.org 14 Виртуальные машины: CIL Hello World .assembly Hello {} .method public static void Main() cil managed { .entrypoint .maxstack 1 ldstr "Hello, world!" call void [mscorlib]System.Console::WriteLine(string) ret } 15 Обеспечение переносимости программ Абстрагирование от программных и аппаратных платформ Переносимость программ • Компилируемые языки: • совместимые ОС и аппаратные платформы («бинарная совместимость») • ОС с разным API: - абстрагирование через библиотеки - перекомпиляция (код не надо переписывать) • разные аппаратные платформы - кросс-компиляция • Виртуальные машины и интерпретаторы: • программа распространяется как байт-код или исходный код • целевая среда должна предоставлять способ его выполнить • возможна оптимизация под конкретную платформу (JITкомпиляция) 17 Ссылки • Устройство интерпретатора языка Python: http://ideafix.name/wp-content/uploads/2012/09/Python14.pdf • Стековая и регистровая ВМ: http://www.sternkn.com/stack-based-vs-register-basedvirtual-machine-architecture-and-the-dalvik-vm/ • Модификация байт-кода Java VM: http://www.ibm.com/developerworks/ru/library/ljvmbytecode_mdf_1 • CIL и системное программирование в MS .NET (учебный курс): http://www.intuit.ru/studies/courses/89/89/info • The Three Projections of Doctor Futamura: http://blog.sigfpe.com/2009/05/three-projections-ofdoctor-futamura.html 18