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

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

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

Вышла книга “Linux и Go. Эффективное низкоуровневое программирование”

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

Первая русскоязычная книга об интеграции языка Go в архитектуру ядра Linux. Содержит вводный курс по языку Go для системного программирования, описывает применение Go для реализации конкурентности и параллелизма, рассказывает об интероперабельности между имеющимся кодом на C с новым кодом на Go, а также исследует возможности внедрения Go для повышения производительности различных дистрибутивов.

Книга ориентирована на программистов и системных администраторов, работающих с Linux, будет интересна разработчикам ядра Linux и драйверов устройств.

 

Ядро операционной системы Linux и множество модулей для различных дистрибутивов написаны на языке C. Притом, что язык С продолжает развиваться и активно использоваться на практике, в область системного программирования постепенно проникают и более молодые языки, в частности Go.

Перед вами – первая фундаментальная книга об использовании Go в Linux. Здесь вы познакомитесь с основами системного программирования, изучите детали взаимодействия между ядром и пользовательским пространством Linux, а также узнаете об интероперабельности между С и Go, о том, в каких аспектах и нюансах Linux язык Go может заменить и уже заменяет язык C. Особое внимание уделено конкурентности, параллелизму и стандарту POSIX. В конце книги для закрепления материала приведены реализации нескольких популярных алгоритмов.

Цилюрик Олег Иванович

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

Книгу “Linux и Go. Эффективное низкоуровневое программирование” можно купить со скидкой в интернет-магазине издательства “БХВ“.

Предисловие. 7

Предназначение и целевая аудитория. 7

Код примеров и замеченные опечатки. 9

Соглашения и выделения, принятые в тексте. 10

Напоминание. 11

Источники информации. 11

Часть I. Инструментарий языка Go. 13

Глава 1. Предыстория Go. 15

«Отцы-основатели» о целях и мотивации…… 15

Применимость: беглый взгляд. 16

Go, C, C++ и другие…… 17

Источники информации. 22

Глава 2. Разворачиваем экосистему Go. 23

Создание среды. 23

Стандартная инсталляция. 23

Версии среды. 25

Альтернативы. 26

«Самая последняя» версия. 27

Смена версий. 30

Проверяем: простейшая программа. 30

Проверяем на простейшем приложении. 32

Библиотеки статические и динамические. 34

Компиляция или интерпретация. 34

Выбор: GoLang или GCC?. 35

Инфраструктура GoLang. 36

Команды go. 36

Переменные окружения. 39

Платформы, переносимость и кросс-компиляция. 47

Стиль кодирования (автоформатирование — fmt) 49

Сборка приложений (build) 51

Сценарии на языке Go (run) 51

Загрузка проектов из сети (get) 52

Утилиты GoLang (tool) 57

Связь с кодом C (Cgo) 60

Сторонний и дополнительный инструментарий. 63

Источники информации. 65

Глава 3. Неформально о синтаксисе Go. 66

Типы данных. 71

Переменные. 73

Выполнение такого приложения. 74

Повторные декларации и переприсваивания. 76

Константы. 77

Агрегаты данных. 79

Массивы и срезы. 79

Двухмерные массивы и срезы. 84

Структуры. 85

Таблицы (хэши) 87

Динамическое создание переменных. 89

Конструкторы и составные литералы. 90

Операции. 91

Функции. 94

Вариативные функции. 98

Стек процедур завершения. 100

Обобщенные функции. 101

Функции высших порядков. 102

Встроенные функции. 104

Объектно-ориентированное программирование. 106

Методы. 107

Интерфейсы. 113

Обработка ошибочных ситуаций. 117

Структура пакетов (библиотек) Go. 121

Функция init 125

Импорт для использования побочных эффектов. 126

Некоторые полезные и интересные стандартные пакеты. 126

Пакет runtime. 127

Форматированный ввод-вывод. 128

Строки и пакет strings 129

Большие числа. 134

Автоматизированное тестирование. 135

Источники информации. 135

Часть II. Конкурентность и многопроцессорность. 137

Глава 4. Процессоры в Linux. 139

Процессоры, ядра и гипертрэдинг. 142

Загадочная нумерация процессоров. 144

Управление процессорами Linux. 147

Привязка к процессору. 147

Как происходит диспетчирование в Linux. 150

Источники информации. 156

Глава 5. Параллелизм и многопроцессорность. 157

Эволюция модели параллелизма. 157

Параллельные процессы и fork. 157

Потоки ядра и pthread_t POSIX.. 160

Сопрограммы — модель параллелизма Go. 166

Параллелизм в Go. 167

Сопрограммы — как это выглядит. 168

Возврат значений функцией. 171

Ретроспектива: сопрограммы в C++. 172

Каналы. 172

Функциональные замыкания в сопрограммах. 177

Примитивы синхронизации. 179

Конкурентность и параллельность. 185

Источники информации. 190

Глава 6. Масштабирование. 191

Планирование активности сопрограмм. 191

Испытательный стенд. 193

Микрокомпьютеры (Single-Board Computers) 193

Рабочие десктопы. 196

Серверы промышленного класса. 197

Масштабирование в реале. 198

1-я попытка …… 199

2-й подход к снаряду…… 205

О числе потоков исполнения. 213

Источники информации. 217

Часть III. Некоторые примеры и сравнения. 219

Глава 7. Осваиваемся в синтаксисе Go. 221

Утилита echo. 221

Итерационное вычисление вещественного корня. 223

Вычисление числа π. 225

Случайная последовательность и ее моменты. 227

Обсчет параметров 2D выпуклых многоугольников. 230

Тривиальный web-сервер. 235

Источники информации. 236

Глава 8. Структуры данных, типы и их методы.. 237

Массивы и срезы. 237

Многомерные срезы и массивы. 242

Функции с множественным возвратом. 243

Глава 9. Элементы функционального программирования. 246

Функциональные замыкания. 246

Карринг. 253

Рекурсия. 255

Рекурсия с кэшированием. 255

Чистые функции. 257

Источники информации. 257

Глава 10. Скоростные и другие сравнения языков. 258

Алгоритмические задачи для сравнения. 258

Некоторые известные алгоритмы. 259

Числа Фибоначчи. 260

Пузырьковая сортировка. 263

Ханойская башня. 268

Решето Эратосфена. 272

Глава 11. Многопроцессорные параллельные вычисления. 276

Скорость активации параллельных ветвей. 276

Гонки. 281

Защита критических данных. 285

Многопроцессорный брутфорс. 289

Каналы в сопрограммах. 295

Таймеры. 296

Тикеры. 298

Когда не нужно злоупотреблять многопроцессорностью.. 299

Источники информации. 302

Заключение. 303

Об авторе. 304