
Книга содержит вводный курс по языку Go для системного программирования, описывает применение Go для реализации конкурентности и параллелизма, рассказывает об интероперабельности между имеющимся кодом на C с новым кодом на Go, а также исследует возможности внедрения Go для повышения производительности различных дистрибутивов. Второе издание содержит описание языка Go в версии 1.2 и описание реализации TinyGo, дополнительно приведены новые примеры использования языка.
Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.
Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.
Материал обновлён в соответствии с новой версией 1.22 языка Go
Ядро операционной системы Linux и множество модулей для различных дистрибутивов написаны на языке C.
Притом, что язык С продолжает развиваться и активно использоваться на практике, в область системного программирования постепенно проникают и более молодые языки, в частности Go. Перед вами – первая фундаментальная книга об использовании Go в Linux. Здесь вы познакомитесь с основами системного программирования, изучите детали взаимодействия между ядром и пользовательским пространством Linux, а также узнаете об интероперабельности между С и Go, о том, в каких аспектах и нюансах Linux язык Go может заменить и уже заменяет язык C. Особое внимание уделено конкурентности, параллелизму и стандарту POSIX. В конце книги для закрепления материала приведены реализации нескольких популярных алгоритмов.
Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.
Не старайся быстро пахать — сажай злаки, которые быстро всходят.
Андрей Рубанов
Во втором издании:
- Материал обновлён в соответствии с новой версией 1.22 языка Go
- Рассмотрена миниатюрная реализация языка TinyGo
- Дополнительно приведены новые примеры использования языка
Книгу “Linux и Go. Эффективное низкоуровневое программирование. 2-е издание” можно купить со скидкой в интернет-магазине издательства “БХВ“.
Предисловие…………………………………………………………………………………………….. 9
Предназначение и целевая аудитория……………………………………………………………………………………….. 9
Код примеров и замеченные опечатки…………………………………………………………………………………….. 11
Чего нет в этой книге………………………………………………………………………………………………………………….. 13
Соглашения и выделения, принятые в тексте………………………………………………………………………….. 13
Напоминание……………………………………………………………………………………………………………………………… 14
Источники информации…………………………………………………………………………………………………………….. 15
Часть I. Инструментарий языка Go…………………………………………. 17
Глава 1. Предыстория Go………………………………………………………………………. 19
Отцы-основатели о целях и мотивации……………………………………………………………………………………. 19
Применимость: беглый взгляд…………………………………………………………………………………………………… 20
Go, C, C++, Java, Python, Rust …………………………………………………………………………………………………… 21
Управление памятью и истоки ненадежности………………………………………………………………………… 28
Источники информации…………………………………………………………………………………………………………….. 29
Глава 2. Разворачиваем экосистему Go………………………………………………….. 31
Создание среды………………………………………………………………………………………………………………………….. 31
Стандартная инсталляция………………………………………………………………………………………………… 31
Версии среды……………………………………………………………………………………………………………………… 34
Альтернативы…………………………………………………………………………………………………………………….. 35
«Самая последняя» версия………………………………………………………………………………………………… 36
Смена версий………………………………………………………………………………………………………………………. 40
Проверяем: простейшая программа…………………………………………………………………………………………. 42
Простейшее приложение…………………………………………………………………………………………………… 44
Библиотеки статические и динамические………………………………………………………………………… 45
Компиляция или интерпретация?……………………………………………………………………………………… 46
Выбор: GoLang или GCC?…………………………………………………………………………………………………. 47
Инфраструктура GoLang…………………………………………………………………………………………………………… 48
Команды go………………………………………………………………………………………………………………………… 48
Переменные окружения……………………………………………………………………………………………………… 51
Переменная окружения GOPATH…………………………………………………………………………….. 55
Переменная окружения GOTOOLDIR………………………………………………………………………. 56
Переменные окружения GOARCH и GOOS……………………………………………………………… 57
Платформы, переносимость и кросс-компиляция………………………………………………….. 58
Стиль кодирования — автоформатирование: fmt…………………………………………………………… 61
Сборка приложений: build………………………………………………………………………………………………… 62
Сценарии на языке Go: run………………………………………………………………………………………………… 63
Загрузка проектов из сети: get………………………………………………………………………………………….. 64
Репозиторные системы……………………………………………………………………………………………… 64
Установка проектов………………………………………………………………………………………………….. 67
Утилиты GoLang: tool………………………………………………………………………………………………………… 68
Утилиты компиляции…………………………………………………………………………………………………………. 71
Связь с кодом C: cgo………………………………………………………………………………………………………………….. 73
Сторонний и дополнительный инструментарий…………………………………………………………………….. 76
Онлайн-инструмент для изучения Go………………………………………………………………………………. 77
Графический терминал Geany………………………………………………………………………………………….. 78
Интерактивный отладчик Delve………………………………………………………………………………………… 79
Источники информации…………………………………………………………………………………………………………….. 81
Глава 3. Неформально о синтаксисе Go…………………………………………………. 82
Типы данных………………………………………………………………………………………………………………………………. 87
Переменные………………………………………………………………………………………………………………………………… 89
Объявление переменных……………………………………………………………………………………………………. 90
Повторные декларации и переприсвоения………………………………………………………………………. 92
Константы………………………………………………………………………………………………………………………………….. 93
Агрегаты данных……………………………………………………………………………………………………………………….. 95
Массивы и срезы………………………………………………………………………………………………………………… 95
Двумерные массивы и срезы………………………………………………………………………………….. 100
Структуры………………………………………………………………………………………………………………………… 101
Таблицы (хеши)………………………………………………………………………………………………………………… 103
Динамическое создание переменных…………………………………………………………………………………….. 105
Конструкторы и составные литералы……………………………………………………………………………. 106
Операции………………………………………………………………………………………………………………………………….. 107
Функции……………………………………………………………………………………………………………………………………. 110
Вариативные функции…………………………………………………………………………………………………….. 115
Стек процедур завершения……………………………………………………………………………………………… 117
Обобщенные функции……………………………………………………………………………………………………… 118
Функции высших порядков……………………………………………………………………………………………… 119
Встроенные функции……………………………………………………………………………………………………….. 121
Объектно-ориентированное программирование………………………………………………………………….. 123
Методы……………………………………………………………………………………………………………………………… 124
Множество методов………………………………………………………………………………………………… 126
Встраивание и агрегирование……………………………………………………………………………….. 127
Функции как объекты……………………………………………………………………………………………… 129
Интерфейсы………………………………………………………………………………………………………………………. 130
Именование интерфейсов……………………………………………………………………………………….. 133
Контроль интерфейса…………………………………………………………………………………………….. 133
Обработка ошибочных ситуаций…………………………………………………………………………………………… 134
Структура пакетов (библиотек) Go………………………………………………………………………………………… 137
Функция init………………………………………………………………………………………………………………………. 142
Импорт для использования побочных эффектов…………………………………………………………… 143
Некоторые полезные и интересные стандартные пакеты……………………………………………………. 144
Пакет runtime……………………………………………………………………………………………………………………. 144
Форматированный ввод/вывод……………………………………………………………………………………….. 145
Строки и пакет strings……………………………………………………………………………………………………… 146
Строчные литералы…………………………………………………………………………………………………………. 156
Большие числа…………………………………………………………………………………………………………………. 157
Автоматизированное тестирование……………………………………………………………………………….. 158
Источники информации…………………………………………………………………………………………………………… 159
Глава 4. Новости от последних версий…………………………………………………. 160
Модули……………………………………………………………………………………………………………………………………… 160
Дженерики………………………………………………………………………………………………………………………………… 162
Источники информации…………………………………………………………………………………………………………… 167
Глава 5. Альтернативы: TinyGo……………………………………………………………. 168
Источники информации…………………………………………………………………………………………………………… 176
Часть II. Конкурентность и многопроцессорность………. 177
Глава 6. Процессоры в Linux………………………………………………………………… 179
Процессоры, ядра и гипертрейдинг……………………………………………………………………………………….. 182
Загадочная нумерация процессоров……………………………………………………………………………………… 184
Управление процессорами Linux…………………………………………………………………………………………… 187
Аффинити маска……………………………………………………………………………………………………………….. 187
Как происходит диспетчирование в Linux?…………………………………………………………………… 190
Приоритеты nice……………………………………………………………………………………………………… 193
Приоритеты реального времени……………………………………………………………………………. 194
Источники информации…………………………………………………………………………………………………………… 196
Глава 7. Параллелизм и многопроцессорность……………………………………… 197
Эволюция модели параллелизма…………………………………………………………………………………………… 197
Параллельные процессы и fork………………………………………………………………………………………. 197
Потоки ядра и pthread_t POSIX………………………………………………………………………………………. 200
Потоки C++………………………………………………………………………………………………………………. 203
Сопрограммы — модель Go……………………………………………………………………………………………. 206
Параллелизм в Go…………………………………………………………………………………………………… 207
Сопрограммы — как это выглядит?……………………………………………………………………………………….. 208
Возврат значений функцией……………………………………………………………………………………………. 211
Ретроспектива: сопрограммы в C++……………………………………………………………………………….. 212
Каналы……………………………………………………………………………………………………………………………………… 212
Функциональные замыкания в сопрограммах………………………………………………………………………. 218
Примитивы синхронизации…………………………………………………………………………………………………….. 220
Конкурентность и параллельность………………………………………………………………………………………… 226
Источники информации…………………………………………………………………………………………………………… 231
Глава 8. Масштабирование………………………………………………………………….. 232
Планирование активности сопрограмм…………………………………………………………………………………. 232
Испытательный стенд……………………………………………………………………………………………………………… 234
Одноплатные микрокомпьютеры (Single-Board Computers)…………………………………………. 234
Рабочие десктопы…………………………………………………………………………………………………………….. 238
Серверы промышленного класса……………………………………………………………………………………. 239
Масштабирование в реальном мире……………………………………………………………………………………… 240
Первая попытка………………………………………………………………………………………………………………… 241
Второй подход к снаряду………………………………………………………………………………………………… 247
О числе потоков исполнения…………………………………………………………………………………………………… 254
Источники информации…………………………………………………………………………………………………………… 258
Часть III. Некоторые примеры и сравнения……………………….. 261
Глава 9. Осваиваемся в технологии Go………………………………………………… 263
Консольный ввод/вывод………………………………………………………………………………………………………….. 263
Утилита echo……………………………………………………………………………………………………………………………. 267
Итерационное вычисление вещественного корня…………………………………………………………………. 269
Вычисление числа π………………………………………………………………………………………………………………… 271
Вычисления неограниченно высокой точности……………………………………………………………………. 274
Случайная последовательность и ее моменты……………………………………………………………………… 275
Расчет параметров выпуклых 2D-многоугольников…………………………………………………………….. 278
TCP клиент-сервер…………………………………………………………………………………………………………………… 283
Тривиальный веб-сервер…………………………………………………………………………………………………………. 288
Порядок итераций для map: сюрприз…………………………………………………………………………………….. 289
Консольный калькулятор……………………………………………………………………………………………………….. 290
Источники информации…………………………………………………………………………………………………………… 293
Глава 10. Структуры данных, типы и их методы…………………………………. 294
Массивы и срезы……………………………………………………………………………………………………………………… 294
Многомерные срезы и массивы………………………………………………………………………………………………. 299
Функции с множественным возвратом…………………………………………………………………………………… 300
Глава 11. Строки, руны и UNICODE……………………………………………………. 303
Символы, байты и руны………………………………………………………………………………………………………….. 303
Изменение содержимого строк……………………………………………………………………………………………….. 305
Палиндромы…………………………………………………………………………………………………………………………….. 306
Регулярные выражения……………………………………………………………………………………………………………. 311
Источники информации…………………………………………………………………………………………………………… 315
Глава 12. Элементы функционального программирования………………….. 316
Функциональные замыкания………………………………………………………………………………………………….. 316
Карринг…………………………………………………………………………………………………………………………………….. 324
Рекурсия……………………………………………………………………………………………………………………………………. 325
Рекурсия с кешированием……………………………………………………………………………………………….. 326
Чистые функции……………………………………………………………………………………………………………………….. 329
Источники информации…………………………………………………………………………………………………………… 329
Глава 13. Скоростные и другие сравнения языков………………………………. 330
Алгоритмические задачи для сравнения……………………………………………………………………………….. 330
Некоторые известные алгоритмы…………………………………………………………………………………………… 331
Числа Фибоначчи…………………………………………………………………………………………………………….. 332
Пузырьковая сортировка…………………………………………………………………………………………………. 335
Ханойская башня……………………………………………………………………………………………………………… 341
Решето Эратосфена…………………………………………………………………………………………………………. 344
Глава 14. Многопроцессорные параллельные вычисления………………….. 349
Скорость активации параллельных ветвей…………………………………………………………………………… 349
Гонки…………………………………………………………………………………………………………………………………………. 354
Защита критических данных………………………………………………………………………………………….. 358
Неблокирующий ввод с клавиатуры……………………………………………………………………………………… 362
Многопроцессорный брутфорс………………………………………………………………………………………………. 366
Каналы в сопрограммах…………………………………………………………………………………………………………. 372
Таймеры……………………………………………………………………………………………………………………………………. 373
Тикеры………………………………………………………………………………………………………………………………. 375
Когда не нужно злоупотреблять многопроцессорностью…………………………………………………… 376
Источники информации…………………………………………………………………………………………………………… 380
Заключение………………………………………………………………………………………….. 381
Об авторе……………………………………………………………………………………………… 382

Цилюрик Олег Иванович — программист-разработчик с более чем 40-летним опытом, преподаватель, автор книг по Linux и Unix , в том числе «Расширения ядра Linux. Драйверы и модули» и «Linux и Go. Эффективное низкоуровневое программирование», высоко оцененных профессионалами и широкой читательской аудиторией.


