ArtReal logo
На грани иронии
 

<! doctype content //public >
<! xref location=/Toweek/2001 >

 
03.04.2001

Вадим Артамонов

Легенда языка Си

О чем думали Керниган и Ричи, дописывая последний байт компилятора?

    Что-то захотелось продолжить тему одного из предыдущего Toweek.
    Говоря о языках программирования, невозможно забыть о языке Си. О нем, собственно выражаясь, и пойдет речь сегодня.
    Откуда возник Си? Есть на этот счет одна легенда.

Легенда
    Жили-были в Bell Labs люди, которые задумали написать новую операционную систему. Нафик она им была нужно, сейчас уже никому не интересно, разве что историкам. Так вот, переж разработчиками возник вполне резонный вопрос: на чем ее писать? На ассемблере, как это было принято, желания писать не возникало. Во-первых, возни и объема работы много, а людей - мало (это вам не IBM). Во-вторых, в те времена в Bell Labs наблюдалось такое ассорти компьютеров, что попутно сразу вставал вопрос о переносимости. Писать на Алголе, Паскале или Коболе? Мало того, что эти языки "заточены" на написание прикладных программ, а не операционных систем, так и объем операционки получился бы совершенно диким. Не стоит забывать, что тогда компьютер, обладающий памятью больше 64К можно было причислять к майнфреймам  (несколько упрощенно - это то, что сейчас называется сервером). Почесали тогда Керниган и Ричи свои репы и придумали язык Си, который, с одной стороны, позволял заниматься системным программированием, а с другой - писать не на ассемблере, а на чем-то более удобном. Вот так и был создан язык "среднего" уровня, на котором и была написана UNIX, включая утилиты к ней.
    Ситуация стала более интересной, когда понадобились прикладные программы. Долго никто не думал, и их тоже написали на Си. И не в последнюю очередь из-за того, что язык Си и компилятор Си был как родной, плюс набитая рука при написании утилит. Соответственно, желание что-то писать на Алголе несколько отсутствовало.
    Вот какой момент. Разработчики UNIX'а четко знали, как работает компилятор, поэтому в первой редакции языка компилятор не особенно утруждал себя нахождением ошибок. А при вызове функций, параметры просто перепихивались этой функции, которая и должна была с ними разбираться. Вполне логично - зачем лишние проверки?
    Теперь второй момент. Раз все в UNIX'е было написано на См, то ни у кого из разработчиков не возникло нездоровое желание портировать в UNIX компилятор другого языка.
    Вот в таком виде UNIX и вышел на большую дорогу из Bell Labs. Кто-то кинулся писать компилятор для своего любимого языка, а все остальные плюнули и начали писать на Си, благо компилятор уже был под рукой (вместе с библиотеками). Триумфальное шествие Си началось.

Легенда языка С++
    Бьерн Страуструп был впечатлен языком Simula. Еще бы, Simula как язык моделирования позволял собирать объекты и прикручивать к ним методы "как правильно пинать этот объект". Сама программа определяла порядок вызова этих методов и смотрела, что же будет с объектами.
    Так вот, впечатлившись, Страуструп решил пркрутить нечто подобное к Си. То, что Си разрабытывался как язык системного программирования, его не смутило. В результате "стахановко-мичуринских" работ получился "Си с классами". А потом Страуструп сформулировал принципы объектно-ориентированного программирования. Сделал он это, по слухам, для того, чтобы объяснить людям "а нафига нам этот мутант нужен". После дополнительно проведенной селекции "Си с классами" мутировал в С++.

Блюдо с гарниром
    Написать программу на Си и откомпилировать ее - особых проблем нет. Проблемы начинаются при отладке, причем отладка, как правило, занимает больше времени, чем написание программы. Ошибки, "любезно заложенные программистом", часто находятся с трудом даже в отладчике. Дело доходит до смешного, от которого хочется плакать.
    Известно, что MS Windows написана на Си. Ошибки исчисляются сотнями (кстати, вы никогда не пробовали отлаживать MS Windows? Попробуйте, это будет хорошей школой отладки проектов).
    Если раньше ошибки какждая уважающая себя фирма старалась выявить максимально быстро и исправить, то Microsoft вывела ошибки на более качественный уровень.
    Не знаю, чем пользуется Intel, но в Pentium'е ошибки тоже повалили косяками. Вот, блин, дожили - процессоры с ошибками.

    Впрочем, мы отвлеклись. Я никогда не был против языка Си. Я - за правильное применение, там, где он к месту.
    Что касается С++, то здесь ситуация такова. Если для Си можно понять, как компилируюься конкретные конструкции (разработчики UNIX'а это знали назубок), то для С++ это могут сказать только разработчики компилятора, что, собственно говоря, совершенно не добавляет энтузиазма программисту, зато представляет все условия для секса с компилятором и отладчиком.

    Вот на этой пессимистичной ноте мы и закончим.

На печать  

<! xref location=/Toweek/2001 >
<! doctype links //site-relative >