Практикум для изучения дисциплины «Основы программирования»



Pdf көрінісі
бет40/81
Дата08.07.2020
өлшемі1,55 Mb.
#74978
түріПрактикум
1   ...   36   37   38   39   40   41   42   43   ...   81
Байланысты:
А.А. Тюгашев

Возможный девиз языка программирования Си 
Одним  из  наиболее  известных,  сильно  повлиявших  на  дальнейшее 
развитие информационных технологий и широко используемых до сих пор 
языков программирования является Си. На его основе были созданы такие 
наиболее  популярные  в  настоящее  время  в  индустрии  программирования 
языки, как С++, С#, Java, PHP, Objective C и др. При этом можно сказать, 
что,  в  отличие  от  многих  других  языков,  созданных  в  рамках  серьезных 
инвестиционных  программ  правительств  или  крупных  корпораций  (PL/I, 
Кобол,  Java)  или  родившихся  в  стенах  исследовательских  лабораторий  в 
качестве  проверки  научной  концепции  (Smalltalk,  Клу,  Q  и  др.),  Си 
появился на свет в результате «хулиганства». 
В начале 1970-х годов молодые системные программисты (программисты, 


75 
 
создающие  операционные  системы  и  другие  служебные  программы) 
Деннис  Ритчи  и  Кен  Томпсон,  работавшие  в  американской  корпорации 
AT&T,  были  в  числе  других  сотен  разработчиков  задействованы  в 
большом  проекте  создания  многозадачной  многопользовательской 
операционной  системы,  что  нашло  свое  отражение  в  названии — 
MULTICS.  Согласно  одной  из  легенд,  Ритчи  и  Томпсон  в  свободное  от 
работы  время  были  не  прочь  поиграть.  Особенно  им  полюбилась  игра 
Space Travel, которую они сами написали и запускали на главном сервере 
компании.  Позднее  они  захотели  перенести  ее  на  вспомогательный 
компьютер PDP-7, собиравший пыль в их комнате. Но он, к сожалению, не 
имел операционной системы. 
Что  делают  системные  программисты,  если  им  хочется  запустить  на 
компьютере  игру,  но  на  нем  отсутствует  операционная  система? 
Правильно,  пишут  операционную  систему.  Название  Unix  как  отсылка  к 
MULTICS  (противопоставление  на  английском  слова  «уникальный», 
«единственный»  слову  «мульти»,  «множественный»)  появилось  в  1970 
году  как  шутка  Брайана  Кернигана —  намек  на  то,  что  новая  система 
поддерживала  лишь  пользователя  Томпсона  и  поэтому  должна  носить 
название Un-multiplexed Information and Computing Service. Все очевиднее 
становилось,  что  изначально  устаревшая  PDP-7,  накладывающая 
множество раздражающих ограничений на работу операционной системы, 
не  сможет  удовлетворять  нуждам  дальнейшего  развития,  как  и  вся  серия 
машин  PDP-7.  При  этом  надеяться  на  разрешение  закупки  нового 
оборудования со стороны руководства не приходилось. 
Один  из  сотрудников,  увлекавшийся  обработкой  текстов  на  компьютере, 
предложил схитрить и попросить у начальства новейший микрокомпьютер 
PDP-
11  компании  DEC  для  создания  инструментов  редактирования  и 
форматирования  текста.  То,  что  для  создания  этих  инструментов 
потребуется  написать  операционную  систему,  указывалось  как  сноска. 
Запрашиваемая  сумма  была  куда  меньше,  чем  раньше —  всего  65  тыс. 
долларов. Не сразу, но начальство согласилось, и в 1970 году был сделан 
заказ  на  PDP-11.  Все  усложнявшаяся  операционная  система  была 
переписана  на  новую  машину.  Перенос  оказался  непростой  задачей, 
поскольку  система  была  написана  полностью  на  ассемблере.  В  связи  с 
этим возникла идея переписать операционную систему на язык высокого 
уровня. 
В  распоряжении  авторов  имелся  язык  программирования  BCPL.  Его 
разработал  Мартин  Ричардс  в  1966–1967  годах,  когда  посещал 
Массачусетский  технологический  институт.  Это  была  несколько 
упрощенная  версия  языка  CPL  (Cambridge  Programming  Language). 
Первоначально  компилятор  BCPL  был  реализован  для  операционных 
систем  GECOS  и  MULTICS.  Томпсон  и  Ритчи  несколько  его 


76 
 
усовершенствовали,  назвав  сначала  B  (читается  «би»),  и  затем  NB.  По 
сути,  B  был  синтаксически  видоизмененным  BCPL,  который  Томпсону 
удалось  втиснуть  в  8 Кбайт  памяти.  Почему  язык  получил  такое  имя? 
Существует  две  гипотезы  его  происхождения:  от  первой  буквы  либо 
BCPL, либо другого языка Томпсона — Bon, названного в честь его жены 
Бонни.  Язык  B  был,  фактически,  языком  промежуточного  уровня.  Как  и 
BCPL,  он  бестиповый,  работающий  со  словом  (ячейкой  машинной 
памяти),  содержащим  фиксированное  число  разрядов,  как  в  ассемблере. 
Память  при  этом рассматривается  как линейный массив  слов,  а  значение 
ячейки  можно  интерпретировать  как  индекс  в  этом  массиве.  Для 
подобного доступа BCPL использует оператор !, а язык B — оператор *. 
В  связи  с  тем,  что  B  не  давал  использовать  все  возможности  PDP-11,  на 
который  программисты  хотели  перенести  систему,  было  решено  создать 
еще  один  улучшенный  язык  программирования.  Переход  от  B  к  Си 
происходил  одновременно  с  созданием  компилятора,  способного 
порождать  довольно  быстрые  и  компактные  программы,  не  слишком 
уступавшие  в  скорости  по  сравнению  с  ассемблером.  Деннис  Ритчи 
вспоминает:  «Я  назвал  несколько  расширенный  язык  NB —  «новый  B» 
(new  B)».  В  язык  NB  Ритчи  ввел  первые  типы —  int  и  char.  Вместе  с 
массивами и указателями они составили его систему типов. 
Откуда появилось название Си? Ритчи разъясняет это так: «Создав систему 
типов,  соответствующий  синтаксис  и  компилятор  для  нового  языка,  я 
почувствовал,  что  он  заслуживает  нового  имени:  NB  показалось  мне 
недостаточно четким. Я решил следовать однобуквенному стилю и назвал 
его C (Си), оставляя открытым вопрос, являлось ли после B это следующей 
буквой в алфавите или в названии BCPL». 
Надо  сказать,  что  при  создании  Си  активно  использовалась 
«самораскрутка»,  когда  язык  используется  для  создания  собственного 
транслятора.  Сначала  на  ассемблере  пишется  поддержка  минимального 
набора  конструкций  и  возможностей  реализуемого  языка,  затем 
полученный  минимальный  язык  применяется  разработчиком  для 
реализации еще какой-либо возможности и т. д. 
Успех Си был неразрывно связан с тем, что в одном месте в одно и то же 
время  появились  сразу  три  шедевра,  ставших  культовыми:  язык 
программирования  Си,  операционная  система  UNIX  и  мини-компьютер 
PDP-
11 (в Советском Союзе аналогом PDP-11 были ЭВМ семейств СМ-4 и 
СМ-1420).  Кен  Томпсон  считает:  «Наше  сотрудничество  было  образцом 
совершенства.  За  те  десять  лет,  что  мы  проработали  вместе,  можно 
вспомнить  только  один  случай  нескоординированной  работы.  Я  тогда 
обнаружил, что мы написали одинаковую ассемблерную программу из 20 
строк. Я сравнил наши тексты и поразился, обнаружив, что они совпадают 


77 
 
посимвольно.  Результат  нашей  совместной  работы  получился  намного 
более  значительным,  чем  вклад  нас  обоих  по  отдельности».  К  1973  году 
язык  Си  стал  довольно  силен,  большая  часть  ядра  UNIX,  первоначально 
написанная  на  ассемблере  PDP-11,  была  переписана  на  Си.  Это  одно  из 
самых первых ядер операционных систем, написанное на языке, отличном 
от 
ассемблера. 
Более 
ранними 
были 
лишь 
MULTICS, 
запрограммированная на ПЛ/1, и TRIPOS, использовавшая  BCPL. 
Таким образом,  Си —  язык,  созданный  системными программистами для 
своих  нужд.  Это  серьезнейшим  образом  сказалось  на  некоторых  его 
особенностях: 
 
Язык 
имеет 
низкоуровневые 
возможности, 
позволяющие 
непосредственно работать с машинными ячейками, в том числе битовые 
операции  и  так  называемую  адресную  арифметику.  В  связи  с  этим 
некоторые ученые относят Си к языкам промежуточного, а не высокого 
уровня. 
 
Си  позволяет  создавать  высокоэффективные —  быстрые  и  не 
требующие больших объемов памяти программы. 
 
Язык Си отличается минимализмом и лаконичностью программ. 
В  отличие  от  языков,  специально  создававшихся  для  первоначального 
обучения  программированию,  таких  как  BASIC  (Beginners  All-purpose 
Symbolic Instruction Code — 
многоцелевой  язык  символических 
инструкций  для  начинающих)  или  Паскаль,  Си  дает  программисту 
большие возможности, развязывет ему руки. Но за большую свободу, как 
известно,  приходится  платить  большей  ответственностью.  При 
программировании  на  Си  можно  допустить  такие  ошибки,  которые  в 
Паскале невозможны. 
Брайан  Керниган  говорит:  «Си —  инструмент,  острый,  как  бритва:  с  его 
помощью можно создать и элегантную программу, и кровавое месиво». В 
связи  со  сравнительно  низким  уровнем  языка  многие  случаи 
неправильного  использования  опасных  элементов  не  обнаруживаются  ни 
при  компиляции,  ни  во  время  исполнения.  Это  часто  вызывает 
непредсказуемое поведение программы. Иногда в результате неграмотного 
использования  элементов  языка  появляются  уязвимости.  Примером 
ошибки является обращение к несуществующему элементу массива. Си не 
имеет  проверки  индексов  массивов  (проверки  границ).  Например, 
возможна  запись  в  шестой  элемент  массива  из  пяти  элементов,  что, 
естественно, приведет к непредсказуемым результатам. Похожей является 
ошибка переполнения буфера
Для  того  чтобы  помочь  программирующим  на  Си  решить  эти  и  многие 
другие  проблемы,  было  создано  большое  число  отдельных  от 


78 
 
компиляторов инструментов. Такими инструментами являются программы 
дополнительной  проверки  исходного  текста  программы  и  поиска 
распространенных  ошибок  (статические  анализаторы),  а  также 
библиотеки,  предоставляющие  дополнительные  функции,  не  входящие  в 
стандарт языка. 
Во  многих  учебниках  по  языкам  программирования  традиционным 
началом  изучения  языка  является  написание  на  нем  программы 
приветствия, выводящей на экран сообщение «Здравствуй, мир!». Пойдем 
по  этому  пути,  проторенному  Керниганом  и  Ритчи  [11],  и  мы.  Далее 
приводится вариант подобной программы на Си. 
Пример программы «Здравствуй, мир!» на языке Си: 
/* Программа приветствия */ 
#include  
 
int main() 

   printf ("
Здравствуй, мир!\n"); 
   return 0; 

Разберем  построчно  текст  программы.  Первой  строкой  идет  так 
называемый комментарий, игнорируемый компилятором и служащий для 
пояснения  программы  читающему  ее  человеку.  Комментарием  в  Си 
считается 
любая 
последовательность 
символов 
(не 
только 
располагающаяся на одной строке, но и многострочная), начинающаяся с 
комбинации /* и заканчивающаяся */. 


Достарыңызбен бөлісу:
1   ...   36   37   38   39   40   41   42   43   ...   81




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет