Добавлена лекция 1 по языкам программирования
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
>[!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 - гибрид двух способов, сначала интерпретирует код, а после "горячие" участки компилирует.
|
||||
@@ -1 +1,9 @@
|
||||
*К сожалению, тут пока ничего нет...*
|
||||
## Лекции
|
||||
- [Парадигмы и машинная модель вычислений (неполная)](Парадигмы%20и%20машинная%20модель%20вычислений.md)
|
||||
- (и тд)
|
||||
|
||||
## Ссылки
|
||||
- [Гитлаб](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2026/main)
|
||||
|
||||
## Доп. материалы
|
||||
- Книга - Engineering a Compiler - Keith D. Cooper
|
||||
Reference in New Issue
Block a user