Файл: Международные и отечественные стандарты языков программирования. Сходство и отличия стандартов.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 12.03.2024

Просмотров: 14

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Рассмотрим тройку лидеров языков программирования. Каждый из них, естественно, имеет преимущества и недостатки. C ++ позволяет создавать очень компактные и быстрые решения, однако требует наибольших затрат на разработку, так как решение для каждой платформы придется писать отдельно. Наличие огромного количества библиотек и высокопроизводительных компиляторов (в том числе и бесплатных) - конечно, плюс, но вряд ли он перевешивает минусы.

Одним из принципов разработки стандарта С++ - это сохранение совместимости с языком С. Так, например, синтаксис языка С++ унаследованный от языка С, но С++ не является множеством языка С. Можно писать программы на С так, чтобы они успешно компилировались на С++. С и С++ очень отличаются как по сложности, так и по принятым архитектурным решениям, которые используют в обоих языках.

Принятие стандарта обеспечило единообразие всех реализаций языка Си++. Не менее важным результатом стандартизации стало то, что в процессе разработки и утверждения стандарта языка было уточнено и дополнено ряд существенных возможностей.

Видимо, это означает (по крайней мере, на это можно надеяться), что еще через несколько лет можно будет говорить о мобильном программировании на Си++ в том же смысле, в котором можно говорить об этом сегодня по отношению к Си. С другой стороны, трудно надеяться, что действительно стандартные компиляторы появятся очень быстро: слишком сильно сегодня расходятся реализационные варианты языка Си++.

Язык Си++ во многом является надмножеством Си. Новые возможности Си++ включают объявления в виде выражений, преобразования типов в виде функций, операторы new и delete, тип bool, ссылки, расширенное понятие константности, функции, подставляются, аргументы по умолчанию, переопределения, пространства имен, классы (включая и все связанные с классами возможности, такие как наследование, функции-члены (методы), виртуальные функции, абстрактные классы и конструкторы), переопределения операторов, шаблоны, оператор:, обработку исключений, динамическую идентификацию и многое другое. Язык Си++ также во многих случаях строго относится к проверке типов, по сравнению с Си.

В Си ++ появились комментарии в виде двойной косой черты («//»), которые были в предшественнике Си - языке BCPL.

Некоторые особенности Си++ позднее были перенесены в Си, например ключевые слова const и inline, объявления в циклах for и комментарии в стиле Си++ («//»). В более поздних реализациях Си также были представлены возможности, которых нет в Си ++, например макросы vararg и улучшена работа с массивами-параметрами.


Годы развития сделали язык C ++ очень популярным, хотя и существующим в многогранности различных форм из-за множества различий компиляторов, каждый из которых имеет свои особенности. Эта популярность и различия в доступных версиях привели к большому количеству проблем совместимости и возможности переноса кода. Таким образом, появилась потребность стандартизации.

Java в этом плане проигрывает в скорости работы программ за счет своей виртуальной машины, зато имеет огромную фору в том, что для обеспечения совместимости с различными платформами со стороны разработчика конечного продукта требуются минимальные телодвижения. Количество различных библиотек для этого языка уже плавно подошло к числу аналогичных для C++, так что в этом вопросе они практически на одном уровне. C #, в принципе, тоже похожа на Java - для работы программ, написанных на этом языке, также требуется виртуальная машина [5].

Первое, что бросается в глаза при сравнении современных языков программирования, это их удивительное сходство между собой. Созданные в разное время, с разными целями, по разные стороны Атлантического океана, они в процессе своего практического использования обрастали разными полезными конструкциями и в конечном итоге пришли к почти полному тождеству. Приведем несколько примеров сходства конструкций одинакового назначения в разных языках программирования (используются языки Си и Паскаль, а также Java - в той части, где отличается от Си).

Цикл с параметром

В качестве первого примера воспользуемся оператором цикла с параметром (for). Это наиболее часто используемый составной (т.е. содержащий другие операторы) оператор в любом языке. Он всегда содержит следующие компоненты:

  • переменную - счетчик цикла
  • выражение - начальное значение цикла
  • выражение - конечное значение цикла
  • список операторов - тело цикла

Кроме того, цикл с параметром может содержать признак увеличения/уменьшения счетчика цикла (Паскаль) или способ модификации счетчика (Си и Java). Реализация на Паскале:

for i:=0 to max-1 do begin

arr[i]:=i;

end

Реализация на Си и Java:

for(i=0; i

Операторы цикла даже внешне выглядят одинаково. Цикл на Си более универсален, поскольку в нем можно задавать разные ограничивающие значения. В то же время цикл на Паскале проще реализуется и лучше соответствует «идеологии» цикла с параметром. Представляется, что различия в условиях окончания цикла больше соответствуют циклу с условием (while), чем циклу с параметром.


Структура типа «запись»

Следующий пример взят из раздела описания структур данных - это описание типа «запись» (структура в Си и Java). Подобная структура всегда содержит следующие компоненты:

список полей с указанием имени поля и его типа

список вариантных частей (union в Си)

Реализация на Паскале:

record

field1:integer;

field2:array[0..30]of char;

case byte of

1:(b0,b1:byte);

2:(i0:integer);

end

Реализация на Си:

struct {

int field1;

char field2[31];

union {

byte b0b1[2];

int i0;

} u;

}

Реализация на Java:

class {

int field1;

char[] field2;

int i0;

}

Java не содержит механизма для записи вариантных частей, а в Си нужно для каждой вариантной части придумывать собственное имя и тип. В то же время в Паскале требуется обязательно указать поле-переключатель или хотя бы тип этого поля (как в примере). Ни один из вариантов не представляется идеальным, однако наиболее универсальной можно считать реализацию на Паскале.

Как видно из приведенных примеров, родственные конструкции разных языков программирования различаются главным образом «внешним видом»: набором ключевых слов или порядком следования компонентов. Содержимое практически полностью идентично. Небольшие различия, как правило, не имеют существенного значения и чаще всего являются «атавизмами» (как, например, возможность задания отличного от единицы модификатора счетчика цикла).

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

Если сравнить между собой родственные конструкции разных языков программирования с точки зрения семантики, то можно выделить «главные» компоненты конструкций, которые присутствуют во всех основных языках. Эти «общие» компоненты и есть та основа любого современного языка, которая прошла проверку временем и практикой.

Интересно отследить те немногие различия, которые есть в семантике современных языков программирования. Однако существуют и обратные примеры, когда средства, присутствующие только в одном языке программирования, полезны на практике. Например, в Си отсутствуют средства экспорта—импорта модулей (за исключением директивы #include), имеющиеся в современных реализациях Паскаля, Модуле и Аде. С другой стороны, Си содержит удобные механизмы создания строковых констант, отсутствующие в Паскале и родственных ему языках.


Сравнивая между собой конструкции современных языков программирования и выделив их общую составляющую, можно описать (не создать, а именно описать уже существующий de facto!) «универсальный» язык программирования (правда, только на семантическом уровне).

Существующая ныне система стандартизации языков программирования не способствует выполнению этой задачи. Главная проблема состоит в том, что при описании стандарта семантическая составляющая не отделена от синтаксиса и лексики. Кроме того, при модернизации стандартов комитеты ISO/ANSI предпочитают скорее добавлять в язык новые возможности, чем исключать редко используемые, что приводит к неоправданному синтаксическому расширению языков.

Необходимо предпринять несколько радикальных шагов, изменяющих создавшуюся ситуацию. Первое, что надо сделать, — отделить семантику каждой языковой конструкции (т. е. то, что она делает) от синтаксиса и лексики (т. е. от того, как она выглядит).

Второе — разработать единые правила описания семантики языка программирования (подобно тому, как с помощью БНФ описываются синтаксис и лексика языка). Можно предположить, что описание семантики конструкции языка должно содержать перечень ее обязательных компонент и описание действий. Порядок следования компонент и их внешний вид должны быть оставлены за пределами семантического описания. 

На основании приведенного выше можно в общих чертах описать способы задания семантического и синтаксического стандартов любого языка программирования. Семантическое описание любой конструкции языка (оператора, типа данных, процедуры и т. д.) должно содержать не менее трех обязательных частей:

  • Список компонент, из которых состоит конструкция (в ТипУказатель это компоненты ИмяТипа и БазовыйТип)
  • Описание каждой компоненты
  • Описание конструкции в целом

Для синтаксического описания достаточно привести формальное определение конструкции, например, в виде БНФ. Следует отметить, что со времен Алгола полное синтаксическое описание языка всегда присутствует в его стандарте. Раньше оно было вспомогательным средством, облегчающим работу разработчиков компиляторов, сейчас же это описание должно, во-первых, стать частью стандарта языка и, во-вторых, тесно интегрироваться с семантическим описанием.

Программист должен уметь не только использовать готовые стандарты, но и разрабатывать новые. Так, например, правила однотипного оформления исходного текста программы определяются стандартом проекта, который может быть изменен при начале разработки нового проекта. Однако в течение выполнения одного проекта оформления всех частей программы должно быть однотипным. Поэтому часто перед началом нового проекта конкретным программистам следует разрабатывать свои стандарты, которые не нарушают ГОСТ, ОСТ и СТП и действуют в пределах конкретного проекта.


Заключение

Стандарт языка – официальный документ одной из международных организаций по стандартам (ISO – Int. Standards Org., ANSI – Amer. Nat. Standards Inst. и др.), в котором зафиксированы алфавит, синтаксис и семантика языка.

К сожалению, благородное дело стандартизации - достижение общей унификации и взаимозаменяемости - может также стать тормозом развития. Вводя новый стандарт, надо учитывать последствия введения, особенно если стандарт является опережающим и опережает практику развития или если стандарт является слишком «узким» и тормозит эволюцию прогресса. Во всем мире руководствуются следующим отношением к стандартам: либо полностью им следуй, или делай свой собственный стандарт. Стандарты дают дополнительные ограничения.

Список литературы

  1. Архангельский А. Я. Язык C++ в C++Builder : справочное и методическое пособие / А. Я. Архангельский. - М. :Бином, 2008. - 942 с.
  2. Баженова, И. Ю. Языки программирования : [учебник для студентов учреждений высшего профессионального образования , обучающихся по направлениям "Фундаментальная информатика и информационные технологии " и "Информационная безопасность"] / И. Ю. Баженова— Москва : Академия, 2012.
  3. Б. Страуструп. Язык программирования C++ = The C++ Programming Language / Пер. с англ. -- 3-е изд. -- СПб.; М.: Невский диалект -- Бином, 1999. - 991 с.
  4. Вольфенгаген В. Э. Конструкции языков программирования. Приёмы описания. - М.: Центр ЮрИнфо Р, 2001. -- 276 с.
  5. Бен-Ари М. Языки программирования. Практический сравнительный анализ. –М.: Мир, 2000.
  6. Гавриков М. М., Иванченко А. Н., Гринченков Д. В. Теоретические основы разработки и реализации языков программирования. — КноРус, 2013. — 178 с. 
  7. Голицына, О. Л. Языки программирования : [учебное пособие] / О. Л. Голицына, Т. Л. Партыка, И. И. Попов .— 3-е изд., перераб. и доп. — Москва: ФОРУМ : ИНФРАМ, 2016 .— 400 с.
  8. Гриффитс А. GCC. Настольная книга пользователей, программистов и системных администраторов / Гриффитс А. – К.: Диасофт, 2004. – 624 с.
  9. Немнюгин С. А., Комолкин А. В., Чаунин М. П. Эффективная работа: UNIX. СПб.: Питер, 2001. -688 с.
  10. Роберт У. Себеста. Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. -- 5-е изд. -- М.: Вильямс, 2001. -- 672 с.
  11. Себеста Р. Основные концепции языков программирования. –М.: Вильямс, 2001.
  12. Таненбаум Э. Операционные системы: разработка и реализация [+CD] / Таненбаум Э., Вудхалл А. – 3-е изд. – СПб.: Питер, 2007.
  13. Пирс Б. Типы в языках программирования. — Добросвет, 2012. — 680 с.