|
Программирование >> Процедурные приложения
давние предки компьютеров, такие как станок Джакарда (Jacquardsloom) (1805 г.) и счетная машина Чарльза Беббиджа (CharlesBabbage) (1834 г.)-, программировались механически для выполнения строго определенных функций. Не исключено, что в скором будущем мы сможем управлять компьютерами, посылая нейронные импульсы непосредственно из коры головного мозга, например подключив воспринимающие контакты к височной области мозга (участвующей в запоминании слов) или к области Брока (управляющей функцией речи). Нейронные системы Искусственный интеллект Командные языки операционных систем Проблемно-ориентированные языки Машинно-ориентированные языки Языки ассемблера Механическое программирование оборудования Рис. 4.1. Теоретические этапы развития языков программирования Первые ассемблерные языки, которые появились вместе с электронными вычислительными машинами, позволяли работать непосредственно со встроенным набором команд компьютера и были достаточно простыми для изучения. Но они заставляли смотреть на проблему с точки зрения работы оборудования. Поэтому программисту приходилось постоянно заниматься перемещением байтов между регистрами, осуществлять их суммирование, сдвиг и, наконец, запись в нужные области памяти для хранения результатов вычислений. Это была очень утомительная работа с высокой вероятностью допущения ошибок. Первые языки высокого уровня, например FORTRAN, разрабатывались как альтернатива языкам ассемблера. Они обеспечивали определенный уровень абстракции от аппаратной среды и позволяли строить алгоритм с точки зрения решаемой задачи, а не работы компьютера. К сожалению, их создатели не учли динамики развития компьютерной техники и в погоне за упрощением процесса программирования упустили ряд существенных моментов. Языки FORTRAN и Algol оказались слишком абстрактными для системных программистов. Эти языки были проблемно-ориентированными, рассчитанными на решение общих инженерных, научных и экономических задач. Программистам, занимающимся разработкой новых системных продуктов, по-прежнему приходилось полагаться только на старые языки ассемблера. Чтобы разрешить эту проблему, разработчикам языков пришлось сделать шаг назад и создать класс машинно-ориентированных языков. К таким языкам низкого уровня относились BCPL и В. Но при работе с ними возникла другая проблема: они были приспособлены только для компьютеров определенной архитектуры. Язык С оказался шагом вперед по сравнению с машинно-ориентированными языками, сохранив при этом достаточно низкий уровень программирования в сравнении с большинством проблемно-ориентированных языков. Язык С позволяет контролировать процесс выполнения программы компьютером, игнорируя в то же время особенности аппаратной среды. Вот почему С рассматривается одновременно как язык программирования высокого и низкого уровней. Достоинства языка С Язык программирования часто можно определить, просто взглянув на исходный текст программы. Так, программа на языке APL напоминает иероглифы, текст на языке ассемблера представляется столбцами мнемоник, язык Pascal выделяется своим читабельным синтаксисом. А что можно сказать о языке С? Многие программисты, впервые столкнувшиеся с ним, находят его слишком замысловатым и пугающим. Конструкции, напоминающие выражения на английском языке, которые характерны для многих языков программирования, в С встречаются довольно редко. Вместо этого программист сталкивается с необычного вида операторами и обилием указателей. Многие возможности языка уходят своими корнями к особенностям программирования на компьютерах, существовавших на момент его появления. Ниже рассматриваются некоторые сильные стороны языка С. Оптимальный размер программы В основу С положено значительно меньше синтаксических правил, чем у других языков программирования. В результате для эффективной работы компилятора языка достаточно всего 256 Кб оперативной памяти. Действительно, список операторов и их комбинаций в языке С обширнее, чем список ключевых слов. Сокращенный набор ключевых слов Первоначально, в том виде, в каком его создал Деннис Ритчи, язык С содержал всего 27 ключевых слов. В ANSI С было добавлено несколько новых зарезервированных слов. В Microsoft С набор ключевых слов был еще доработан, и общее их число превысило 50. Многие функции, представленные в большинстве других языков программирования, не включены в язык С. Например, в С нет встроенных функций ввода/вывода, отсутствуют математические функции (за исключением базовых арифметических операций) и функции работы со строками. Но если для большинства языков отсутствие таких функций было бы признаком слабости, то С взамен этого предоставляет доступ к самостоятельным библиотекам, включающим все перечисленные функции и многие другие. Обращения к библиотечным функциям в программах на языке С происходят столь часто, что эти функции можно считать составной частью языка. Но в то же время их легко можно переписать без ущерба для структуры программы - это безусловное преимущество С. Быстрое выполнение программ Программы, написанные на С, отличаются высокой эффективностью. Благодаря небольшому размеру исполняемых модулей, а также тому, что С является языком достаточно низкого уровня, скорость выполнения программ на языке С соизмерима со скоростью работы их ассемблерных аналогов. Упрощенный контроль за типами данных В отличие от языка Pascal, в котором ведется строгий контроль типов данных, в С понятие типа данных трактуется несколько шире. Это унаследовано от языка В, который так же свободно обращался с данными разных типов. Язык С позволяет в одном месте программы рассматривать переменную как символ, а в другом месте - как ASCII-код этого символа, от которого можно отнять 32, чтобы перевести символ в верхний регистр. Реализация принципа проектирования сверху вниз Язык С содержит все управляющие конструкции, характерные для современных языков программирования, в том числе инструкции for, if/else, switch/case, while и другие. На момент появления языка это было очень большим достижением. Язык С также позволяет создавать изолированные программные блоки, в пределах которых переменные имеют собственную область видимости. Разрешается создавать локальные переменные и передавать в подпрограммы значения параметров, а не сами параметры, чтобы защитить их от модификации. Модульная структура Язык С поддерживает модульное программирование, суть которого состоит в возможности раздельной компиляции и компоновки разных частей программы. Например, вы можете выполнить компиляцию только той части программы, которая была изменена в ходе последнего сеанса редактирования. Это значительно ускоряет процесс разработки больших и даже среднего размера проектов, особенно если приходится работать на медленных машинах. Если бы язык С не поддерживал модульное программирование, то после внесения небольших изменений в программный код пришлось бы компилировать всю программу целиком, что могло бы занять слишком много времени. Возможность использования кодов ассемблера Большинство компиляторов С позволяет обращаться к подпрограммам, написанным на ассемблере. В сочетании с возможностью раздельной компиляции и компоновки это позволяет легко создавать приложения, в которых используется код как высокого, так и низкого уровня. Кроме того, в большинстве систем из ассемблерных программ можно вызывать подпрограммы, написанные на С. Возможность управления отдельными битами данных Очень часто в системном программировании возникает необходимость управления переменными на уровне отдельных битов. Поскольку своими корнями язык С прочно связан с операционной системой UNIX, в нем представлен довольно обширный набор операторов побитовой арифметики. Наличие указателей Язык, используемый для системного программирования, должен предоставлять возможность обращаться к области памяти с заданным адресом, что значительно повышает скорость выполнения программы. В С эта возможность реализуется за счет использования указателей. Хотя указатели применяются и во многих других языках программирования, только С позволяет выполнять над указателями арифметические операции. Например, если переменная student record ptr указывает на первый элемент массива student records, то выражение student record ptr + 1 будет указывать на второй элемент массива. Возможность гибкого управления структурами данных Все массивы данных в языке С одномерны. Но С позволяет создавать конструкции из одномерных массивов, получая таким образом многомерные массивы. Эффективное использование памяти Программирование на языке С позволяет достаточно эффективно использовать память компьютера. Отсутствие встроенных функций дает программе возможность загружать только те библиотеки функций, которые ей действительно нужны. Возможность кросс-платформенной переносимости Важной характеристикой любой программы является возможность ее запуска на компьютерах разных платформ или с разными операционными системами. В современном компьютерном мире программы, написанные на языке С, отличаются наибольшей независимостью от платформы. Это особенно справедливо в отношении персональных компьютеров. Наличие мощных библиотек готовых функций Имеется множество специализированных коммерческих библиотек функций, доступных для любого компилятора С. Это библиотеки работы с графикой, базами данных, окнами, сетевыми ресурсами и многим другим. Использование библиотек функций позволяет значительно уменьшить время разработки приложений. Недостатки языка С Не существует абсолютно совершенных языков программирования. Дело в том, что различные задачи требуют различных решений. При выборе языка программирования программист должен исходить из того, какие именно задачи он собирается решать с помощью своей программы. Это первый вопрос, на который вы должны дать ответ еще до того, как начнете работу над программой, поскольку если впоследствии вы поймете, что выбранный язык не подходит для решения поставленных задач, то всю работу придется начинать сначала. От правильного выбора языка программирования в конечном счете зависит успех всего проекта. Ниже будут рассмотрены некоторые слабые стороны языка С. Упрощенный контроль за типами данных! То, что язык С не осуществляет строгого контроля за типами данных, можно считать как достоинством, так и недостатком. В некоторых языках программирования присвоение переменной одного типа значения другого типа воспринимается как ошибка, если при этом явно не указана функция преобразования. Благодаря этому исключается появление ошибок, связанных с неконтролируемым округлением значений. Как было сказано выше, язык С позволяет присваивать целое число символьной переменной и наоборот. Это не проблема для опытных программистов, но для новичков данная особенность может оказаться одним из источников побочных эффектов. Побочными эффектами называются неконтролируемые изменения значений переменных. Поскольку С не осуществляет строгого контроля за типами данных, это дает большую гибкость при манипулировании переменными. Например, в одном выражении оператор присваивания (=) может использоваться несколько раз. Но это также означает, что в программе могут
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |