From 67d743f810c63e576de282b77b44416cc40c3899 Mon Sep 17 00:00:00 2001 From: LeterZP Date: Sat, 26 Sep 2026 16:55:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=201=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=8F=D0=B7=D1=8B=D0=BA=D0=B0=D0=BC=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Парадигмы и машинная модель вычислений.md | 70 +++++++++++++++++++ .../Языки программирования.md | 10 ++- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 2 курс/Языки программирования/Парадигмы и машинная модель вычислений.md diff --git a/2 курс/Языки программирования/Парадигмы и машинная модель вычислений.md b/2 курс/Языки программирования/Парадигмы и машинная модель вычислений.md new file mode 100644 index 0000000..a2df543 --- /dev/null +++ b/2 курс/Языки программирования/Парадигмы и машинная модель вычислений.md @@ -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 - гибрид двух способов, сначала интерпретирует код, а после "горячие" участки компилирует. \ No newline at end of file diff --git a/2 курс/Языки программирования/Языки программирования.md b/2 курс/Языки программирования/Языки программирования.md index 51c0e5e..5a22026 100644 --- a/2 курс/Языки программирования/Языки программирования.md +++ b/2 курс/Языки программирования/Языки программирования.md @@ -1 +1,9 @@ -*К сожалению, тут пока ничего нет...* \ No newline at end of file +## Лекции +- [Парадигмы и машинная модель вычислений (неполная)](Парадигмы%20и%20машинная%20модель%20вычислений.md) +- (и тд) + +## Ссылки +- [Гитлаб](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2026/main) + +## Доп. материалы +- Книга - Engineering a Compiler - Keith D. Cooper \ No newline at end of file