Лекция 04 - Компиляция. ВМ. Переносимость

advertisement
СИСТЕМНОЕ И ПРИКЛАДНОЕ
ПРОГРАММНОЕ
ОБЕСПЕЧЕНИЕ
Лекция 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
Download