Знакомы ли вы с технологиями, лежащими в основе вашей собственной программы? Почему «правильный» код не хочет работать? Истина проста и банальна — нужно сразу создавать код, который будет работать хорошо и не будет прятать в себе трудноуловимые ошибки.
Для этого Джонатан Стейнхарт исследует фундаментальные концепции, лежащие в основе работы компьютеров. Он рассматривает аппаратное обеспечение, поведение программ на определенных устройствах, чтобы показать, как на самом деле должен работать ваш код.
Узнайте, что на самом деле происходит, когда вы запускаете код на компьютере, и вы научитесь программировать лучше и эффективнее.
Author(s): Джонатан Стейнхарт
Series: Для профессионалов
Edition: 1
Publisher: Питер
Year: 2023
Language: Russian
Commentary: Publisher's PDF
Pages: 528
City: СПб.
Tags: Machine Learning; Web Programming; Security; Privacy; Cryptography; Application Development; C; Electronics; Mathematical Logic; Combinatorics; Computer Architecture; Elementary; Systems Programming; Race Conditions
Об авторе
О научном редакторе
Благодарности
Предисловие
От издательства
Введение
Почему важно программировать хорошо
Научиться писать код — только начало
Низкоуровневые знания важны
Кому стоит прочитать эту книгу?
Что такое компьютеры?
Что такое программирование компьютеров?
Кодинг, программирование, инженерия и сomputer science
Ландшафт
Структура книги
Глава 1. Внутренний язык компьютеров
Что такое язык?
Письменный язык
Бит
Логические операции
Булева алгебра
Закон де Моргана
Представление целых чисел с помощью битов
Представление положительных чисел
Сложение двоичных чисел
Представление отрицательных чисел
Представление действительных чисел
Представление с фиксированной точкой
Представление с плавающей точкой
Стандарт IEEE для чисел с плавающей точкой
Двоично-десятичная система счисления
Более простые способы работы с двоичными числами
Восьмеричное представление
Шестнадцатеричное представление
Представление контекста
Именованные группы битов
Представление текста
Американский стандартный код обмена информацией
Развитие других стандартов
8-битная форма представления Unicode
Использование символов для представления чисел
Кодировка Quoted-Printable
Кодировка Base64
Кодировка URL
Представление цветов
Добавление прозрачности
Кодирование цветов
Выводы
Глава 2. Комбинаторная логика
Задача для цифровых компьютеров
Разница между аналоговым и цифровым представлением
Почему для аппаратного обеспечения размер имеет значение
Цифровые решения для более стабильных устройств
Цифровые устройства в аналоговом мире
Почему вместо цифр используются биты
Знакомство с принципами работы электрического тока
Электрический ток на примере сантехники
Электрические переключатели
Создание аппаратного обеспечения, работающего с битами
Реле
Вакуумные лампы
Транзисторы
Интегральные схемы
Логические вентили
Повышение помехоустойчивости с помощью гистерезиса
Дифференциальная передача сигналов
Задержка распространения
Варианты выходов
Создание более сложных схем
Создание сумматора
Построение дешифраторов
Построение демультиплексоров
Построение селекторов
Выводы
Глава 3. Последовательная логика
Представление времени
Осцилляторы
Генераторы тактовых сигналов
Триггеры-защелки
Синхронный RS-триггер
Триггеры
Счетчики
Регистры
Организация памяти и обращение к памяти
Оперативная память
Постоянное запоминающее устройство
Блочные устройства
Флеш-память и твердотельные диски
Обнаружение и исправление ошибок
Аппаратное и программное обеспечение
Выводы
Глава 4. Анатомия компьютера
Память
Ввод и вывод
Центральный процессор
Арифметико-логическое устройство
Сдвиг
Исполнительное устройство
Набор инструкций
Инструкции
Режимы адресации
Инструкции кода состояния
Ветвление
Итоговый набор инструкций
Окончательный проект
Регистр команд
Передача данных и управляющие сигналы
Управление движением
Наборы команд RISC и CISC
Графические процессоры
Выводы
Глава 5. Архитектура компьютера
Основные архитектурные элементы
Ядра процессора
Микропроцессоры и микрокомпьютеры
Процедуры, подпрограммы и функции
Стеки
Прерывания
Относительная адресация
Блок управления памятью
Виртуальная память
Пространство системы и пользователя
Иерархия памяти и производительность
Сопроцессоры
Организация данных в памяти
Запуск программ
Мощность запоминающих устройств
Выводы
Глава 6. Разбор связей
Низкоуровневый ввод/вывод
Порты ввода/вывода
Нажми на кнопку
Да будет свет
Свет, камера, мотор…
Светлые идеи
2n оттенков серого
Квадратура
Параллельная связь
Последовательная связь
Поймать волну
Универсальная последовательная шина
Сети
Современные локальные сети
Интернет
Аналоговые устройства в цифровом мире
Цифро-аналоговое преобразование
Аналого-цифровое преобразование
Цифровое аудио
Цифровые изображения
Видео
Устройства взаимодействия с человеком
Терминалы
Графические терминалы
Векторная графика
Растровая графика
Клавиатура и мышь
Выводы
Глава 7. Организация данных
Базовые типы данных
Массивы
Битовые матрицы
Строки
Составные типы данных
Односвязные списки
Динамическое выделение памяти
Более эффективное выделение памяти
Сборка мусора
Двусвязные списки
Иерархические структуры данных
Хранение данных на дисковых устройствах
Базы данных
Индексы
Перемещение данных
Векторный ввод/вывод
Подводные камни объектно-ориентированного программирования
Сортировка
Создание хешей
Эффективность и производительность
Выводы
Глава 8. Обработка языка
Язык ассемблера
Языки высокого уровня
Структурное программирование
Лексический анализ
Конечные автоматы
Регулярные выражения
От слов к предложениям
Клуб «Язык дня»
Деревья синтаксического анализа
Интерпретаторы
Компиляторы
Оптимизация
Осторожнее с аппаратной частью!
Выводы
Глава 9. Веб-браузер
Языки разметки
Унифицированные указатели ресурсов
HTML-документы
Объектная модель документа
Словарь древовидных структур данных
Интерпретация модели DOM
Каскадные таблицы стилей
XML и друзья
JavaScript
jQuery
SVG
HTML5
JSON
Выводы
Глава 10. Прикладное и системное программирование
«Угадай животное», версия 1: HTML и JavaScript
Каркас прикладного уровня
Тело веб-страницы
JavaScript
CSS
«Угадай животное», версия 2: С
Терминалы и командная строка
Создание программы
Терминалы и драйверы устройств
Переключение контекста
Стандартный ввод/вывод
Кольцевые буферы
Больше абстракций — лучше код
Важные мелочи
Переполнение буфера
Программа на языке С
Тренировка
Выводы
Глава 11. Сокращения и приближения
Поиск по таблице
Преобразование
Отображение текстур
Классификация символов
Целочисленные методы
Прямые линии
Кривые линии
Многочлены
Рекурсивное деление
Спирали
Конструктивная геометрия
Сдвиг и наложение масок
Еще меньше математики
Приближения степенного ряда
Алгоритм Волдера
Парочка случайностей
Заполняющие пространство кривые
L-системы
Стохастические приемы
Квантование
Выводы
Глава 12. Взаимоблокировки и состояния гонки
Что такое состояние гонки?
Общие ресурсы
Процессы и потоки
Блокировки
Транзакции и детализация
Ожидание захвата ресурсов
Взаимоблокировки
Реализация кратковременного захвата ресурсов
Реализация долговременного захвата ресурсов
JavaScript в браузере
Асинхронные процессы и промисы
Выводы
Глава 13. Безопасность
Обзор безопасности и конфиденциальности
Модель угроз
Доверие
Физическая безопасность
Безопасность связей
Наше время
Метаданные и наблюдение
Социальный контекст
Аутентификация и авторизация
Криптография
Стеганография
Шифры подстановки
Шифры перестановки
Более сложные шифры
Одноразовые блокноты
Проблема обмена ключами
Криптография с открытым ключом
Прямая секретность
Криптографические хеш-функции
Цифровые подписи
Инфраструктура открытых ключей
Блокчейн
Управление паролями
Гигиена ПО
Защищайте только необходимое
Проверьте логику трижды
Поищите ошибки
Сведите к минимуму поверхности атаки
Не выходите за пределы
Генерировать хорошие случайные числа — сложно
Знайте свой код
Чрезвычайная изобретательность — ваш враг
Разберитесь с видимостью
Не переусердствуйте
Не копите
Не полагайтесь на динамическое выделение памяти
Не полагайтесь и на сборку мусора
Данные как код
Выводы
Глава 14. Машинный интеллект
Обзор
Машинное обучение
Байес
Гаусс
Собель
Кэнни
Выделение признаков
Нейронные сети
Использование данных машинного обучения
Искусственный интеллект (ИИ)
Большие данные
Выводы
Глава 15. Влияние реальных условий
Повышение ценности
Как мы до этого дошли
Краткая история
ПО с открытым исходным кодом
Creative Commons
Расцвет переносимости
Управление пакетами
Контейнеры
Java
Node.js
Облачные вычисления
Виртуальные машины
Портативные устройства
Среда разработки
Есть ли у вас опыт?
Учимся оценивать
Планируем проекты
Принимаем решения
Работаем с разными людьми
Создаем культуру поведения на работе
Делаем осознанный выбор
Методологии разработки
Проектирование
Ведение записей
Быстрое прототипирование
Разработка интерфейса
Использовать сторонний код или писать собственный?
Разработка
Серьезный разговор
Переносимый код
Управление версиями
Тестирование
Создание отчетов и отслеживание багов
Рефакторинг
Обслуживание
Позаботьтесь о стиле
Чините, а не создавайте заново
Выводы