Опубликовано

Новинка: “Linux и Go. Эффективное низкоуровневое программирование. 2-е издание”

Linux и Go. Эффективное низкоуровневое программирование. 2-е издание

Книга содержит вводный курс по языку 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. Эффективное низкоуровневое программирование», высоко оцененных профессионалами и широкой читательской аудиторией.

Добавить комментарий