История языка С
09.02.2024
18.12.2024
6 минут
136
0
0
0
0
Был ли Си первым ?
Сейчас, всем известный, можно сказать почти легендарный язык С используется почти везде и считается отцом многих других языков.
Но был ли С первым языком программирования? Нет. Этот почётный титул принадлежит ассемблеру и машинным кодам. А может это первый высокоуровневый язык? Опять нет. FORTRAN, разработанный в промежутке 1954 - 1957 года, забирает данный титул себе.
Так в чём Си первый?
А в том что Си это, де-факто “Универсальный ассемблер”. Который предоставляет такую же скорость работы программ как ассемблер, но при этом позволяет писать программы для разных платформ, не меняя кода, то есть, кроссплатформенность.
Причины создания си
Почти всю раннюю цифровую эпоху создали энтузиасты и любители. Те у кого, простите за выражение “пёрло” от идеи написать, разработать и внедрить что-нибудь новое, не всегда инновационное, но как минимум полезное для своих авторов.

Деннис Ритчи

Брайан Керниган
Так было и с Си. По одной версии, его создатель Деннис Ритчи был недоволен возможностями своего сервера, и ограниченностью управления своим кораблем, в игре в которую он любил играть вместе с Керниганом. Поэтому они портировали игру на PDP-7, а потом и на PDP-11.
Ах? да, забыл сказать что ОС на этих машинах не было, поэтому они написали свою, на Ассемблере.

PDP-7

PDP-11
И в дальнейшем, чтобы было легче портировать программы и операционные системы был разработал язык С.
Есть версия и о том что это была первоапрельская шутка. Шутка, которая зашла слишком далеко.
Но скорее всего, Bell Labs нужен был язык для поддержки Unix систем на различных компьютерах и с разной архитектурой процессора. И в течении 4 лет, с 1969 по 1973 года был разработан язык С.
Особенности языка Cи
Язык обладал многими особенностями, а не только вышеупомянутой кроссплатформенностью и быстротой ассемблера. Среди прочего можно отметить:
- Язык, должен быть простым и интуитивным
- Богатая стандартная библиотека. Конечно, это если сравнивать с другими языками программирования в 70 х
- Динамическое выделение памяти.
- Ориентированность на структурный подход в решении задач. Большая задача разбивалась на несколько более маленьких, которые могли бы быть решены написанием функции для каждой.
- Модульность. Возможность разделять программу на элементарные элементы с последующим их использованием в других программах.
- Расширяемость. Очень легко написать новый функционал, для языка.
- Чувствительность к регистру. К примеру FORTRAN не чувствителен к регистру.
- Строго говоря Си это высокоуровневый ЯП, но он гораздо ближе к низкоуровневым языкам, чем кто-либо ещё.
- Арифметика указателей и полный контроль над управлением памятью. Возможность работать с адресами памяти, как в ассемблере.
- Процедурный язык.
- Быстрый и экономный.
- Простой. Многие могут не согласиться, но С имеет минимум ключевых слов и только минимум функционала для максимальной портируемости.
- Компилируемый язык.
- Он общего назначения. У меня есть глава о сферах применения языка, там я тебе и докажу что его можно использовать почти везде. Нет, вообще везде.
- Поддержка рекурсий.
И как говорил сам автор языка.
Стандартизация
Историю языка наглядно показывает развитие её стандартов. А именно, на что делают упор разработчики, что удаляют, добавляют, к каким соглашениям приходят.
Время до стандартов и правил
Если считать текущий стандарт си минималистичным, то первая версия языка выпущенная в 1972 году, которой дали название NB ( типа New B), имела в своём распоряжении только возможность подключать заголовочные файлы и две директивы препроцессора для вставки и замены строк #include и #define.
Конечно язык не стоял на месте и быстро расширялся. В 1973 году был написан переносимый компилятор для си Стивеном K. Джонсоном.
Про K&R C
В 1978 году вышла легендарная книга от Брайна Кернигана и Денниса Ритчи The C Programming Language.

Данная книга стала стандартом на многие годы, до появления стандарта ANSI C. Но даже после появления этого стандарта, считалось что каждый компилятор должен следовать спецификациям K&R C
В 78 году С обзавёлся следующими фишками:
- Стандартная библиотека ввода и вывод
- Несколько новых типов данных
- Некоторые составные операторы такие как =- =+ =* =/ … были упразднены ибо было не совсем понятно что они должны делать. Каждый компилятор трактовал это по своему.
ANSI C или C89
Как можно догадаться, стандарт был принят в 89 и вместе с ним вышла вторая редакция книги The C Programming language.
В новом стандарте появилось:
- Прототипы функций
- Указатели типа void
- Поддержка символов других языков
- Расширена работа препроцессора
C95
Немного дополнил и изменил некоторые шероховатости С89. Также расширил количество поддерживаемых международных символов и добавил диграфы. Как альтернативные символы некоторым другим.
C99
Ключевой особенностью данного стандарта стало изменение работы некоторых ключевых слов и появление новых, например inline. Вот вкратце что появилось и изменилось:
- Появление ключевого слова inline
- Новые variadic макросы
- Добавление препроцессора #pragma
- Возможность использовать CVR + static в [ ] внутри объявлений функций
- Предопределена переменная __func__
- Возможность проводить инициализацию в for цикле
- Функция main() по умолчанию возвращает 0
- Усечение результатов деления к наименьшему целочисленных значений
- Появились составные литералы
- Появились шестнадцатеричные константы с плавающей запятой
- Возможность оставлять запятую в конце перечисления enum констант
- Улучшение инициализации array, struct и union с использованием {}
- Имплементация variable-length array
- Гибкие члены массива
- Появление новых типов данных
- _Bool
- long long и unsigned long long
- _Complex
- _Imaginary
- Появление однострочных комментариев //
- Теперь указатели могут быть использованы с ключевым словом restrict
C11
- Улучшение мультипоточности, с добавлением
- объекта _Atomic
- локального хранилища потока _Thread_local
- Расширена поддержка Unicode
- Добавлено _Generic выражение
- Теперь можно сделать анонимные члены для struct и union
- Расширено время жизни временных объектов
- Теперь есть static assert
C17
Не было почти никаких изменений. За исключением отмены некоторых макросов и функций. Идём дальше.
Современный С, C23
И хотя, данный стандарт еще не полностью реализован компиляторами и не так популярен как С99, было бы не лишним узнать что же нового нам предложили в прошлом году.
А предложили нам следующее:
- Добавлено много новых типов данных
- Новая константа u8
- Реализована пустая инициализация
- Появились атрибуты
- static_assert теперь ключевое слово
- thread_local теперь ключевое слово
- nullptr уже константа с типом nullptr_t
- Теперь true и false становятся ключевыми словами
- Новые директивы препроцессора
- #elifdef
- #elifndef
- #warning
- #embed
- Новые опции для #pragma
- FENV_ROUND
- FENV_DEC_ROUND
Семейство языков си (Языки потомки си)
Можно выделить только двух прямых потомков языка. Это Objective-C, который основан на новом подходе в программировании, то есть ООП. И, куда более известней С++, который дополняет Со своим функционалом и вводит много нового. Теперь немного о том, чем предок отличается от своих чадов.
Objective-C
В отличие от плюсов, синтаксис которых на 99% сопоставим с Си, Objective-C совсем другая история. Его синтаксис сильно изменился.
И если Си, платформо независим, то Objective-C используется только на macOS и iOS.

Код на Objective-C

Код на Си
C++
С++, гораздо сложнее Си. Да и вообще, его можно назвать самым сложным языком программирования.
Эта сложность вызвана его обширным функционалом, который вызывает немало критики со стороны трушных си-шников, да и других языко-поклонников.
Так в плюсах реализовано:
- ООП
- Шаблоны
- Обработчик исключений
- Перегрузка операторов
- Более гибкая и безопасная модель управления памятью, умные указатели.
- Поддержка многопоточного программирования.
- Наличие стандартных контейнеров, типа vector, array, list, deque, map, set …

Код на С++
Си подобные языки
Кроме прямых потомков языка Си, существуют ещё и языки, синтаксис которых, очень сильно напоминает нашего “Универсального ассемблера”.
Кроме вышеупомянутых наследников, похожий синтаксис имеют:
- Java
- C#
- D
- JavaScript
- Perl
Актуальность языка си (Его популярность)
В интернете я заметил интересное явление. Почти все пытаются доказать что си не мёртв и очень даже используемый, то есть популярный ЯП. То есть всякие блогеры считают, что многие другие считают что ЯП Си мёртв. Но по факту мало кто так считает.
Честно, я так и не понял с чего вдруг все решили доказывать что он не мёртв. То есть первоисточник данного тезиса мне не известен. Может это из-за возраста, а может из-за того что Python так сильно превозносится, что всем видится как некогда популярные языки уже не так популярны.
Если посмотреть статистику популярности языков программирования от TIOBE Index

Можно заметить что Си, по факту чуть ли ни разу не падал ниже 2ого места. И среди самых популярных всегда будут Java и C++. Python относительно недавно стал так популярен.
С чем такая стабильность связана? Я не знаю. И я не могу дать однозначного, всестороннего и не предвзятого ответа. Но могу поделиться моим, почти 4-х летним опытом. Раньше я много программировал на С++, по факту с него я и начал этот путь. И лишь изредка я касался С. Сейчас мой стек изменился и я использую другие языки и технологии.
Но вот что интересно, когда я возвращаюсь к Си, мне становится легче, просто легче. В сравнении с перегруженным синтаксисом плюсов или чудовищным количеством модулей которые приходится помнить, когда пишешь на питоне, возвращение в лоно Си для меня как облегчение.
Как-то так.
Комментарии
(0)
Отправить
Сейчас тут пусто. Буть первым (o゚v゚)ノ
Другое
Использованные термины
- Язык программирования ⟶ Это формальный язык, предназначенный для описания алгоритмов и структур данных с помощью синтаксиса и семантики, которые могут быть интерпретированы или скомпилированы компьютером. Языки программирования позволяют разработчикам писать программы, которые могут выполнять различные задачи — от простых вычислений до сложных систем управления.
Релевантные вопросы
- Почему бросил писать игры ? Я бросил делать игры потому что это долго и нудно. И очень одиноко. И ещё, я не хотел пахать по 15 часов в день чтобы сделать какую-нибудь прибабаху для игры. Я жить ещё хочу :)