Добавлен: 17.06.2023
Просмотров: 553
Скачиваний: 3
СОДЕРЖАНИЕ
1.2 Краткая история языков программирования
1.3 Языки программирования высокого уровня
2 Спецификация программ и стандартизация ЯП
2.1.1 Императивное программирование
2.1.2 Объектно-ориентированное программирование
2.1.3 Функциональное программирование
2.1.4 Логическое программирование
2.2.1 Язык функционального программирования РЕФАЛ
2.2.2 Язык программирования C (Си)
2 .2 .3 Язык программирования Prolog
2.2.4 Язык программирования Lisp (Лисп)
2.2.5 Язык программирования FORTRAN (ФОРТРАН)
2.2.6 Язык программирования ALGOL (АЛГОЛ)
2.2.7 Язык программирования COBOL (КОБОЛ)
2.2.8 Язык программирования Ada (Ада)
2.2.9 Паскаль (язык программирования)
2.2.10 История, назначение, характеристика Java
2.2.12 Язык программирования Smalltalk
3.1 Роль языков программирования
3.3. Какой язык следует считать хорошим?
5. Удобство верификации программы. Основным требованием является надежность программы, написанной на том или ином языке. Существует множество технологий для проверки правильности выполнения программой своих функций. Правильность программы можно доказать с помощью формальных методов верификации (см. раздел 4.2), проверкой без выполнения (путем чтения текста программы и исправления ошибок), также она может быть протестирована путем ее выполнения с тестовыми входными данными и
проверкой выходных результатов в соответствии с ее спецификацией и т. д. Для проверки больших программ обычно используется некая комбинация всех этих методов. Даже если язык обеспечивает на первый взгляд много возможностей для облегчения программирования, но проверка написанных на нем программ затруднительна, он менее надежен, чем язык, поддерживающий и упрощающий проверку программы. Основной фактор, влияющий на упрощение проверки программы, — простота семантики и синтаксических структур.
6. Среда программирования. Наличие в языке программирования технически развитых конструкций и структур (выражений, структур управления, типов данных и структур данных) — это только один аспект, влияющий на широту его использования. Наличие подходящей среды программирования может сделать технически слабый язык более легким в применении, нежели сильный язык при незначительной внешней поддержке. Можно составить длинный список разнообразных определяющих факторов, которым должна удовлетворять среда программирования, но возглавляет его, несомненно, требование наличия в ней надежной, эффективной и хорошо документированной реализации языка программирования. Специализированные текстовые редакторы и тестирующие пакеты, которые отражают специфику языка и работы с ним, могут сильно ускорить написание и тестирование программ. Средства для поддержки и модификации нескольких версий программы могут облегчить разработку больших программ. Из языков, описанных в данной книге, только Smalltalk был специально разработан под конкретную среду программирования, состоящую из окон, меню, возможностей ввода данных с помощью мыши и набора средств, позволяющих оперировать с программой, написанной на Smalltalk.
7. Переносимость программ. Одним из важных критериев для многих программных проектов является переносимость разработанных программ с компьютера, на котором они были написаны, на другие компьютерные системы. Удобным средством создания переносимых программ являются широкодоступные языки, определение которых не зависит от возможностей различных машин. Такие языки, как Ada, FORTRAN, С и Pascal имеют стандартные определения, позволяющие реализовывать переносимые приложения. Другие языки (например, ML) происходят от единственной централизованной реализации (single-source implementation), позволяя разработчику языка осуществлять некоторый контроль над свойствами, определяющими его переносимость.
8. Стоимость использования. Коварный критерий стоимости был оставлен напоследок. Стоимость использования, конечно, является существенным компонентом оценки языка программирования и складывается из нескольких составляющих:
♦ Стоимость выполнения программы. На заре компьютерных вычислений стоимость связывалась в основном только с выполнением программы. Большое значение имели исследования по разработке оптимизирующих компиляторов, эффективного использования регистров и механизмов эффективного выполнения программ. Хотя стоимость выполнения программы учитывается и в процессе разработки языка, но в первую очередь она важна для больших производственных программ, которые многократно выполняются. Однако на сегодняшний день для большинства приложений вопрос скорости выполнения не является первостепенным. Если речь идет об улучшении диагностики или упрощении контроля в процессе разработки и сопровождения программы, то при использовании настольных компьютеров, выполняющих много миллионов операций в секунду и большую часть времени находящихся в режиме ожидания, увеличение времени выполнения на 10 или 20 % является допустимым.
♦ Стоимость трансляции программы. Когда такие языки, как FORTRAN или С используются в процессе обучения, первостепенным может оказаться вопрос эффективной трансляции (компиляции), а не эффективного выполнения. Как правило, в процессе отладки студенческие программы многократно транслируются, а выполняются всего несколько раз. В этом случае важнее иметь быстрый и эффективный компилятор, а не компилятор, создающий эффективный код.
♦ Стоимость создания, тестирования и использования программы. Этот аспект стоимости может быть проиллюстрирован на примере языков Smalltalk и Perl. Для определенного класса задач решение может быть разработано, закодировано, протестировано, изменено и использовано с минимальными затратами времени и сил программиста. Smalltalk и Perl являются примерами эффективных в смысле стоимости языков программирования. И это объясняется тем, что в них минимизировано общее время и объем усилий, требующихся программисту на решение на компьютере какой-либо задачи, даже если время выполнения программы может быть больше, чем для других языков.
♦ Стоимость сопровождения программы. Многочисленные исследования показали, что самую большую часть стоимости программы, используемой в течение нескольких лет, составляет не стоимость начального создания, кодирования и тестирования программы, а стоимость полного жизненного цикла программы, куда входит стоимость как разработки, так и сопровождения программы. Поддержка включает в себя и исправление ошибок, выявленных уже после того, как программа отдана в эксплуатацию, и изменения, которые необходимо внести в программу в связи с обновлением аппаратной части или операционной системы, и усовершенствование и расширение возможностей программы для удовлетворения новых потребностей. Язык, который позволяет без особых проблем вносить многочисленные изменения и исправления в программу и создавать различные расширения (причем разными программистами и в течение многих лет), окажется в конечном счете более выгодным, чем любой другой.
Синтаксис и семантика
Синтаксис языка программирования определяет то, как выглядит программа на этом языке. Определить синтаксические правила — значит объяснить, как пишутся операторы, объявления и другие языковые конструкции. Семантика языка программирования определяет смысловые значения различных синтаксических конструкций. Например, чтобы в языке С задать вектор V из десяти целочисленных элементов, необходимо написать следующее объявление:
int V[10]:
В языке же Pascal то же самое будет выглядеть по-другому:
V: аггау[0..9] of integer;
Как видно, их синтаксис сильно различается, хотя во время выполнения программы создаются одинаковые объекты данных. Чтобы понять смысл этих объявлений, необходимо знать семантику объявлений массивов в языках С и Pascal. То есть вы должны знать, что если поместить подобное объявление в начало подпрограммы, то при каждом ее вызове будет создаваться вектор, содержащий указанное число элементов, а по завершении программы он будет уничтожаться. Во время выполнения подпрограммы на вектор можно ссылаться по имени V. В обоих примерах элементами вектора V будут Vc...... V9.Однако, если вы объявляете объект V как список в языке LISP, необходимо знать, что размер его может быть произвольным и определяется непосредственно в момент создания. Более того, объект может быть создан в любой момент во время выполнения программы и на первый элемент можно ссылаться одним из следующих способов: (car V) или (head V). В руководствах по языкам программирования и в справочниках принято строить описание языка на основе его синтаксических конструкций. Как правило, сначала приводится синтаксис некоторой языковой конструкции, например конкретного оператора или объявления, а затем поясняется семантика этой конструкции, то есть описывается ее смысл. В главе 3 приведена система обозначений НФБ, которая является в настоящее время основной системой обозначений, используемой для описания синтаксиса языка программирования.
Мы придерживаемся другого способа описания; он основан на структурах, связанных с выполнением программы. Иногда такие структуры данных и операции непосредственно связаны с конкретными синтаксическими конструкциями, но чаще эта связь является более опосредованной. Например, выполняемая программа на языке С может использовать вектор V, где V имеет структуру, определенную приведенным выше объявлением. Однако скомпилированная программа может иметь другие структуры данных, такие как центральный стек, содержащий активационные записи подпрограмм, которые напрямую не связаны с синтаксисом программы.
Эти скрытые структуры так же важны для понимания языка, как и видимые структуры, напрямую соответствующие тому, что программист написал в программе. Именно поэтому в данной книге рассмотрение элементов языка организовано вокруг выполняемых структур, а не синтаксических элементов. Конкретный элемент, создаваемый во время выполнения программы, может не иметь синтаксического представления в программе, может быть представлен напрямую единственным синтаксическим элементом, может выражаться через несколько различных синтаксических элементов, которые собираются транслятором воедино для создания одного элемента виртуального компьютера.
3.4 Структура программы на языке высокого уровня
Исходная программа, как правило, состоит из следующих частей (впервые эти требования были сформулированы в языке
• раздела идентификации — области, содержащей наименование программы, а также дополнительную информацию для программистов и/или пользователей;
• раздела связи — фрагмента текста, описывающего внешние переменные, передаваемые вызывающей программой (если таковая имеется), т. е* ту часть исходных данных, которая обязательно поступает на вход программы при ее запуске. Эти переменные часто называют параметрами программы;
• раздела оборудования (среда) — описания типа ЭВМ, процессора, требований к оперативной и внешней памяти, существенных с точки зрения выполнимости программы;
• раздела данных — идентификации (декларация, объявление, описание) переменных, используемых в программе, и их типов. Понятие типа позволяет осуществлять проверку данных на совместимость в операциях еще на этапе трансляции программы и отвергнуть недопустимые преобразования;
• раздела процедур — собственно программной части, содержащей описание процессов обработки данных. Элементами процедуры являются операторы и стандартные функции, входящие в состав соответствующего языка программирования. Необходимо отметить, что конкретные ЯП могут не требовать наличия всех вышеперечисленных разделов исходного модуля. В некоторых случаях описания переменных могут размещаться произвольно в тексте или опускаться, при этом тип переменной определяется компилятором, исходя из системы умолчаний; есть средства программирования, в которых тип переменной задается в момент присвоения ей значения другой переменной или константы и т. д. Существуют фрагменты описания данных, которые могут быть отнесены как к разделу данных, так и к разделу оборудования (указания на устройство, длину и формат записи, организацию файла и т. п.). Так, например, программа на языке Pascal представляет собой последовательность заголовка, раздела объявлений и тела программы. Структурная схема программы на языке Pascal .Следует отметить, что в современных реализациях языка (Turbo Pascal, Object Pascal) заголовок программы необязателен и не обрабатывается компилятором; порядок размещения разделов объявлений произвольный (в отличие от стандарта, где этот порядок строго фиксирован); в программе может бытьуказано несколько одинаковых разделов объявлений и существует раздел объявления используемых модулей (в стандарте языка этот раздел отсутствовал).