Компиляторы примеры: Недопустимое название | OSDev Wiki
Примеры компиляторов — CodeRoad
Я ищу исходный код компилятора, способного создавать программы Win32 из входной программы на языке программирования (не имеет значения, какой именно, может быть, чем проще, тем лучше)
Тем не менее, я не могу найти ничего подходящего для себя, и огромные компиляторы, такие как GCC, приводят меня в крайнее замешательство, поскольку у них так много функций, что я не знаю, с чего начать.
- Есть ли микрокомпилятор OpenSource Win32 для какого-нибудь языка программирования, на который я мог бы взглянуть?
open-source
compiler-construction
compiler-theory
Поделиться
Источник
saf
12 апреля 2010 в 17:12
7 ответов
- C99 fenv.h для компиляторов MS
Кто-нибудь знает достойную реализацию C99 fenv.h для компиляторов MS? Думаю, это будет нетрудно сделать, я просто хочу сэкономить немного времени.
- хороший/полный Boot дух примеры, используя синтаксис версия 2
Почти все примеры, которые я рассматривал до сих пор, начиная с: http://boost-spirit.com/repository/applications/show_contents.php , используют старый синтаксис. Я читал и перечитывал фактическую документацию по адресу http:/ / www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html / index.html и…
Поделиться
Andrey
12 апреля 2010 в 17:16
2
Вы пытаетесь понять, как построить компилятор, или вы пытаетесь узнать, как выглядит исполняемый файл Win32 внутри?
Если первое, то чтение книги о том, как создать компилятор, будет намного эффективнее, чем попытка реинжиниринга исходного кода. Компиляторы не похожи ни на что, что вы когда-либо видели, и это действительно помогает, когда автор знакомит вас с принципами, общими методами и инструментами, используемыми. Стоит также отметить, что компиляторы строятся поэтапно, и только к концу реализации вам нужно иметь какие-либо знания о CPU и операционной системе, на которую вы ориентируетесь. Если вы новичок в compiler construction, то вам нужно многое узнать, прежде чем вы достигнете этой стадии.
Однако если вы хотите понять формат исполняемых файлов Win32, то вам нужно понять код x86 (или x64) assembly и формат файла Portable Execution (PE) (который используется Windows для исполняемых файлов). Для введения в код x86 assembly я бы рекомендовал превосходную «PC Assembly Language» free eBook http доктора Пола Картера:/ / www.drpaulcarter.com/pcasm/ , а для PE я бы начал здесь http://msdn.microsoft.com/en-us/magazine/cc301805.aspx и http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Поделиться
Andrew O’Reilly
12 апреля 2010 в 18:33
2
Я бы посоветовал взять учебник по компиляторам. Они объясняют все необходимые компоненты компилятора и обычно разрабатывают компилятор от начала до конца.
У меня есть копия современной реализации компилятора в Java из моего курса компиляторов, и я очень доволен ею.
Поделиться
Ben S
12 апреля 2010 в 17:16
- Практические примеры NFA и Эпсилон NFA
Каковы реальные примеры NFA и epsilon NFA, т. е. практические примеры, отличные от того, что он используется при проектировании компиляторов
- C++ Код, Поддерживающий Несколько Компиляторов
В библиотеках C++ boost предусмотрены механизмы синхронизации, которые, однако, поддерживают только очень ограниченный список компиляторов. Мы должны реализовать механизмы синхронизации по-своему, чтобы они обеспечивали более широкую поддержку различных компиляторов. Другими словами, мы хотим…
0
Я бы предложил поискать источник компилятора Pascal, C или SmallC для MS-DOS (16-битный). В частности, если они ограничиваются 16-битным плоским реальным режимом (режим памяти <= 64 КБ), они должны быть довольно простыми.
Поддержка сегментированного реального режима добавляет большую сложность, которой лучше всего было бы избежать, и она не имеет отношения к 32-битной программе плоского защищенного режима (не OS 32-битное Программирование).
Для процессора, не являющегося x86, пример программы для серии статей Джека Креншоу «давайте построим компилятор», который представляет собой синтаксический компилятор Pascal, ориентированный на процессор Motorola MC68000 16/32-bit. Существует также Марсель Хендрикс, написанный в Forth на win32- версии этой серии .
Существует также компилятор TCC — Tiny C, который поддерживает вывод PE-i386 (т. е. Win32).
Хотя если вы не потрудились прочитать всю ссылку SO, которую дал Фирас Ассаад в комментариях, которая содержит все эти ссылки, кроме одной, я думаю, что вы найдете исходный код компилятора ужасно длинным.
Поделиться
mctylr
12 апреля 2010 в 18:11
0
gas
может превратить язык assembly в объектный код, который ld
затем может связать с соответствующими средами выполнения для создания программы.
Поделиться
Ignacio Vazquez-Abrams
12 апреля 2010 в 17:16
0
Если ваша цель состоит в том, чтобы узнать, как работают компиляторы и/или как кодировать, вам действительно следует прочитать книгу на эту тему. Однако при поиске примеров исходного кода попробуйте использовать Pascal примеров компиляторов, подобных этому .
Pascal имеет несколько простой grammar и реализован во многих книгах.
Поделиться
Bruno Brant
12 апреля 2010 в 17:26
0
Самый простой язык программирования-это Assembly, x86-assembly, если быть точным. Самый известный ассемблер, NASM, является открытым исходным кодом; вы можете проверить его исходный код по адресу:
http:/ / repo.or.cz / w / nasm. git
NASM имеет макросы, которые действительно являются «compiled» в операторах ассемблера. Хотя это и не полноценный язык, он сосредоточен на основах.
Поделиться
Pindatjuh
12 апреля 2010 в 17:50
Похожие вопросы:
Использование написания лексеров и парсеров, кроме компиляторов?
Какие проблемы, кроме написания компиляторов, можно решить с помощью лексеров и парсеров ? Каковы преимущества / недостатки использования лексеров и парсеров по сравнению с простым написанием…
Примеры различий в поведении компиляторов C
Я искал какую-то область C,где мы получаем разное поведение от разных компиляторов. Глядя на следующий код, мы получаем вывод 7 в gcc4.4.5 и 10 в tcc4.5. int i=0; я=Я++ + ++Я + Я++ + ++я;…
MinGW набор компиляторов
Я устанавливаю набор компиляторов MinGW в каталог C:\MinGW , а также устанавливаю среду PATH. Я не знаю об использовании в любом проекте,и я хочу скомпилировать свою программу с помощью компилятора…
C99 fenv.h для компиляторов MS
Кто-нибудь знает достойную реализацию C99 fenv.h для компиляторов MS? Думаю, это будет нетрудно сделать, я просто хочу сэкономить немного времени.
хороший/полный Boot дух примеры, используя синтаксис версия 2
Почти все примеры, которые я рассматривал до сих пор, начиная с: http://boost-spirit.com/repository/applications/show_contents.php , используют старый синтаксис. Я читал и перечитывал фактическую…
Практические примеры NFA и Эпсилон NFA
Каковы реальные примеры NFA и epsilon NFA, т. е. практические примеры, отличные от того, что он используется при проектировании компиляторов
C++ Код, Поддерживающий Несколько Компиляторов
В библиотеках C++ boost предусмотрены механизмы синхронизации, которые, однако, поддерживают только очень ограниченный список компиляторов. Мы должны реализовать механизмы синхронизации по-своему,…
Добавление Компиляторов На Netbeans
Я попытался использовать Netbeans IDE для C/C++. При запуске я заметил, что единственными цепочками компиляторов, которые он принимает, являются: MingGw, Cygwin и Clang. Мой компилятор-это последняя…
Компиляция кода C с использованием нескольких компиляторов
Я только недавно решил выучить C. Я заметил, что есть несколько компиляторов, которые я могу скачать. Если я напишу код C для одного компилятора, он должен работать для всех компиляторов, верно?
Есть ли примеры многопоточных компиляторов трассировки JIT?
И JVM, и .NET CLR включают в себя компиляторы Just-In-Time, которые поддерживают несколько пользовательских потоков. Однако я считаю, что это method-at-a-time JITs. Все трассировки JITs , о которых…
Теория компиляции
Проекты выполняются в течении всего курса и сдаются в конце. В некоторых проектах возможна командная работа — об этом написано явно в спецификации. Ссылки на спецификации проектов ниже.
Проект: компилятор процедурного языка
Проект: интерпретатор языка PostScript для 2D графики
Книги и материалы по разработке компиляторов
А что такое Compiler Driver?
А что такое Compiler Frontend?
А что такое Compiler Backend?
Конечные автоматы
Калькулятор на основе рекурсивного спуска
Abstract Syntax Tree
Сердце современных фронтендов компиляторов — абстрактное синтаксическое дерево (Abstract Syntax Tree, AST). Оно создаётся на стадии синтаксического разбора, обрабатывается путём обхода при проверке семантических правил и проверке/определении типов, а затем также путём обхода AST выполняется генерация кода.
Восходящий разбор по принципу сдвига и свёртки (shift-reduce)
Полезные утилиты из STL и Boost для фронтенда
Стековые и регистровые машины
Исследуем работу компилятора C/C++
FFI — механизм интеграции между языками программирования
Автоматизируем вызов graphviz из командной строки
Изучаем генератор кода GNU Flex
GNU Flex позволяет описать лексический анализатор на простом языке Flex, перечислив регулярные выражения для отдельных токенов и указав код, исполняемый при сопоставлении каждого токена. Затем Flex генерирует код на языке C или C++. Полученный код использует детерминированный конечный автомат для разбора текста.
Руководство по lexertl
C++ библиотека lexertl во многом лучше GNU Flex. Она умеет создавать лексические анализаторы из правил в runtime, может обрабатывать unicode, и даже умеет генерировать код сканера на C++. Библиотека header-only и очень проста в установке.
Руководство по Bison
GNU Bison позволяет описать грамматику парсера на языке, похожем на EBNF. Получив на вход грамматику, Bison способен сгенерировать код парсера на C/C++. Полученный код использует таблицы переходов и недетерминированный конечный автомат со стеком.
Руководство по Lemon
Lemon появился, когда разработчиков SQLite не устроил код, сгенерированный GNU Bison. Генератор парсеров Lemon создаёт более чистый и простой парсер, который лучше обрабатывает переполнение стека и другие исключительные случаи, более удобен в многопоточной и объектно-ориентированной средах.
Примеры ко всем статьям ищите в репозитории примеров в каталоге chapter_3
Изучаем LLVM, виртуальный ассемблер LLVM-IR, генерируем машинный код. Все примеры в этой серии статей основаны на C++14, генераторе кода Lemon или библиотеках проекта LLVM.
Руководство по установке LLVM
Руководство по сборке и установке LLVM на Windows и Linux. Знакомит с примерами и утилитами в составе LLVM.
Архитектура Backend компилятора
Статья рассматривает архитектуру бекенда и связывает понятия Abstract Syntax Tree, «промежуточный код» и «машинный код».
Минимальный транслятор, основанный на LLVM
В данной статье описан пример минимального компилятора, бекенд которого основан на LLVM. Транслятор умеет превращать исходный код с функциями и выражениями в промежуточный код на языке LLVM-IR, который затем можно скомпилировать вручную.
Особенности языка C и C-style кода
Компилятор языка С в linux. Примеры
Операционная система (ОС) Linux/Unix и язык C — «близненцы-братья». Вспомните, что язык программирования C был создан (Д.Ритчи, 1972 г) специально для написания ОС Unix, и с тех пор и «каноническая» ОС Unix, а также все ее клоны и подобные ей ОС пишутся на языке C. Поэтому во всех версиях Unix и Unix-подобных систем компилятор языка C в большинстве случаев входит в комплект поставки системы.
Одним из первых программных продуктов, созданных в рамках проекта GNU, также явился компилятор языка С с открытым кодом. Этот компилятор включается в поставку всех версий ОС Linux.
Таким образом, среда, в которой выполняется наш лабораторный практикум предоставляет в Ваше распоряжение 4 компилятора на выбор:
- cc — стандартный компилятор языка C;
- c++ — стандартный компилятор языка C++;
- gcc — GNU-компилятор языка C;
- g++ — GNU-компилятор языка C++.
Способы запуска и подавляющее большинство опций всех указанных компиляторов идентичны, выбор того или иного компилятора отражается только на имени команды. Мы при подготовке лабораторного практикума использовали компиляторgcc, поэтому в дальнейших примерах будем говорить именно о нем.
Компилятор языка C выполняет как собственно компиляцию — перевод исходного текста на машинный язык, результатом чего является объектный модуль, так и редактирование связей — сборку из нескольких объектных модулей (в том числе, и библиотечных) исполняемого модуля.
Файлы с исходными текстами C-программ должны иметь расширение .c, например:hello.c. Результатом компиляции является файл, содержащий объектный модуль, его имя совпадает с именем исходного модуля, а расширение — .o, например:hello.o. Для файла, содержащего исполняемый модуль стандартного расширения не существует. При компиляции программы, состоящей из единственного исходного модуля, объектный модуль автоматически удаляется после создания компилятором исполняемого модуля.
Общий формат команды вызова компилятора имеет следующий вид (компилирование в linux):
gcc [опции] [выходной_файл] файл1 [файл2 :]
Наиболее часто употребляемые опции компилятора следующие:
-c | Подавляет фазу редактирования связей, создает объектный модуль для каждого исходного модуля из перечисленных в параметрах вызова.Выходной_файл с этой опцией не задается. Опция может применяться вместе с опцией -I |
-o | Компиляция и редактирование связей. Cоздает объектный модуль для каждого исходного модуля из перечисленных в параметрах вызова и имеющих расширение .c. Файлы с расширением .c рассматриваются как исходные модули и компилируются; файлы, имеющие расширение .o, рассматриваются как объектные модули и подключаются при редактировании связей. Параметр выходной_файл задает имя файла исполняемого модуля. Опция может применяться вместе с опциями -L, -l, -I. |
-L каталог | Добавить каталог в список каталогов, которые содержат объектные библиотечные модули. |
-lбиблиотека | При редактировании связей подключить модули из библиотеки. |
-I каталог | Искать включаемые (#include) файлы, имена которых не начинаются с /сначала в каталоге, а лишь затем — в стандартных каталогах для включаемых файлов. |
-E | Выполнить обработку указанных исходных модулей только препроцессором, результат направляется в стандартный вывод.Выходной_файл с этой опцией не задается. Опция может применяться вместе с опцией -I. |
-w | Подавить выдачу предупреждающих сообщений. |
Примеры использования компилятора:
gcc hello.c | Компиляция исходного модуля hello.c с выдачей сообщений об ошибках на стандартный вывод. Файл объектного модуля не создается. |
gcc -c hello.c | Компиляция исходного модуля hello.c с выдачей сообщений об ошибках на стандартный вывод. При успешной компиляции объектный модуль записывается в файл hello.o. |
gcc -o hello hello.o | Редактирование связей для объектного модуля hello.o, исполняемый модуль записывается в файл hello. |
gcc -o hello hello.o hello1.c | Создание исполняемого модуля в файле hello из объектного модуля hello.o и модуля hello1.c (последний модуль является исходным, он предварительно компилируется. |
gcc -o hello hello.o hello1.o -l hellolib | Создание исполняемого модуля в файле hello из объектных модулей hello.o и hello1.o c с подключением объектных модулей из библиотеки hellolib. |
gcc -o hello hello1.с -lm | Создание исполняемого модуля в файле hello из исходного модуля hello.с с выдачей сообщений об ошибках на стандартный вывод с подключением бибилиотеки math.h. Файл объектного модуля не создается. |
Как написать очень простой компилятор
вступление
Типичный компилятор выполняет следующие шаги:
- Разбор: исходный текст преобразуется в абстрактное синтаксическое дерево (AST).
- Разрешение ссылок на другие модули (C откладывает этот шаг до ссылки).
- Семантическая проверка: отсеивание синтаксически правильных утверждений, которые не имеют смысла, например, недоступный код или дублированные объявления.
- Эквивалентные преобразования и оптимизация высокого уровня: AST преобразуется, чтобы представить более эффективные вычисления с той же семантикой. Это включает, например, раннее вычисление общих подвыражений и константных выражений, устранение чрезмерных локальных назначений (см. Также SSA ) и т. Д.
- Генерация кода: AST преобразуется в линейный низкоуровневый код с переходами, распределением регистров и т.п. Некоторые вызовы функций могут быть встроены на этом этапе, некоторые циклы развернуты и т. Д.
- Оптимизация глазка: низкоуровневый код сканируется для выявления простых локальных неэффективностей, которые устраняются.
Большинство современных компиляторов (например, gcc и clang) повторяют последние два шага еще раз. Они используют промежуточный низкоуровневый, но независимый от платформы язык для начальной генерации кода. Затем этот язык преобразуется в специфичный для платформы код (x86, ARM и т. Д.), Делая примерно то же самое оптимизированным для платформы способом. Это включает, например, использование векторных команд, когда это возможно, переупорядочение команд для повышения эффективности прогнозирования ветвлений и так далее.
После этого объектный код готов к связыванию. Большинство компиляторов нативного кода знают, как вызывать компоновщик для создания исполняемого файла, но сам по себе это не этап компиляции. В таких языках, как Java и C #, связывание может быть полностью динамическим, выполняемым виртуальной машиной во время загрузки.
Помните основы
- Сделай так, чтобы это работало
- Сделай это красиво
- Сделайте это эффективным
Эта классическая последовательность применима ко всей разработке программного обеспечения, но имеет повторение.
Сконцентрируйтесь на первом шаге последовательности. Создайте простейшую вещь, которая могла бы работать.
Читай книги!
Прочитайте Книгу Дракона Ахо и Уллмана. Это классика и до сих пор вполне применима сегодня.
Современный дизайн компилятора также хвалят.
Если этот материал слишком сложен для вас сейчас, сначала прочитайте несколько вступлений о разборе; обычно библиотеки разбора включают вступления и примеры.
Убедитесь, что вам удобно работать с графиками, особенно с деревьями. Это вещи, из которых сделаны программы на логическом уровне.
Определите свой язык хорошо
Используйте любые обозначения, которые вы хотите, но убедитесь, что у вас есть полное и последовательное описание вашего языка. Это включает как синтаксис, так и семантику.
Самое время написать фрагменты кода на вашем новом языке в качестве тестовых примеров для будущего компилятора.
Используйте свой любимый язык
Можно писать компилятор на Python, Ruby или на любом другом языке, который вам удобен. Используйте простые алгоритмы, которые вы хорошо понимаете. Первая версия не должна быть быстрой, эффективной или полнофункциональной. Это только должно быть достаточно правильно и легко изменить.
Также можно писать разные этапы компилятора на разных языках, если это необходимо.
Приготовьтесь написать много тестов
Весь ваш язык должен быть покрыт тестовыми случаями; эффективно это будет определяться ими. Познакомьтесь с предпочтительными рамками тестирования. Пишите тесты с первого дня. Сконцентрируйтесь на «положительных» тестах, которые принимают правильный код, а не на обнаружение неправильного кода.
Регулярно запускайте все тесты. Исправьте неработающие тесты, прежде чем продолжить. Было бы стыдно получить плохо определенный язык, который не может принимать действительный код.
Создать хороший парсер
Генераторов парсеров много . Выберите то, что вы хотите. Вы также можете написать свой собственный парсер с нуля, но это только стоит, если синтаксис вашего языка мертв просто.
Парсер должен обнаруживать и сообщать о синтаксических ошибках. Напишите много тестовых случаев, как положительных, так и отрицательных; повторно используйте код, который вы написали при определении языка.
Выход вашего парсера — абстрактное синтаксическое дерево.
Если в вашем языке есть модули, вывод синтаксического анализатора может быть простейшим представлением «объектного кода», который вы генерируете. Существует множество простых способов выгрузить дерево в файл и быстро загрузить его обратно.
Создать семантический валидатор
Скорее всего, ваш язык допускает синтаксически правильные конструкции, которые могут не иметь смысла в определенных контекстах. Примером является дублированное объявление той же переменной или передача параметра неправильного типа. Валидатор обнаружит такие ошибки, глядя на дерево.
Валидатор также разрешает ссылки на другие модули, написанные на вашем языке, загружает эти другие модули и использует их в процессе проверки. Например, этот шаг гарантирует, что число параметров, переданных функции из другого модуля, является правильным.
Опять же, напишите и запустите множество тестовых случаев. Тривиальные случаи так же необходимы при устранении неполадок, как умные и сложные.
Генерировать код
Используйте самые простые методы, которые вы знаете. Часто вполне можно напрямую перевести языковую конструкцию (например, if
оператор) в слегка параметризованный шаблон кода, мало чем отличающийся от шаблона HTML.
Опять же, игнорируйте эффективность и сосредоточьтесь на правильности.
Таргетинг на независимую от платформы низкоуровневую виртуальную машину
Я полагаю, что вы игнорируете вещи низкого уровня, если вы не заинтересованы в деталях оборудования. Эти детали кровавые и сложные.
Ваши варианты:
- LLVM: позволяет эффективно генерировать машинный код, обычно для x86 и ARM.
- CLR: предназначен для .NET, в основном для x86 / Windows; имеет хороший JIT.
- JVM: ориентирован на мир Java, довольно мультиплатформенный, имеет хороший JIT.
Игнорировать оптимизацию
Оптимизация это сложно. Почти всегда оптимизация преждевременна. Создать неэффективный, но правильный код. Реализуйте весь язык, прежде чем пытаться оптимизировать полученный код.
Конечно, тривиальные оптимизации — это нормально. Но избегайте любых хитрых, волосатых вещей, пока ваш компилятор не станет стабильным.
И что?
Если все эти вещи не слишком пугающие для вас, пожалуйста, продолжайте! Для простого языка каждый из этапов может быть проще, чем вы думаете.
Просмотр «Hello world» из программы, созданной вашим компилятором, может стоить усилий.
Слово КОМПИЛЯТОР — Что такое КОМПИЛЯТОР?
Слово состоит из 10 букв:
первая к,
вторая о,
третья м,
четвёртая п,
пятая и,
шестая л,
седьмая я,
восьмая т,
девятая о,
последняя р,
Слово компилятор английскими буквами(транслитом) — kompilyator
Значения слова компилятор.
Что такое компилятор?
Компилятор
Компилятор Компилятоp (от англ. Compile — собирать вместе, составлять) — системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на языке, близком к машинному…
Энциклопедический фонд России
КОМПИЛЯТОР — (compiler) Компьютерная программа, переводящая программу, написанную на языке высокого уровня (high-level language), в подробные команды (называемые машинным кодом…
Словарь бизнес терминов. — 2001
Компилятор Компилятор — программа, преобразующая текст, написанный на алгоритмическом языке, в программу, состоящую из машинных команд. Компилятор создает законченный вариант программы на машинном языке.
Словарь финансовых терминов
КОМПИЛЯТОР, КОМПЬЮТЕРНАЯ ПРОГРАММА, которая переводит символы ЯЗЫКА ПРОГРАММИРОВАНИЯ в команды, которые может непосредственно воспринимать компьютер. Программы по большей части пишутся на ЯЗЫКАХ ВЫСОКОГО УРОВНЯ, таких как «Си», Паскаль или Бейсик…
Научно-технический энциклопедический словарь
Компилятор компиляторов
Компилятор компиляторов — программа, воспринимающая синтаксическое или семантическое описание языка программирования и генерирующая компилятор для этого языка.
ru.wikipedia.org
Компиляторы: принципы, технологии и инструменты
Компиляторы: принципы, технологии и инструменты — классический учебник по теории построения компиляторов под авторством Альфреда В. Ахо, Рави Сети и Джеффри Д. Ульмана, известный также как «Книга дракона»…
ru.wikipedia.org
Кросс-компилятор
Кросс-компиля́тор (англ. cross compiler) — компилятор, производящий исполняемый код для платформы, отличной от той, на которой исполняется сам кросс-компилятор. Такой инструмент бывает полезен, когда нужно получить код для платформы…
ru.wikipedia.org
Раскрутка компилятора
Раскрутка компилятора (англ. bootstrapping) — это такой способ создания компилятора для некоего языка программирования, когда компилятор пишется именно на целевом языке. Раскрутка также используется для переноса компиляторов на новые платформы.
ru.wikipedia.org
Оптимизирующий компилятор
Оптимизирующий компилятор — компилятор, в котором используются различные методы получения более оптимального программного кода при сохранении его функциональных возможностей.
ru.wikipedia.org
Русский язык
Кросс-компиля́тор, -а.
Орфографический словарь. — 2004
Примеры употребления слова компилятор
Но как, ведь автор жития зачастую не столько писатель, сколько компилятор?
Использовалась последняя версия Firefox Nightly, ORBX.js, ASM.js и компилятор Emscripten.
Есть такая версия, что вот он такой великий компилятор, что он собрал музыку, которая вообще в мире существовала за всю эпоху.
Версия Go 1.1 получила значительный прирост в производительности, более оптимизированный компилятор, линковщик и обновленные инструменты для разработчиков.
Правда, компилятор работает несколько странно, он без проблем распознает обычные команды JavaScript, но при загрузке библиотеки Underscore простейший код вызова объекта, выводящего на экран текст «Мяу!»
- компилирующий
- компилятивность
- компилятивный
- компилятор
- компиляция
- компланарный
- комплексирование
6 книг по компиляторам
Каждый программист должен знать, как работает его код, как он взаимодействует с «железом», и множество тонкостей разработки программного обеспечения. И желательно знать как работают компиляторы.
Компиляторы – неотъемлемая часть базовых знаний любого кодера. Поэтому мы составили подборку книг, которая поможет вам увеличить свои знания по этой важной теме.
Книга описывает проект Оберон – полную программную среду для современной рабочей станции. Суть проекта в том, чтобы создать проект, который будет спроектирован и реализован с нуля, а затем описан, объяснён и понят, как единое целое. Также пособие содержит подробнейшее описание компилятора языка Оберон и его графической подсистемы.
В этой книге будет подробно рассмотрена разработка компилятора для высокоуровневого языка программирования. Также в ней будут освещены все этапы его реализации. Вам будет представлен исходный код на нескольких языках программирования. Кроме того, пособие содержит теорию по формальным языкам и грамматикам, а благодаря обилию примеров весь материал будет легче запоминать. Работа предназначена для студентов технических вузов и всех тех, кто интересуется искусством программирования.
Книга содержит основные принципы разработки компиляторов, лексический и синтаксический анализ, генерацию кода, а также их детальное рассмотрение. Издание широко освещает вопросы оптимизации кода, его строгое изложение уравновешивается множеством практических примеров. Для того чтобы создать компилятор, необходимы знания языков программирования, архитектуры вычислительных систем, теории языков и пр. Устранить пробелы вам поможет эта книга.
Книга содержит информацию о фундаментальных техниках, которые являются общими для всех языковых парадигм. С их помощью вы сможете создать современный компилятор. Большое внимание уделяется техникам автоматизации, в том числе автоматизации проектирования компилятора.
Издание поможет каждому читателю обновить свои знания, развить навыки, научиться создавать качественные продукты разработки. Книга посвящена сборке мусора, уменьшению времени компиляции и оптимизации процесса. Акцент сделан на работу со встраиваемыми девайсами и способам отладки кода.
Пособие расскажет о большом выборе способов оптимизации кода и том, как выбрать наиболее эффективный. Оно также содержит информацию о проблемах проектирования и написания современных компиляторов.
Как написать простейший компилятор
9 великолепных бесплатных книг для изучения C
★ Компилятор — компиляторы .. Информация
6. Раздельной компиляции.
(Separate compilation)
Отдельное англ компиляции. separate compilation (раздельной компиляции) — части потока программы отдельно, а потом объединяют их линкер в одном модуле загрузки.
Исторически, особенность компилятора отражена в его названии англ. compile (компиляции) — собраться вместе, чтобы сделать, что он произвел как поток, и ссылки, компилятор может генерировать машинный код сразу. но позже, с ростом сложности и размера программ и увеличение время, затрачиваемое на перекомпиляцию, возникла необходимость разделить программу на части и выделить те библиотеки, которые могут быть собраны независимо друг от друга. В процессе трансляции программы компилятор сам по себе или вызывается компилятор создает объект модуль, который содержит дополнительную информацию, которая затем в процессе сборки деталей в исполняемый модуль используется для связывания и разрешения ссылок между частями программы. отдельный сборник также позволяет писать различные части исходного кода программ на различных языках программирования.
Появление раздельной компиляции и выбор макета, как произошел отдельный этап гораздо позже компилятора. В этой связи вместо термина «компилятор» иногда используют термин «транслятор» в качестве синонима в литературе, или, когда хотят подчеркнуть его способность переводить программу в машинный код и наоборот, употребляют термин «компилятор», чтобы подчеркнуть возможность собирать большое количество файлов с одного. вот только использовать в данном контексте, термины, «компилятор» и «транслятор» не так. даже если компилятор выполняет трансляцию программы сами, зарядный механизм требует внешней программы, компоновщик, компилятор не может рассматриваться в качестве своего рода переводчика, переводчик осуществляет перевод исходной программы и только. И даже больше не переводчики, такие как компиляторы, утилиты-компилятор системы make (сделать), который доступен на всех системах Unix.
Фактическая полезность make (сделать) — яркий пример довольно успешного осуществления раздельной компиляции. утилита make (сделать) управляет скрипт на интерпретируемом ввода инженерных языка, известного как makefile, содержащиеся в наборе, при запуске утилиты, входной текстовый файл. утилита сама по себе не выполняет никаких трансляций или макет де-факто инструмент make (сделать) функции менеджера компиляции процесс, который организует составление программы в соответствии с заданным сценарием. В частности, в процессе составления целевой программы утилиты make (сделать) заставляет переводчиков с языков программирования, а другую часть исходной программы в объектный код, а затем вызывает линкер, связывающий финальный исполняемый файл программы или библиотеки программы модуля. таким образом, разные части программы выполняются в отдельных исходных файлов, могут быть написаны на том же языке программирования или разных языков программирования. В процессе перекомпиляции программы транслируются только измененные части файлов исходного текста программы, в соответствии с которым продолжительность перекомпиляции много порой на порядок снижается.
Языковые процессоры: Ассемблер, компилятор и интерпретатор
Языковые процессоры: Ассемблер, компилятор и интерпретатор
Языковые процессоры —
Язык ассемблера зависит от машины, но мнемоника, которая используется для представления инструкций в нем, не может быть напрямую понятна машиной, а язык высокого уровня не зависит от машины. Компьютер понимает инструкции в машинном коде, т.е.е. в виде нулей и единиц. Написание компьютерной программы непосредственно в машинном коде — утомительная задача. Программы написаны в основном на языках высокого уровня, таких как Java, C ++, Python и т. Д., И называются исходным кодом . Этот исходный код не может быть выполнен непосредственно компьютером и должен быть преобразован в машинный язык для выполнения. Следовательно, для перевода программы, написанной на языке высокого уровня в машинный код, используется специальное программное обеспечение системы трансляции, которое называется Language Processor , а программа после преобразования в машинный код (объектная программа / объектный код).
Языковые процессоры могут быть любого из следующих трех типов:
- Компилятор —
Языковой процессор, который за один раз считывает полную исходную программу, написанную на языке высокого уровня, и переводит ее в эквивалентную программу на машинном языке, называется компилятором.
Пример: C, C ++, C #, JavaВ компиляторе исходный код успешно преобразуется в объектный код, если он не содержит ошибок. Компилятор указывает ошибки в конце компиляции с номерами строк, когда есть какие-либо ошибки в исходном коде.Ошибки должны быть устранены, прежде чем компилятор сможет снова успешно перекомпилировать исходный код.>
- Ассемблер —
Ассемблер используется для перевода программы, написанной на языке Ассемблер, в машинный код. Исходная программа — это вход ассемблера, который содержит инструкции на языке ассемблера. На выходе, сгенерированном ассемблером, является объектный код или машинный код, понятный компьютеру. - Интерпретатор —
Перевод отдельного оператора исходной программы в машинный код выполняется языковым процессором и выполняет его непосредственно перед переходом к следующей строке и называется интерпретатором. Если в операторе есть ошибка, интерпретатор завершает процесс перевода на этом операторе и отображает сообщение об ошибке. Интерпретатор переходит к следующей строке для выполнения только после устранения ошибки. Интерпретатор напрямую выполняет инструкции, написанные на языке программирования или сценариях, без предварительного преобразования их в объектный код или машинный код.
Пример: Perl, Python и Matlab.
Разница между компилятором и интерпретатором —
Компилятор | Переводчик |
---|---|
Компилятор — это программа, которая превращает весь исходный код языка программирования в исполняемый машинный код для ЦП. | берет исходную программу и запускает ее построчно, переводя каждую строку по мере ее поступления. |
Компилятору требуется много времени для анализа всего исходного кода, но общее время выполнения программы сравнительно меньше. | требуется меньше времени для анализа исходного кода, но общее время выполнения программы меньше. |
Компилятор генерирует сообщение об ошибке только после сканирования всей программы, поэтому отладка сравнительно сложна, поскольку ошибка может присутствовать в любом месте программы. | Его отладка проще, поскольку он продолжает переводить программу до тех пор, пока не будет обнаружена ошибка. |
Создает промежуточный объектный код. | Промежуточный объектный код не создается. |
Примеры: C, C ++, Java | Примеры: Python, Perl |
Вниманию читателя! Не прекращайте учиться сейчас. Ознакомьтесь со всеми важными концепциями теории CS для собеседований SDE с помощью курса CS Theory Course по доступной для студентов цене и станьте готовым для отрасли.
Что такое, Типы, Инструменты, Пример
- Подробности
Что такое компилятор?
Компилятор — это компьютерная программа, которая помогает преобразовать исходный код, написанный на языке высокого уровня, в машинный язык низкого уровня. Он переводит код, написанный на одном языке программирования, на другой язык без изменения смысла кода.Компилятор также делает конечный код эффективным, что оптимизирует время выполнения и объем памяти.
Процесс компиляции включает в себя основные механизмы трансляции и обнаружение ошибок. Процесс компиляции проходит лексический, синтаксический и семантический анализ во внешнем интерфейсе, а также генерацию и оптимизацию кода во внутреннем интерфейсе.
В этом руководстве по дизайну компилятора вы узнаете
Особенности компиляторов
- Корректность
- Скорость компиляции
- Сохранение правильного значения кода
- Скорость целевого кода
- Распознавание законных и нелегальных программ конструкции
- Хорошая отчетность / обработка ошибок
- Помощь по отладке кода
Типы компиляторов
Ниже приведены различные типы компиляторов:
- Однопроходные компиляторы
- Двухпроходные компиляторы
- Многопроходные компиляторы
Однопроходный компилятор
Однопроходный компилятор
При однопроходном компиляторе исходный код напрямую преобразуется в машинный код.Например, язык Паскаль.
Двухпроходный компилятор
Двухпроходный компилятор
Двухпроходный компилятор разделен на две части, а именно.
- Внешний интерфейс: Он отображает юридический код в промежуточное представление (IR).
- Серверная часть: Он отображает IR на целевую машину
Двухпроходный метод компилятора также упрощает процесс переназначения. Это также позволяет использовать несколько интерфейсов.
Многопроходные компиляторы
Многопроходные компиляторы
Многопроходный компилятор несколько раз обрабатывает исходный код или синтаксическое дерево программы. Он разделил большую программу на несколько небольших программ и обработал их. Он разрабатывает несколько промежуточных кодов. Все эти многопроходные системы принимают выход предыдущей фазы в качестве входа. Так что требуется меньше памяти. Он также известен как «Широкий компилятор».
Задачи компилятора
Основные задачи, выполняемые компилятором:
- Разбивает исходную программу на части и накладывает на них грамматическую структуру.
- Позволяет построить желаемую целевую программу из промежуточного представления, а также создать таблица символов
- Компилирует исходный код и обнаруживает в нем ошибки
- Управляет хранением всех переменных и кодов.
- Поддержка отдельной компиляции
- Чтение, анализ всей программы и перевод в семантически эквивалентный
- Преобразование исходного кода в объектный код в зависимости от типа машины
История компилятора
Важным ориентиром истории компилятора являются: следует:
- Слово «компилятор» впервые было использовано в начале 1950-х годов Грейс Мюррей Хоппер.
- Первый компилятор был построен Джоном Бэкумом и его группой между 1954 и 1957 годами в IBM.
- COBOL был первым языком программирования, который был скомпилировано на нескольких платформах в 1960 г.
- Изучение проблем сканирования и синтаксического анализа проводилось в 1960-х и 1970-х годах, чтобы предоставить полное решение
Шаги для систем обработки языка
Прежде чем узнать о концепции компиляторов, вам сначала необходимо понимать несколько других инструментов, которые работают с компиляторами.
Шаги для систем обработки языков
- Препроцессор : Препроцессор считается частью компилятора. Это инструмент, который производит ввод для компилятора. Он занимается обработкой макросов, расширением, расширением языка и т. Д.
- Интерпретатор : Интерпретатор подобен компилятору, который переводит язык высокого уровня в машинный язык низкого уровня. Основное различие между ними заключается в том, что интерпретатор читает и преобразует код построчно.Компилятор сразу считывает весь код и создает машинный код.
- Ассемблер : переводит код языка ассемблера на машинно-понятный язык. Выходной результат ассемблера известен как объектный файл, который представляет собой комбинацию машинных инструкций, а также данных, необходимых для хранения этих инструкций в памяти.
- Компоновщик : Компоновщик помогает связывать и объединять различные объектные файлы для создания исполняемого файла.Все эти файлы могли быть скомпилированы отдельными ассемблерами. Основная задача компоновщика — поиск вызываемых модулей в программе и определение того места в памяти, где хранятся все модули.
- Загрузчик : Загрузчик является частью ОС, которая выполняет задачи по загрузке исполняемых файлов в память и их запуску. Он также вычисляет размер программы, которая создает дополнительное пространство памяти.
- Кросс-компилятор : Кросс-компилятор в конструкции компилятора — это платформа, которая помогает вам генерировать исполняемый код.
- Компилятор из исходного кода в исходный : Компилятор из исходного кода в исходный — это термин, используемый, когда исходный код одного языка программирования транслируется в исходный код другого языка.
Инструменты построения компилятора
Инструменты построения компилятора были представлены как компьютерные технологии, распространившиеся по всему миру. Они также известны как компиляторы-компиляторы, компиляторы-генераторы или переводчики.
Эти инструменты используют определенный язык или алгоритм для определения и реализации компонента компилятора.Ниже приведен пример инструментов построения компилятора.
- Генераторы сканера : Этот инструмент принимает в качестве входных данных регулярные выражения. Например, LEX для операционной системы Unix.
- Механизмы синтаксически-управляемого перевода : Эти программные инструменты предлагают промежуточный код с помощью дерева синтаксического анализа. Его цель — связать один или несколько переводов с каждым узлом дерева синтаксического анализа.
- Генераторы синтаксического анализатора: Генератор синтаксического анализатора принимает грамматику в качестве входных данных и автоматически генерирует исходный код, который может анализировать потоки символов с помощью грамматики.
- Автоматические генераторы кода : принимает промежуточный код и преобразует его в машинный язык.
- Механизмы обработки потока данных : Этот инструмент полезен для оптимизации кода. Здесь информация предоставляется пользователем, а промежуточный код сравнивается для анализа любой связи. Это также известно как анализ потока данных. Это поможет вам узнать, как значения передаются из одной части программы в другую.
Зачем нужен компилятор?
- Компилятор проверяет всю программу, поэтому нет синтаксических или семантических ошибок
- Исполняемый файл оптимизирован компилятором, поэтому он выполняется быстрее
- Позволяет создавать внутреннюю структуру в памяти
- Нет необходимости выполнять программа на той же машине, на которой она была создана
- Перевести всю программу на другой язык
- Сгенерировать файлы на диске
- Свяжите файлы в исполняемый формат
- Проверьте синтаксические ошибки и типы данных
- Помогает вам улучшить ваше понимание семантика языка
- Помогает решать проблемы производительности языка
- Возможность для нетривиального проекта программирования
- Методы, используемые для создания компилятора, могут быть полезны и для других целей
Применение компиляторов
- Дизайн компилятора помогает полностью реализация языков программирования высокого уровня
- Su Оптимизация pport для параллелизма компьютерной архитектуры
- Проектирование новых иерархий памяти машин
- Широко используется для трансляции программ
- Используется с другими инструментами повышения производительности программного обеспечения
Резюме
- Компилятор — это компьютерная программа, которая помогает преобразовывать написанный исходный код на языке высокого уровня на машинный язык низкого уровня
- Корректность, скорость компиляции, сохранение правильного значения кода — некоторые важные особенности конструкции компилятора
- Компиляторы разделены на три части 1) Компиляторы за один проход 2) Двухпроходные компиляторы и 3) Многопроходные компиляторы
- Слово «компилятор» было впервые использовано в начале 1950-х годов Грейс Мюррей Хоппер.
- Шаги для системы обработки языка: препроцессор, интерпретатор, ассемблер, компоновщик / загрузчик
- Важная конструкция компилятора инструменты: 1) генераторы сканера, 2) синтаксис-3) механизмы направленного перевода. , 4) Генераторы парсеров, 5) Автоматические генераторы кода
- Основной задачей компилятора является проверка всей программы на отсутствие синтаксических или семантических ошибок
1.1 Что такое компилятор?
1.1 Что такое компилятор?
Далее: 1.2 Что такое
Up: 1 Введение
Пред .: 1 Введение
Содержание
Компилятор — это программа, которая переводит исходную программу, написанную
на каком-то языке программирования высокого уровня (например, Java) в машину
код для некоторой компьютерной архитектуры (например, Intel Pentium
архитектура). Сгенерированный машинный код может быть позже выполнен на многих
раз против разных данных каждый раз.
Интерпретатор читает исполняемую исходную программу, написанную на
язык программирования высокого уровня, а также данные для этой программы, и
он запускает программу на основе данных для получения некоторых результатов. Один
пример — интерпретатор оболочки Unix, который запускает операционную систему
команды в интерактивном режиме.
Обратите внимание, что и интерпретаторы, и компиляторы (как и любая другая программа)
написан на каком-то языке программирования высокого уровня (который может быть
отличается от языка, который они принимают), и они переведены на
Машинный код.Например, интерпретатор Java может быть полностью
написано на C или даже на Java. Исходная программа интерпретатора
машинно-независимый, поскольку он не генерирует машинный код. (Обратите внимание
разница между сгенерировать и переведена в машину
кода.) Интерпретатор обычно медленнее, чем компилятор, потому что он
обрабатывает и интерпретирует каждый оператор в программе столько раз, сколько
количество оценок этого утверждения. Например, когда
for-loop интерпретируется, операторы внутри тела for-loop будут
анализироваться и оцениваться на каждом этапе цикла.Некоторые языки, например
Java и Lisp поставляются с интерпретатором и компилятором. Ява
исходные программы (классы Java с расширением .java
)
переведены компилятором javac
в файлы с байтовым кодом (с
.class
расширение). Интерпретатор Java, называемый
виртуальная машина Java (JVM) может фактически интерпретировать байтовые коды
напрямую или может внутренне скомпилировать их в машинный код, а затем
выполнить этот код (JIT: своевременная компиляция).
Составители и интерпретаторы — не единственные примеры переводчиков.Вот еще несколько:
Исходный язык | Переводчик | Целевой язык |
LaTeX | Средство форматирования текста | PostScript |
SQL | процессор запросов к базе данных | План оценки запросов |
Ява | компилятор javac | Байт-код Java |
Ява | кросс-компилятор | Код C ++ |
Английский текст | Понимание естественного языка | семантика (значение) |
Регулярные выражения | Сканер-генератор JLex | сканер на Java |
БНФ языка | Генератор парсера CUP | парсер на Java |
Этот курс в основном посвящен компиляторам для высокоуровневого программирования.
языков, но те же методы применимы к переводчикам или любым другим
схема составления.
Далее: 1.2 Что такое
Up: 1 Введение
Пред .: 1 Введение
Содержание
2015-01-20
Компиляторы
— Учебники по C ++
Основные инструменты, необходимые для выполнения этих руководств, — это компьютер и набор инструментов компилятора, способный компилировать код C ++ и создавать программы для работы на нем.
C ++ — это язык, который сильно развился за эти годы, и в этих руководствах объясняются многие функции, недавно добавленные в язык.Следовательно, чтобы правильно следовать руководствам, необходим последний компилятор. Он должен поддерживать (хотя бы частично) функции, представленные стандартом 2011 года.
Многие поставщики компиляторов поддерживают новые функции в разной степени. Внизу страницы указаны некоторые компиляторы, которые, как известно, поддерживают необходимые функции. Некоторые из них бесплатны!
Если по какой-либо причине вам нужно использовать какой-либо старый компилятор, вы можете получить доступ к более старой версии этих руководств здесь (больше не обновляются).
Что такое компилятор?
Компьютеры понимают только один язык, и этот язык состоит из наборов инструкций, состоящих из единиц и нулей. Этот компьютерный язык соответственно называется машинным языком .
Одна команда для компьютера может выглядеть так:
Программа на машинном языке конкретного компьютера, которая позволяет пользователю вводить два числа, складывает два числа и отображает итоговую сумму, может включать следующие инструкции машинного кода:
00000 | 10011110 | |
00001 | 11110100 | |
00010 | 10011110 | |
00011 | 11010100 | |
00100 | 10111111 | |
00101 |
| |
Даже если вы не совсем понимаете приведенный выше код, вы должны быть в состоянии оценить, насколько проще будет программировать на языке C ++ по сравнению с машинным языком.
Поскольку компьютер может понимать только машинный язык, а люди хотят писать на языках высокого уровня, языки высокого уровня в какой-то момент должны быть переписаны (переведены) на машинный язык. Это делается с помощью специальных программ, называемых компиляторами, интерпретаторами или ассемблерами, которые встроены в различные программные приложения.
C ++ разработан как компилируемый язык, что означает, что он обычно переводится на машинный язык, который может быть понят непосредственно системой, что делает сгенерированную программу высокоэффективной.Для этого необходим набор инструментов, известный как набор инструментов разработки, ядром которого являются компилятор и его компоновщик.
Консольные программы
Консольные программы - это программы, которые используют текст для связи с пользователем и окружающей средой, например для вывода текста на экран или чтения ввода с клавиатуры. С консольными программами
легко взаимодействовать, и они обычно имеют предсказуемое поведение, идентичное для всех платформ. Они также просты в реализации и поэтому очень полезны для изучения основ языка программирования: все примеры в этих руководствах являются консольными программами.
Способ компиляции консольных программ зависит от конкретного инструмента, который вы используете.
Самый простой способ для новичков компилировать программы на C ++ - использовать интегрированную среду разработки (IDE). IDE обычно объединяет несколько инструментов разработки, включая текстовый редактор и инструменты для компиляции программ прямо из него.
Здесь у вас есть инструкции по компиляции и запуску консольных программ с использованием различных бесплатных интегрированных интерфейсов разработки (IDE):
Если у вас есть среда Linux или Mac с функциями разработки, вы сможете скомпилировать любой из примеров непосредственно из терминала, просто включив флаги C ++ 11 в команду для компилятора:
Компилятор | Платформа | Команда |
---|---|---|
GCC | Linux и другие... | g ++ -std = c ++ 0x example.cpp -o example_program |
Clang | OS X, среди прочего ... | clang ++ -std = c ++ 11 -stdlib = libc ++ example.cpp -o example_program |
Как работают компиляторы | Баелдунг по информатике
Мы открываем новую область компьютерных наук. Если у вас есть несколько лет опыта в области компьютерных наук или исследований, и вы заинтересованы в том, чтобы поделиться этим опытом с сообществом (и, конечно, получать деньги за свою работу), загляните на страницу «Напишите для нас».Ура, Ойген
1. Введение
языков программирования были созданы, чтобы позволить разработчикам писать понятный человеку исходный код. Однако компьютеры работают с машинным кодом, который люди с трудом могут писать или читать. Таким образом, компиляторы переводят исходный код языка программирования в машинный код, предназначенный для конкретной машины .
В этой статье мы разберем этапы процесса компиляции. Затем мы увидим различия между компиляторами и интерпретаторами.Наконец, мы познакомим вас с примерами нескольких компиляторов современных языков программирования.
2. Этапы компиляции
Как мы уже упоминали, процесс компиляции преобразует исходный код высокого уровня в машинный код низкого уровня, который может выполняться целевой машиной. Более того, важная роль компиляторов - информировать разработчика о допущенных ошибках, особенно связанных с синтаксисом.
Процесс компиляции состоит из нескольких этапов:
- Лексический анализ
- Анализ синтаксиса
- Семантический анализ
- Генерация промежуточного кода
- Оптимизация
- Генерация кода
В этом разделе мы подробно обсудим каждый этап.
2.1. Лексический анализ
Первым этапом компиляции является лексический анализ. На этом этапе компилятор разбивает исходный код на фрагменты, называемые лексемами. Лексема - это абстрактная единица лексической системы определенного языка. Давайте проанализируем простой пример:
Строковое приветствие = "привет";
В приведенном выше утверждении у нас пять лексем:
- Строка
- приветствие
- =
- «привет»
- ;
После разделения кода на лексемы создается последовательность токенов.Последовательность токенов - это конечный продукт лексического анализа. Таким образом, лексический анализ также часто называют токенизацией. Токен - это объект, описывающий лексему. Он предоставляет информацию о назначении лексемы, например о том, является ли она ключевым словом, именем переменной или строковым литералом. Кроме того, в нем хранятся данные о местоположении исходного кода лексемы.
2.2. Синтаксический анализ
Во время синтаксического анализа компилятор использует последовательность токенов, сгенерированных на первом этапе. Токены используются для создания структуры, называемой абстрактным синтаксическим деревом (AST), которая представляет собой дерево, представляющее логическую структуру программы.
На этом этапе компилятор проверяет грамматическую структуру исходного кода и правильность его синтаксиса. Между тем, любые синтаксические ошибки приводят к ошибке компиляции, о которой компилятор сообщает разработчику.
Короче говоря, синтаксический анализ отвечает за две задачи:
- Проверяет исходный код на наличие синтаксических ошибок.
- Он генерирует абстрактное синтаксическое дерево, которое используется на следующем этапе.
2.3. Семантический анализ
На этом этапе компилятор использует абстрактное синтаксическое дерево для обнаружения любых семантических ошибок, например:
- присвоение переменной неправильного типа
- объявление переменных с одинаковыми именами в той же области видимости
- с использованием необъявленной переменной
- с использованием ключевого слова языка в качестве имени переменной
Семантический анализ можно разделить на три этапа:
- Проверка типа - проверяет соответствие типа в операторах присваивания, арифметических операциях, функциях и вызовах методов.
- Проверка управления потоком - исследует, правильно ли используются структуры управления потоком и правильно ли осуществляется доступ к классам и объектам.
- Проверка этикеток - подтверждает использование этикеток и идентификаторов.
Для достижения всех вышеперечисленных целей во время семантического анализа компилятор выполняет полный обход абстрактного синтаксического дерева. Семантический анализ, наконец, создает аннотированный AST, который описывает значения его атрибутов.
2.4. Генерация промежуточного кода
В процессе компиляции компилятор может сгенерировать одну или несколько промежуточных форм кода.
«После синтаксического и семантического анализа исходной программы многие компиляторы генерируют явное низкоуровневое или машиноподобное промежуточное представление, которое мы можем рассматривать как программу для абстрактной машины. Это промежуточное представление должно обладать двумя важными свойствами: его легко создавать и легко переводить на целевую машину ». - Компиляторы. Принципы, методы и инструменты. Второе издание. Альфред В. Ахо. Колумбийский университет.Моника С. Лам. Стэндфордский Университет. Рави Сетхи. Avaya.
Промежуточный код не зависит от машины. Таким образом, нет необходимости в уникальных компиляторах для каждой отдельной машины . Кроме того, методы оптимизации легче применять к промежуточному коду, чем к машинному коду. Промежуточный код имеет две формы представления:
- High-Level - аналогично исходному языку. В этой форме мы можем легко повысить производительность исходного кода.Однако он менее предпочтителен для повышения производительности целевой машины.
- Низкий уровень - близко к машинному коду машины. Он предпочтителен для оптимизации машин.
2,5. Оптимизация
На этапе оптимизации компилятор использует различные способы повышения эффективности кода . Безусловно, процесс оптимизации должен следовать трем важным правилам:
- Полученный код не может изменить исходное значение программы.
- Оптимизация должна быть направлена на потребление меньшего количества ресурсов и ускорение работы программного обеспечения.
- Процесс оптимизации не должен существенно влиять на общее время компиляции.
Давайте посмотрим на несколько примеров методов оптимизации:
- Встраивание функции - замена вызова функции ее телом.
- Устранение мертвого кода - компилятор избавляется от кода, который никогда не выполняется, или, если он выполняется, возвращенный результат не используется.
- Слияние циклов - выполнение в одном цикле операций из соседних циклов с одинаковыми условиями итерации.
- Комбинирование инструкций - инструкции, реализующие аналогичные операции, объединяются в одну; например, х = х + 10; х = х - 7; можно заменить на x = x + 3;
2.
6. Генерация кода
Наконец, компилятор преобразует оптимизированный промежуточный код в машинный код, выделенный для целевой машины.Окончательный код должен иметь то же значение, что и исходный код, и быть эффективным с точки зрения использования памяти и ресурсов ЦП. Кроме того, процесс генерации кода также должен быть эффективным.
2,7. Практический пример
На приведенной ниже блок-схеме мы видим пример процесса компиляции простого оператора.
3. Компилятор против интерпретатора
Как мы уже знаем, компилятор преобразует исходный код высокого уровня в код низкого уровня. Затем целевая машина выполняет код низкого уровня.С другой стороны, интерпретатор анализирует и выполняет исходный код напрямую. Интерпретатор обычно использует одну из нескольких техник:
- Анализирует (разбирает) исходный код и выполняет его напрямую.
- Преобразует исходный код высокого уровня в промежуточный код и немедленно выполняет его.
- Явно выполняет сохраненный предварительно скомпилированный код, созданный компилятором. В этом случае компилятор принадлежит системе интерпретатора.
Давайте посмотрим краткое сравнение интерпретатора и компилятора:
КОМПИЛЯТОР: | ПЕРЕВОДЧИК: |
1.Преобразует код, но не выполняет его. | 1. Выполняет код напрямую. |
2. Реализация компилятора требует знания целевой машины. | 2. Нет необходимости в знаниях о целевой машине, так как интерпретатор выполняет код. |
3. Каждая инструкция переводится только один раз. | 3. Одна и та же инструкция может быть проанализирована несколько раз. |
4. Скомпилированная программа запускается быстрее. | 4. Интерпретируемые программы выполняются медленнее, но на их интерпретацию уходит меньше времени, чем на компиляцию и выполнение. |
5. Потребляет больше памяти из-за промежуточной генерации кода. | 5. Обычно выполняет входной код напрямую, поэтому потребляет меньше памяти. |
6. Примеры скомпилированных языков: Java, C ++, Swift, C #. | 6. Примеры интерпретируемых языков: Ruby, Lisp, PHP, PowerShell. |
4. Примеры компилятора
4.1. Javac
В Java исходный код сначала компилируется в байт-код компилятором javac. Затем виртуальная машина Java (JVM) интерпретирует и выполняет байт-код. Итак, javac - отличный пример компилятора, который принадлежит системе интерпретатора. Такая система делает Java переносимой и многоплатформенной.
Более того, существуют другие языки, такие как Kotlin или Scala, которые также компилируются в байт-код, но используют уникальные компиляторы. Таким образом, JVM может выполнять код, изначально написанный с использованием различных технологий.
4.2. Моно
Mono - это набор инструментов, включая компилятор языка программирования C #, для выполнения программного обеспечения, предназначенного для платформы .NET. Он был создан для того, чтобы приложения .NET могли работать на разных платформах. Более того, важной целью было предоставить разработчикам, работающим над Linux, лучшую среду и инструменты для работы с платформой .NET.
Компилятор преобразует исходный код C # в промежуточный байт-код. После этого виртуальная машина выполнит его. И компилятор C #, и виртуальная машина принадлежат набору инструментов Mono.
4.3. Коллекция компиляторов GNU
Коллекция компиляторов GNU (GCC) - это набор компиляторов с открытым исходным кодом, принадлежащих проекту GNU. Эти компиляторы могут работать на различных аппаратных и программных платформах. Следовательно, они могут генерировать машинный код для различных архитектур и операционных систем.
Во время компиляции GCC отвечает за обработку аргументов, вызов компилятора для конкретного языка программирования, запуск программы ассемблера и, в конечном итоге, запуск компоновщика для создания исполняемого двоичного файла.
GCC состоит из компиляторов для нескольких языков программирования:
- C (gcc)
- C ++ (g ++)
- Objective-C (gobjc)
- Фортран (G77 и GFortran)
- Ява (gcj)
- Ада (комар)
5. Заключение
В этой статье мы описали роль компилятора. Далее мы прошли все этапы процесса компиляции. Затем мы обсудили различия между компилятором и интерпретатором. Наконец, мы упомянули несколько реальных примеров компиляторов.
Что такое компилятор? - Определение с сайта WhatIs.com
К
Компилятор - это специальная программа, которая обрабатывает операторы, написанные на определенном языке программирования, и превращает их в машинный язык или «код», который использует процессор компьютера. Обычно программист пишет операторы языка на таком языке, как Паскаль или Си, по одной строке за раз, используя редактор . Созданный файл содержит так называемые исходные операторы .Затем программист запускает компилятор соответствующего языка, указывая имя файла, содержащего исходные операторы.
При выполнении (запуске) компилятор сначала анализирует (или анализирует) все операторы языка синтаксически один за другим, а затем, на одном или нескольких последовательных этапах или «проходах», строит выходной код, следя за тем, чтобы операторы, которые ссылаются на к другим операторам в окончательном коде относятся правильно. Традиционно выходные данные компиляции называются объектным кодом или иногда объектным модулем . (Обратите внимание, что термин «объект» здесь не имеет отношения к объектно-ориентированному программированию.) Объектный код - это машинный код, который процессор может выполнять по одной инструкции за раз.
Язык программирования Java, язык, используемый в объектно-ориентированном программировании, представил возможность компиляции вывода (называемого байт-кодом), который может работать на любой платформе компьютерной системы, для которой предоставляется виртуальная машина Java или интерпретатор байт-кода для преобразования байт-кода в инструкции. который может выполняться фактическим аппаратным процессором.Используя эту виртуальную машину, байт-код может быть дополнительно перекомпилирован на платформе исполнения с помощью своевременного компилятора. (См. Также: компилятор Java)
Традиционно в некоторых операционных системах после компиляции требовался дополнительный этап - определение относительного расположения инструкций и данных, когда более одного объектного модуля должны были запускаться одновременно, и они перекрестно ссылались на последовательности инструкций друг друга или данные. Этот процесс иногда назывался редактированием связи , а результат - загрузочным модулем .
Компилятор работает с языками, которые иногда называют 3GL, и языками более высокого уровня. Ассемблер работает с программами, написанными на языке ассемблера процессора.
Последнее обновление: сентябрь 2016 г.
Продолжить чтение о компиляторе
Введение в компиляторы и дизайн языка
Введение в компиляторы и дизайн языка
Компилятор переводит программу, написанную на языке высокого уровня, в программу, написанную на языке более низкого уровня.Для студентов, изучающих информатику, создание компилятора с нуля - это обряд посвящения: сложный и увлекательный проект, который предлагает понимание многих различных аспектов информатики, некоторые из которых являются глубоко теоретическими, а другие - весьма практичными.
Эта книга представляет собой введение в создание компилятора за один семестр, позволяя читателю создать простой компилятор, который принимает C-подобный язык и переводит его на рабочий язык ассемблера X86 или ARM. Он больше всего подходит для студентов, которые имеют некоторый опыт программирования на C и прошли курсы по структурам данных и компьютерной архитектуре.
Это бесплатный онлайн-учебник: вы можете получить доступ к главам в формате PDF.
прямо внизу. Если вы предпочитаете держать настоящую книгу, вы также можете приобрести ее в твердом или мягком переплете ниже.
Учебник и материалы были разработаны профессором Дугласом Тейном в рамках класса компиляторов CSE 40243 в Университете Нотр-Дам.
Присоединяйтесь к нашему списку рассылки, чтобы получать сообщения о новых выпусках и других обновлениях.
Автор дает разрешение на загрузку, печать и использование этих PDF-файлов в личных и академических целях.Коммерческая печать или распространение запрещено. Вместо того, чтобы копировать PDF-файлы локально,
укажите учащимся на эту страницу (compilerbook.org), чтобы они могли получить доступ к последней версии.
Ресурсы кода. Репозиторий github compilerbook-examples
содержит дополнительные ресурсы, соответствующие книге, в том числе несколько сканеров и парсеров,
начальная структура кода для компилятора проекта и примеры тестовых случаев для каждого этапа
сканер, парсер, проверка типов и генератор кода.
Errata. Нашли опечатку или ошибку? Пожалуйста, отправьте электронное письмо автору dthain
по адресу nd
dot edu
с заголовком «Ошибки в сборнике», и я буду счастлив исправить его и поблагодарить вас в следующем выпуске.
.