Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 17
Текст из файла (страница 17)
Таким образом зародилась идея операционной системы 1)Ы1Х. Система Мп!г!сз программировалась па языке Р 1/1, и хотя он достаточно громоздок, было желанно написать новую систему, ()г!1Х, именно на языке высокого уровня. Поскольку Томпсон имел некоторый опыт работы с системным языком ВСРП (языком низкого уровня, не имеющим никаких средств динамической поддержки), он разработал новый язык под названием В, который реализовывал минимальное подмножество возможностей языка ВСРП для системного программирования (~ВСР1 помещался в 8-килобайтнучо намять компьютера (Р()Р-7!» !92!). В настоящее время трудно представить, насколько существенным сдерживающим фактором было ограничение объема памяти всего 30 лет назад.
В 1970 г, для проекта 11К1Х был приобретен компьютер !'1) Р-11 с его огромной памятью в 24 Кбайт. В ато время небольшое, но растущее сообщество ()Ы1Х почувствовало ограничения языка В. Поэтому в В были добавлены такис понятия, как типы, определения структур н некоторые дополнитсльныс операторы, и новый язык стал известен под именем С. 1.5. Обзор языка С 59 Хотя С вЂ” универсальный язык программирования, он тесно связан с системным программированием. Этот язык впервые был использован для написания ядра операционной системы ()гч! Х и с тех пор оыл тесно связан с реализациями ())ч1Х. В настоящее время реализации языка С существуют в большинстве компьютерных систем. В 70-е гг.
интерес к языку С проявлялся в основном со стороны университетских кругов, отдававших предпочтение операционной системе (Л~ПХ. Когда в 80-х гг, начали появляться коммерческие версии этой системы, их популярность постоянно росла благодаря языку С. В 1982 г. рабочая группа института стандартов АК81 начала работать над стандартом языка С, который увидел свет в 1989 г. 110~ и был принят и в качестве международного стандарта (180/1Е8 9899) в 1990 г. В настоящее время программисты, использующие язык С, — наиболее быстро растущая популяция в программистском мире.
Вместе с языками Сч"ь и )ага, которые разрабатывались на его основе, он оказывает наибольшее влияние на программирование. Синтаксис исемантнкабольшинствановыхязыкон(такпхкак)ага я Рог!) частично основаны на концепциях, характерных для языка С. Краткий обзор языка. Когда речь идет о языке С, как правило, рассматривается не столько собственно сам язык, определяемый специальной грамматикой, а среда этого языка. Составные части среды программирования языка С таковы.
+ Язык С. Это относительно небольшой язык с ограниченным набором структур управления и возможностей. (Нс забывайте, что он развился из минимального компилятора, который работал на РРР-7, а позже на Р()Р-11.) + 77репроцессор С. Поскольку почти каждый компилятор С включает в себя операторы препроцессора, начинающиеся с символа №, то оольшинство пользователей даже яс подозревают, что они нс являются составной частью собственно языка С, + Лопуп1сиия ияшерфейса С. В результате использования возможностей языка С возник ряд соглашений. Например, принято, что определения интерфейсов между модулями должны храниться в соответствующем заголовочном файле с расширением .и.
В операторе Фпс1пде "яугспщ" прп определении интерфейса к модулю пуггп используется как С-прспроцессор, так н указанное соглашение. + Библиоглвхи С. Многие функции, такие как рщптй дегсПзг, пзН ос, 1ог1 и ехес, были написаны с помощью интерфейсов С, хотя опи не входят в официальное определение языка С. Однако в стандарте АМ81 языка С эти функции включены в язык в качестве обязательных библиотечных функций для согласующихся со стандартом компиляторов. Подключение большой библиотеки позволяет расширять с помощью ее функций относительно небольшое ядро языка. Модуль на языке С состоит из глобальных объявлений н последовательности вызовов функций. Для формирования одной выполняемой программы одновременно загружается несколько модулей. Каждая функция может вызывать другие функции и имеет доступ как к локальным, так и к глобальным данным, 60 Глава 1.
Проблемы разработки языка При такой структуре хрансшш данных осуществляется очень просто. Каждая функция имеет локальную память или локальную актпвационную запись, которая является динамической и допускает рекурсию; также каждая функция имеет доступ к глобальным переменным. реально не существует никакой блочной структуры. Каждый отдельный объект данных реализован эффективно. Например, многомерные массивы строятся из одномерных массивов, а индексы одномерных массивов начинаются с О.
Это исключает необходимость применения дескрипторов для вычисления смещения, что, в свою очередь, исключает все сложныс вычисления для опрсдслсния размещения в памяти элементов массива. В языке С используются указатели, а массивы и указатели эквивалентны, что позволяет программам использовать любой из наиболее подходя~них методов для доступа к элементам массивов. Строки реализованы как массивы символов. Эта реализация совершенно прозрачна, повтому обращаться к строкам можно несколькими способами: как к строкам, как к массивам или (как уже отмечалось) как к указателям на отдельный символ.
В языке С имеется большой набор арифметических операций, которые позволяют писать очень эффективные, а иногда и очень лаконичные программы. Также имеется полный набор структур управлешш с очень гибкой ссмантикой, иногда допускаюгдсй довольно необычное использование. Кроме того, в С предусмотрена возможность гибкого определения типов. Тем не менее можно утверждать, что С является одновременно и сильно типизированнымм, и не сильно типизированным языком. Такая неоднозначность возникает пзза того, что большинство отдельных элементов данных являются подтипами целого типа. Хотя транслятор и обнаружит оцшбки, связанные с несоответствием типов, но поскольку большинство элементов данных в конечном счете относятся к целочисленному типу, многие ошибки могут остаться незамеченными.
Язык С изначально был тесно связан с функциональными возможностями операционной системы. В операционной системс 1Л~1Х нскоторые фуикции операционной системы (например, функция еа11ос для динамического выделения области памяти) определены как вызовы соответствующих функций языка С. По соглашению все они определяются в системных заголовочных файлах с расширением .й. Так, например, для вызова па11ос из программы на языке С в начале программы должен быть подключен соответствующий файл Фапс1вое <ва11ос ж> а при дальнейшем использовании этой функции в программе следует просто писатыа11ос(5аогаде51гей указывая в качестве параметра требуемый обьсм памяти. При компиляции и запуске такой программы определения соответствующих функций (напримср, па11ос) подключаются из библиотеки С.
Компилятор С сначала запускает прспроцсссор. Такис команды, как (гое1 пе и (г1 пс1опе выполняются в первую очередь, азатом уже транслятором С компилируется вся остальная программа При разработке операторов ввода-вывода в качестве образца была взятка концепция оператора ЕОкпАЕ языка РОКТКЛК, но получившиеся в результате операторы лучше приспособлены для шперактивных программ, чем операторы кЕАО и 'ик1 тЕ языка ГОКТКЛМ Большинство полезных функций определено в системном файле зЫ1о.'и, который должон подключаться к любой программе на языке С. Та- 1.7.
Задачи и упражнения б1 кой подход позволяет легко расширять язык — достаточно написать ряд новых функций для добавления новых функциональных возможностей. В программе можно использовать комментарии (любой текст, ограниченный символами!*...*!), задаваемые в любом месте, где можно использовать пробел. Поскольку формат текста свободный, то символы продолжения строки пе нужны, однако каждый макроопсратор препроцессора обязательно должен определяться в одной строке.
Тем нс менее можно использовать символ (~) для указания, что определение макроопсратора прснроцессора продолжается в следующей строке. 1.6. Рекомендуемая литература Во многих книгах конкретные языки программирования рассматриваются на обзорном уровне. В книгах Дершема и Джигита [35], Лоудсна [74], Ссбссты [99] и Сети [100) предложен альтернативный взгляд на многие аспекты, освещенные в данной книге. Ранний зтап истории развития языков программирования хорошо изложен в книгах Саммета [95],[96] и Розена [93].
Под редакцией Вексельблата (%'схс!Ыас) вышел сборник статей, написанных разработчиками многих основных языков, среди которых Л(.СО(., ЛР(., СОВО[ч РОСТКАХ Р[./! [117]. В 1993 г. прошла Вторая конференция по истории языков программирования [4]. В атом издании приведена более полная информация но истории языков Рго!оя, С, 1!ЯР, Сч-ч-, Лда и Разса1, а также некоторых других, о которых не рассказано в нашей книге. Роль стандартизации языков описана в книге Рада и Берга [90], Все языки, описанные в этой книге, испытывают влияние как среды программирования, так и операционной среды.
Эти факторы особенно сильно повлияли на такие языки, как Лба, С, 1.1ЯР, М1. и Рго!о(ь Описание многих современных вариантов сред программирования приведено в книгах Брауна [23], а также Перри и Кайзера [87). О способах проверки корректности программ и об ограничениях методов верификации можно прочитать у Абрамса и Вслковпца [2]. Статьи на все рассмотренные в атой главе темы можно найти в журналах )ЕЕЕ 7)гагьуастют оп Еоуггеаге епюпееппд, лсл4 тгапхасглокх оп 5о/ггеаге Гпдтеепггд' и 5о/)маге Ргасг(се апг)Ехрепепстс 1.7.
Задачи и упражнения 1, Используя критерии, приведенные в разделе 1.3.1, оцените причины популярности того языка, который наиболее активно используется на вашем локальном компьютере. Нужно ли расширить список критериев? 2. Выберите стандартизованный язык, к компилятору которого у вас есть доступ. Напишите программу, которая, оудучи несовместимой, все же компилируется и выполняется. Перечислите те нестандартныс возможности, которые поддерживает ваш компилятор. 3.