Наиболее распространенные типы баз данных:
1. Реляционные базы данных: это самый распространенный тип баз данных, основанный на модели реляционной алгебры. Данные организованы в виде таблиц с рядами и столбцами, а связи между таблицами задаются с использованием ключевых полей.
2. Иерархические базы данных: данные в таких базах организованы в виде древовидной структуры, где каждая запись имеет только одного родителя и может иметь несколько дочерних элементов.
3. Сетевые базы данных: данные в них организованы в виде графа, где каждая запись может иметь несколько родителей и дочерних элементов.
4. Объектно-ориентированные базы данных: позволяют хранить объекты и их свойства, а также взаимосвязи и наследование между объектами.
5. XML базы данных: хранят данные в формате XML, что упрощает работу с структурированными данными.
6. NoSQL базы данных: этот тип баз данных не использует классическую модель таблиц и SQL для работы с данными. Вместо этого, данные хранятся в гибких и масштабируемых структурах. Некоторые подтипы NoSQL баз данных включают документоориентированные, столбцовые, графовые и ключ-значение базы данных.
7. Распределенные базы данных: данные в таких базах разделены на несколько физических узлов или серверов, что позволяет распределить нагрузку и обеспечить высокую доступность.
8. Ин-мемори базы данных: данные хранятся и обрабатываются в оперативной памяти компьютера, что позволяет получить высокую скорость доступа и обработки данных.
1. Реляционные базы данных: это самый распространенный тип баз данных, основанный на модели реляционной алгебры. Данные организованы в виде таблиц с рядами и столбцами, а связи между таблицами задаются с использованием ключевых полей.
2. Иерархические базы данных: данные в таких базах организованы в виде древовидной структуры, где каждая запись имеет только одного родителя и может иметь несколько дочерних элементов.
3. Сетевые базы данных: данные в них организованы в виде графа, где каждая запись может иметь несколько родителей и дочерних элементов.
4. Объектно-ориентированные базы данных: позволяют хранить объекты и их свойства, а также взаимосвязи и наследование между объектами.
5. XML базы данных: хранят данные в формате XML, что упрощает работу с структурированными данными.
6. NoSQL базы данных: этот тип баз данных не использует классическую модель таблиц и SQL для работы с данными. Вместо этого, данные хранятся в гибких и масштабируемых структурах. Некоторые подтипы NoSQL баз данных включают документоориентированные, столбцовые, графовые и ключ-значение базы данных.
7. Распределенные базы данных: данные в таких базах разделены на несколько физических узлов или серверов, что позволяет распределить нагрузку и обеспечить высокую доступность.
8. Ин-мемори базы данных: данные хранятся и обрабатываются в оперативной памяти компьютера, что позволяет получить высокую скорость доступа и обработки данных.
Принципы работы кеша:
Принцип локальности: Если данные были запрошены один раз, есть высокая вероятность, что они будут запрошены снова в ближайшем будущем. Поэтому кеш сохраняет эти данные для быстрого доступа.
Иерархическая структура: Кеш организуется в иерархической структуре с несколькими уровнями. Более высокий уровень находится ближе к процессору и обладает более быстрым доступом, но меньшей емкостью.
Замена данных: Когда кеш заполняется, требуется освободить место для новых данных. Алгоритмы замены определяют, какие данные вытеснить для освобождения места.
Когерентность: Кеш-память может быть использована несколькими компонентами одновременно. Протоколы когерентности гарантируют согласованность данных, синхронизируя их между кешами.
Принцип локальности: Если данные были запрошены один раз, есть высокая вероятность, что они будут запрошены снова в ближайшем будущем. Поэтому кеш сохраняет эти данные для быстрого доступа.
Иерархическая структура: Кеш организуется в иерархической структуре с несколькими уровнями. Более высокий уровень находится ближе к процессору и обладает более быстрым доступом, но меньшей емкостью.
Замена данных: Когда кеш заполняется, требуется освободить место для новых данных. Алгоритмы замены определяют, какие данные вытеснить для освобождения места.
Когерентность: Кеш-память может быть использована несколькими компонентами одновременно. Протоколы когерентности гарантируют согласованность данных, синхронизируя их между кешами.
Существует несколько типов SSL-сертификатов, которые различаются по уровню проверки, количеству защищаемых доменов и назначению. Подробная классификация:
1. По уровню проверки (Validation Level)
• DV (Domain Validation)
- Проверка: только право владения доменом (через e-mail, DNS-запись или файл на сервере).
- Срок выпуска: несколько минут.
- Назначение: для блогов, личных сайтов, тестовых проектов.
- Пример:
- В адресной строке: только замок (без названия организации).
Плюсы: быстро, дешево.
Минусы: минимальная доверенность (проверяется только домен).
• OV (Organization Validation)
- Проверка: владелец домена и организация (через официальные документы).
- Срок выпуска: 1–3 дня.
- Назначение: корпоративные сайты, интернет-магазины.
- В адресной строке: замок + информация о компании в сертификате.
Плюсы: повышенное доверие.
Минусы: дольше оформление, дороже.
• EV (Extended Validation)
- Проверка: самая строгая — юридический статус, адрес, контактные данные.
- Срок выпуска: 3–7 дней.
- Назначение: банки, крупные компании, госорганы.
- В адресной строке: раньше показывало название компании рядом с замком (в современных браузерах убрали, но в сертификате данные остаются).
Плюсы: максимальное доверие.
Минусы: дорогой и долго оформляется.
2. По количеству защищаемых доменов
• Single Domain SSL
- Защищает только один домен, например:
→
(иногда вместе с
• Wildcard SSL
- Защищает домен и все его поддомены.
→
(включая
Плюсы: удобно и экономно при множестве поддоменов.
Минусы: не защищает другие домены.
• Multi-Domain (SAN / UCC SSL)
- Защищает несколько разных доменов в одном сертификате.
→
Плюсы: удобно для компаний с несколькими сайтами.
Минусы: дороже, сложнее управлять.
3. По назначению
• Code Signing SSL — для подписания программного кода (а не сайтов).
• Email (S/MIME) — для шифрования и подписи электронной почты.
• Client Authentication — для идентификации пользователей при входе в систему.
• Document Signing — для электронной подписи документов.
1. По уровню проверки (Validation Level)
• DV (Domain Validation)
- Проверка: только право владения доменом (через e-mail, DNS-запись или файл на сервере).
- Срок выпуска: несколько минут.
- Назначение: для блогов, личных сайтов, тестовых проектов.
- Пример:
https://myblog.com- В адресной строке: только замок (без названия организации).
Плюсы: быстро, дешево.
Минусы: минимальная доверенность (проверяется только домен).
• OV (Organization Validation)
- Проверка: владелец домена и организация (через официальные документы).
- Срок выпуска: 1–3 дня.
- Назначение: корпоративные сайты, интернет-магазины.
- В адресной строке: замок + информация о компании в сертификате.
Плюсы: повышенное доверие.
Минусы: дольше оформление, дороже.
• EV (Extended Validation)
- Проверка: самая строгая — юридический статус, адрес, контактные данные.
- Срок выпуска: 3–7 дней.
- Назначение: банки, крупные компании, госорганы.
- В адресной строке: раньше показывало название компании рядом с замком (в современных браузерах убрали, но в сертификате данные остаются).
Плюсы: максимальное доверие.
Минусы: дорогой и долго оформляется.
2. По количеству защищаемых доменов
• Single Domain SSL
- Защищает только один домен, например:
→
example.com(иногда вместе с
www.example.com)• Wildcard SSL
- Защищает домен и все его поддомены.
→
*.example.com(включая
mail.example.com, shop.example.com, и т.д.)Плюсы: удобно и экономно при множестве поддоменов.
Минусы: не защищает другие домены.
• Multi-Domain (SAN / UCC SSL)
- Защищает несколько разных доменов в одном сертификате.
→
example.com, example.net, myshop.orgПлюсы: удобно для компаний с несколькими сайтами.
Минусы: дороже, сложнее управлять.
3. По назначению
• Code Signing SSL — для подписания программного кода (а не сайтов).
• Email (S/MIME) — для шифрования и подписи электронной почты.
• Client Authentication — для идентификации пользователей при входе в систему.
• Document Signing — для электронной подписи документов.
Сравнение файловых систем
Файловая система - это метод организации и хранения данных на запоминающем устройстве. Существует множество различных файловых систем, каждая со своими преимуществами и недостатками.
Основные типы файловых систем:
• FAT (File Allocation Table) - простая и распространенная файловая система, используемая в ранних версиях Windows и на съемных носителях.
• NTFS (New Technology File System) - более современная файловая система, используемая в современных версиях Windows. Поддерживает большие файлы и тома, а также расширенные атрибуты и безопасность.
• ext4 - файловая система, используемая в Linux. Известна своей надежностью, производительностью и поддержкой больших файлов.
• XFS - еще одна файловая система, используемая в Linux. Оптимизирована для больших файлов и высокой производительности.
• ZFS - файловая система с открытым исходным кодом, известная своей надежностью, поддержкой больших объемов данных и расширенными функциями управления данными.
Выбор файловой системы:
- Для съемных носителей (например, USB-накопителей) подойдет FAT.
- Для настольных компьютеров и ноутбуков с Windows рекомендуется использовать NTFS.
- Для серверов и рабочих станций Linux с большими объемами данных подойдут ext4 или XFS.
- Для приложений, требующих высокой надежности и расширенных функций управления данными, рекомендуется использовать ZFS.
Файловая система - это метод организации и хранения данных на запоминающем устройстве. Существует множество различных файловых систем, каждая со своими преимуществами и недостатками.
Основные типы файловых систем:
• FAT (File Allocation Table) - простая и распространенная файловая система, используемая в ранних версиях Windows и на съемных носителях.
• NTFS (New Technology File System) - более современная файловая система, используемая в современных версиях Windows. Поддерживает большие файлы и тома, а также расширенные атрибуты и безопасность.
• ext4 - файловая система, используемая в Linux. Известна своей надежностью, производительностью и поддержкой больших файлов.
• XFS - еще одна файловая система, используемая в Linux. Оптимизирована для больших файлов и высокой производительности.
• ZFS - файловая система с открытым исходным кодом, известная своей надежностью, поддержкой больших объемов данных и расширенными функциями управления данными.
Выбор файловой системы:
- Для съемных носителей (например, USB-накопителей) подойдет FAT.
- Для настольных компьютеров и ноутбуков с Windows рекомендуется использовать NTFS.
- Для серверов и рабочих станций Linux с большими объемами данных подойдут ext4 или XFS.
- Для приложений, требующих высокой надежности и расширенных функций управления данными, рекомендуется использовать ZFS.
DevSecOps — интеграция практик безопасности в процесс разработки программного обеспечения и операционных процессов, который часто используется в рамках подхода DevOps. Термин состоит из трех частей:
Dev — разработка (Development)
Sec — безопасность (Security)
Ops — операционные процессы (Operations)
Основные принципы DevSecOps:
• Интеграция безопасности с самого начала: Вместо того чтобы "добавлять" безопасность в конце процесса разработки, её рассматривают как неотъемлемую часть всего жизненного цикла разработки.
• Автоматизация процессов безопасности: Использование инструментов для автоматического тестирования и проверки кода на наличие уязвимостей.
• Обратная связь в реальном времени: Разработчики получают уведомления о потенциальных проблемах безопасности во время написания и тестирования кода, что позволяет быстро их устранять.
• Совместная работа команд: DevSecOps способствует тесному взаимодействию между командами разработчиков, специалистов по безопасности и операционными командами для обеспечения качественного и безопасного ПО.
• Постоянная защита и мониторинг: Мониторинг безопасности осуществляется на всех этапах разработки и эксплуатации.
Dev — разработка (Development)
Sec — безопасность (Security)
Ops — операционные процессы (Operations)
Идея DevSecOps заключается в том, чтобы обеспечивать безопасность на всех этапах разработки и эксплуатации ПО, а не только в конце, когда продукт уже готов. Это подход, который встраивает процессы безопасности в непрерывную интеграцию (CI), непрерывное развертывание (CD) и управление инфраструктурой.
Основные принципы DevSecOps:
• Интеграция безопасности с самого начала: Вместо того чтобы "добавлять" безопасность в конце процесса разработки, её рассматривают как неотъемлемую часть всего жизненного цикла разработки.
• Автоматизация процессов безопасности: Использование инструментов для автоматического тестирования и проверки кода на наличие уязвимостей.
• Обратная связь в реальном времени: Разработчики получают уведомления о потенциальных проблемах безопасности во время написания и тестирования кода, что позволяет быстро их устранять.
• Совместная работа команд: DevSecOps способствует тесному взаимодействию между командами разработчиков, специалистов по безопасности и операционными командами для обеспечения качественного и безопасного ПО.
• Постоянная защита и мониторинг: Мониторинг безопасности осуществляется на всех этапах разработки и эксплуатации.
x86
• Происхождение: Разработана Intel в конце 1970-х годов.
• Особенности:
- CISC (Complex Instruction Set Computing) архитектура, что означает наличие большого набора сложных инструкций.
- Широко используется в настольных компьютерах, ноутбуках и серверах.
- Обеспечивает высокую производительность и совместимость с большим количеством программного обеспечения.
• Производители: Intel, AMD.
ARM
• Происхождение: Разработана компанией ARM Holdings в 1980-х годах.
• Особенности:
- RISC (Reduced Instruction Set Computing) архитектура, что предполагает упрощенный набор инструкций для повышения эффективности.
- Энергоэффективность, что делает её популярной в мобильных устройствах, таких как смартфоны и планшеты.
- Лицензируется другим компаниям, что позволяет широкое разнообразие реализаций.
• Производители: Qualcomm, Apple, Samsung и другие.
RISC-V
• Происхождение: Разработана в Калифорнийском университете в Беркли в 2010-х годах.
• Особенности:
- Открытая и свободная RISC архитектура, что позволяет любому использовать и модифицировать её без лицензионных отчислений.
- Высокая гибкость и возможность настройки под конкретные задачи.
- Быстро набирает популярность в научных и промышленных кругах благодаря своей открытости.
• Производители: SiFive, Western Digital и другие.
• Происхождение: Разработана Intel в конце 1970-х годов.
• Особенности:
- CISC (Complex Instruction Set Computing) архитектура, что означает наличие большого набора сложных инструкций.
- Широко используется в настольных компьютерах, ноутбуках и серверах.
- Обеспечивает высокую производительность и совместимость с большим количеством программного обеспечения.
• Производители: Intel, AMD.
ARM
• Происхождение: Разработана компанией ARM Holdings в 1980-х годах.
• Особенности:
- RISC (Reduced Instruction Set Computing) архитектура, что предполагает упрощенный набор инструкций для повышения эффективности.
- Энергоэффективность, что делает её популярной в мобильных устройствах, таких как смартфоны и планшеты.
- Лицензируется другим компаниям, что позволяет широкое разнообразие реализаций.
• Производители: Qualcomm, Apple, Samsung и другие.
RISC-V
• Происхождение: Разработана в Калифорнийском университете в Беркли в 2010-х годах.
• Особенности:
- Открытая и свободная RISC архитектура, что позволяет любому использовать и модифицировать её без лицензионных отчислений.
- Высокая гибкость и возможность настройки под конкретные задачи.
- Быстро набирает популярность в научных и промышленных кругах благодаря своей открытости.
• Производители: SiFive, Western Digital и другие.
Помимо x86, ARM и RISC-V, существуют и другие архитектуры процессоров, каждая из которых имеет свои особенности и области применения:
MIPS
• Происхождение: Разработана в 1980-х годах в Стэнфордском университете.
• Особенности:
- RISC-архитектура.
- Используется в встраиваемых системах и сетевом оборудовании.
• Применение: Роутеры, игровые консоли.
PowerPC
• Происхождение: Разработана совместно IBM, Apple и Motorola в 1990-х годах.
• Особенности:
- RISC-архитектура.
- Использовалась в компьютерах Apple до перехода на Intel.
• Применение: Серверы, встраиваемые системы.
SPARC
• Происхождение: Разработана Sun Microsystems в 1980-х годах.
• Особенности:
- RISC-архитектура.
- Используется в серверах и высокопроизводительных вычислениях.
• Применение: Серверы, рабочие станции.
Itanium
• Происхождение: Разработана Intel и Hewlett-Packard.
• Особенности:
- Архитектура IA-64.
- Предназначена для серверов и рабочих станций.
• Применение: Высокопроизводительные серверы (хотя сейчас менее популярна).
Z/Architecture
• Происхождение: Разработана IBM.
• Особенности:
- Используется в мейнфреймах.
- Поддерживает высокую надежность и масштабируемость.
• Применение: Банковские системы, крупные корпоративные сети.
MIPS
• Происхождение: Разработана в 1980-х годах в Стэнфордском университете.
• Особенности:
- RISC-архитектура.
- Используется в встраиваемых системах и сетевом оборудовании.
• Применение: Роутеры, игровые консоли.
PowerPC
• Происхождение: Разработана совместно IBM, Apple и Motorola в 1990-х годах.
• Особенности:
- RISC-архитектура.
- Использовалась в компьютерах Apple до перехода на Intel.
• Применение: Серверы, встраиваемые системы.
SPARC
• Происхождение: Разработана Sun Microsystems в 1980-х годах.
• Особенности:
- RISC-архитектура.
- Используется в серверах и высокопроизводительных вычислениях.
• Применение: Серверы, рабочие станции.
Itanium
• Происхождение: Разработана Intel и Hewlett-Packard.
• Особенности:
- Архитектура IA-64.
- Предназначена для серверов и рабочих станций.
• Применение: Высокопроизводительные серверы (хотя сейчас менее популярна).
Z/Architecture
• Происхождение: Разработана IBM.
• Особенности:
- Используется в мейнфреймах.
- Поддерживает высокую надежность и масштабируемость.
• Применение: Банковские системы, крупные корпоративные сети.
Если вы работаете с Qt на C++, вы наверняка видели файлы с расширением
Что такое .ui файл?
.ui — файл интерфейса пользователя, создаваемый в Qt Designer.
Он описывает все виджеты (кнопки, поля ввода, метки, окна), их свойства и макеты в формате XML.
Пример содержимого .ui файла:
Зачем нужен uic?
uic (User Interface Compiler) — это утилита, которая компилирует
Пример команды:
После этого вы получаете класс
Как использовать с C++
Подключаем сгенерированный заголовочный файл:
Всё! Теперь у вас есть полностью рабочий GUI на C++.
.uiЧто такое .ui файл?
.ui — файл интерфейса пользователя, создаваемый в Qt Designer.
Он описывает все виджеты (кнопки, поля ввода, метки, окна), их свойства и макеты в формате XML.
Пример содержимого .ui файла:
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Нажми меня</string>
</property>
</widget>
</widget>
</ui>
Зачем нужен uic?
uic (User Interface Compiler) — это утилита, которая компилирует
.ui файл в C++ заголовочный файл, обычно с именем ui_<имя_формы>.h.Пример команды:
uic mainwindow.ui -o ui_mainwindow.hПосле этого вы получаете класс
Ui::MainWindow, который содержит все виджеты и методы для их инициализации.Как использовать с C++
Подключаем сгенерированный заголовочный файл:
#include "ui_mainwindow.h"
#include <QMainWindow>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
ui.setupUi(this); // Настраивает интерфейс
}
private:
Ui::MainWindow ui;
};
Всё! Теперь у вас есть полностью рабочий GUI на C++.
Автоматическая компиляция
В больших проектах запускать uic вручную неудобно. Обычно это делается автоматически:
• CMake:
• qmake:
Таким образом, при сборке проекта uic сгенерирует все нужные заголовочные файлы без вашего вмешательства.
.ui файловВ больших проектах запускать uic вручную неудобно. Обычно это делается автоматически:
• CMake:
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON) # Автоматически компилирует .ui файлы
find_package(Qt5 COMPONENTS Widgets REQUIRED)
add_executable(MyApp main.cpp)
target_link_libraries(MyApp Qt5::Widgets)• qmake:
.pro файл автоматически обрабатывает все .ui файлы.Таким образом, при сборке проекта uic сгенерирует все нужные заголовочные файлы без вашего вмешательства.
Популярные системы сборки — коротко и по существу
C / C++
• Make — дед всех сборщиков. Просто, но больно на больших проектах.
• CMake — стандарт для C++, генерирует подо всё, от Visual Studio до Ninja. Настроил один раз — и забыл.
• Ninja — летает. Минимализм и скорость, но без генератора не обойтись.
• Meson — современный и понятный. Пишешь конфиг, а остальное делает сам.
Java / Kotlin
• Maven — строгий, надёжный, как бухгалтер. XML, но зато стабильно.
• Gradle — гибкий и умный. Kotlin DSL, кэш, плагины — идеально для Android.
• Ant — старичок. Всё вручную, без зависимостей. Только если проект с археологических времён.
JavaScript / TypeScript
• npm scripts — минимализм. Для мелких задач — норм, для монстров — нет.
• Webpack — тяжёлый, но делает всё. Настроить — целое приключение.
• Vite — быстрый, лёгкий, без боли. Для фронтенда XXI века.
• Rollup — идеален для библиотек, чистая сборка без мусора.
• esbuild / Parcel — “включил и поехал”. Молниеносные и почти без настроек.
Python
• setuptools — классика. Работает, но старомодно.
• Poetry — современный подход: зависимости, сборка, публикация — всё в одном.
Rust
• Cargo — лучший пример, как должна выглядеть система сборки. Просто, быстро, всё встроено.
Go
• go build — минимализм в чистом виде. Один файл — одна команда — готово.
Кросс-языковые
• Bazel — для монореп и гигантов вроде Google. Кэш, параллель, масштаб.
• Buck / Pants / Please — те же идеи, другие акценты. Подходят, если у тебя тысяча микросервисов.
C / C++
• Make — дед всех сборщиков. Просто, но больно на больших проектах.
• CMake — стандарт для C++, генерирует подо всё, от Visual Studio до Ninja. Настроил один раз — и забыл.
• Ninja — летает. Минимализм и скорость, но без генератора не обойтись.
• Meson — современный и понятный. Пишешь конфиг, а остальное делает сам.
Java / Kotlin
• Maven — строгий, надёжный, как бухгалтер. XML, но зато стабильно.
• Gradle — гибкий и умный. Kotlin DSL, кэш, плагины — идеально для Android.
• Ant — старичок. Всё вручную, без зависимостей. Только если проект с археологических времён.
JavaScript / TypeScript
• npm scripts — минимализм. Для мелких задач — норм, для монстров — нет.
• Webpack — тяжёлый, но делает всё. Настроить — целое приключение.
• Vite — быстрый, лёгкий, без боли. Для фронтенда XXI века.
• Rollup — идеален для библиотек, чистая сборка без мусора.
• esbuild / Parcel — “включил и поехал”. Молниеносные и почти без настроек.
Python
• setuptools — классика. Работает, но старомодно.
• Poetry — современный подход: зависимости, сборка, публикация — всё в одном.
Rust
• Cargo — лучший пример, как должна выглядеть система сборки. Просто, быстро, всё встроено.
Go
• go build — минимализм в чистом виде. Один файл — одна команда — готово.
Кросс-языковые
• Bazel — для монореп и гигантов вроде Google. Кэш, параллель, масштаб.
• Buck / Pants / Please — те же идеи, другие акценты. Подходят, если у тебя тысяча микросервисов.
Кодеки — это устройства или программы, которые сжимают и распаковывают мультимедийные данные, такие как аудио и видео. Название «кодек» происходит от слов coder-decoder — «кодер-декодер».
Вот как они работают:
1. Сжатие (кодирование)
Когда вы записываете видео или аудио, исходные данные занимают очень много места. Например, одна минута видео в высоком разрешении без сжатия может занимать гигабайты.
Кодек уменьшает размер файла двумя основными способами:
a) Потеря информации (lossy)
• Примеры: MP3 (аудио), H.264 (видео), AAC (аудио)
• Убираются «неважные» детали, которые человеческое ухо или глаз практически не замечает.
• Преимущество: файлы маленькие
• Недостаток: при многократной перезаписи качество теряется
b) Без потерь (lossless)
• Примеры: FLAC (аудио), PNG (изображения), FFV1 (видео)
• Сжимается файл без потери качества, полностью можно восстановить оригинал
• Преимущество: качество 100%
• Недостаток: сжатие не такое сильное, как у lossy
2. Хранение
После сжатия данные сохраняются в файле или потоке, например
Файл содержит кодированные данные и иногда дополнительную информацию (метаданные, субтитры, обложки и т.д.).
3. Воспроизведение (декодирование)
Когда вы воспроизводите файл, кодек раскодирует его обратно в форму, которую может обработать динамик или экран:
• Кодек читает сжатые данные
• Преобразует их в поток аудио/видео
• Отправляет на устройство вывода
Если кодек не установлен, файл не откроется, потому что система не знает, как интерпретировать данные.
4. Примеры популярных кодеков
Видео: H.264, H.265 (HEVC), VP9, AV1
Аудио: MP3, AAC, Opus, FLAC
Вот как они работают:
1. Сжатие (кодирование)
Когда вы записываете видео или аудио, исходные данные занимают очень много места. Например, одна минута видео в высоком разрешении без сжатия может занимать гигабайты.
Кодек уменьшает размер файла двумя основными способами:
a) Потеря информации (lossy)
• Примеры: MP3 (аудио), H.264 (видео), AAC (аудио)
• Убираются «неважные» детали, которые человеческое ухо или глаз практически не замечает.
• Преимущество: файлы маленькие
• Недостаток: при многократной перезаписи качество теряется
b) Без потерь (lossless)
• Примеры: FLAC (аудио), PNG (изображения), FFV1 (видео)
• Сжимается файл без потери качества, полностью можно восстановить оригинал
• Преимущество: качество 100%
• Недостаток: сжатие не такое сильное, как у lossy
2. Хранение
После сжатия данные сохраняются в файле или потоке, например
.mp3, .mp4, .mkv.Файл содержит кодированные данные и иногда дополнительную информацию (метаданные, субтитры, обложки и т.д.).
3. Воспроизведение (декодирование)
Когда вы воспроизводите файл, кодек раскодирует его обратно в форму, которую может обработать динамик или экран:
• Кодек читает сжатые данные
• Преобразует их в поток аудио/видео
• Отправляет на устройство вывода
Если кодек не установлен, файл не откроется, потому что система не знает, как интерпретировать данные.
4. Примеры популярных кодеков
Видео: H.264, H.265 (HEVC), VP9, AV1
Аудио: MP3, AAC, Opus, FLAC
Сигналы прерывания в зависимости от источника возникновения делятся на два основных типа:
1. Внутренние (или программные, синхронные) прерывания — возникают внутри процессора в результате выполнения инструкций программы.
Примеры:
• Деление на ноль;
• Ошибка страницы (page fault);
• Выполнение специальной инструкции программного прерывания (например, INT в x86);
• Переполнение арифметической операции.
2. Внешние (или аппаратные, асинхронные) прерывания — возникают вне процессора, от внешних устройств или по внешним сигналам.
Примеры:
• Сигнал от таймера;
• Сигнал от клавиатуры, мыши, сетевого адаптера и других периферийных устройств;
• Аппаратный сброс.
Иногда внешние прерывания дополнительно подразделяют на:
• Маскируемые — могут быть временно запрещены программно (например, с помощью флага разрешения прерываний).
• Немаскируемые (NMI — Non-Maskable Interrupts) — всегда обрабатываются, даже если остальные прерывания запрещены (обычно для сигналов аварийных состояний).
1. Внутренние (или программные, синхронные) прерывания — возникают внутри процессора в результате выполнения инструкций программы.
Примеры:
• Деление на ноль;
• Ошибка страницы (page fault);
• Выполнение специальной инструкции программного прерывания (например, INT в x86);
• Переполнение арифметической операции.
2. Внешние (или аппаратные, асинхронные) прерывания — возникают вне процессора, от внешних устройств или по внешним сигналам.
Примеры:
• Сигнал от таймера;
• Сигнал от клавиатуры, мыши, сетевого адаптера и других периферийных устройств;
• Аппаратный сброс.
Иногда внешние прерывания дополнительно подразделяют на:
• Маскируемые — могут быть временно запрещены программно (например, с помощью флага разрешения прерываний).
• Немаскируемые (NMI — Non-Maskable Interrupts) — всегда обрабатываются, даже если остальные прерывания запрещены (обычно для сигналов аварийных состояний).
Web scraping
Скрапинг — стандартная процедура для сбора необходимой информации. Для этих целей применяется специализированное программное обеспечение.
С помощью веб-скрейпинга информация собирается в автоматическом режиме по заданным параметрам, структурируется и записывается в файл для дальнейшего анализа.
Такой метод подходит для сбора статистики, стоимости различных офферов, получения данных о товарах в каталогах.
Скрапинг — стандартная процедура для сбора необходимой информации. Для этих целей применяется специализированное программное обеспечение.
С помощью веб-скрейпинга информация собирается в автоматическом режиме по заданным параметрам, структурируется и записывается в файл для дальнейшего анализа.
Такой метод подходит для сбора статистики, стоимости различных офферов, получения данных о товарах в каталогах.
Законно ли это? Если боитесь собирать данные с сайтов, то лучше не стоит, но все, что находится в открытом доступе, можно собирать.
Видеокарта (или GPU — Graphics Processing Unit) устройство, которое обрабатывает графические данные для отображения изображений на экране. Она ускоряет задачи, связанные с графикой, такими как игры, видеоредактирование, 3D-моделирование и машинное обучение. Основная задача — преобразовывать данные в визуальные пиксели, которые монитор может показать.
Основные компоненты видеокарты
Видеокарта состоит из нескольких ключевых частей, работающих вместе:
• GPU (графический процессор): Основной "мозг". Это множество ядер (сотни или тысячи), оптимизированных для параллельных вычислений. В отличие от CPU (центрального процессора), GPU лучше справляется с повторяющимися задачами, как обработка пикселей.
• Видеопамять (VRAM): Специальная память (например, GDDR6 или HBM) для хранения текстур, моделей и промежуточных данных. Она быстрая и работает независимо от оперативной памяти компьютера.
• Шина данных (PCIe): Связь с материнской платой и CPU. Через неё передаются команды и данные.
• Контроллеры и интерфейсы: Включают HDMI/DisplayPort для вывода на экран, кулеры для охлаждения и питание (через разъёмы на карте).
Как работает видеокарта: пошаговый процесс
Работа видеокарты можно описать как конвейер обработки данных. Вот упрощённая схема:
1. Получение данных: CPU отправляет задачу (например, рендеринг сцены в игре) через PCIe. Данные включают 3D-модели, текстуры и инструкции.
2. Обработка на GPU:
• Вершинный шейдер: Преобразует координаты объектов (вершин) в 3D-пространстве, применяя трансформации (вращение, масштабирование).
• Растеризация: Преобразует 3D-данные в 2D-изображение, разбивая на пиксели.
• Пиксельный (фрагментный) шейдер: Вычисляет цвет каждого пикселя, учитывая освещение, текстуры и эффекты (тени, отражения). Здесь используется параллельная обработка на множестве ядер.
• Дополнительные этапы: Могут включать постобработку (антиалиасинг, bloom) и вычисления для AI (например, в RTX-картах NVIDIA с DLSS).
3. Хранение и вывод: Результаты хранятся в VRAM, затем передаются на монитор через интерфейсы. Видеокарта может обрабатывать несколько кадров в секунду (FPS), обеспечивая плавность.
Примеры и аналогии
• Аналогия: Представьте GPU как конвейер на фабрике. CPU — менеджер, который даёт задания, а GPU — рабочие, которые быстро собирают детали (пиксели) параллельно.
• Производительность: Современные карты вроде NVIDIA RTX 40-series или AMD RX 7000-series могут обрабатывать миллиарды операций в секунду. Для сравнения, в играх видеокарта может рендерить 4K-изображение при 60 FPS, используя тысячи ядер.
Основные компоненты видеокарты
Видеокарта состоит из нескольких ключевых частей, работающих вместе:
• GPU (графический процессор): Основной "мозг". Это множество ядер (сотни или тысячи), оптимизированных для параллельных вычислений. В отличие от CPU (центрального процессора), GPU лучше справляется с повторяющимися задачами, как обработка пикселей.
• Видеопамять (VRAM): Специальная память (например, GDDR6 или HBM) для хранения текстур, моделей и промежуточных данных. Она быстрая и работает независимо от оперативной памяти компьютера.
• Шина данных (PCIe): Связь с материнской платой и CPU. Через неё передаются команды и данные.
• Контроллеры и интерфейсы: Включают HDMI/DisplayPort для вывода на экран, кулеры для охлаждения и питание (через разъёмы на карте).
Как работает видеокарта: пошаговый процесс
Работа видеокарты можно описать как конвейер обработки данных. Вот упрощённая схема:
1. Получение данных: CPU отправляет задачу (например, рендеринг сцены в игре) через PCIe. Данные включают 3D-модели, текстуры и инструкции.
2. Обработка на GPU:
• Вершинный шейдер: Преобразует координаты объектов (вершин) в 3D-пространстве, применяя трансформации (вращение, масштабирование).
• Растеризация: Преобразует 3D-данные в 2D-изображение, разбивая на пиксели.
• Пиксельный (фрагментный) шейдер: Вычисляет цвет каждого пикселя, учитывая освещение, текстуры и эффекты (тени, отражения). Здесь используется параллельная обработка на множестве ядер.
• Дополнительные этапы: Могут включать постобработку (антиалиасинг, bloom) и вычисления для AI (например, в RTX-картах NVIDIA с DLSS).
3. Хранение и вывод: Результаты хранятся в VRAM, затем передаются на монитор через интерфейсы. Видеокарта может обрабатывать несколько кадров в секунду (FPS), обеспечивая плавность.
Примеры и аналогии
• Аналогия: Представьте GPU как конвейер на фабрике. CPU — менеджер, который даёт задания, а GPU — рабочие, которые быстро собирают детали (пиксели) параллельно.
• Производительность: Современные карты вроде NVIDIA RTX 40-series или AMD RX 7000-series могут обрабатывать миллиарды операций в секунду. Для сравнения, в играх видеокарта может рендерить 4K-изображение при 60 FPS, используя тысячи ядер.
LLM расшифровывается как Large Language Model (Большая языковая модель).
Как работают LLM?
• Обучение: Модели обучаются на миллиардах слов из книг, статей, веб-сайтов и других источников. Они используют нейронные сети (часто трансформеры, как в архитектуре Transformer) для предсказания следующего слова в предложении на основе контекста.
• Размер: "Large" указывает на огромные параметры — миллиарды или триллионы весов в модели, что требует мощных компьютеров для обучения и запуска.
• Примеры технологий: Они основаны на алгоритмах вроде GPT (Generative Pre-trained Transformer), BERT (Bidirectional Encoder Representations from Transformers) или LaMDA от Google.
Ограничения
LLM могут "галлюцинировать" (генерировать неправдивую информацию), быть предвзятыми (из-за данных обучения) или требовать много ресурсов. Они не "понимают" мир как люди — это статистическое предсказание на основе паттернов.
Это тип ИИ, основанный на машинном обучении, который обучен на огромных объемах текстовых данных для понимания, генерации и обработки человеческого языка. Такие модели способны выполнять задачи, связанные с текстом, такие как ответы на вопросы, перевод, написание статей, генерация кода или даже творческие задачи (например, сочинение стихов).
Как работают LLM?
• Обучение: Модели обучаются на миллиардах слов из книг, статей, веб-сайтов и других источников. Они используют нейронные сети (часто трансформеры, как в архитектуре Transformer) для предсказания следующего слова в предложении на основе контекста.
• Размер: "Large" указывает на огромные параметры — миллиарды или триллионы весов в модели, что требует мощных компьютеров для обучения и запуска.
• Примеры технологий: Они основаны на алгоритмах вроде GPT (Generative Pre-trained Transformer), BERT (Bidirectional Encoder Representations from Transformers) или LaMDA от Google.
Ограничения
LLM могут "галлюцинировать" (генерировать неправдивую информацию), быть предвзятыми (из-за данных обучения) или требовать много ресурсов. Они не "понимают" мир как люди — это статистическое предсказание на основе паттернов.
Машинное обучение — область ИИ, где модели обучаются на данных для выполнения задач, таких как предсказание, классификация или кластеризация.
Алгоритмы ML делятся на категории: обучение с учителем, без учителя и с подкреплением.
Алгоритмы обучения с учителем:
Здесь модель обучается на размеченных данных (с входами и правильными выходами).
• Линейная регрессия: Предсказывает непрерывные значения, минимизируя ошибку между предсказанием и реальностью. Пример: прогноз цен на недвижимость на основе площади и расположения. Преимущества: простота и интерпретируемость.
• Логистическая регрессия: Классифицирует данные в бинарные категории (да/нет). Пример: определение, одобрить ли кредит по финансовым данным. Преимущества: эффективность для больших наборов данных.
• Деревья решений: Строит дерево правил на основе признаков. Пример: диагностика заболеваний по симптомам. Преимущества: легко визуализировать и интерпретировать.
• Случайный лес: Ансамбль деревьев решений для улучшения точности. Пример: классификация спама в email. Преимущества: устойчив к переобучению.
• Метод опорных векторов: Находит гиперплоскость для разделения классов. Пример: распознавание рукописных цифр. Преимущества: хорош для высокомерных данных.
• Нейронные сети (включая глубокое обучение): Многослойные модели, имитирующие мозг. Пример: распознавание изображений в компьютерном зрении. Преимущества: мощны для сложных задач, но требуют много данных.
Алгоритмы обучения без учителя:
Здесь модель находит паттерны в неразмеченных данных.
• K-средних: Группирует данные в кластеры по сходству. Пример: сегментация клиентов по покупкам. Преимущества: простота и скорость.
• Иерархическая кластеризация: Строит дерево кластеров. Пример: анализ генетических данных. Преимущества: не требует задания числа кластеров заранее.
• Метод главных компонент: Снижает размерность данных, сохраняя ключевую информацию. Пример: сжатие изображений. Преимущества: уменьшает шум и ускоряет вычисления.
Алгоритмы обучения с подкреплением:
Модель учится через взаимодействие с окружением, получая награды.
• Q-обучение: Агент учится оптимальной стратегии. Пример: обучение агента играть в шахматы или управлять роботом. Преимущества: подходит для динамических задач, как игры или автономное вождение.
Алгоритмы ML делятся на категории: обучение с учителем, без учителя и с подкреплением.
Алгоритмы обучения с учителем:
Здесь модель обучается на размеченных данных (с входами и правильными выходами).
• Линейная регрессия: Предсказывает непрерывные значения, минимизируя ошибку между предсказанием и реальностью. Пример: прогноз цен на недвижимость на основе площади и расположения. Преимущества: простота и интерпретируемость.
• Логистическая регрессия: Классифицирует данные в бинарные категории (да/нет). Пример: определение, одобрить ли кредит по финансовым данным. Преимущества: эффективность для больших наборов данных.
• Деревья решений: Строит дерево правил на основе признаков. Пример: диагностика заболеваний по симптомам. Преимущества: легко визуализировать и интерпретировать.
• Случайный лес: Ансамбль деревьев решений для улучшения точности. Пример: классификация спама в email. Преимущества: устойчив к переобучению.
• Метод опорных векторов: Находит гиперплоскость для разделения классов. Пример: распознавание рукописных цифр. Преимущества: хорош для высокомерных данных.
• Нейронные сети (включая глубокое обучение): Многослойные модели, имитирующие мозг. Пример: распознавание изображений в компьютерном зрении. Преимущества: мощны для сложных задач, но требуют много данных.
Алгоритмы обучения без учителя:
Здесь модель находит паттерны в неразмеченных данных.
• K-средних: Группирует данные в кластеры по сходству. Пример: сегментация клиентов по покупкам. Преимущества: простота и скорость.
• Иерархическая кластеризация: Строит дерево кластеров. Пример: анализ генетических данных. Преимущества: не требует задания числа кластеров заранее.
• Метод главных компонент: Снижает размерность данных, сохраняя ключевую информацию. Пример: сжатие изображений. Преимущества: уменьшает шум и ускоряет вычисления.
Алгоритмы обучения с подкреплением:
Модель учится через взаимодействие с окружением, получая награды.
• Q-обучение: Агент учится оптимальной стратегии. Пример: обучение агента играть в шахматы или управлять роботом. Преимущества: подходит для динамических задач, как игры или автономное вождение.
Распределение Пуассона для моделирования сетевых пакетов
Распределение Пуассона — простой способ описать, сколько случайных событий может произойти за определенное время. Оно подходит, когда события редкие, независимые друг от друга и происходят с постоянной средней скоростью.
В компьютерных сетях это идеально для моделирования прибытия пакетов данных — маленьких порций информации, которые передаются между устройствами.
Зачем оно нужно в сетях?
• Моделирование трафика: Представьте, что пакеты приходят на сервер, как посетители в магазин. Если в среднем приходит 5 пакетов в минуту, Пуассоновское распределение помогает предсказать, сколько их может быть в следующий раз — 3, 7 или ни одного.
• Оценка нагрузки: Оно используется в моделях очередей, чтобы понять, не "затормозится" ли сеть. Например, если пакетов слишком много, сервер может не справиться, и данные потеряются.
• Анализ проблем: В реальных сетях (как интернет или локальная сеть) пакеты прибывают случайно. Если трафик не соответствует этому распределению, это может сигнализировать о проблеме, как хакерская атака.
Простой пример
Допустим, в минуту в среднем прибывает 5 пакетов. Распределение Пуассона говорит:
• Вероятность, что прибудет ровно 3 пакета, около 14% (довольно часто).
• Вероятность, что ни одного — очень маленькая, около 0.7% (редко, потому что сеть активна).
• Среднее число пакетов всегда равно 5, а разброс тоже около 5.
Это помогает инженерам планировать сети: добавлять больше мощности, если среднее растет.
Пример кода на Python (простая симуляция)
Генерирует случайные числа пакетов и показывает среднее:
Запустите его (нужен Python с numpy: pip install numpy), и увидите, что среднее близко к 5.
Распределение Пуассона — простой способ описать, сколько случайных событий может произойти за определенное время. Оно подходит, когда события редкие, независимые друг от друга и происходят с постоянной средней скоростью.
В компьютерных сетях это идеально для моделирования прибытия пакетов данных — маленьких порций информации, которые передаются между устройствами.
Зачем оно нужно в сетях?
• Моделирование трафика: Представьте, что пакеты приходят на сервер, как посетители в магазин. Если в среднем приходит 5 пакетов в минуту, Пуассоновское распределение помогает предсказать, сколько их может быть в следующий раз — 3, 7 или ни одного.
• Оценка нагрузки: Оно используется в моделях очередей, чтобы понять, не "затормозится" ли сеть. Например, если пакетов слишком много, сервер может не справиться, и данные потеряются.
• Анализ проблем: В реальных сетях (как интернет или локальная сеть) пакеты прибывают случайно. Если трафик не соответствует этому распределению, это может сигнализировать о проблеме, как хакерская атака.
Простой пример
Допустим, в минуту в среднем прибывает 5 пакетов. Распределение Пуассона говорит:
• Вероятность, что прибудет ровно 3 пакета, около 14% (довольно часто).
• Вероятность, что ни одного — очень маленькая, около 0.7% (редко, потому что сеть активна).
• Среднее число пакетов всегда равно 5, а разброс тоже около 5.
Это помогает инженерам планировать сети: добавлять больше мощности, если среднее растет.
Пример кода на Python (простая симуляция)
Генерирует случайные числа пакетов и показывает среднее:
import numpy as np
# Среднее: 5 пакетов в минуту
lambda_rate = 5
# Симуляция 1000 минут
packets = np.random.poisson(lambda_rate, 1000)
# Среднее из симуляции
print(f"Среднее количество пакетов: {np.mean(packets):.2f}")Запустите его (нужен Python с numpy: pip install numpy), и увидите, что среднее близко к 5.
Императивное программирование: когда программа — это последовательность шагов
Императивное программирование — это самый «естественный» для человека способ описывать алгоритмы: делай раз, делай два, делай три.
Программа в этой парадигме состоит из команд, которые изменяют состояние — значения переменных, память, содержимое файлов и т. д.
Основные признаки:
• есть переменные, которые можно менять;
• есть инструкции (assignments, циклы, условия);
• программа — это последовательность действий.
Простой пример (Python)
Здесь мы явно изменяем состояние:
• создаём переменную
• увеличиваем её в цикле.
Примеры языков:
• C, C++, Java
• Python (когда используем циклы и изменяемые переменные)
• JavaScript (в императивном стиле)
Когда применять:
• Нужна высокая производительность.
• Логика естественна как последовательность операций.
• Важен контроль над состоянием: работа с памятью, сетевыми протоколами, системами реального времени.
Императивное программирование — это самый «естественный» для человека способ описывать алгоритмы: делай раз, делай два, делай три.
Программа в этой парадигме состоит из команд, которые изменяют состояние — значения переменных, память, содержимое файлов и т. д.
Основные признаки:
• есть переменные, которые можно менять;
• есть инструкции (assignments, циклы, условия);
• программа — это последовательность действий.
Простой пример (Python)
# Находим сумму чисел от 1 до n
n = 5
s = 0
for i in range(1, n + 1):
s += i
print(s) # 15Здесь мы явно изменяем состояние:
• создаём переменную
s,• увеличиваем её в цикле.
Примеры языков:
• C, C++, Java
• Python (когда используем циклы и изменяемые переменные)
• JavaScript (в императивном стиле)
Когда применять:
• Нужна высокая производительность.
• Логика естественна как последовательность операций.
• Важен контроль над состоянием: работа с памятью, сетевыми протоколами, системами реального времени.
Функциональное программирование: когда программа — это математика
Функциональная парадигма основана на идее, что вычисления — это применение функций, которые не изменяют состояние.
Главное правило:
Функция при одинаковых входных данных всегда возвращает один и тот же результат и не имеет побочных эффектов.
Основные признаки:
• отсутствие изменяемых переменных;
• функции как «граждане первого класса»;
• рекурсия вместо циклов;
• map, filter, reduce;
• композиция функций.
Пример (Python, функциональный стиль):
Посчитаем сумму чисел от 1 до n без циклов и изменяемых переменных.
Или ещё более функционально — через встроенную функцию:
Никакого изменения состояния — просто применяем функции к данным.
Примеры языков:
• Haskell
• F#
• Lisp, Clojure
• JavaScript (частично)
• Python (частично)
Когда применять:
• Много параллельных вычислений — отсутствие модификации состояния делает код потокобезопасным.
• Нужна ясная математическая логика.
• Хотите писать компактный и легко тестируемый код.
Функциональная парадигма основана на идее, что вычисления — это применение функций, которые не изменяют состояние.
Главное правило:
Функция при одинаковых входных данных всегда возвращает один и тот же результат и не имеет побочных эффектов.
Основные признаки:
• отсутствие изменяемых переменных;
• функции как «граждане первого класса»;
• рекурсия вместо циклов;
• map, filter, reduce;
• композиция функций.
Пример (Python, функциональный стиль):
Посчитаем сумму чисел от 1 до n без циклов и изменяемых переменных.
from functools import reduce
n = 5
result = reduce(lambda a, b: a + b, range(1, n + 1))
print(result) # 15Или ещё более функционально — через встроенную функцию:
sum(range(1, n + 1))Никакого изменения состояния — просто применяем функции к данным.
Примеры языков:
• Haskell
• F#
• Lisp, Clojure
• JavaScript (частично)
• Python (частично)
Когда применять:
• Много параллельных вычислений — отсутствие модификации состояния делает код потокобезопасным.
• Нужна ясная математическая логика.
• Хотите писать компактный и легко тестируемый код.
Объектно-ориентированное программирование: когда всё — это объекты
Объектно-ориентированное программирование (ООП) моделирует программу как набор объектов, которые представляют сущности мира и взаимодействуют между собой.
Основные принципы ООП:
• Инкапсуляция — скрываем внутреннее устройство объекта.
• Наследование — один класс может расширять другой.
• Полиморфизм — общий интерфейс, разные реализации.
• Абстракция — выделение значимых свойств сущности.
Пример на Python
Создадим простую иерархию животных.
Вывод:
Здесь работает полиморфизм: метод
Примеры языков:
• Java
• C#
• Python (полностью поддерживает ООП)
• C++
• Swift
Когда применять:
• Когда нужно моделировать сложные сущности и отношения.
• Для больших проектов.
• В бизнес-логике, где есть объекты: пользователи, документы, счета.
Объектно-ориентированное программирование (ООП) моделирует программу как набор объектов, которые представляют сущности мира и взаимодействуют между собой.
Основные принципы ООП:
• Инкапсуляция — скрываем внутреннее устройство объекта.
• Наследование — один класс может расширять другой.
• Полиморфизм — общий интерфейс, разные реализации.
• Абстракция — выделение значимых свойств сущности.
Пример на Python
Создадим простую иерархию животных.
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Гав!"
class Cat(Animal):
def speak(self):
return "Мяу!"
animals = [Dog(), Cat()]
for a in animals:
print(a.speak())Вывод:
Гав!
Мяу!Здесь работает полиморфизм: метод
speak() вызывается одинаково, но ведёт себя по-разному.Примеры языков:
• Java
• C#
• Python (полностью поддерживает ООП)
• C++
• Swift
Когда применять:
• Когда нужно моделировать сложные сущности и отношения.
• Для больших проектов.
• В бизнес-логике, где есть объекты: пользователи, документы, счета.
Логическое программирование: когда программа — это набор фактов и правил
Логическое программирование основано на идее, что программа — это знание, а выполнение — это логический вывод.
То есть вместо того, чтобы объяснять компьютеру как найти ответ, вы описываете что является истинным, а система сама выводит результат.
Главный представитель — язык Prolog.
Основные концепции:
• Факты — утверждения об объекте или отношении.
• Правила — логические зависимости между фактами.
• Запросы (queries) — вопросы к программе.
• Унификация — сопоставление шаблонов.
• Поиск решения — Prolog сам перебирает варианты и находит подходящие.
Пример: семейные отношения (Prolog)
Факты:
Это означает:
Анна — родитель Ивана
Сергей — родитель Ивана
Иван — родитель Димы
Правило:
Значение:
X — дед/бабушка Y, если X — родитель Z, а Z — родитель Y.
Запрос:
Ответ Prolog:
Компьютер сам делает логический вывод. Нам не нужно описывать алгоритм — только знания.
Где применяется логическое программирование:
• экспертные системы,
• поиск решений в сложных логических задачах,
• искусственный интеллект (классические подходы),
• автоматические доказатели теорем,
• анализ и трансформация программ.
Логическое программирование основано на идее, что программа — это знание, а выполнение — это логический вывод.
То есть вместо того, чтобы объяснять компьютеру как найти ответ, вы описываете что является истинным, а система сама выводит результат.
Главный представитель — язык Prolog.
Основные концепции:
• Факты — утверждения об объекте или отношении.
• Правила — логические зависимости между фактами.
• Запросы (queries) — вопросы к программе.
• Унификация — сопоставление шаблонов.
• Поиск решения — Prolog сам перебирает варианты и находит подходящие.
Пример: семейные отношения (Prolog)
Факты:
parent(anna, ivan).
parent(sergey, ivan).
parent(ivan, dima).
Это означает:
Анна — родитель Ивана
Сергей — родитель Ивана
Иван — родитель Димы
Правило:
grandparent(X, Y) :- parent(X, Z), parent(Z, Y).Значение:
X — дед/бабушка Y, если X — родитель Z, а Z — родитель Y.
Запрос:
?- grandparent(X, dima).Ответ Prolog:
X = anna ;
X = sergey ;
false.Компьютер сам делает логический вывод. Нам не нужно описывать алгоритм — только знания.
Где применяется логическое программирование:
• экспертные системы,
• поиск решений в сложных логических задачах,
• искусственный интеллект (классические подходы),
• автоматические доказатели теорем,
• анализ и трансформация программ.