Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

Введение

Язык программирования - это система обозначений, которая используется для точного описания программ или алгоритмов.

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

используется исключительно в письменной форме, то есть в виде текстов.

У каждого языка программирования есть специальный документ, который называется стандартом языка программирования. В нем подробно описаны правила этого языка. Так как языки программирования постоянно развиваются, время от времени выходят новые стандарты.

Проблема исследования и ее актуальность состоит в изучении стандартов языков программирования.

Целью работы является изучение международных и отечественных стандартов языков программирования.

Для решения проблемы исследования и достижения цели реализуются следующие задачи:

- исследование имеющейся научно-методической литературы по этой теме;

- проведение логико-дидактического анализа изложения этой темы в современных учебных пособиях;

- обобщение и систематизация полученных сведений.

1. Языки программирования и их классификация

Язык программирования - это знаковая система для описания алгоритмов программ, ориентированных на конкретных исполнителей (прежде всего ЭВМ).

Знаковая система состоит из трех компонентов:

1) правила, описывающие синтаксис;

2) правила, задающие семантику синтаксически правильных конструкций;

3) правила, формирующие прагматику синтаксически правильных конструкций.

Классификация языков программирования

Классификаций языков программирования существует много, но научной теории пока нет. Три основные классификации сложились исторически:

1) по функциональному признаку:

- универсальные языки (в них можно промоделировать, условно говоря, любой алгоритм)

- специализированные языки (ориентированные на определенные классы задач)

2) по предметной ориентацией:

Языка для решения определенного класса задач, например, языки программирования для решения задач символьной обработки (Lisp, Cobol), языки для обработки флэш-клипов (АctionScript) и т. п.

3) По уровню абстракции:

- языка низкого уровня (машинно-зависимые) - Assembler и т. П.;

- языка высокого уровня (ориентированные на пользователя в определенной мере)

- Pascal, C, Fortran и т. п.;

Как отдельное направление следует выделить языка программирования баз данных, предназначены для манипуляции большими централизованными массивами данных и получения из них информации. Многие из этих языков (Access, FoxPro, 4GL и др.) имеют развитые процедурные элементы. Фактическим стандартом стала речь запросов к базам данных SQL.

Языки программирования низкого уровня ориентированы на конкретный тип процессора и учитывают его особенности.

Преимущества: с помощью языков низкого уровня создаются эффективные и компактные программы, поскольку разработчик получает доступ ко всем возможностям процессора.

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

Языки низкого уровня, как правило, используют для написания небольших системных приложений, драйверов устройств, модулей стыков с нестандартным оборудованием, когда важнейшими требованиями являются компактность, быстродействие и возможность прямого доступа к аппаратным ресурсам.

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

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

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

Авторским вариантом языка называется описание языка в том виде, в котором он был предложен разработчиком (одним человеком или комитетом).

Важной особенностью языков высокого уровня является их относительная независимость от машины. В связи с проблемой переноса программ с одной машины на другую и отсутствием общей точки зрения на то, что именно считать стандартом этого языка программирования, Американский национальный институт стандартов (ANSI) и Международная организация по стандартизации (ISO) приняли стандарты для многих популярных языков программирования. Каждый язык высокого уровня должен иметь формальное описание. В этом описании должны быть определены правила записи программных конструкций (синтаксис) и то, каким образом эти конструкции выполняются (семантика).

Первые языки программирования были очень примитивными и это были машинные коды - машинные языки, которые позволяли задавать названия команд в символическом виде и указывать числа в двоичном, шестнадцатеричном и десятичном форматах. Процесс программирования был сложным и предусматривал запись программистом всех алгоритмов непосредственно на машинном языке.

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

Появилась необходимость в языках программирования высокого уровня и были сформулированы требования к таким языкам, основная из которых такова: язык должен быть близким к тем фрагментов естественных языков, которые обеспечивают конкретную предметную область деятельности человека.

Исходя из такого подхода, в 60-х годах появились языки программирования третьего поколения, отличались от предыдущих поколений тем, что их языковые конструкции имели более высокий уровень и были машинно-независимыми.

Это универсальные языки высокого уровня. Наиболее известными примерами ранних языков третьего поколения является FORTRAN (FORmula ТRANslation - переводчик формул), разработанный под руководством Дж. Бекуса 1960 г., который был предназначен для научных и инженерных расчетов, и СОВОL (язык общего назначения деловой ориентации), разработанный в 1960 г. . специалистами военно-морского флота США для решения экономических задач, АLGOL, разработанный международной рабочей группой.

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

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

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

2. Стандартизация языков программирования

Язык программирования представляет собой систему взаимосвязанных знаков, необходимых для написания компьютерных программ. Кроме этого, есть свод правил, которые влияют на вид программы. В зависимости от этих правил ЭВМ осуществляет вычислительные процессы или управляет объектами. Предназначен такой метод составления программ исключительно для взаимодействия человека и компьютера.

Типы данных

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

Особая система, по которой данные организуются в программе, — это система типов языка программирования; разработка и изучение систем типов известна под названием теория типов. Языки можно поделить на имеющиестатическую типизацию и динамическую типизацию, а также бестиповые языки (например, Forth).

Статически типизированные языки могут быть в дальнейшем подразделены на языки с обязательной декларацией, где каждая переменная и объявление функции имеет обязательное объявление типа, и языки с выводимыми типами. Иногда динамически типизированные языки называют латентно типизированными.

Структуры данных

Системы типов в языках высокого уровня позволяют определять сложные, составные типы, так называемые структуры данных. Как правило, структурные типы данных образуются какдекартово произведениебазовых (атомарных) типов и ранее определённых составных типов.

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

Семантика языков программирования

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

Например, определив как базовый тип данных "строка" мы должны предложить "традиционный" набор функций обработки таких данных: сравнение строк, выделение части строки, конкатенацию строк и др.

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

Методы денотационной семантики базируются на соответствующих алгебрах, методы операционной семантики базируются на синтаксических структурах программ.

Несмотря на то, что большинство языков ориентировано на императивную модель вычислений, задаваемую фон-неймановской архитектурой ЭВМ, существуют и другие подходы. Можно упомянуть языки со стековой вычислительной моделью (Форт,Factor,PostScriptи др.), а также функциональное (Лисп, Haskell, ML,F#, РЕФАЛ, основанный на модели вычислений, введённой советским математиком А. А. Марковым-младшим и др.) и логическое программирование (Пролог).

В настоящее время также активно развиваются проблемно-ориентированные, декларативные и визуальные языки программирования.

Существует два основных вида языков для составления программ:

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

Язык программирования может быть представлен в виде набора спецификаций, определяющих его синтаксис и семантику.

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

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

Стандарт языка программирования - это набор правил, согласно которым должны записываться тексты алгоритмов на этом языке.

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

Для многих широко распространённых языков программирования созданы международные стандарты. Специальные организации проводят регулярное обновление и публикацию спецификаций и формальных определений соответствующего языка. В рамках таких комитетов продолжается разработка и модернизация языков программирования и решаются вопросы о расширении или поддержке уже существующих и новых языковых конструкций.

Концепция языка программирования неотрывно связана с его реализацией. Для того чтобы компиляция одной и той же программы различными компиляторами всегда давала одинаковый результат, разрабатываются стандарты языков программирования. Существует ряд организаций, целенаправленно занимающихся вопросами стандартизации. Это Американский национальный институт стандартов ANSI (American National Standards Institute), Институт инженеров по электротехнике и электронике IEEE (Institute of Electrical and Electronic Engineers), Организация международных стандартов ISO (International Organization for Standardization).

Базовым стандартом разработки ПО является ISO 12207.

Systems and software engineering - Software Life Cycle Processes, в котором все процессы ЖЦ ПО разделены на три группы.

Для поддержки практического использования стандарта ISO 12207 разработаны следующие технологические документы: Руководство для ISO / IEC 12207 (ISO / IEC TR 24748-3: 2011 Systems and software engineering - Life cycle management - Part 3: Guide to the application of ISO / IEC 12207 (Software life cycle processes)) и Руководство по использованию ISO / IEC 12207 в управлении проектами (ISO / IEC TR 16326: 2009 Systems and software engineering - Life cycle processes - Project management).

Стандарты организации IEEE

В 1963 в результате слияния Института радиотехников (Institute of Radio Engineers, IRE) и Американского института инженеров-электриков (American Institute of Electrical Engineers, AIEE) была создана международная некоммерческая ассоциация технических специалистов, мировой лидер в области разработки стандартов по радиоэлектронике и электротехнике Институт инженеров по радиоэлектронике и электротехнике IEEE (Institute of

Electrical and Electronics Engineers). Данная международная организация объединяет более 400 тыс. специалистов из 170 стран. IEEE осуществляет информационную и материальную поддержку специалистов для организации и развития научной деятельности в электротехнике, электронике, компьютерной технике и информатике.

Как правило, при создании языка выпускается частный стандарт, определяемый разработчиками языка. Если язык получает широкое распространение, то со временем появляются различные версии компиляторов, которые не точно следуют частному стандарту. В большинстве случаев идет расширение зафиксированных первоначально возможностей языка. Для приведения наиболее популярных реализаций языка в соответствие друг с другом разрабатывается согласительный стандарт. Очень важным фактором стандартизации языка программирования является своевременность появления стандарта – до широкого распространения языка и создания множества несовместимых реализаций. В процессе развития языка могут появляться новые стандарты, отражающие современные нововведения. Так, язык FORTRAN первоначально был стандартизирован в 1966 году. В результате был издан стандарт FORTRAN 66. Далее этот стандарт несколько раз пересматривался (в 1977 году был выпущен FORTRAN 77, затем появился и FORTRAN 90).

Язык Java, ставший в последнее время весьма распространенным, постепенно был значительно расширен и модифицирован: новая спецификация получила название Java 2.

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

Стандарты языка программирования C

Начало стандарта языка программирования С было положено выходом в 1978 году первой редакции книги Б.Кернигана и Д.Ритчи. Этот стандарт часто называют K&R. Программисты, авторы этого труда, работали над UNIX вместе с Кеном Томпсоном. При этом первый из них предложил название системы, а второй изобрел этот язык программирования.

Стандарт языка С начал разрабатываться рабочей группой института стандартов ANSI в 1982 году. Международный стандарт языка С принят в 1990 году.

Однако промышленный стандарт языка программирования С был выпущен в 1989 году ANSI и имел имя X3. 159 – 1989. Вот что написано про этот стандарт:

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

В 1988 году на основе этого стандарта языка программирования была выпущена вторая редакция книги Кернигана и Ритчи о С. Заметим, что фирмы, производящие программные продукты для разработки программ на языке С, могут формировать свой состав библиотек и даже несколько расширять состав других средств языка.

Язык С лег в основу разработки языков программирования C++ и Java. 

При создании С ++ стремились сохранить совместимость с языком С. Большинство программ на С исправно работать и с компилятором С ++. С ++ имеет синтаксис, основанный на синтаксисе С.

Нововведениями С ++ по сравнению с С являются:

  • поддержка объектно-ориентированного программирования через классы;
  • поддержка обобщенного программирования через шаблоны;
  • дополнение к стандартной библиотеки;
  • дополнительные типы данных;
  • обработка исключений;
  • пространства имен;
  • встроенные функции;
  • перегрузки операторов;
  • перегрузки имен функций;
  • ссылки и операторы управления свободно распределенной памятью.

В 1998 году был ратифицирован международный стандарт языка С ++: ISO / IEC 14882: 1998 "Standard for the C ++ Programming Language". В 2003 году был опубликован стандарт языка ISO / IEC 14882: 2003, где были исправлены ошибки. Велась работа над новыми стандартами. В 2011 году стандарт был принят и получил название С ++ 11 ISO / IEC 14882: 2011.

Несмотря на мощность и многофункциональность существующих на данный момент языков, ни один синтаксис не является универсальным. Многообразие систем заставляет изобретать новые варианты языков. Распространение многоядерных процессоров и мобильность создали новую работу для разработчиков.

Следует подчеркнуть значение стандартизации. Если для языка существует стандарт, и если компиляторы его поддерживают, то программы можно переносить с одного компьютера на другой. Когда мы пишем пакет программ, который должен выполняться на разных компьютерах, то мы должны строго придерживаться стандарта. Иначе задача сопровождения чрезвычайно усложнится, потому что придется следить за десятками или сотнями машинно-зависимых вопросов.

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

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

Группа стандартов ГОСТ «Единая система программной документации» (ЕСПД) потерпела мало изменений с момента ее создания, пережила несколько поколений ЭВМ и революционных изменений технологий разработки программ. При этом она до настоящего времени никогда не затрудняла новаций.

КОБОЛ был первым языком, в котором средства описания данных соответствуют процедурным возможностям, и первым языком, в котором введен тип данных "запись", являющийся основной структурой данных.

В СССР первые компиляторы с подмножества языка КОБОЛ реализованы в 1968 г. на ЭВМ "Днепр-21" и "Минск-32", а в 1977 г. был принят отечественный стандарт на язык программирования КОБОЛ (ГОСТ 22558-77).

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

В области программирования общепризнанной ведущей организацией по разработке стандартов является институт ANSI (Американский национальный институт стандартов). Данный институт является лидером по установке стандартов языков программирования, кодовых таблиц клавиш и символов, выводимых на экран, и еще многих других. Необходимо также отметить стандарты ISO.

3. Сходство и отличие стандартов

При использовании текущей технологии информационная система пишется на некотором языке программирования, в нее встраиваются операторы языка SQL и, наконец, включает какие-либо вызовы библиотечных функций операционной системы.

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

По мнению многих программистов, наиболее хороший стандарт на сегодняшний день существует для языка Си. Опыт нескольких лет, прошедших после принятия стандарта, показывает, что при грамотном использовании стандарта Си ANSI/ISO проблемы переноса программ, связанные с особенностями аппаратуры или компиляторов, практически не возникают (если учитывать имеющиеся в самом стандарте рекомендации по созданию переносимых программ). Этих нескольких лет оказалось достаточно, чтобы обеспечить полное соответствие стандарту практически всех индустриальных компиляторов языка Си. Даже если в реализации допускаются расширения стандарта (как, например, в компиляторе Ричарда Столлмана из проекта GNU GCC), то имеются опции компилятора, позволяющие контролировать выход за границы стандарта.

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

Рассмотрим тройку лидеров языков программирования. Каждый из них, естественно, имеет преимущества и недостатки. 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 с.