вторник, 4 февраля 2014 г.

Язык C: заметки на полях

По языку C написано множество руководства и учебных пособий. Ещё одной особенностью C является то, что первоначально исчерпывающие руководства по языку написаны его авторами (Б. Керниган, Д. Ритчи), выдержавшими 34 переиздания в США. Это очень способствовало краткости и однозначности толкований понятий языка, и простоте его освоения.

Есть ли смысл, при такой истории и таком объёме существующих описаний, снова обращаться к деталям языка C? Есть, и на то существует несколько оснований, исходящих из различных точек зрения:
  • За 40 лет язык претерпел несколько модернизаций, последние действующие стандарты (C89, C99) вносят ряд существенных нововведений (самый яркий пример чему — комплексная арифметика), не отображаемых в "классической" литературе по C, которая писалась, как правило, много лет назад.
  • Язык C изначально разрабатывался как язык системного программирования систем принадлежащих к классу UNIX. С широким распространением операционной системы Linux, основным "полигоном" использования C стали проекты GNU и другие свободные проекты для этой системы. Они все рассчитаны на использование компилятора GCC, который имеет ряд собственных расширений языка.
  • Поддержка символьных представлений UNICODE, и способ кодирования UTF-8 для них, которая стала единственной поддерживаемой по умолчанию всеми дистрибутивами Linux. Поддержка широких символов (описана в <wchar.h>) слабо освещена в литературе, потому, что для англоязычных авторов она не есть особенно актуальной, а русскоязычные авторы во многом обходят эту часть языка стороной.
  • Помимо компилятора GCC, в последние годы начинает широко практиковаться использование компилятора Clang (из проекта LLVM — Low Level Virtual Machine), ряд расширений GCC поддерживается Clang, другие — нет.
  • Есть вещи, которые не являются, собственно, частью самого языка, но есть традицией, сложившейся в практике использования этой языковой среды. Примером этого является, например, использование в ядре Linux циклических двунаправленных списков везде где нужны списочные структуры (вместо односвязных списков, линейных списков и др.), что и будет рассмотрено далее.
     
В любом случае, я даю ссылки на заметки, написанные мною для себя, по итогам практической работы с C протяжённостью в несколько десятилетий. Если кому-то это будет интересно и полезно - пользуйтесь!


- на Google:
Это текст (в формате OpenOffice), и архив примеров к нему.
- на Yandex:
текст и архив примеров

P.S. Варианты на Google и Yandex могут отличаться - они обновляются не синхронно, в разное время. Но эти отличия не могут быть существенными.