Файл: Международные и отечественные стандарты языков программирования. Сходство и отличия стандартов.(Семантика языков программирования).pdf
Добавлен: 31.03.2023
Просмотров: 214
Скачиваний: 2
СОДЕРЖАНИЕ
Глава 1 Стандартизация языков программирования
1.1 Семантика языков программирования
1.2 Парадигма программирования
Глава 2 Анализ международных и отечественных стандартов языков программирования
2.1 Отечественные стандарты языков программирования
2.2 Международные стандарты языков программирования
Введение
На стадии проектирования закладываются не только технические характеристики программного изделия, но и определяется содержание и характер работ на остальной стадий проектирования. Решения, принятые на стадии внутреннего проекта, определяют простоту или сложность будущего сопровождения программы. Легкость сопровождения - это одно из свойств приложения, которое нельзя добавить к нему после ее разработки. Рациональная технология проектирования должна обеспечить снижение общих трудовых затрат с учетом всего жизненного цикла программного изделия. Необходимо учитывать, что сопровождение программ стоит гораздо больше, чем их разработка.
Один из путей усовершенствования технологии: введение стандартов, ограничивающих программиста в выборе средств разработки.
Основные причины, вызывающие необходимость стандартизации программирования: стремление сделать систему достаточно простой, доступной для восприятия программистом, который знаком с соответствующими стандартами; требование сделать систему легко модифицированной; необходимость упрощения отладки программ; необходимость повышения качества программ; возможность планирования работ по созданию программного изделия и повышению эффективности контроля по обеспечению качества программ.
Разнообразие информационных технологий, аппаратных средств, языков программирования, их динамичное развитие, миллионная армия их производителей и пользователей сделали одной из главных в компьютерном производстве проблему его стандартизации.
Цель исследования – проанализировать международные и отечественные стандарты языков программирования.
Задачи исследования:
- Общая характеристика стандартизации языков программирования.
- Анализ международных и отечественных стандартов языков программирования.
Объект исследования – стандартизация процесса программирования.
Предмет исследования – международные и отечественные стандарты языков программирования.
Глава 1 Стандартизация языков программирования
1.1 Семантика языков программирования
Если синтаксис отвечает за техническую корректность конструкций языка, то семантика — за смысловое наполнение. В человеческом языке это сложная область: у одного слова может быть много прямых, переносных и контекстуальных значений. А еще есть фразеологизмы с особой семантикой. Кроме того, человеческие языки тесно связаны с культурой — заучить слова и правила недостаточно, нужно знакомиться с историей и традициями.
В плане семантики языки программирования устроены значительно проще. Смысл ключевого слова не изменятся в зависимости от контекста, ситуации или культурного бэкграунда программиста. Семантика ЯП — это про осмысленность языковых конструкций, а в более широком смысле — про проверку правильности программ. Точнее, она используется для формальной верификации — то есть математического доказательства, что текст программы не содержит ошибок алгоритма и соответствует целям, ради которых создавался.
Семантика языка программирования - это правила придания смысла синтаксически правильным программам. В конечном счете, эти правила определяют ту последовательность действий вычислительной машины, которую она должна выполнить, работая по данной программе. Например, семантика языка команд компьютера определяется самим компьютером: машинная программа описывает в точности то, что реализует вычислительная машина при работе по данной программе. Аналогично семантика языка программирования высокого уровня может быть определена через описание правил выполнения соответствующей виртуальной машины [4, c. 56].
На основании степени удаленности языка постановки задачи от машинного кода, т.е. степени снижения семантического разрыва, выделяют три поколения языков программирования: 1) машинные языки (команды записываются в виде последовательности битов — «0» и «1»); семантический разрыв наиболее высок; 2) языки ассемблера (машинно зависимый мнемонический код); представляют собой множество сокращений, взаимно однозначно соответствующих операторам машинного языка; 3) языки высокого уровня; семантический разрыв снижается за счет введения дополнительных абстрактных конструкций, облегчающих процесс формализации задачи. Создание подобной иерархической структуры осуществляется благодаря возможности однозначного определения примитивов. В качестве примера приведем наиболее современную конструкцию, названную объектно ориентированной. Она дает возможность моделировать задачу в терминах объектов и отношений между ними. Главное преимущество языка высокого уровня в том, что он намного превосходит ассемблер в легкости изучения и использования. Кроме того, программа, написанная на языке высокого уровня, понятнее, является переносимой, т.е. независимой от конфигурации конкретного вычислителя. Таким образом, ее создатель избавлен от необходимости вникать в тонкости архитектуры компьютера, на котором она будет работать. Эту задачу берет на себя специально разработанный для этого компилятор, интерпретирующий текст программы для вычислителя. Результат работы компилятора представляет собой так называемый исполняемый файл, адресованный конкретному типу вычислителей (процессоров). Получается, что теоретизация и анализ семантики языка происходят в процессе создания компилятора, а не в процессе написания программы, а процесс формализации задачи и алгоритма ее решения представляет собой перевод с естественного языка на язык программирования [9, c. 67].
В этой связи отметим принципиальную особенность языков программирования по отношению, например, к языкам логики. Для осуществления такого перевода профессиональный программист, не всегда владеющий каким-либо языком в достаточной мере, а точнее, почти никогда не владеющий, не обращается к семантике этого языжа. Это объясняется тем, что для сложившихся относительно давно и хорошо разработанных языков программирования семантика непосредственно следует из синтаксиса, т.е. форма оператора в значительной степени определяет его смысл. Функцию оценки правильности построенного на языке выражения и принадлежности этого выражения конкретному языку программирования осуществляет содержащаяся в составе компилятора программа-анализатор, описытающая синтаксические структуры этого языка и фактически определяющая смысл команд программы для вычислителя.
Механизмы создания формальных языков типа языков программирования, используемые для описания их синтаксиса, часто называют грамматиками. Это формальное описание синтаксиса неявно задает семантику по отношению к вычислителю. Первоначально такую задачу удалось решить Джону Бэкусу, разработчику языжа ALGOL 58 (1950-е гг.). Позже эта запись была модифицирована Питером Науром для описания языка ALGOL 60 (1960 г.). Переработанный метод описания синтаксиса стал известен как форма Бэкуса—Наура, или сокращенно БНФ. Он является метаязыком для языков программирования и все еще остается наиболее распространенным методом краткого описания синтаксиса языка программирования. Для описания синтаксических структур БНФ использует специальные абстракции.
Статическую семантику относят к классу операционных, поскольку смысл конструкциям языка придается с точки зрения их влияния на функции переходов в состояние абстрактного вычислителя. Более совершенными являются пропозициональные и денотационные семантики. В первой более высокий уровень абстракций достигается за счет замены множества состояний абстрактного вычислителя множеством формул некоторой логической системы, во второй операционное определение заменяется денотацион-ным16, чем обеспечивается возможность еще более глубокого анализа. Такие семантики задаются, например, для языков, строящихся в соответствии с упомянутым ранее объектно ориентированным подходом [3, c. 12].
1.2 Парадигма программирования
Знакомое из философии и лингвистики слово «парадигма» имеет в информатике и программировании узкопрофессиональный смысл.
Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие.
Наиболее распространённая практика прикладного программирования на основе императивного управления и процедурно-операторного стиля построения программ получила популярность более пятидесяти лет назад в сфере узкопрофессиональной деятельности специалистов по организации вычислительных и информационных процессов.
Поскольку всякая наука начинается с классификации, видимо, следует упомянуть опередившую время книгу профессора МГУ В.Ш. Кауфмана «Языки программирования. Концепции и принципы», которая была издана первый раз в конце 1980-х годов. Из нее мы узнали, какую парадигму (концепцию, стиль) программирования мы применяем. В практическом плане господствующими были процедурные языки — это Фортран, Алгол, Бейсик, Паскаль, С. Принципы структурного программирования в указанных языках также могли быть успешно реализованы. Реализованная в них императивная парадигма («Напиши, как нужно сделать!») казалась простой и единственно возможной: определите функции системы, разработайте структуру данных, реализуйте соответствующие алгоритмы их обработки.
Язык С++ (Б.Страуструп, 1983 год), как объектно-ориентированный язык, только начал развиваться и был нам недоступен.
Существенно, что до 1986 года у меня, как и моих коллег по НИИ, не было возможности работы с персональными ЭВМ. Свои задачи мы решали либо в ВЦ на ЭВМ М-222, либо на мини-ЭВМ М-6000 (для управления технологическими процессами) [10].
Реальная возможность изучения различных парадигм программирования появилась с развитием ПК и Интернета. Но именно преподавание программирования заставило меня обратить внимание на парадигму объектно-ориентированного программирования (ООП), которая была положена в основу языков C++ и Оbject Pascal. Лозунг «Мыслить в объектах!» постепенно приобретал конкретное содержание и программную реализацию. Замечу, что в любом языке ООП используется процедурный стиль при кодировании тела функций.
Декларативное программирование. Оказалось, что есть еще две парадигмы, соответствующие по Кауфману декларативному подходу, это логическое и функциональное программирование. Декларативный подход требует всего лишь указания «что мы хотим сделать». В рамках курса «Технологии программирования» пришлось знакомить студентов и с этими подходами.
Для освоения логического программирования (ЛП) был выбран Turbo Prolog (позднее появился Visual Prolog). Помню возмущение части студентов: «Кому нужны эти предикаты, даже конструкции цикла и те отсутствуют!» Любопытно, что девушки, не столь бойко писавшие программы в императивном стиле, на моих примерах Prolog осваивали быстрее (вот и пошутите на тему «женской логики»).
Идею функционального программирования (ФП) можно свести к формуле А.П. Ершова: «ФП – это функции, функции и ничего кроме функций». Готовя примеры на языке Lisp (List Programming – Программирование списков), я получал эстетическое удовольствие от того, как из простых конструкций можно получать достаточно сложные элементы. Например, арифметику с длинными числами [12].
1.3 Типы данных
Все значения простых типов данных (называемых иногда элементарными или примитивными) являются атомарными, то есть не имеют внутренней структуры. В этом пункте рассмотрим все простые типы, кроме подпрограммного, поскольку его имеет смысл обсуждать вместе с понятием подпрограммы.
Арифметические типы данных. В компьютерах эти типы данных представляют числа, поэтому действительно являются основными.
Как мы уже отмечали, в некоторых языках (JavaScript) существует единственный числовой тип (Number), который представляет все допустимые числа. С точки зрения упрощения программ это, конечно, удобно, однако большинство индустриальных языков программирования разделяет арифметические типы на два вида: целые (для представления целочисленных значений) и вещественные (для представления чисел с дробной частью).
Основная причина этого состоит в том, что представление целых и вещественных чисел в современных компьютерах различно, различается и набор операций. Например, операции сложения целых и вещественных чисел представляются разными машинными командами. Сама номенклатура машинных операций над целыми и вещественными числами различается (например, для вещественных чисел отсутствуют побитовые операции).
Реализация операций над вещественными числами сложнее с аппаратной точки зрения, поэтому в ряде архитектур вещественные числа вообще могут отсутствовать. Для того, чтобы программист мог учитывать эти нюансы, многие языки (в том числе, Паскаль, С++, Java, C#) разделяют числовые типы на два вида.
При рассмотрении целых типов возникают следующие основные вопросы [1]:
• универсальность (насколько полно учтены машинные типы);