Почему языки C-семейства заняли свое "особое" место среди прочих языков программирования

Рейтинг: 12Ответов: 4Опубликовано: 29.04.2015

А как вы считаете почему языки C-семейства заняли свое "особое" место среди прочих языков программирования?

Ответы

▲ 17Принят

Думаю, они «взлетели» на феноменальном успехе самого языка C.

Язык C был успешен потому, что во время его разработки была нужда в хорошем низкоуровневом системном языке. C оказался самым популярным среди них не в последнюю очередь потому, что семейство UNIX-подобных операционных систем выбрало C в качестве системного языка. (Что неудивительно, учитывая участие Денниса Ритчи в обоих проектах.)

Высокоуровневых языков было достаточно в те далёкие времена (LISP, COBOL, Basic), но компиляторы того времени не были способны адекватно оптимизировать высокоуровневый код. C же снискал славу «кроссплатформенного ассемблера»: код на нём можно было легко оптимизировать вручную.

Затем, C++ был пожалуй первым хорошим (для своего времени) языком программирования, ориентированным на практическое программирование. Совместимостью с C он обязан как своему взлёту и популярности, так и многим неустранимым своим недостаткам.

Далее, вступает MS-DOS. Программисты Microsoft вдохновлялись UNIX-системами, и решили выбрать C как системный язык. Далее, долгое время de facto-стандартом для написания оконных систем под Windows стал, естественно, C++, как подходящий последователь C.

Таким образом, две популярные платформы (UNIX и DOS/indows) приветствовали знание C и его потомков, что конечно же привело к их широкому распространению.


Тем не менее, и у других языков был шанс. Например, более высокоуровневый Pascal был очень популярен в среде разработчиков под DOS, и планировался вначале как системный язык Windows. И он, кажется, был языком выбора под платформой Macintosh. (До тех пор, пока там предпочтительным языком не стал Objective C — снова язык из семейства C.) Pascal вплоне мог перехватить лидирующую роль в семействе языков практического программирования. Но, к сожалению, язык не развивался адекватно нуждам программистов, и был в основном вытеснен своими коллегами, основанными на синтаксисе C.


Стоит заметить, однако, что последователи C, унаследовав синтаксис C, вовсе не унаследовали его стиль и философию.

▲ 6

Вообще @Vlad довольно хорошо изложил с исторической точки зрения, но я зайду с другой стороны, грамматической/синтаксической.

Любой не эзотерический язык программирования это так или иначе выбор между:

Lisp C Forth.

Функциональной, императивной, конкатенативной(стэковой) парадигмой:

Префиксной + a b, инфиксной a + b, постфиксной a b + записью выражений.

Так вот C(и остальные языки семейства, последовавшие за ним позднее) просто стал одним из первых общеупотребительных языков, который практически идеально и без лишнего синтаксического сахара вписывается в императивную парадигму.

Он просто является её прямым и логичным выражением. Запись a + b выглядит понятнее для большинства людей, чем конкурирующие Lispовое + a b и Forthовое a b +. (Конечно все эти 3 нотации были известны еще задолго до изобретения Lisp C и Forth, но в общее употребление они вошли похоже именно в те времена)

Кроме того он достаточно прост, в нем по мимо обычного потока управления есть всего 6 основных средств построения абстракций: указатели, функции, структуры, указатели на функции, препроцессор и typedef.

Остальные элементы вроде фигурных скобок:

{{}{}{}{}{}}

Составных присваиваний:

a+=a++ + --a;

Указателей:

int *(*f)(char *с)

Смотрятся просто веселее и читаются легче чем Lisp с его унылыми эзотерическими пугающими людей круглыми скобками:

(+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))

или Forth с Йоды магистра речью умной:

: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;.

Что касается других старых императивных языков вроде Pascal, BASIC, Fortran, то в них просто слишком много сахара и они все же не так изящны и выразительны как C.

Можно например чисто визуально сравнить 4 Hello World для весьма похожих языков Pascal, Visual Basic, Fortran и С. Что вы выберете?

Program HelloWord;
begin
     writeLn ('Hello World!')
end.

Module Hello
  Sub Main()
      MsgBox("Hello, World!")
  End Sub
End Module

Program Hello
   Print *, "Hello World!"
End Program Hello

#include<stdio.h>
main() {
    printf("Hello World");
}

P.S. Конечно в обычном BASIC можно сделать так ? "Hello, World!", но ничто ведь не мешает Вам: #define $ printf

▲ 3

Помнится, для меня с коллегами Си в середине 80-х стал просто светом в окошке из-за своего лаконизма, прозрачности и отсутствию (по сравнению с Паскалем) дурацких ограничений, которые почему-то считаются авторами языков просто обязательными для программирования без ошибок.

▲ 1

Началось все, скорее всего, именно с синтаксиса. Из низкоуровневых языков, компилировавшихся в оптимальный код, C для своего времени был самым удобным.

Замена всевозможных длиннющих BEGIN и END на { и } (и т.д.) сыграла немаловажную роль. Это сейчас у нас IDE с autocomplete и прочими ништяками, а тогда сокращение количества букаф в программах было для многих великой радостью. Этим и другими плюсами к себе завоевал расположение C.