>[!WARNING] >К сожалению, данная лекция на данный момент не доведена до завершения, и в ней отсутствуют некоторые моменты. >Недостающие материалы будут дополнены позже. ## Содержание - [[#Парадигмы]] - [[#Императивная парадигма]] - [[#Объектно-ориентированная парадигма]] - [[#Функциональная парадигма]] - [[#Логическая парадигма]] - [[#Машинная модель вычислений]] - [[#Регистры]] - [[#Память]] - [[#Стек]] - [[#Система команд]] - [[#Способы исполнения программы]] - [[#Компиляция]] - [[#Интерпретация]] - [[#JIT]] ## Парадигмы > **Парадигма** - набор концепций и абстракций, определяющих стиль структурирования программы. Парадигма задает "основную единицу" программы, а также выражение потока управления, параллельно с этим работая с состоянием программы определенным образом. Каждый язык программирования использует одну или несколько парадигм. До 1957 года код писался напрямую в машинных кодах. Созданный в это время [Fortran](https://ru.wikipedia.org/wiki/Фортран) стал первым массовым языком высокого уровня, закрепив [[#Императивная парадигма|императивный стиль]]. В 1958 году [Lisp](https://ru.wikipedia.org/wiki/Лисп) ввел функции как данные, а также рекурсию, что закрепило [[#Функциональная парадигма|функциональную парадигму]]. (История создания) При этом не стоит путать парадигмы с такими вещами, как процедурное программирование (в рамках [[#Императивная парадигма|императивной парадигмы]], с акцентом на процедурах как единицах декомпозиции), структурное программирование (в рамках [[#Императивная парадигма|императивной парадигмы]]), паттерны проектирования (типовые решения в [[#Объектно-ориентированная парадигма|ООП]]), архитектурные стили (REST, микросервисы), мультипоточность и асинхронность. Есть пара советов, в связи с которыми можно выбрать основную парадигму для задачи. Но редко бывает, что задача решается исключительно одной парадигмой, поэтому чаще всего в проекте есть основная парадигма, а остальные используются "точечно", там где нужно. Но парадигма - лишь абстракция, в конце концов все становится машинным кодом, а процессор знает лишь инструкции - ему плевать на парадигмы. Парадигма - инструмент мышления и реализации кода. ### Императивная парадигма Суть императивной парадигмы - напрямую приказывать программе делать что-то. Основная абстракция - состояние программы и ее изменение. Ничего не делается само по себе: каждое действие программы руководствуется прописанными инструкции. Ассемблер - предельный случай императивности. В нем нет скрытых механизмов: все делается ровно по инструкции. Каждое действие физически отражается в компьютере: изменение регистров, смена выполняемой инструкции и так далее. ### Объектно-ориентированная парадигма Основная абстракция - объект: данные и поведение над ними объединены вместе. Основные принципы ООП: инкапсуляция, наследование и полиморфизм. Есть два способа переиспользоать код в программе: наследование и композиция. Наследование - отношение "является", композиция - отношение "содержит". В индустрии закрепилось правило: "предпочитайте композицию наследованию". Это пошло из-за хрупкости наследования: одно изменение в классе-предке может сломать всех потомков, о существовании которых можно даже не догадываться. ### Функциональная парадигма Основная абстракция -функция как знаечние первого класса. Нет изменяемого состояния - результат зависит только от входных аргументов. ### Логическая парадигма Программа - это набор фактов и правил логического вывода, а вычисление - поиск ответа на вопрос, при этом программа сама ищет путь выполнить задачу, а если не получается - возвращается назад. Программист описывает лишь то, что является истинным, а не как это вычислить. ## Машинная модель вычислений ### Регистры Регистры общего назначения - самая быстрая память процессора для текущих операндов. На x86-64 - 16 64-битных регистров общего назначения, а также 2 регистра служебного назначения. Регистр - ограниченный ресурс, их нельзя путать с бесконечным количеством перемнных. ### Память ### Стек ### Система команд У процессора есть система команд, это самые базовые команды работы с процессором и регитсрами. Выполнение программы на самом базовом уровне - небольшой цикл: взять адрес инструкции, выполнить ее, передвинуться на одну инструкцию ниже и повторить все по новой. ## Способы исполнения программы Способ исполнения - не парадигма, один язык может иметь разные реализации. ### Компиляция Компиляция - перевод всего текста программы заранее в машинный код (традиционно в него). ### Интерпретация Интерпретация - исполнение построчно специальной программой. ### JIT JIT - гибрид двух способов, сначала интерпретирует код, а после "горячие" участки компилирует.