Возможно, вам не понадобится делать компилятор, но вы должны понимать, как работают языки высокого уровня! (Ключ! Стучите по доске!)
Запись Baidu:
Принцип компиляции, после анализа общего принципа компиляции, сформировал автономную техническую теорию, которая берет словарь в качестве ядра и объединяет структуру данных слова для завершения процесса компиляции. Сгенерируйте словарь (генератор словарей), проанализировав лексический метод, проанализируйте грамматику для генерации частичного кода и установите указатель данных (транслятор), соберите частичный код для генерации потока целевого машинного языка и установите пространство потока данных, такое как объекты и указатели, вызываемые программой, и, наконец, завершение исполняемой программы (ассемблера) тремя нечеткими процессами (поскольку эти процессы неотделимы от словаря, компиляция будет иметь взаимное влияние), преобразование компьютерного языка высокого уровня в поток кода машинного языка , это наш принцип компиляции.
Что такое компилятор и интерпретатор ? Их основные отличия.
Принцип компиляции не имеет ничего общего с языком ассемблера
Принцип компиляции заключается в ознакомлении с общими принципами и основными методами построения компилятора. Содержимое включает язык и грамматику, лексический анализ, грамматический анализ, грамматический перевод, генерацию промежуточного кода, управление хранением, оптимизацию кода и генерацию целевого кода.
Язык ассемблера (язык ассемблера) — это язык низкого уровня, используемый в электронных компьютерах, микропроцессорах, микроконтроллерах или других программируемых устройствах, также известный как символьный язык.
Принцип компиляции заключается в изучении различных теорий в процессе преобразования различных языков в машинный. Принцип компиляции заключается в преобразовании компьютерного языка в машинный язык, который можно запускать непосредственно на компьютерном оборудовании, что является своего рода языком перевода.
- 1. Превращение языка высокого уровня в машинный язык включает два метода: один — это компиляция, а другой — интерпретация;
- 2. Превратите ассемблер в машинный язык, называемый ассемблером.
- Компиляция: язык высокого уровня -> машинный язык (инструкция);
- Сборка: инструкция по сборке -> машинная инструкция;
Преобразование языка программирования - Перевод — это возможность преобразовать исходную программу на определенном языке в программу на другом языке — программу на целевом языке без изменения семантики.
- В частности, компиляция относится к преобразованию языка высокого уровня в язык низкого уровня.
- Интерпретация — примите вводное предложение на определенном языке высокого уровня, объясните его и управляйте компьютером, чтобы выполнить его, немедленно получить результат предложения, а затем принять следующее предложение.
Работа компилятора
- лексический анализ
- Парсинг
- Семантический анализ и генерация промежуточного кода
- оптимизация
- Генерация объектного кода
Компиляция. Как работает компилятор
1. Лексический анализ
- задача
— введите исходную программу и просканируйте строку, составляющую исходную программу.
Описывать и разбирать, определять отдельные слова. - слово
— наименьшая грамматическая единица, имеющая практическое значение в языках высокого уровня,
Он состоит из символов.
Void jisuan() int y,c,d; float x,a,b; x=a+b*50; y=c+)d*(x+b; >
- Основные слова: Void, int, float
- Идентификатор a, b, c, d, x, y, jisuan
- Целочисленная константа: 50
- Операторы: +, -, *, =
- Ограничительный символ: <> ;, ()
подводить итоги: - Лексический анализ распознает правильные слова в соответствии с лексическими правилами, преобразует их в единые спецификации и резервирует их.
- Преобразование
— преобразование основных символов, операторов и ограничительных символов.
— преобразование идентификатора
— постоянное преобразование
— Формат после преобразования: (номер класса, внутренний код) - Эффективными инструментами для описания лексических правил являются регулярные формы и конечные автоматы.
2. Синтаксический анализ
- Задачи: — На основе лексического анализа, согласно грамматическим правилам языка, составить словесные символы в различные грамматические единицы: словосочетания, придаточные, языковые
- Правила грамматики: — Правила языка, также называемые грамматикой; определяют, как слова образуют фразы, предложения, процедуры и процедуры.
- Представление грамматических правил: — BNF: A :: = B | C
Правила синтаксиса для операторов присваивания - A::=V=E
- E::=T|E+T
- T::=F|T*F
- F::=V|(E)|C
- V :: = Идентификатор
Метод грамматического анализа
– Вывести и уменьшить - Деривация-крайний левый вывод, крайний правый вывод
- Редукция — крайнее правое уменьшение, крайнее левое уменьшение
3. Семантический анализ и генерация промежуточного кода.
- задача
анализирует значение различных грамматических категорий, выявленных с помощью грамматического анализа,
Выполнение и предварительное преобразование между исходным кодом и целевым кодом
Код . - Работа в два этапа
— выполнять статическую семантическую проверку для каждой грамматической категории.
— если семантика верна, промежуточный код будет переведен - Промежуточная форма кода
— кватернион, троичный, обратный польский
Например, замените x = a + b * 50 на промежуточный код.
Число Оператор Левый операнд Правый операнд Результат (1) Целочисленная константа50Преобразовать в действительную постоянную T1 (2) * b T1 T2 (3) + a T2 T3 (4) = T3 x
4. Оптимизировать
- задача
— Обработка и преобразование ранее сгенерированного промежуточного кода для создания более эффективного целевого кода на последнем этапе. - Принцип: эквивалентное преобразование
- Основные аспекты
— Извлечение общих подвыражений, объединение известных величин, удаление бесполезных предложений, оптимизация цикла и т. д.
понимание:
фактически переводит код программы на языке высокого уровня, который мы пишем, в промежуточный код, который легко превратить в машинный язык. Я думаю, что он похож на язык ассемблера, но немного выше, чем язык ассемблера. На этом языковом уровне цель оптимизации кода — уменьшить количество компьютерных операций, чтобы достичь цели оптимизации кода.
5. Генерация целевого кода
- задача
— Преобразование оптимизированного промежуточного кода в код низкоуровневого языка на конкретном компьютере. - Форма объектного кода
— Абсолютный код инструкции: целевой код, который может быть выполнен немедленно.
— Код инструкции сборки: программа на языке ассемблера, которая может быть запущена только после сборки через последовательность программирования ассемблера.
— код перемещаемой инструкции: сначала подключите целевые модули, определите расположение переменных и констант в основной памяти и загрузите их в основную память, чтобы они стали абсолютным кодом инструкции, который можно запускать. .
6. Формы и управление формами
- Функция таблицы:
— используется для записи различной информации об исходной программе и различных условиях в процессе компиляции. - Таблицы, относящиеся к первым трем этапам компиляции:
— таблица символов, таблица констант, таблица меток, таблица записей подпрограмм, таблица промежуточных кодов и т. д.
1) Таблица символов
• Таблица символов: используется для регистрации имен констант, имен переменных, имен массивов, имен процессов и т. д. в исходной программе и записи их свойств, определений и ссылок.
NAME INFORMATION k целое число, переменный адрес n целое число, переменный адрес m целое число, переменный адрес
2) Постоянная таблица и таблица меток
Постоянная таблица меток таблицы Значение НАЗВАНИЕ ИНФОРМАЦИЯ 1 4 10 Четвертичный серийный номер4 (Зарегистрируйте различные постоянные значения) (Определение и применение регистрационных знаков)
3) Список названий записей
Функция: номер уровня процесса регистрации, прерывание программы
NAME INFORMATION . Двоичная подпрограмма INCWAP, четвертичный серийный номер1
4) Таблица промежуточных кодов
№ OP ARG1 ARG2 РЕЗУЛЬТАТ (1) = i m (2) = j n (3) = 1 k (4) J 100 k (9) (5) + m 10 m (6) + n 10 n (7) + k 1 k (8) j (4) (9) return
7. Обработка ошибок
- задача
Если в исходной программе есть ошибка, компилятор должен попытаться найти ошибку и сообщить о ней пользователю. - Завершение: выполняется специальной программой обработки ошибок.
- Тип ошибки:
— Грамматические ошибки: обнаруживаются на этапах лексического и грамматического анализа.
— семантические ошибки: обычно обнаруживаются на этапе семантического анализа.
8. раз
- Пройдено: относится к процессу сканирования исходной программы или промежуточного результата исходной программы от начала до конца и выполнению связанной обработки для создания нового промежуточного результата или объектного кода.
-Примечание. Этап не имеет ничего общего со значением этапа. - Сканирование за один проход
- Множественное сканирование
— Преимущества: экономия места в памяти, улучшение качества целевого кода и ясность логической структуры компиляции.
-Недостаток: длительное время компиляции.
— Примечание. В случае разрешения памяти лучше сохранить как можно меньшее количество проходов.
9. Генерация компилятора
- Скомпилируйте программу прямо на машинном языке
- Программа компилятора, написанная на языке ассемблера
— Примечание. Основная часть компилятора обычно написана на языке ассемблера. - Программа компилятора, написанная на языке высокого уровня
— Примечание. Это часто используемый метод. - Самостоятельная компиляция
- Инструменты компиляции:
— LEX (лексический анализ) и YACC (используется для автоматического создания LALR-анализа.
таблица) - Перенос (компилятор одного языка переносится между разными типами машин)
Чтобы создать компилятор для определенного языка на определенной машине, вы должны освоить следующие три аспекта:
- Язык источника
- Язык перевода
- Метод компиляции
Интеллектуальная рекомендация
Чтение «CSS World» Xiaoji 4.1.1 Глава 4.1.1
Предисловие Эта глава имеет смысл. По сравнению с первыми тремя главами, она немного длинная. Я все еще хотел написать ее, но я писал слишком долго за раз, но большинство из них были наклейками и кодо.
Fuchsia Learn-Banjo-tutorial.md (ниже)
Стиль языка C ++ C ++ немного сложнее, чем версия языка C. Давайте взглянем. Переводчик банджо генерирует три файла 1. Первый файл был введен в языковой версии C. Два других файла находятся в каталоге.
Ответ широковещательной передачи ARP
Ранее считалось, что запрос является широковещательным, а ответ одноадресным. Но когда я сегодня работал над проектом по синтаксическому анализу пакетов данных arp, начальник (ps: богоподобное существ.
Используйте express4 и socket.io для создания сервера
Сначала установите express4, обратитесь к http://www.expressjs.com.cn/starter/generator.html Затем создайте экспресс-проект Это создает проект экспресс-фоновой службы на основе шаблона ejs. Следующая .
Общие команды Ansible (специальные команды)
Ansible предоставляет два способа выполнения задач: один — это специальные команды, а другой — написание сборников пьес Ansible. Первый может решать некоторые простые задачи, а второй — более сложные .
Источник: russianblogs.com
Лекция 3. Основы компиляторов
- Основные понятия компиляции
- Компиляторы и интерпретаторы
- Понятия входного языка, целевого языка и языка реализации
- Т-диаграммы
- Прямая компиляция, кросс-компиляция, раскрутка
- Виртуальные машины
- Компиляция «на лету»
Основные задачи компиляторов
Компьютеры сами по себе способны выполнять только очень ограниченный набор операций, называемых машинными кодами. В старые времена, когда появились первые компьютеры, программы писались в машинных кодах, представляющих собой последовательности двоичных чисел, однозначно воспринимаемых компьютером.
В конце 50-х кодов прошлого века появились первые языки программирования, такие как язык ассемблера и Фортран. Для того, чтобы компьютер мог понять программу, написанную на каком-то языке программирования, необходим переводчик (транслятор) такой программы в машинные коды.
Отметим, что, если оператор языка ассемблера отображается при трансляции чаще всего 1 в одну машинную инструкцию, предложения языков более высокого уровня отображаются, вообще говоря, в несколько машинных инструкций. Трансляторы бывают двух типов: компиляторы (compiler) и интерпретаторы (interpreter). Процесс компиляции состоит из двух частей: анализа (analysis) и синтеза (synthesis).
Анализирующая часть компилятора разбивает исходную программу на составляющие ее элементы (конструкции языка) и создает промежуточное представление исходной программы. Синтезирующая часть из промежуточного представления создает новую программу, которую компьютер в состоянии понять. Такая программа называется объектной программой.
Объектная программа может в дальнейшем выполняться без перетрансляции. В качестве промежуточного представления обычно используются деревья, в частности, так называемые деревья разбора. Под деревом разбора понимается дерево, каждый узел которого соответствует некоторой операции, а сыновья этого узла – операндам.
Интерпретатор
В отличие от компилятора, интерпретатор не создает никакой новой программы, а просто выполняет каждое предложение языка программирования. Можно сказать, что результатом работы интерпретатора является «число».
Вообще говоря, интерпретатор, так же, как и компилятор, анализирует программу на входном языке, создает промежуточное представление, а затем выполняет операции, содержащиеся в тексте этой программы. Например, интерпретатор может построить дерево разбора, а затем выполнить операции, которыми помечены узлы этого дерева.
В том случае, если исходный язык достаточно прост (например, если это язык ассемблера или Basic), то никакое промежуточное представление не нужно, и тогда интерпретатор – это простой цикл. Он выбирает очередную инструкцию языка из входного потока, анализирует и выполняет ее. Затем выбирается следующая инструкция. Этот процесс продолжается до тех пор, пока не будут выполнены все инструкции, либо пока не встретится инструкция, означающая окончание процесса интерпретации.
Компилятор
Компилятор переводит программы с одного языка на другой. Входом компилятора служит цепочка символов, составляющая исходную программу на языке программирования L1. Выход компилятора (объектная программа) также представляет собой цепочку символов, но принадлежащую другому языкуL2, например, языку некоторого компьютера.
При этом сам компилятор написан на языкеL3, возможно, отличающемся от первых двух. Будем называть языкL1 исходным языком, языкL2 – целевым языком, а языкL3 – языком реализации. Таким образом, можно говорить о компиляторе как об отображении множестваL1в множествоL2, т.е.
KL3: L1→L2. Отметим, что далеко не всегда исходные программы корректны с точки зрения исходного языка. Более того, некорректные программы подаются на вход компилятору значительно чаще, чем корректные – таков уж современный процесс разработки программ.
Поэтому крайне важной частью процесса трансляции является точная диагностика ошибок, допущенных во входной программе. Существует огромное количество различных языков программирования, начиная с таких традиционных языков программирования как FortranиPascalи кончая современными объектно-ориентированными языками такими, какC# иJava. Практически каждый язык программирования имеет какие-то особенности с точки зрения создателя транслятора. Однако мы начнем с рассмотрения разнообразных целевых языков компиляторов.
Источник: studfile.net
Что делает компилятор с исходной программой
Одним из наиболее распространенных компиляторов для языка C++ является компилятор Clang , который развивается в рамках проекта LLVM. Рассмотрим создание первой простейшей программы на C++ с помощью Clang под ОС Windows.
Прежде всего нам надо установить непосредственно сам компилятор. Clang развивается в рамках проекта LLVM , репозиторий которого можно найти на github: https://github.com/llvm/llvm-project. И данный проект предоставляет готовый установщик компилятора под Windows
Для загрузки установщика под Windows перейдем на страницу релизов в данном репозитории по ссылке https://github.com/llvm/llvm-project/releases/
По умолчанию в самом верху будут ссылки на самую последнюю версию. Но по умолчанию ссылка на установщик для Windows может быть скрыта. В этом случае под набором ссылок необходимо нажать на ссылку Show All assets . И среди появившихся ссылок найдем пункт LLVM-XX.X.X-win64.exe , где XX.X.X — это версия. Например, в моем случае это файл LLVM-15.0.7-win64.exe
Это версия для 64-битной версии Windows. Если ОС 32-х битная, то необходимо загрузить файл LLVM-15.0.7-win32.exe
После загрузки запустим файл.
На стартовом экране программы нажмем на кнопку «Далее». Затем надо будет принять лицензионное соглашение
Далее надо будет указать опции установки:
Чтобы при компиляции не указывать полные пути к компилятору или вручную не добавлять путь к нему в переменные среды выберем на этом окне пункт Add LLVM to the system PATH for current user
На следующем окне укажем папку для установки. Можно оставать путь по умолчанию — «C:/Program Files/LLVM»:
На следующих окнах оставим все опции по умолчанию и запустим процесс установки. После успешной установки мы можем приступать к использованию Clang
Чтобы проверить установку Clang, в терминале/командной строке следует ввести команду
clang —version
В этом случае нам должна отобразиться базовая информация о компиляторе, типа версии и т.д.:
C:Userseugen>clang —version clang version 15.0.7 Target: x86_64-pc-windows-msvc Thread model: posix InstalledDir: C:Program FilesLLVMbin
Первая программа
После завершения установки если мы откроем каталог C:Program FilesLLVMbin , то найдем там все необходимые файлы компиляторов:
В частности, файл clang.exe предназначен для компиляции программы на языке Си, а clang++.exe как раз и будет представлять компилятор для языка С++. То есть нам нужен clang++.
Итак, создадим на жестком диске С папку для исходных файлов программы на языке C++. А в этой папке создадим новый текстовый файл, который переименуем в hello.cpp . То есть по сути файлы исходного кода на С++ — это обычные текстовые файлы, которые, как правило, имеют расширение cpp .
В моем случае файл hello.cpp находится в папке C:cpp.
Теперь определим в файле hello.cpp простейший код, который будет выводить строку на консоль:
#include // подключаем заголовочный файл iostream int main() // определяем функцию main < // начало функции std::cout // конец функции
Для вывода строки на консоль необходимо подключить нужный функционал. Для этого в начале файла идет строка
#include
Данная строка представляет директиву препроцессора, которая позволяет подключить библиотеку iostream. Эта библиотека нужна для вывода строки на консоль.
Далее идет определение функции main . Функция main должна присутствовать в любой программе на С++, с нее собственно и начинается выполнение приложения.
Функция main состоит из четырех элементов:
- Тип возвращаемого значения . В данном случае это тип int . Этот тип указывает, что функция должна возвращать целое число.
- Имя функции . В данном случае функция называется main.
- Список параметров . После имени функции в скобках идет список параметров. Но в данном случае скобки пустые, то есть функция main не принимает параметров.
- Тело функции . После списка параметров в фигурных скобках идет тело функции. Здесь и определяются собственно те действия, которые выполняет функция main.
В теле функции происходит вывод строки на консоль. Для обращения к консоли используется стандартный поток вывода std::cout . С помощью оператора
В конце осуществляем выход из функции с помощью оператора return . Так как функция должна возвращать целое число, то после return указывается число 0. Ноль используется в качестве индикатора успешного завершения программы.
После каждой инструкции в языке C++ ставятся точка с запятой.
Каждая строка снабжена комментарием. Все, что написано после двойного слеша // представляет комментарий. Комментарий не учитывается при компиляции приложения, и не является частью программного кода, а служат лишь для его описания. Комментарий позволяет понять, что делает программа.
Теперь скомпилируем этот файл. Для этого откроем командную строку Windows и вначале с помощью команды cd перейдем к папке с исходным файлом:
cd C:cpp
Чтобы скомпилировать исходный код, необходимо компилятору clang++ передать в качестве параметра файл hello.cpp:
clang++ hello.cpp -o hello
Дополнительный необязательный параметр -o hello указывает, что скомпилированный файл будет называться hello.exe. Если не указать этот параметр, то файл будет называться по умолчанию — a.exe.
После выполнения этой команды будет скомпилирован исполняемый файл, который в Windows по умолчанию называется hello.exe. И мы можем обратиться к этому файлу, и в этом случае консоль выведет строку «Hello METANIT.COM!», собственно как и прописано в коде.
Если вместо командной строки используется оболочка PowerShell, то для запуска файла надо прописать «./hello».
Источник: metanit.com