Изменены ссылки на заголовки внутри файлов

This commit is contained in:
LeterZP
2026-10-01 23:44:56 +03:00
parent 02f469090a
commit 365256ed47
7 changed files with 161 additions and 161 deletions
@@ -2,20 +2,20 @@
>К сожалению, данная лекция на данный момент не доведена до завершения, и в ней отсутствуют некоторые моменты.
>Недостающие материалы будут дополнены позже.
## Содержание
- [Парадигмы](#Парадигмы)
- [Императивная парадигма](#Императивная%20парадигма)
- [Объектно-ориентированная парадигма](#Объектно-ориентированная%20парадигма)
- [Функциональная парадигма](#Функциональная%20парадигма)
- [Логическая парадигма](#Логическая%20парадигма)
- [Машинная модель вычислений](#Машинная%20модель%20вычислений)
- [Регистры](#Регистры)
- [Память](#Память)
- [Стек](#Стек)
- [Система команд](#Система%20команд)
- [Способы исполнения программы](#Способы%20исполнения%20программы)
- [Компиляция](#Компиляция)
- [Интерпретация](#Интерпретация)
- [JIT](#JIT)
- [[#Парадигмы]]
- [[#Императивная парадигма]]
- [[#Объектно-ориентированная парадигма]]
- [[#Функциональная парадигма]]
- [[#Логическая парадигма]]
- [[#Машинная модель вычислений]]
- [[#Регистры]]
- [[#Память]]
- [[#Стек]]
- [[#Система команд]]
- [[#Способы исполнения программы]]
- [[#Компиляция]]
- [[#Интерпретация]]
- [[#JIT]]
## Парадигмы
@@ -23,10 +23,10 @@
Парадигма задает "основную единицу" программы, а также выражение потока управления, параллельно с этим работая с состоянием программы определенным образом. Каждый язык программирования использует одну или несколько парадигм.
До 1957 года код писался напрямую в машинных кодах. Созданный в это время [Fortran](https://ru.wikipedia.org/wiki/Фортран) стал первым массовым языком высокого уровня, закрепив [императивный стиль](#Императивная%20парадигма). В 1958 году [Lisp](https://ru.wikipedia.org/wiki/Лисп) ввел функции как данные, а также рекурсию, что закрепило [функциональную парадигму](#Функциональная%20парадигма).
До 1957 года код писался напрямую в машинных кодах. Созданный в это время [Fortran](https://ru.wikipedia.org/wiki/Фортран) стал первым массовым языком высокого уровня, закрепив [[#Императивная парадигма|императивный стиль]]. В 1958 году [Lisp](https://ru.wikipedia.org/wiki/Лисп) ввел функции как данные, а также рекурсию, что закрепило [[#Функциональная парадигма|функциональную парадигму]].
(История создания)
При этом не стоит путать парадигмы с такими вещами, как процедурное программирование (в рамках [императивной парадигмы](#Императивная%20парадигма), с акцентом на процедурах как единицах декомпозиции), структурное программирование (в рамках [императивной парадигмы](#Императивная%20парадигма)), паттерны проектирования (типовые решения в [ООП](#Объектно-ориентированная%20парадигма)), архитектурные стили (REST, микросервисы), мультипоточность и асинхронность.
При этом не стоит путать парадигмы с такими вещами, как процедурное программирование (в рамках [[#Императивная парадигма|императивной парадигмы]], с акцентом на процедурах как единицах декомпозиции), структурное программирование (в рамках [[#Императивная парадигма|императивной парадигмы]]), паттерны проектирования (типовые решения в [[#Объектно-ориентированная парадигма|ООП]]), архитектурные стили (REST, микросервисы), мультипоточность и асинхронность.
Есть пара советов, в связи с которыми можно выбрать основную парадигму для задачи. Но редко бывает, что задача решается исключительно одной парадигмой, поэтому чаще всего в проекте есть основная парадигма, а остальные используются "точечно", там где нужно.
@@ -1,24 +1,24 @@
## Содержание
- [Формальные грамматики](#Формальные%20грамматики)
- [Основы](#Основы)
- [Форма Бэкуса-Наура](#Форма%20Бэкуса-Наура)
- [Пример вывода строки](#Пример%20вывода%20строки)
- [Спецификация языка](#Спецификация%20языка)
- [Теория автоматов](#Теория%20автоматов)
- [История](#История)
- [Иерархия Хомского](#Иерархия%20Хомского)
- [Конечный автомат](#Конечный%20автомат)
- [ДКА и НКА](#ДКА%20и%20НКА)
- [Регулярные выражения и автоматы](#Регулярные%20выражения%20и%20автоматы)
- [Построение Томпсона](#Построение%20Томпсона)
- [Минимизация](#Минимизация)
- [Границы конечных автоматов](#Границы%20конечных%20автоматов)
- [Формы представления конечного автомата](#Формы%20представления%20конечного%20автомата)
- [Примеры конечных автоматов](#Примеры%20конечных%20автоматов)
- [Автомат для идентификаторов](#Автомат%20для%20идентификаторов)
- [Автомат для комментариев](#Автомат%20для%20комментариев)
- [Автомат для регулярного выражения](#Автомат%20для%20регулярного%20выражения)
- [Автомат для четного числа символов "a"](#Автомат%20для%20четного%20числа%20символов%20"a")
- [[#Формальные грамматики]]
- [[#Основы]]
- [[#Форма Бэкуса-Наура]]
- [[#Пример вывода строки]]
- [[#Спецификация языка]]
- [[#Теория автоматов]]
- [[#История]]
- [[#Иерархия Хомского]]
- [[#Конечный автомат]]
- [#ДКА и НКА]]
- [[#Регулярные выражения и автоматы]]
- [[#Построение Томпсона]]
- [[#Минимизация]]
- [[#Границы конечных автоматов]]
- [[#Формы представления конечного автомата]]
- [[#Примеры конечных автоматов]]
- [[#Автомат для идентификаторов]]
- [[#Автомат для комментариев]]
- [[#Автомат для регулярного выражения]]
- [[#Автомат для четного числа символов "a"]]
## Формальные грамматики
@@ -98,20 +98,20 @@
<block> ::= "{" <statement>* "}"
```
Про звезду * в последней строке после `<statement>` поговорим [чуть позже](#Построение%20Томпсона).
Про звезду * в последней строке после `<statement>` поговорим [[#Построение Томпсона|чуть позже]].
В примере видно, что `<statement>` ссылается сам на себя, используя для этого `<if-statement>` и `<block>`. Такая рекурсивная вложенность в грамматике и делает синтаксис язык [контекстно-свободным, а не регулярным](#Иерархия%20Хомского).
В примере видно, что `<statement>` ссылается сам на себя, используя для этого `<if-statement>` и `<block>`. Такая рекурсивная вложенность в грамматике и делает синтаксис язык [[#Иерархия Хомского|контекстно-свободным, а не регулярным]].
## Теория автоматов
### История
Изначально, теория автоматов родилась не из программирования, а из вопроса "что вообще значит вычислять?". Программирование появилось позже, как массовая практика, и унаследовало уже готовый аппарат.
В самом начале, в 1943 году, [Уоррен Маккаллок](https://ru.wikipedia.org/wiki/Мак-Каллок,_Уоррен) и [Уолтер Питтс](https://ru.wikipedia.org/wiki/Питтс,_Уолтер) создали [формальную модель нейрона](https://ru.wikipedia.org/wiki/Искусственный_нейрон), которая по своей сути является переключательным автоматом. В 1950-ых годах [Стивен Клини](https://ru.wikipedia.org/wiki/Клини,_Стивен_Коул) вывел [связь регулярных выражений и конечных автоматов](#Регулярные%20выражения%20и%20автоматы). В 1956 году [Ноам Хомский](https://ru.wikipedia.org/wiki/Хомский,_Ноам) предложил [иерархию формальных грамматик](#Иерархия%20Хомского). В 1959 году [Михаэль Рабин](https://ru.wikipedia.org/wiki/Рабин,_Михаэль) и [Дана Скотт](https://ru.wikipedia.org/wiki/Скотт,_Дана) дали [строгое определение НКА](#ДКА%20и%20НКА), а также доказали его эквивалентность с ДКА.
В самом начале, в 1943 году, [Уоррен Маккаллок](https://ru.wikipedia.org/wiki/Мак-Каллок,_Уоррен) и [Уолтер Питтс](https://ru.wikipedia.org/wiki/Питтс,_Уолтер) создали [формальную модель нейрона](https://ru.wikipedia.org/wiki/Искусственный_нейрон), которая по своей сути является переключательным автоматом. В 1950-ых годах [Стивен Клини](https://ru.wikipedia.org/wiki/Клини,_Стивен_Коул) вывел [[#Регулярные выражения и автоматы|связь регулярных выражений и конечных автоматов]]. В 1956 году [Ноам Хомский](https://ru.wikipedia.org/wiki/Хомский,_Ноам) предложил [[#Иерархия Хомского|иерархию формальных грамматик]]. В 1959 году [Михаэль Рабин](https://ru.wikipedia.org/wiki/Рабин,_Михаэль) и [Дана Скотт](https://ru.wikipedia.org/wiki/Скотт,_Дана) дали [[#ДКА и НКА|строгое определение НКА]], а также доказали его эквивалентность с ДКА.
### Иерархия Хомского
В своей теории Хомский делит грамматику языка на четыре типа - от 3 до 0. Чем ниже номер типа, тем мощнее грамматика и тем сложнее устройство, нужное для распознавания.
Тип 3 - **регулярные** грамматики. Примерами языка с такой грамматикой будут являться различные идентификаторы или числа. Для распознавания такой грамматики в основном используется [конечный автомат](#Конечный%20автомат).
Тип 3 - **регулярные** грамматики. Примерами языка с такой грамматикой будут являться различные идентификаторы или числа. Для распознавания такой грамматики в основном используется [[#Конечный автомат|конечный автомат]].
Тип 2 - **контекстно-свободные** грамматики. Примером языка с такой грамматикой может быть синтаксис любого языка программирования. Для распознавания такой грамматики используется [автомат с магазинной памятью](https://ru.wikipedia.org/wiki/Автомат_с_магазинной_памятью).
@@ -124,7 +124,7 @@
Строка принимается автоматом, если, начав в $q_0$ и применяя $\delta$ символ за символом, автомат оказывается в одном из состояний $F$.
Такие автоматы можно встретить в лексическом анализе (разбивает текст программы на токены), сетевых протоколах (разбирает TCP-состояние, парсит [HTTP-заголовки](../Веб-программирование/Общие%20стандарты%20и%20протоколы%20сети%20Интернет.md#Заголовки%20HTTP)), играх (поведение NPC), [регулярных выражениях](#Регулярные%20выражения%20и%20автоматы) и схемотехнике (сам по себе конечный автомат является стандартной моделью цифровых схем управления).
Такие автоматы можно встретить в лексическом анализе (разбивает текст программы на токены), сетевых протоколах (разбирает TCP-состояние, парсит [HTTP-заголовки](../Веб-программирование/Общие%20стандарты%20и%20протоколы%20сети%20Интернет.md#Заголовки%20HTTP)), играх (поведение NPC), [[#Регулярные выражения и автоматы|регулярных выражениях]] и схемотехнике (сам по себе конечный автомат является стандартной моделью цифровых схем управления).
#### ДКА и НКА
>**Детерминированный конечный автомат** (ДКА) - конечный автомат, в котором существует ровно один возможный переход из определенного состояния по данному символу.
@@ -153,7 +153,7 @@
Именно по такому алгоритму работает большинство движков для регулярных выражений в стандартных библиотеках языков программирования.
#### Минимизация
[Построение Томпсона](#Построение%20Томпсона) очень хорошо работает для построения автомата, но обычно дает автомат с избыточным числом состояний. Именно поэтому существуют методы минимизации полученного конечного автомата.
[[#Построение Томпсона]] очень хорошо работает для построения автомата, но обычно дает автомат с избыточным числом состояний. Именно поэтому существуют методы минимизации полученного конечного автомата.
>**Теорема Майхилла-Нероуда** - для каждого регулярного языка существует единственный минимальный ДКА.
@@ -170,7 +170,7 @@
Формально такую ограниченность конечных автоматов можно доказать через [лемму о накачке](https://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages).
Почти в любом языке программирования синтаксис представляет собой [контекстно-свободный, а не регулярный](#Иерархия%20Хомского) язык. Поэтому лексер (конечный автомат) сам по себе не может разобрать структуру программы целиком, для этого ему нужен парсер с дополнительной памятью (стеком).
Почти в любом языке программирования синтаксис представляет собой [[#Иерархия Хомского|контекстно-свободный, а не регулярный]] язык. Поэтому лексер (конечный автомат) сам по себе не может разобрать структуру программы целиком, для этого ему нужен парсер с дополнительной памятью (стеком).
#### Формы представления конечного автомата
Конечный автомат можно описать в виде пять разных форм.