14 (1108013)
Текст из файла
Курс «Алгоритмы и алгоритмические языки»1 семестр 2015/2016Лекция 141Схема компиляцииИсходная программаfile1.cfile3.cfile2.c1Препроцессор1Препроцессор1Препроцессор2Компилятор2Компилятор2Компиляторfile1.s3Ассемблерfile3.sfile2.s3file1.oАссемблерfile2.o43Ассемблерfile3.oКомпоновщикИсполняемый файл2ПрепроцессорПеред компиляцией выполняется этап препроцессирования.Это обработка программного модуля для получения егоокончательного текста, который отдается компилятору.Управление препроцессированием выполняется с помощьюдиректив препроцессора:#include <...> - системные библиотеки#include "..." – пользовательские файлы#define name(parameters) text#undef name#define MAX 128#define ABS(x) ((x) >= 0 ? (x) : -(x))x -> y – 7ABS(x) -> ((y – 7) >= 0 ? (y – 7) : -(y – 7))x -> a-- ?3Препроцессор и условная компиляцияПрепроцессор позволяет организовать условное включениефрагментов кода в программу#ifdef name / #endif – проверка определения имени#ifndef _STDIO_H#define _STDIO_H<...
текст файла ...>#endif4Препроцессор и условная компиляцияПрепроцессор позволяет организовать условное включениефрагментов кода в программу#if/#if defined/#elif/#else/#endif – общие проверкиусловий#if HOST_BITS_PER_INT >= 32typedef unsigned int gfc_char_t;#elif HOST_BITS_PER_LONG >= 32typedef unsigned long gfc_char_t;#elif defined(HAVE_LONG_LONG)&& (HOST_BITS_PER_LONGLONG >= 32)typedef unsigned long long gfc_char_t;#else#error "Cannot find an integer type with at least 32 bits"#endif5Препроцессор: операции # и ##Операция # позволяет получить строковое представлениеаргумента#define FAIL(op)do {fprintf (stderr, "Operation " #op "failed: ""at file %s, line %d\n", __FILE__,__LINE__);abort ();} while (0)\\\\\\int foo (int x, int y) {if (y == 0)FAIL (division);return x / y;}do { fprintf (stderr, "Operation " "division" "failed: " "at file%s, line %d\n", "fail.c", 13); abort (); } while (0);6Препроцессор: операции # и ##Операция ## позволяет объединить фактические аргументымакроса в одну строкуjava-opcodes.h:enum java_opcode {#define JAVAOP(NAME, CODE, KIND, TYPE, VALUE) \OPCODE_##NAME = CODE,#include "javaop.def"#undef JAVAOPLAST_AND_UNUSED_JAVA_OPCODE};javaop.def:JAVAOP (nop,0, STACK,POP,0)JAVAOP (aconst_null,1, PUSHC,PTR,0)JAVAOP (iconst_m1,2, PUSHC,INT,-1)<...>JAVAOP (ret_w,209, RET,RETURN, VAR_INDEX_2)JAVAOP (impdep1,254, IMPL,ANY,1)JAVAOP (impdep2,255, IMPL,ANY,2)7Препроцессор: операции # и ##Операция ## позволяет объединить фактические аргументымакроса в одну строкуgcc –E java-opcodes.h:enum java_opcode {OPCODE_nop = 0,OPCODE_aconst_null = 1,OPCODE_iconst_m1 = 2,OPCODE_iconst_0 = 3,<...>OPCODE_impdep2 = 255,LAST_AND_UNUSED_JAVA_OPCODE};8Компоновка и классы памятиКласс памяти Время жизниВидимость Компоновка ОпределенаaвтоматическийавтоматическоеблокнетВ блокерегистровыйавтоматическоеблокнетВ блоке какregisterстатическийстатическоефайлвнешняяВне функцийстатическийстатическоефайлвнутренняяВне функцийкак staticстатическийстатическоеблокнетВ блоке как staticКвалификатор extern: переменная определена и память под неевыделена в другом файлеКлассы памяти функций:статическая (объявлена с квалифатором static)внешняя (extern), по умолчаниювстраиваемая (inline, C99)Объявление внешних функций в заголовочных файлах:extern void *realloc (void *ptr, size_t size);9КомпоновщикОрганизовывает слияние нескольких объектныхфайлов в одну программуРазрешает неизвестные символы (внешниепеременные и функции)Глобальные переменные с одним именемполучают одну область памятиОшибки, если необходимых имен нетили есть несколько объектов с одним именемОпции для указания места поискаХорошим стилем программирования являетсяэкспорт лишь тех объектов, которые используютсяв других файлах (интерфейс модуля)Используйте квалификатор staticСборка исполняемого файла или библиотеки10(статической или динамической)Отладка программВсе программы содержат ошибки, отладка – это процесс поискаи удаления некоторых ошибокСуществуют другие методы обнаружения ошибок (тестирование,верификация, статические и динамические анализаторы кода),но их применение не гарантирует отсутствия ошибокДля отладки используют инструменты, позволяющие получитьинформацию о поведении программы на некоторых входныхданных, не изменяя ее поведенияПростейший метод: отладочная печатьstatic void debug_array (int *a, int n) {int *a; int n;fprintf (stderr, "Array (%d)", n);n = read_array (a);for (int i = 0; i < n; i++)debug_array (a, n);fprintf (stderr, "%d ", a[i]);fprintf (stderr, "\n");}Отладочная печать может контролироваться макросом (NDEBUG)11Отладка программ: отладчикиОтладчик – основной инструмент отладки программыОтладчик позволяетзапустить программу для заданных входных данныхостанавливать выполнение по достижении заданныхточек программы безусловно или при выполнениинекоторого условия на значения переменныхостанавливать выполнение, когда некоторая переменнаяизменяет свое значениевыполнить текущую строку исходного кода программыи снова остановить выполнениепосмотреть/изменить значения переменных, памятипосмотреть текущий стек вызововНеобходимое условие для отладки на уровне исходного кода:наличие в исполняемом файле программы отладочнойинформации (связи между командами процессора и строкамиисходного кода программы, связь между адресами и12переменными и т.д.)Отладка программ: отладчик gdbКомпиляция с отладочной информацией: gcc -gНекоторые команды gdbgdb <file> --args <args> – загрузить программу сзаданными параметрами командной строкиrun/continue – запустить/продолжить выполнениеbreak <function name/file:line number> –завести безусловную точку остановаcond <bp#> condition – задать условие остановкивыполнения для некоторой точки остановаwatch <variable/address> – задать точкунаблюдения (остановка выполнения при изменениизначения переменной или памяти по адресу)next/step – выполнить текущую строку исходного кодапрограммы без захода/с заходом в вызываемые функцииprint <var>/set <var> = expression – посмотреть/изменить текущие значения переменных, памятиbt – посмотреть текущий стек вызововСреда Code::Blocks поддерживает gdb в своем интерфейсе 13Отладка программ: примеры команд gdbУстановка точек остановаможно использовать '.' вместо '->'b fancy_abortb 7199b sel-sched.c:7199cond 2 insn.u.fld.rt_int == 112cond 3 x_rtl->emit.x_cur_insn_uid == 1396Просмотр и изменение значений переменныхp orig_ops.u.expr.history_of_changes.basep bb->indexset sched_verbose=5call debug_vinsn (0x4744540)Установка точек наблюденияwa can_issue_morewa ((basic_block) 0x7ffff58b5680)->preds.base.prefix.num14.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.