Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур.

Презентация:



Advertisements
Похожие презентации
Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур.
Advertisements

Лекция 7 Модульность. Причины модульности Структурированность Данные, разделенные по отдельным файлам проще поддаются структурированию, анализу и навигации.
Новиков Сергей Анализ потока управления и потока данных в программе.
Разработка программного обеспечения для сигнальных процессоров TMS320C64xx в IDE Code Composer Studio Часть I. Основные возможности среды разработки CCS.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Вперёд ЯЗЫКИ ПРОГРАММИРОВАНИЯ ЦЕЛИ: ЦЕЛИ: 1. Средство для задания действий, которые должны быть выполнены машиной.(Машинный язык) 1. Средство для задания.
М.Ю. Харламов, ВНУ им. В.Даля, Транслятор Транслятор - это программа, которая переводит программу на исходном (входном) языке в эквивалентную ей.
Основы информатики Лекция. Директивы. Исключения Заикин Олег Сергеевич
Условная компиляция Условная компиляция C / С++Pascal Условная компиляция выполняется с помощью специальных директив и позволяет выборочно компилировать.
ЛАБОРАТОРНАЯ РАБОТА 1 ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ ТАБЛИЦ, ИСПОЛЬЗУЕМЫХ В ТРАНСЛЯТОРЕ Рейн Т. С.
ПРЕЗЕНТАЦИЯ НА ТЕМУ: ПРЕЗЕНТАЦИЯ НА ТЕМУ: ВИДЫ ТРАНСЛЯЦИИ Составил: Ревнивцев М.В Преподаватель: Кленина В.И.
Внутреннее представление компилятора Типы представлений и их особенности.
Лекция 1 Введение в программирование и язык C. Машинный код Машинный код или машинный язык система команд (набор кодов операций) конкретной вычислительной.
2.4. Проект C++Builder Стандартный состав проекта: Unit1.cpp –программный файл реализации модуля, связанный с первой формой (Unit i.cpp – программный.
СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. Системное программное обеспечение - это комплекс программ, которые обеспечивают эффективное управление компонентами.
Объектно-ориентированное программирование Карпов В.Э. Смолток. Лекция 4. Байт-код.
Лекция 3 ПЕРВЫЕ ПРОГРАММЫ, ВВОД/ВЫВОД В ЯЗЫКЕ С++
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Октябрь Макрообработка (2 часа). Октябрь Основные вопросы Основные понятия. Классификация макропроцессоров. Основные понятия. Классификация.
Использование языка Си для программирования ЦСП TMS320C67x.
Транксрипт:

Владиславлев Виктор Системы программирования (СП) Создание СП для новых архитектур

Содержание Системы программирования Структура компилятора – Препроцессор – Компилятор – Ассемблер – Линковщик – Динамический Линковщик Прочие системные утилиты Библиотеки Создание/Портирование СП – Machine Description – Двоичный интерфейс приложения – Библиотеки Симулятор Средства отладки Средства анализа производительности Форматы исполняемых файлов Форматы отладочной информации Agenda

Системы программирования Toolchain – набор средств разработки программ Компилятор Бинарные утилиты Библиотеки Средства отладки и профилирования И проч. (редакторы, навигаторы по коду, системы автодокументации, верификаторы и т.д.) Примеры: GNU toolchain – Unix/Linux/Windows на большинстве архитектур Microsoft Visual Studio – Windows на x86 ICC – toolchain от компании Intel – Windows/Linux на x86 и IA64 Code Warrior – toochain для встроенных систем Xcode – toochain для Mac OS X и iOS Можно разделить Нативные системы (host = target) Кросс-системы (host != target) Toolchain

ядро компилятора Структура компилятора Компилятор - переводит исходный код программы (написанные на языке высокого уровня) в эквивалентный код на языке целевой платформы Compiler structure.c.cpp.f77....c.cpp.F... High-Level IR Low-Level IR Low-Level IR Low-Level IR asm.o.obj.out.exe Препроцессор 2.Front-End 3.Оптимизации 4.Кодогенератор 5.Ассемблер 6.Линкер ++ Можно проследить запуски фаз компиляции (опция --verbose в GCC) 3

Препроцессирование Инициальная обработка 1.Разбиение на строки 2.Замена триграфов 3.Объединение строк 4.Замена комментариев Рабиение на токены 1.(слева направо, жадная) 2.Замена диграфов (в С++) Собственно препроцессирование 1.Подключение файлов (#include) 2.Макроподстановки (#define/undef/##) 3.Условная компиляция (#ifdef/if/else/elif/endif) 4.Управление строками (#line) 5.Диагностика (#error/warning) ++ Часто полезно получить препроцессированный код (опция -E в GCC) Preprocessing Триграфзначение ??([ ??)] ??} ??=# ??/\ ??'^ ??!| ??-~ /??/ * */ # /* */ defi\ ne FO\ O 10\ 20 #define FOO 1020 a = i+++j; a = (i++) + j; a = i + (++j); ?

Препроцессирование Инициальная обработка 1.Разбиение на строки 2.Замена триграфов 3.Объединение строк 4.Замена комментариев Рабиение на токены 1.(слева направо, жадная) 2.Замена диграфов (в С++) Собственно препроцессирование 1.Подключение файлов (#include) 2.Макроподстановки (#define/undef/##) 3.Условная компиляция (#ifdef/if/else/elif/endif) 4.Управление строками (#line) 5.Диагностика (#error/warning) ++ Часто полезно получить препроцессированный код (опция -E в GCC) Preprocessing Триграфзначение ??([ ??)] ??} ??=# ??/\ ??'^ ??!| ??-~ /??/ * */ # /* */ defi\ ne FO\ O 10\ 20 #define FOO 1020 a = i+++j; a = (i++) + j; a = i + (++j); X

собственно Компилятор Компилятор обрабатывает единицу трансляции (translating unit TU, compilation unit). В С/С++ это файл после препроцессирования. В FORTRAN – один файл может содержать несколько TU. Компилятор включает: 1. Компилятор переднего плана (Frontend) – строит по исходному коду промежуточное представление (Intermediate Representation – IR, или IL); включает – Лексический анализатор – Синтаксический анализатор – Семантический анализатор 2. Фазы Анализа и Оптимизаций представления – их много (Основная часть курса), но можно и уменьшить: разные уровни оптимизаций 3. Фазы Распределение регистров и кодогенерация Результат работы компилятора – язык ассемблера (ассемблер, машинный язык) целевой архитектуры Compiler ++ Можно проследить результат работы компилятора после каждой фазы (опции --dump-tree-all --dump-rtl-all в GCC)

О сложности парсинга template struct Outer { template struct Inner { template X* nested() { return (X*)0; } }; template T3* call() { return typename Outer ::Inner ( ).nested (); } Не откомпилируется: одна «ошибка», повторенная дважды. Парсер не справляется с таким синтаксистом. Как помочь?

трансформация Кода int f(int b, int c) { int a1 = b*5 - c; int a2 = -8*b + 2*c; return 2*a1 + a2; } D.26 = b * 5; a1 = D.26 - c; 27 = b * -4; D.28 = D.27 + c; a2 = D.28 * 2; D.20 = a1 * 2; D.29 = D.20 + a2; return D.29;.globl f.type f:.LFB0:.cfi_startproc leal (%rdi,%rdi), %eax ret.cfi_endproc Code transformation ++ Бывает полезно посмотреть ассемблерный код (опция -S в GCC) 1.Source code 2.AST 3.High-level IR 4.Low-level IR 5.assembler bc5 * - a1 b2-8 * + a2 c * a1a22 * + ret set (reg:SI 62) (ashift:SI (reg/v:SI 60 [ b ]) (const_int 1 [0x1]); set (reg/i:SI 0 ax) (reg:SI 62);

Ассемблер Ассемблер как программа переводит язык ассемблера в код целевой архитектуры, сохраняемый в исполняемом формате Для символьных ссылок – резервирует место, подстановку реальных адресов осуществляет линкер КАК ПРАВИЛО, ассемблер – тривиален (парсинг, упаковщик). Исключение: IA-64 (Itanium) (виртуальные регистры, шаблоны, скобки параллельности) Язык ассемблера Имеет типы (наследованные от архитектуре), комментарии, объекты и пр. характерезуется тривиальным синтаксисом может быть не стандартизирован даже в рамках одной платформы Assembler mov eax, ebx Intel movl %ebx, %eax AT&T Имена регистров зарезервированы Сначала dst, потом src Регистры начинаются с % b, w, l, q – размер операнда

Линковщик Дефиниция – полное определение сущности (глобала или функции) Декларация – лишь обещание того, что где-то есть дефиниция Объектный файл содержит дефиниции функций и глобалов В коде есть ссылки на декларированные глобалы и/или функции Основная задача линковщика (линкера) – реализовать чужие обещания Проблемы: Никого не нашли – ошибка! Нескольких – (duplicate definitions): – С++: one definition rule – С: tentative definition для неинициализированных глобалов – FORTRAN: common model – в каждой TU свой COMMON блок, своего размера Инициализированный глобал Предварительное определение Декларация Дефиниция Переменная на стеке Указывает на память в куче Linker int G1 = 1; int G2; extern int G3; extern int f( int*); int g( int n) { int* h = malloc(n*sizeof(int)); f( h); return h[ G2 ]; } bss: datacodeheap bssdatacode file memorystack

Недостатки статических библиотек: многократное дублирование кода в памяти связь приложения с реализацией библиотеки навсегда динамические библиотеки:.so в Unix,.dll в Windows,.dylib в MacOS X PIC (position-independent code) в Linux Procedure Linkage Table Global Offset Table ld.so – динамический загрузчик Мапирование кода в адресное пространство процесса Проблема с данными библиотеки DLL – это не PIC, как в Linux; в Windows это называется memory mapping Динамическая линковка Dynamic Linking movl %edx, %esi movq %rax, %rdi call movq %rax movl (%rax), %eax cltq movl %edx, %esi movq %rax, %rdi call f movl G2(%rip), %eax сltq call f … LPT f:?? a.out libname lib function f ld.so LPT f:0x… f() lib.so

Прочие бинарные утилиты as – ассемблер ld – линкер gprof – профилировшик, требует инструментирование код ar – архиватор для создания статических библиотек ( LIB – Windows) objcopy – копирует содержимое одних объектных файлов в другие objdump – получение информации из объектного файла, в частности, выполняет функцию дизассемблера readelf – показать содержимое ELF файла strip – удаляет символы из объектного файла gold – улучшенный линкер от Google, теперь – в стандартных утилитах nm – получить список символов из объектного файла c++filt – DeMangling windmc – message compiler (Win) windres – recourse compiler (Win) Other binutils _ZGVZN15UICmdWithParser11parseMemoryEPPKcmRmP7ProgramP7MachineS3_RNS_15uiParserWidth_tEE8reMemory UICmdWithParser::parseMemory(char const**, unsigned long, unsigned long&, Program*, Machine*, unsigned long&, UICmdWithParser::uiParserWidth_t&)::reMemory ?

Библиотеки Требования к стандартной библиотеке языка 1.Взаимодействие с ОС 2.Удобный ввод-вывод, функции взаимодействия с сетью 3.Математические функции 4.Средства отладки и диагностирования программ (про assert.h) 5.Поддержка часто используемых типов (функции работы со строками, работа с UNICODE) Для С это libc ++ не все требования выполнены; например, п.1. – отдельный стандарт POSIX Распространненные реализации: GNU C Library – самая распространенная реализация, используемая в Linux Microsoft C Run-time Library Dietlibc – альтернативная небольшая реализация Стандартной библиотеки Си uClibc – Стандартная библиотека Си для встраиваемых систем на базе Linux Newlib – Стандартная библиотека языка Си для встраиваемых систем Klibc – применяется главным образом для загрузки Linux-систем Eglibc – разновидность glibc для встраиваемых систем bionic – реализация стандартной библиотеки в Android Libraries

Для С++ это libstdc++ в GNU toolchain – IOStream – STL Библиотеки динамической поддержки языковой; для С++ это libsupc++ – EH (exception handling) – RTTI (run-time type information): dynamic_cast, typeid, type_info – new с синтаксисом размещения Библиотека поддержки компилятора; в GCC это libgcc, в LLVM compiler-rt – Арифметические функции, которые не могут быть напрямую раскрыты в команды target архитектуры (divsi3(int, int)) – Функции работы с исключениями (независимые от языка) (_Unwind_GetIp) – Другие функции поддержки компилятора (_splitstack_find) BFD (Binary File Descriptor) library – основа большинства бинарных утилит Библиотеки Libraries