Пользователь
0,0
рейтинг
9 декабря 2011 в 18:24

История языка Си из песочницы

Сейчас, наверно, невозможно найти в мире специалиста в IT-области, который бы не слышал о языке Си. Этот язык приобрёл огромную популярность во всём мире и оказал значительное влияние на многие другие языки программирования. Именно он является предшественником таких языков, как C++, C#, Java; менее известных (например J#). Компания Microsoft для разработки родного языка к своей платформе .Net выбрала именно Си-подобный синтаксис. Что ни говори, но язык Си серьезно изменил жизнь программистов прошлого века и стал де-факто в области низкоуровневого программирования, оставив ассемблеру только те места, где производительность имела критическое значение.

Многие помнят имена создателей языка — Кена Томпсона и Дениса Ритчи, но я решил копнуть глубже и вспомнить историю создания и развития языка. Всем кому интересна эта тема — добро пожаловать под кат.

Язык Си восходит корнями к языку ALGOL (расшифровывается как ALGorithmic Language), который был создан в 1958 году совместно с комитетом Европейских и Американских учёных в сфере компьютерных наук на встрече в 1958 в Швейцарской высшей технической школе Цюриха. Язык был ответом на некоторые недостатки языка FORTRAN и попыткой их исправить.

Вдохновлённые языком ALGOL-60, Математическая лаборатория Кембриджского Университета совместно с Компьютерным отделом Лондонского университета создали в 1963 году язык CPL (Combined Programming Language).

Язык CPL посчитали сложным, и в ответ на это Мартином Ричардсоном был создан в 1966 году язык BCPL, основное предназначение которого заключалось в написании компиляторов. Сейчас он практически не используется, но в своё время из-за хорошей портируемости он играл важную роль.

BCPL послужил предком для языка Би, разработанного в 1969 в уже знакомой всем AT&T Bell Telephone Laboratories, не менее знакомыми Кеном Томпсоном и Денсом Ритчи.

Язык Би был использован для написания самых ранних версий UNIX, созданной как ответ на проект Multics, разрабатываемый всё в той же Bell Laboratories. Именно этот язык послужил непосредственным предшественником языка Си.

По поводу возникновения языка Си Питер Мойлан в своей книге «The case against C» пишет: «Нужен был язык, способный обойти некоторые жесткие правила, встроенные в большинство языков высокого уровня и обеспечивающие их надежность. Нужен был такой язык, который позволил бы делать то, что до него можно было реализовать только на ассемблере или на уровне машинного кода.» Си стал именно таким языком. Это обусловило его дальнейшую популярность в таких отраслях программирования, как написание драйверов и прочих аспектах низкоуровневого программирования.

Язык программирования Си был разработан в стенах Bell Labs в период с 1969 по 1973 годы. Как признался сам Ритчи, самый активный период творчества приходился на 1972 год.

За всё время своего существования, язык Си оброс легендами по поводу мотивов своего создания.
Согласно одной из легенд, Керниган и Ритчи любили одну компьютерную игру, которую они запускали на главном сервере компании. Позже, они захотели перенести её на компьютер, стоящий в офисе. Но он, к сожалению не имел операционной системы, что сподвигло Кернигана и Ритчи её написать. Когда они захотели перенести систему на другой компьютер, это оказалось непростой задачей, так как система была написана полностью на ассемблере. Тогда у них возникла идея переписать её на язык высокого уровня. Сначала для этих целей планировали использовать язык Би, но в связи с тем, что он не давал на полную использовать новые возможности компьютера, на который они хотели перенести систему, было решено создать свой язык.

Согласно другой легенде, язык Си был первоапрельской шуткой, которая обрела нешуточную популярность.
Компилятор языка Си унаследовал традицию, заложенную ещё Никлаусом Виртом и был написан на самом Си. Согласно мнению большинства, название языка Си является третьей буквой алфавита. Оно появилось как указание на то, что язык Си является более усовершенствованным, чем язык Би. Однако, сам Ритчи по поводу названия языка говорил следующее:«Создав систему типов, соответствующий синтаксис и компилятор для нового языка, я почувствовал, что он заслуживает нового имени: NB показалось мне недостаточно четким. Я решил следовать однобуквенному стилю и назвал его C (Си), оставляя открытым вопрос, являлось ли после B это следующей буквой в алфавите или в названии BCPL».

Успех Си в основном связан с тем, что на нём была написана значительная часть операционной системы UNIX, которая в итоге приобрела очень большую популярность. Если считать по количеству используемых на данный момент операционных систем, разработанных на базе UNIX, то она является самой распространённой системой в мире. В связи с её распространённостю, а также с тем, что на данный момент объём операционной системы измеряется в миллионах строк кода (для примера, в последних версиях Linux содержится более 10 000 000 строк кода), задача о переписывании UNIX на другой язык становиться практически невыполнимой (также следует учитывать тот факт, что при ручном переписывании неизбежно возникнут ошибки, что существенно снизит стабильность работы, а при переводе с использованием программных средств пострадает производительность кода). Кроме того, язык Си, будучи приближённым к аппаратной реализации компьютера позволяет выжать из него намного больше, чем многие другие языки программирования. Это обстоятельство показывает бессмысленность перевода UNIX на другой язык. Таким образом, если другие языки программирования могут исчезнуть с течением времени, уступив дорогу новым технологиям, то язык Си будет жить, пока живёт UNIX. То есть пока существуют компьютеры в том виде, в котором мы их себе представляем.

Первая книга, посвящённая языку Си была написана Керниганом и Ритчи в 1978 году и вышла в свет под названием «Язык программирования Си». Эта книга, в среде программистов более известная как «K&R», стала неофициальным стандартом языка Си.

В конце 1970-х годов, язык си начал вытеснять BASIC, который в то время был ведущим в области программирования микрокомпьютеров. В 1980-х годах он был адаптирован под архитектуру IBM-PC, что привело к значительному скачку его популярности. В то же время Бьярн Страуструп начал разработку языка программирования, который бы сочетал в себе синтаксис популярного языка Си и концепцию объектно-ориентированного программирования, которая становилась всё более востребованной, так началась разработка языка С++.

В то время как Си набирал всё большую популярность, компиляторы для него выпускались различными фирмами, и зачастую программа, которая компилировалась на компиляторе одной фирме, не компилировалась на компиляторе другой. Всё это было связано с отсутствием чётко оговоренного стандарта языка Си. Все разработчики ориентировались на книгу Кернигана и Ритчи, но интерпретировали её по-своему.

Разработкой стандарта языка Си занялся Американский национальный институт стандартов (ANSI). При нём в 1983 году был сформирован комитет X3J11, который занялся разработкой стандарта. Первая версия стандарта была выпущена в 1989 году и получила название С89. В 1990, внеся небольшие изменения в стандарт, его приняла Международная Организация Стандартизации ISO. Тогда он стал известен под кодом ISO/IEC 9899:1990, но в среде программистов закрепилось название, связанное с годом принятия стандарта: С90. Последней на данный момент версией стандарта является стандарт ISO/IEC 9899:1999, также известный как С99, который был принят в 2000 году.

Среди новшеств стандарта С99 стоит обратить внимание на изменение правила, касающегося места объявления переменных. Теперь новые переменные можно было объявлять посреди кода, а не только в начале составного блока или в глобальной области видимости. Это уводит Си от концепции объявления переменных в начале функции, которая присутствует в Паскале. Меня, как и многих программистов, привыкших писать на С++ (где это ограничение отсутствует) такое поведение компилятора вызывало недовольство. Тем не менее, даже с принятием стандарта С99, в программе Borland Embarcadeo RAD Studio 2010, ограничение на объявление переменных в начале блока кода всё ещё действует. Также можно указать другие места, в которых стандарты Си не до конца соблюдаются. Есть мнение, что это связано с тем, что основное внимание больших компаний, таких как Microsoft и Borland сосредоточено на более новых языках программирования. Однако, согласно заверениям компании Sun Microsystems, её среда разработки Sun Studio полностью поддерживает С99.

Стандарт С99 сейчас в большей или меньшей степени поддерживается всеми современными компиляторами языка Си. В идеале, код написанный на Си с соблюдением стандартов и без использования аппаратно- и системно-зависимых вызовов, становился как аппаратно- так и платформенно-независимым кодом.

В 2007 году начались работы над следующим стандартом языка Си: С1x.
Артём @artyom_256
карма
11,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (29)

  • +2
    Простите, а как C повлиял на F#?
    • +1
      И правда, F# здесь лишний. Исправил)
    • –3
      .
  • 0
    >Стандарт С99 сейчас в большей или меньшей степени поддерживается всеми современными компиляторами языка Си.

    Всеми, кроме Микрософтовской студии! Там по сути нет компилятора именно языка Си! Часто эти грабли доставляли при попытках собрать библиотеки.
    • 0
      А я в студии собирал такой код:
      main() { printf("Hello world!\n"); }

      Хотя C++ компилятор бы его обматерил)
      • 0
        Почему? Не обматерил бы. Инклюд stdio.h и вуаля.
        • +1
          отсутствие инклуда как раз является фишкой :)
          • 0
            а… ) Студия небось его автоматом подключает… я ее всего пару раз в глаза видел, поэтому хз)
            • +3
              эм… ни один сишный компилятор не инклудит автоматом заголовки, он просто предугадывает сигнатуру у методов по ее входным аргументам и считает, что она возвращает int
              • –1
                Я слышал, что студия как ide много чего сама делает, поэтому и предположил. Тот же g++ выдает ошибку при попытке собрать этот код без инклюда, он, похоже, ничего не предугадывает.
                • +1
                  ~/labs $ cat main.c 
                  main() { printf("Hello world!\n"); }
                  
                  ~/labs $ gcc main.c -o main
                  main.c: In function ‘main’:
                  main.c:1:10: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
                  ~/labs $ ./main 
                  Hello world!
                  


                  g++ предназначен для сборки C++ кода, а вот gcc прекрасно справляется
                  • –4
                    ну дык я о с++ и говорил… понятное дело, что сишный справится с этим кодом)
            • 0
              По стандарту современного Си, если функция возвращает int (как это делает printf, например), объявление её прототипа не требуется, то есть файлы типа stdio.h подключать не нужно.
              • +1
                Можете объяснить, пожалуйста. Просто не понимаю: если не подключать заголовочный файл, откуда компилятор знает, что возвращает функция printf… и откуда её вызывать
                • 0
                  если сишный компилятор не находит объявление функции «foo», то он считает, что она задана следующим образом:
                  int foo(...);
                  
                  • 0
                    int foo();
                    • 0
                      если бы компилятор считал, что это функция не принимает аргументы, то тот же printf бы не отработал. фишка именно в том, что по дефолту в си функция — это функция с переменным количеством аргументов
                      • 0
                        В Си int foo(void) это функция без аргументов. А int foo() — с аргументами.
                • +12
                  «откуда компилятор знает … откуда её [printf] вызывать»

                  Компилятор этими вопросами не занимается, он просто вставляет ссылку на символ _printf в генерируемом объектном файле и все. Это задача линковщика — найти определение всех символов и скомпоновать из набора объектных файлов и библиотек исполняемый файл. Линковщик находит определение символа _printf, потому что по-умолчанию стандартная библиотека языка Си (libc) всегда участвует в линковке.
                  • +1
                    Спасибо, последний факт как раз не знал, и не доставало, что бы понять
      • +1
        С99 там в студии нет и не будет.
    • +2
      Там по сути нет компилятора именно языка Си!

      Отдельного компилятора нет, но cl.exe успешно умеет им притворяться:
      image
      • +2
        пардон
        image
      • +4
        «Отдельного компилятора нет, но cl.exe успешно умеет им притворяться»

        Но C99 он не переваривает.

        struct foo { int bar; } foo = { .bar = 42 };
        int data[] = {[3] = 0, [2] = 1, [1] = 2, [0] = 3};
    • 0
      Попробуйте положить код в файл с расширением .c вместо .cpp и все получится.
  • +1
    Эх, си++ за 21 день, сколько лет то уже прошло, а так дальше char * str = «7 stroka, proverit»; и не пролез =)
    • +5
      такой код не соберется %)

      а вообще, чтобы изучить язык — на нем надо писать, много писать. практически в любом предмете теория бесполезна без практики
      • +1
        Да по хорошему, теория начинает хорошо усваиваться только, если есть некоторый практический опыт. Поэтому проще поучавствовать в опенсорс проекте каком-нибудь, желательно качественном и с толковым лидером, ну а там поднатаскают уже в плане практики и книжки с теорией станут куда легче читаться и они наконец начнут пониматься и запоминаться!
  • 0
    "… версиях Linux содержится более 10 000 000 строк кода), задача о переписывании UNIX на другой язык становиться практически невыполнимой...".
    Не сочтите за грубость, но всё же загляните на tsya.ru.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.