Files
Info/2 курс/Языки программирования/Парадигмы и машинная модель вычислений.md
T

70 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
>[!WARNING]
>К сожалению, данная лекция на данный момент не доведена до завершения, и в ней отсутствуют некоторые моменты.
>Недостающие материалы будут дополнены позже.
## Содержание
- [Парадигмы](#Парадигмы)
- [Императивная парадигма](#Императивная%20парадигма)
- [Объектно-ориентированная парадигма](#Объектно-ориентированная%20парадигма)
- [Функциональная парадигма](#Функциональная%20парадигма)
- [Логическая парадигма](#Логическая%20парадигма)
- [Машинная модель вычислений](#Машинная%20модель%20вычислений)
- [Регистры](#Регистры)
- [Память](#Память)
- [Стек](#Стек)
- [Система команд](#Система%20команд)
- [Способы исполнения программы](#Способы%20исполнения%20программы)
- [Компиляция](#Компиляция)
- [Интерпретация](#Интерпретация)
- [JIT](#JIT)
## Парадигмы
> **Парадигма** - набор концепций и абстракций, определяющих стиль структурирования программы.
Парадигма задает "основную единицу" программы, а также выражение потока управления, параллельно с этим работая с состоянием программы определенным образом. Каждый язык программирования использует одну или несколько парадигм.
До 1957 года код писался напрямую в машинных кодах. Созданный в это время [Fortran](https://ru.wikipedia.org/wiki/Фортран) стал первым массовым языком высокого уровня, закрепив [императивный стиль](#Императивная%20парадигма). В 1958 году [Lisp](https://ru.wikipedia.org/wiki/Лисп) ввел функции как данные, а также рекурсию, что закрепило [функциональную парадигму](#Функциональная%20парадигма).
(История создания)
При этом не стоит путать парадигмы с такими вещами, как процедурное программирование (в рамках [императивной парадигмы](#Императивная%20парадигма), с акцентом на процедурах как единицах декомпозиции), структурное программирование (в рамках [императивной парадигмы](#Императивная%20парадигма)), паттерны проектирования (типовые решения в [ООП](#Объектно-ориентированная%20парадигма)), архитектурные стили (REST, микросервисы), мультипоточность и асинхронность.
Есть пара советов, в связи с которыми можно выбрать основную парадигму для задачи. Но редко бывает, что задача решается исключительно одной парадигмой, поэтому чаще всего в проекте есть основная парадигма, а остальные используются "точечно", там где нужно.
Но парадигма - лишь абстракция, в конце концов все становится машинным кодом, а процессор знает лишь инструкции - ему плевать на парадигмы. Парадигма - инструмент мышления и реализации кода.
### Императивная парадигма
Суть императивной парадигмы - напрямую приказывать программе делать что-то. Основная абстракция - состояние программы и ее изменение. Ничего не делается само по себе: каждое действие программы руководствуется прописанными инструкции.
Ассемблер - предельный случай императивности. В нем нет скрытых механизмов: все делается ровно по инструкции. Каждое действие физически отражается в компьютере: изменение регистров, смена выполняемой инструкции и так далее.
### Объектно-ориентированная парадигма
Основная абстракция - объект: данные и поведение над ними объединены вместе. Основные принципы ООП: инкапсуляция, наследование и полиморфизм.
Есть два способа переиспользоать код в программе: наследование и композиция. Наследование - отношение "является", композиция - отношение "содержит". В индустрии закрепилось правило: "предпочитайте композицию наследованию". Это пошло из-за хрупкости наследования: одно изменение в классе-предке может сломать всех потомков, о существовании которых можно даже не догадываться.
### Функциональная парадигма
Основная абстракция -функция как знаечние первого класса. Нет изменяемого состояния - результат зависит только от входных аргументов.
### Логическая парадигма
Программа - это набор фактов и правил логического вывода, а вычисление - поиск ответа на вопрос, при этом программа сама ищет путь выполнить задачу, а если не получается - возвращается назад. Программист описывает лишь то, что является истинным, а не как это вычислить.
## Машинная модель вычислений
### Регистры
Регистры общего назначения - самая быстрая память процессора для текущих операндов. На x86-64 - 16 64-битных регистров общего назначения, а также 2 регистра служебного назначения. Регистр - ограниченный ресурс, их нельзя путать с бесконечным количеством перемнных.
### Память
### Стек
### Система команд
У процессора есть система команд, это самые базовые команды работы с процессором и регитсрами. Выполнение программы на самом базовом уровне - небольшой цикл: взять адрес инструкции, выполнить ее, передвинуться на одну инструкцию ниже и повторить все по новой.
## Способы исполнения программы
Способ исполнения - не парадигма, один язык может иметь разные реализации.
### Компиляция
Компиляция - перевод всего текста программы заранее в машинный код (традиционно в него).
### Интерпретация
Интерпретация - исполнение построчно специальной программой.
### JIT
JIT - гибрид двух способов, сначала интерпретирует код, а после "горячие" участки компилирует.