Создавайте высокопроизводительные браузерные приложения, не полагаясь на один только JavaScript! Компилируясь в бинарный формат WebAssembly, ваш код на C, C++ или Rust будет работать в браузере с оптимальной скоростью. WebAssembly обеспечивает большую скорость, возможности повторного использования существующего кода и доступ к новым и более быстрым библиотекам. Кроме того, при необходимости вы можете настроить взаимодействие с JavaScript.
Author(s): Жерар Галлан
Series: Библиотека программиста
Edition: 1
Publisher: Питер
Year: 2022
Language: Russian
Commentary: Vector PDF
Pages: 496
City: СПб.
Tags: C++; Debugging; JavaScript; Web Applications; Node.js; Testing; WebAssembly; Emscripten
Предисловие
Благодарности
О книге
Для кого эта книга
Структура книги
О коде
Другие онлайн-ресурсы
Об авторе
Об иллюстрации на обложке
От издательства
Часть IПервые шаги
Глава 1. Знакомство с WebAssembly
1.1. Что такое WebAssembly
1.1.1. Asm.js, предшественник WebAssembly
1.1.2. От asm.js к MVP
1.2. Какие проблемы решает WebAssembly
1.2.1. Улучшение производительности
1.2.2. Более короткое время запуска в сравнении с JavaScript
1.2.3. Возможность использовать в браузере другие языки помимо JavaScript
1.2.4. Возможность повторного использования кода
1.3. Как работает WebAssembly
1.3.1. Обзор работы компиляторов
1.3.2. Загрузка, компиляция и создание модуля
1.4. Структура модуля WebAssembly
1.4.1. Преамбула
1.4.2. Известные разделы
1.4.3. Пользовательские разделы
1.5. Текстовый формат WebAssembly
1.6. Как обеспечивается безопасность WebAssembly
1.7. Какие языки можно использовать для создания модуля WebAssembly
1.8. Где можно использовать модуль
Резюме
Глава 2. Модули WebAssembly изнутри
2.1. Известные разделы
2.2. Пользовательские разделы
Резюме
Глава 3. Создание вашего первого модуля WebAssembly
3.1. Набор инструментальных средств Emscripten
3.2. Модули WebAssembly
3.2.1. Когда не стоит использовать модуль WebAssembly
3.3. Параметры вывода Emscripten
3.4. Компиляция C или C++ с помощью Emscripten и шаблона HTML
3.5. Emscripten генерирует связующий код на JavaScript
3.5.1. Компиляция кода на C или C++ вместе с JavaScript, созданного Emscripten
3.5.2. Создание базовой HTML-страницы для использования в браузерах
3.6. Emscripten генерирует только файл WebAssembly
3.6.1. Компиляция C или C++ в виде вспомогательного модуля с помощью Emscripten
3.6.2. Загрузка и создание экземпляра модуля в браузере
3.7. Проверка поддержки: как проверить, доступен ли WebAssembly
Сценарии использования в реальном мире
Упражнения
Резюме
Часть IIРабота с модулями
Глава 4. Повторное использование существующей кодовой базы на C++
4.1. Использование C или C++ для создания модуля со связующим кодом Emscripten
4.1.1. Внесение изменений в код на C++
4.1.2. Компиляция кода в модуль WebAssembly
4.1.3. Создание веб-страницы
4.1.4. Написание кода на JavaScript, взаимодействующего с модулем
4.1.5. Просмотр результатов
4.2. Использование C или C++ для создания модуля без Emscripten
4.2.1. Внесение изменений в C++
4.2.2. Компиляция кода в модуль WebAssembly
4.2.3. Создание файла JavaScript, взаимодействующего с модулем
4.2.4. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 5. Создание модуля WebAssembly, вызывающего JavaScript
5.1. Использование C или C++ для создания модуля со связующим кодом Emscripten
5.1.1. Внесение изменений в код на C++
5.1.2. Создание кода на JavaScript и добавление его в сгенерированный Emscripten JavaScript-файл
5.1.3. Компиляция кода в модуль WebAssembly
5.1.4. Изменение JavaScript-кода веб-страницы
5.1.5. Просмотр результатов
5.2. Использование C или C++ для создания модуля без связующих файлов Emscripten
5.2.1. Внесение изменений в код на C++
5.2.2. Компиляция кода в модуль WebAssembly
5.2.3. Изменение кода на JavaScript для взаимодействия с модулем
5.2.4. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 6. Создание модуля WebAssembly, вызывающего JavaScript, с использованием указателей на функции
6.1. Использование C или C++ для создания модуля со связующими файлами Emscripten
6.1.1. Использование указателя на функцию, передаваемого модулю через JavaScript
6.1.2. Изменение кода на C++
6.1.3. Компиляция кода в модуль WebAssembly
6.1.4. Изменение JavaScript-кода веб-страницы
6.1.5. Просмотр результатов
6.2. Использование C или C++ для создания модуля без связующего файла Emscripten
6.2.1. Использование указателей на функции, передаваемых в модуль через JavaScript
6.2.2. Изменение кода на C++
6.2.3. Компиляция кода в модуль WebAssembly
6.2.4. Изменение JavaScript-кода, который будет взаимодействовать с модулем
6.2.5. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Часть IIIПродвинутые темы
Глава 7. Динамическое связывание: основы
7.1. Динамическое связывание: за и против
7.2. Варианты реализации динамического связывания
7.2.1. Вспомогательные и основные модули
7.2.2. Динамическое связывание: dlopen
7.2.3. Динамическое связывание: dynamicLibraries
7.2.4. Динамическое связывание: JavaScript API в WebAssembly
7.3. Обзор динамического связывания
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 8. Динамическое связывание: реализация
8.1. Создание модулей WebAssembly
8.1.1. Разделение логики в validate.cpp на два файла
8.1.2. Создание нового файла С++ для логики формы Place Order (Разместить заказ)
8.1.3. Использование Emscripten для генерации вспомогательных модулей WebAssembly
8.1.4. Определение JavaScript-функции для обработки ошибок при валидации
8.1.5. Использование Emscripten для генерации основного модуля WebAssembly
8.2. Настройка веб-страницы
8.2.1. Изменение кода JavaScript веб-страницы
8.2.2. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 9. Потоки: веб-воркеры и pthread
9.1. Преимущества веб-воркеров
9.2. Рекомендации по использованию веб-воркеров
9.3. Предварительная загрузка модуля WebAssembly с помощью веб-воркера
9.3.1. Изменение логики calculate_primes
9.3.2. Использование Emscripten для генерации файлов WebAssembly
9.3.3. Копирование в правильное место
9.3.4. Создание HTML-файла для веб-страницы
9.3.5. Создание файла JavaScript для веб-страницы
9.3.6. Создание файла JavaScript для веб-воркера
9.3.7. Просмотр результатов
9.4. Использование pthread
9.4.1. Изменение логики calculate_primes для создания и использования четырех pthread
9.4.2. Использование Emscripten для генерации файлов WebAssembly
9.4.3. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 10. Модули WebAssembly в Node.js
10.1. Вспоминая пройденное
10.2. Валидация на стороне сервера
10.3. Работа с модулями, созданными Emscripten
10.3.1. Загрузка модуля WebAssembly
10.3.2. Вызов функций в модуле WebAssembly
10.3.3. Вызов JavaScript-функций
10.3.4. Вызов указателей на функции JavaScript
10.4. Использование JavaScript API в WebAssembly
10.4.1. Загрузка и создание экземпляра модуля WebAssembly
10.4.2. Вызов функций в модуле WebAssembly
10.4.3. Вызов JavaScript из модуля WebAssembly
10.4.4. Вызов указателей на функции JavaScript из модуля WebAssembly
Сценарии использования в реальном мире
Упражнения
Резюме
Часть IVОтладка и тестирование
Глава 11. Текстовый формат WebAssembly
11.1. Создание основной логики игры с помощью текстового формата WebAssembly
11.1.1. Разделы модуля
11.1.2. Комментарии
11.1.3. Сигнатуры функций
11.1.4. Узел module
11.1.5. Узлы import
11.1.6. Узлы global
11.1.7. Узлы export
11.1.8. Узел start
11.1.9. Узлы code
11.1.10. Узлы type
11.1.11. Узел data
11.2. Создание модуля WebAssembly из текстового формата
11.3. Модуль, созданный Emscripten
11.3.1. Создание файла на C++
11.3.2. Создание модуля WebAssembly
11.4. Создание файлов HTML и JavaScript
11.4.1. Изменение файла HTML
11.4.2. Создание файла JavaScript
11.5. Просмотр результатов
Сценарии использования в реальном мире
Упражнения
Резюме
Глава 12. Отладка
12.1. Расширение игры
12.2. Изменение HTML
12.3. Отображение количества попыток
12.3.1. Функция generateCards в JavaScript
12.3.2. Изменения в коде текстового формата
12.3.3. Создание файла Wasm
12.3.4. Тестирование изменений
12.4. Увеличение количества попыток
12.4.1. Функция updateTriesTotal в JavaScript
12.4.2. Изменение текстового формата
12.4.3. Создание файла Wasm
12.4.4. Тестирование изменений
12.5. Обновление экрана итогов
12.5.1. Функция levelComplete в JavaScript
12.5.2. Изменение текстового формата
12.5.3. Создание файла Wasm
12.5.4. Тестирование изменений
Упражнения
Резюме
Глава 13. Тестирование и все, что с ним связано
13.1. Установка среды тестирования JavaScript
13.1.1. Файл package.json
13.1.2. Установка Mocha и Chai
13.2. Создание и запуск тестов
13.2.1. Написание тестов
13.2.2. Запуск тестов из командной строки
13.2.3. HTML-страница, загружающая тесты
13.2.4. Запуск тестов из браузера
13.2.5. Исправление тестов
13.3. Что дальше
Упражнения
Резюме
Приложения
Приложение А. Установка и настройка инструментов
A.1. Python
A.1.1. Запуск локального веб-сервера
A.1.2. Тип носителя WebAssembly
A.2. Emscripten
A.2.1. Загрузка Emscripten SDK
A.2.2. Если вы используете Windows
A.2.3. Если вы используете Mac или Linux
A.2.4. Решение проблем при установке
A.3. Node.js
A.4. WebAssembly Binary Toolkit
A.5. Bootstrap
Приложение Б. Функции ccall, cwrap и вызовы функций напрямую
Б.1. Функция ccall
Б.1.1. Создание простого модуля WebAssembly
Б.1.2. Создание веб-страницы, которая будет взаимодействовать с модулем WebAssembly
Б.2. Функция cwrap
Б.2.1. Изменение кода JavaScript для использования cwrap
Б.3. Вызовы функций напрямую
Б.4. Передача массива в модуль
Приложение В. Макросы в Emscripten
В.1. Макросы emscripten_run_script
В.2. Макросы EM_JS
В.2.1. Без параметров
В.2.2. Передача значений параметров
В.2.3. Передача указателей в качестве параметров
В.2.4. Возвращение указателя на строку
В.3. Макросы EM_ASM
В.3.1. EM_ASM
В.3.2. EM_ASM_
В.3.3. Передача указателей в качестве параметров
В.3.4. EM_ASM_INT и EM_ASM_DOUBLE
В.3.5. Возврат указателя на строку
Приложение Г. Ответы к упражнениям
Г.1. Глава 3
Г.2. Глава 4
Г.3. Глава 5
Г.4. Глава 6
Г.5. Глава 7
Г.6. Глава 8
Г.7. Глава 9
Г.8. Глава 10
Г.9. Глава 11
Г.10. Глава 12
Г.11. Глава 13
Приложение Д. Дополнительные возможности текстового формата
Д.1. Операторы потока управления
Д.1.1. Операторы if
Д.1.2. Циклы
Д.2. Указатели на функции
Д.2.1. Тестирование кода