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

"История развития программирования в России"

Содержание:

Введение

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

Целью данной работы является анализ истории развития программирования в России, для достижения поставленной цели были выделены следующие задачи:

- рассмотреть теоретичесие аспекты истории развития прогрмирования в России;

- изучить развитие языков программирования.

Объект исследования – история программирования.

Предмет исследования – история развития программирования в России.

Структура работы состоит из введения, основной части, заключения и списка литературы.

Теоретической и метододогической базой данной работы послужили труды российских и зарубежных авторов в области программирования, материалы периодических изданий и сети Интернет.

Глава 1 Теоретичесие аспекты истории развития прогрмирования в России

1.1 Эволюционный процесс развития языков программирования

В начале 60-х годов 20 века появилось много языков, часть из которых до сих пор представляет значительное явление в программировании[1].

Первый язык программирования высокого уровня FORTRAN создан в 1954 г. в корпорации IBM группой разработчиков во главе с Джоном Бэкусом.

FORTRAN включал самые элементарные средства, многие из которых непосредственно отражали возможности ЭВМ того времени. На нем написано огромное количество библиотек, как в области статистики, так и в области управления спутниками. Поэтому используется до сих пор, ведутся разработки новых стандартов: F2K — 2000г., HPF — HighPerformanceFortranдля параллельных суперкомпьютеров со множеством процессоров.

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

Язык КОБОЛ заслуживает внимания за развитие такой важной части языков программирования как средства описания и обработки файлов.

Первым универсальным языком программирования был ПЛ/1, объединивший многие возможности и средства языков FORTRAN, Алгол-60, КОБОЛ.

Параллельно с развитием универсальных языков создавались и специализированные языки, в которых за счет сужения области их использования удавалось построить отдельные высокоуровневые механизмы для описания и данных и действий. Так, в языке Лисп допускается лишь один тип данных — список и базовый механизм выполнения — рекурсивные функции. Целью создания Лиспа было использование его в системах автоматического доказательства теорем. Поэтому он называется также языком искусственного интеллекта. К этой группе языков относятся также разработанные позже и вобравшие в себя многие идеи Лиспа языки Пролог, Плэнер. Еще одним специализированным языком, созданным в начале 60-х годов, является язык Снобол. Основной тип данных в Сноболе — строка символов. Он содержит высокоуровневые средства для обработки строк, в основе реализации которых лежат нормальные алгоритмы А.А. Маркова. Поэтому он относится к марковским языкам. Областями применения Снобола являются конструирование компиляторов, символьная математика, обработка текстов, перевод с естественных языков и др. И, наконец, язык АПЛ — мощный и высокоуровневый язык для решения научных задач. Основным типом данных является массив; имеется огромное множество разнообразных средств для описания действий с массивами. Этот язык интерактивный : он позволяет программисту вмешиваться в процесс трансляции и исполнения, внося на любой стадии исправления и изменения, в отличие от пакетных языков, которые не предоставляют таких возможностей.

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

Независимо от Pascal разработан язык Симула-67, который относится к языкам моделирования, т.е. используется как средство для имитационного моделирования сложных систем (к этому классу языков относятся также, например GPSS, Симскрипт, Слам). Симула- 67 содержит в качестве подмножества Алгол-60. Но что более важно и что поставило этот язык впереди своего времени, он содержи также новую конструкцию — класс. Однако этот язык не располагал таким богатым набором типов данных, как Pascal, что не позволило воспользоваться всеми преимуществами понятия класса. Объединение этих двух важных идей было осуществлено в языке Параллельный Паскаль. Развитие идеи, заложенной в понятие класса, происходило и в рамках других языков. Например, язык SmallTalk основан на понятии объекта, содержащего понятийную и процедурную части. Объекты взаимодействуют между собой, посылая сообщения, представляющие собой требования выполнить те или иные процедуры над объектами-получателями сообщений. Этот язык принадлежит к классу объектно-ориентированных языков программирования. В языке Модула введены конструкции «модуль», которая управляет доступом к объектам данных, ограничивая область вокруг объекта и операций над ним. Это существенное отличие от понятия класса стало основной идеей на последующих этапах развития языков программирования.

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

Язык C разработан в 1972 году Керниганом и Ритчи и первоначально не рассматривался как массовый. Он планировался для замены Ассемблера, чтобы создавать компактные и эффектные программы, но не зависеть от типа процессора. Язык C также вобрал в себя многие возможности предшественников, но содержит ряд интересных идей, связанных с максимальной полнотой и эффективностью использования ЭВМ.

С++ — объектно-ориентированное расширение С. Создан Бьярном Страуструпом в 1980г.

Java(Ява). Язык создан компанией Sun в начале 90-х годов на основе С++. Он призван упростить разработку приложений С++ путем исключения из него низкоуровневых возможностей. Главная особенность языка — компиляция не в машинный код, а в платформно независимый. Очень популярен в настоящее время. Особое внимание развитие этого языка — поддержка всевозможных мобильных устройств, встраиваемых в бытовую технику и созданию платформно независимых модулей, способных работать на серверах в глобальных и локальных сетях с различными ОС. Разработаны и разрабатываются: языки моделирования (популярен язык графического моделирования UML); языки программирования баз данных; языки программирования для Интернета. Языки: HTML — для Web-страниц,Perl — для генерации текстовых отчетов и управления задачами,VRLM — для организации виртуальных трехмерных интерфейсов в Интернете.

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

Развитие средств описания данных и действий продолжается в настоящее время. Однако с начала 80-х годов вышла на первый план новая тенденция развития языков программирования — развитие средств, обеспечивающих автоматическое (автоматизированное) доказательство правильности программ. Такая цель требует пересмотра семантики и ее выражения на языке многих широко используемых в настоящее время языковых возможностей. Кроме этого, необходимо наличие соответствующего программного обеспечения[2].

Таким образом, можно уже говорить не о развитии языков, а о развитии языковых систем, включающих язык, транслятор, методы и процедуры автоматического (автоматизированного) доказательства правильности программ, верификатор и ряд других средств поддержки разработки программ. И раньше, конечно, говорили о системах программирования на том или ином языке. Однако из них вполне можно было выделить сам язык и разрабатывать, изучать его отдельно. При развитии указанной третьей тенденции делать это можно и нужно только в комплексе. Ряд языковых систем подобного рода разработаны, например системы IOTA, AFFIRM, CIP.

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

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

В последнее время в связи развитием Интернет-технологий, широким распространением высокопроизводительных компьютеров и рядом других факторов получили распространение так называемые скриптовые языки, такие как JavaScript (в компании Netscape Communications)- для описания сложного поведения веб-страниц[3].

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

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

1.2 Эволюционные проблемы языков программирования

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

Машина проводила вычисления и выдавала результат, однако, логика её работы, программа по сути, была обусловлена внутренней уникальной схемой, что не позволяло проводить различные вычисления на этой же машине. Важно заметить, что для программирования тогда использовались именно электротехнические элементы, то есть, программист-инженер по сути создавал программу посредством соединения непосредственно устройств, исполнявших операции. Уникальность, и как следствие дороговизна, привели к тому, что было разработано новое поколение машин — эти устройства, по своей сути, стали первыми программируемыми в полном смысле слова. Языком программирования для этих машин в начале служила коммутационная панель, на которой, соединяя гнёзда различных устройств, программист мог задавать последовательность действий для машины — что уже было достаточно большим различием в синтаксисе языка. Если раньше программист исполнял роль инженера-схемотехника и применял сами компоненты для создания программы, то теперь при программировании он мог использовать универсальные блоки — заранее объединенные группы компонент, имеющие необходимые свойства и умеющие выполнять необходимые операции. В дальнейшем в связи с развитием оборудования панель была заменена на перфокарты, перфоленты, магнитные ленты и барабаны — однако, программирование всё ещё сводилось к формированию последовательности единиц и нулей.

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

Для решения данной проблемы был разработан язык программирования низкого уровня — ассемблер. Ассемблер позволил программисту использовать мнемонические команды, вместо машинных команд, что в значительной степени ускорило работу программистов. Однако, несмотря на наличие мнемонических команд, программа всё ещё являлась прямым указанием последовательности действий для машины, а не средством выражения алгоритма. Этот этап стал большим прорывом, так как сама программа перестала быть для программиста последовательностью нулей и единиц, а превратилась в набор команд.

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

Целью появления этих языков стало формирование ещё одного уровня абстракции, программист теперь был свободен от решения задач переноса данных внутри машины и мог больше внимания уделять самому алгоритму программы. Именно на этом этапе языки программирования получили программы — компиляторы и интерпретаторы.

Оба эти класса программ необходимы для перевода и трансформации текстового представления программы, которое удобно для программиста и построено согласно правилам языка в машинное представление — при этом управляющие команды в большей степени являются средствами языка и не привязаны к аппаратной реализации машины. Важным моментом здесь является то, что язык ассемблер не имеет компилятора, а использует ассемблер (утилита, проводящая сборку бинарной программы для машины из исходного кода, на языке ассемблера называется также) — программу, которая лишь ставит в соответствие мнемоническим символам бинарные последовательности, но не трансформирует программу. Эти изменения привели к значительному ускорению разработки и удешевлению программ, однако создание больших программ всё ещё оставалось трудоёмким. Одной из основных проблем стала не сложность программирования, а сложность самих программ. Большие программные продукты было очень трудно контролировать, так как не было единого стиля мышления и программирования. Решением этой проблемы занялся ряд выдающихся учёных, в котором особо необходимо отметить имена Эдсгера Дейкстры, Коррады Бёма и Джузеппе Якопини. За несколько лет в результате работы многих учёных и практиков был сформирован базис структурного подхода к программированию. Отличительной особенностью стало выявление трёх базовых элементов любой программы: последовательность, ветвление и цикл[4].

Такая систематизация не позволяла программе превратиться в разрозненный набор команд, что в свою очередь в значительной мере повысило качество программ и скорость их разработки. Конечно же, формирование правил программирования мгновенно отразилось и на том, как о программе размышлял программист. Если на прошлом этапе программист был избавлен от необходимости думать непосредственно в командах машины и стал вести разработку с помощью команд языка, следя лишь за ходом программы, то теперь программа больше не воспринималась как набор приказов машине, она стала ещё более абстрактной, превратившись в укрупнённые блоки с хорошо видимой структурой, что позволило программистам сконцентрироваться на непосредственных алгоритмах, а не на отслеживании переходов между командами в памяти. Косвенным подтверждением можно считать резкое увеличение производительности алгоритмов и ряд открытий новых алгоритмов. Однако задачи, которые решались с помощью компьютеров становились всё сложнее, а набор предметных областей — шире. По этой причине на рубеже 70-х годов возникла потребность вновь переработать подход к программированию. В результате на свет появилась новая концепция — объектно-ориентированный подход. Отличительной чертой данного подхода является возможность для программиста думать о программе, как о наборе объектов, которые могут взаимодействовать между собой и имеют собственное состояние. Такой подход упрощает восприятие и структуру программы, так как сводит многие трудные для понимания вещи к вещам из реального мира, думать о которых на этапе разработки проще.

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

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

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

Таким образом дальнейшая миниатюризация становится всё более трудоёмкой и дорогостоящей[5]. Эти причины и привели в 2000-х годах к популяризации многопроцессорных систем, а как следствие, и к обострению проблемы параллельного программирования. Важно заметить, что эта проблема на данный момент всё ещё не является решённой в полном смысле слова, так как причиной её появления служит сама архитектура современных машин[6].

Глава 2 Развитие языков программирования

2.1 Характеристики и свойства языков программирования

Языки программирования являются средством представления знаний для компьютерных систем. Они предлагают концептуальные средства представления и возможности моделирования, приспособленные к решению конкретных задач[7]. При этом концепции языков программирования складываются и развиваются в результате стремления разработчиков снизить «семантический разрыв» между языком описания работы вычислительного устройства и языком, на котором осуществляется постановка задачи. Развитие языков на эмпирическом уровне определяется развитием вычислительной техники. На теоретическом уровне изменения в представлениях о языках программирования определяется выбором формы управления вычислительными устройствами. Многообразие концепций языков, разработанных за период в 60 лет, привело к многообразию парадигм программирования, сложившихся к настоящему времени[8].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Эффективность создания, тестирования и использования программы хорошо иллюстрируется языком АПЛ. При использовании этого языка для решения некоторого класса задач проектирование, кодирование, тестирование, модификация и выполнение программы отнимает у программиста минимальное количество времени и энергии. АПЛ может быть назван эффективным в полном смысле слова — он позволяет минимизировать суммарное время и энергию, затрачиваемые на решение задач на ЭВМ.

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

2.2 Некоторые аспекты объектно-ориентированного программирования

Если приемы процедурного программирования концентрируются на алгоритмах, то объектно-ориентированное программирование (ООП) концентрируется на сути задачи. Элементы программы разрабатываются в соответствии с объектами, присутствующими в описании задачи. Отсюда и терминология - «Объектно-ориентированное программирование». При этом первичными считаются объекты (данные), которые могут активно взаимодействовать друг с другом с помощью механизма передачи сообщений (называемого также и механизмом вызова методов). Функция программиста - определить объекты, взаимодействие которых после старта программы приведет к достижению необходимого конечного результата.

Общий подход к ООП включает в себя следующие концепции[9]:

1) наличие типов, определенных пользователем;

2) скрытие деталей реализации (инкапсуляция);

3) использование кода через наследование; разрешение интерпретации вызова функции во время выполнения программы (полиморфизм).

Известно, что реальные/физические объекты окружающего мира обладают тремя базовыми характеристиками:

  1. набором свойств, характеризующих объект;
  2. способностью объекта изменять свойства;
  3. способностью реагировать на события как в окружающем мире, так и внутри самого себя.

Хотя термины «тип данных» (или просто тип) и «абстрактный тип данных» звучат похоже, они имеют различный смысл. В языках программирования тип данных (переменной) обозначает множество значений, которые может принимать эта переменная. Абстрактный тип данных (АТД) определяется как математическая модель с совокупностью операторов, определенных в рамках этой модели. Таким образом, классы могут служить простым примером АТД.

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

Рис. 1. Схема процесса создания программной модели (класса) в рамках ООП.

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

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

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

Информационная и математическая модели служат основой для построения программной модели объекта или класса.

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

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

Выделение объектов само по себе не является простой задачей. Для выделения объектов в части анализа и исследования задачи значительное место отводится разработке концептуальной модели функционирования пользовательского интерфейса. Аспекты, которые следует учитывать при разработке концептуальной модели функционирования пользовательского интерфейса

Важность этапа разработки концептуальной модели пользовательского интерфейса сложно переоценить также из-за возросших требований к качеству программного продукта как на отечественных, так и на западных рынках, т.к. в оценку программного продукта входит качество интерфейса, обеспечивающего взаимодействие пользователя с программой. В. Головач [2] отмечает четыре основных критерия качества интерфейса, а именно:

    • скорость работы пользователей;
    • количество человеческих ошибок;
    • скорость обучения;
    • субъективное удовлетворение (подразумевается, что соответствие интерфейса задачам пользователя является неотъемлемым свойством интерфейса).

Скорость выполнения работы является важным критерием эффективности интерфейса. Длительность выполнения работы пользователем состоит из: o длительности восприятия исходной информации;

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

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

сознания, т. е. знания из областей когнитивной и инженерной психологии, а также эргономики.

Согласно Дональду Норману, на которого ссылается В. Головач, взаимодействие пользователя с системой (не только компьютерной) состоит из семи шагов:

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

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

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

Заключение

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

Вышесказанное приводит к мысли о том, что организации взаимодействия программиста и машины также потребует переработки. С самого зарождения синтаксис языков программирования эволюционировал по пути улучшения структурированности, читаемости и понятности программы для программиста. Однако, на данный момент улучшением синтаксиса добиться наглядности и удобства работы с параллельными программами пока не удаётся. Вероятно, решение будет найдено в уже существующих концепциях. Так, например, ещё в 1974 году в Массачусетском технологическом институте был разработан MIT Static Dataflow Machine — аппаратная реализация машины с статической архитектурой потока данных[10]. В ней управление вычислениями проводилось при помощи самих данных, а не с помощью потока управления — то есть, была решена одна из основных проблем текущей архитектуры — наличие счётчика инструкций. Эта идея не получила развития в связи со сложностью реализации и программирования в 80-х годах и была постепенно забыта, однако с появлением графических ускорителей идея была вновь использована. Многие графические чипы последних лет используют в том или ином виде элементы архитектуры с потоком данных. Другим направлением может стать разработка средств визуального программирования, которые уже применяются сегодня в некоторых специализированных областях программирования. Примерами успешных решений можно считать: LabView, Algorithm Builder и HiAsm — однако, каждый из этих инструментов сильно привязан к своему набору решаемых задач, что не позволяет говорить о необходимом уровне универсальности, сопоставимым, например с языком C. Учитывая описанные выше проблемы, можно предположить, что будущее языков программирования будет связано с увеличением значимости средств автоматизации программирования. Такого рода инструментарий уже сейчас применяется в некоторых специализированных областях, так, например, при разработке интеллектуальных систем и систем принятия решений. В дальнейшем такого рода технологии, вероятно, позволят переложить большую часть работы программиста на машину[11] — что в свою очередь вновь повысит уровень абстракции, снижая эффективность и повышая качество программ.

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

  1. Богатырев Р. Природа и эволюция сценарных языков // МИР ПК - ДИСК. - 2015. - № 10.
  2. Богатырев Р., Природа и эволюция сценарных языков - МИР ПК - ДИСК. 2015. № 10
  3. Головач В. Дизайн пользовательского интерфейса, 2012. - Режим доступа: www.uibook.ru
  4. Головач В. Дизайн пользовательского интерфейса. - 2012. - Режим доступа: www.uibook.ru.
  5. Джефф Коч, Изобретение многоядерных процессоров: расширение преимуществ закона Мура, Журнал Technology@Intel, 2015
  6. Казакова А.Е. Методологические основания развития языков программирования. Диссертация по ВАК 09.00.08. - М, 2008. - Режим доступа: dissertCat.com.
  7. Казакова А.Е. Методологические основания развития языков программирования : диссертация по ВАК 09.00.08. - М., 2008. - Режим доступа: dissertCat.com.
  8. Неклюдова С. А., Балса А.Р. Парадигмы программирования как инструменты разработчика программных систем // Информационные технологии и системы : межвузовский сборник научных трудов. Выпуск 1 (12). - СПб., 2014.
  9. Неклюдова С.А., Балса А.Р. Парадигмы программирования как инструменты разработчика программных систем. Межвузовский сборник научных трудов: Информационные технологии и системы. Выпуск 1(12). Санкт-Петербург, 2014 год.
  10. Роберт У. Себеста. Основные концепции языков программирования. — 5-е изд.. — М.: Вильямс, 2011. — 672 с.
  11. Теслер Г.С. Новая кибернетика, Киев: Логос, 2014 - immsp.kiev.ua
  12. Теслер Г.С. Новая кибернетика. - Киев : Логос, 2014. - Режим доступа: immsp.kiev.ua
  13. Тыугу Э. Х. Концептуальное программирование М.: Наука. Главная редакция физико-математической литературы, 2014. — 256 с.
  14. Эккель Б. Философия С++. Введение в стандартный С++. - 2-е изд. - СПб. : Питер, 2014. - с.12
  15. Эккель Б. Философия С++. Введение в стандартный С++. 2-е изд. - СПб.:Питер, 2014.- 572 с.
  16. Jack B.Dennis, David P.Misunas. Preliminary Architecture for a Basic Data-Flow Processor. — NY.: ACM Sigarch Computer Architecture News, 2014.
  17. Wesley M. Johnson, J. R. Paul Hanna, Richard J. Millar. Advances in Dataflow Programming Languages. — NY.: ACM Computing Surveys (CSUR), 2014.
  1. Богатырев Р., Природа и эволюция сценарных языков - МИР ПК - ДИСК. 2015. № 10

  2. Неклюдова С.А., Балса А.Р. Парадигмы программирования как инструменты разработчика программных систем. Межвузовский сборник научных трудов: Информационные технологии и системы. Выпуск 1(12). Санкт-Петербург, 2014 год.

  3. Головач В. Дизайн пользовательского интерфейса, 2012. - Режим доступа: www.uibook.ru

  4. Роберт У. Себеста. Основные концепции языков программирования. — 5-е изд.. — М.: Вильямс, 2011. — с.32

  5. Джефф Коч, Изобретение многоядерных процессоров: расширение преимуществ закона Мура, Журнал Technology@Intel, 2015

  6. Wesley M. Johnson, J. R. Paul Hanna, Richard J. Millar. Advances in Dataflow Programming Languages. — NY.: ACM Computing Surveys (CSUR), 2014.

  7. Казакова А.Е. Методологические основания развития языков программирования : диссертация по ВАК 09.00.08. - М., 2008. - Режим доступа: dissertCat.com.

  8. Казакова А.Е. Методологические основания развития языков программирования : диссертация по ВАК 09.00.08. - М., 2008. - Режим доступа: dissertCat.com.

  9. Эккель Б. Философия С++. Введение в стандартный С++. - 2-е изд. - СПб. : Питер, 2014. - с.12

  10. Jack B.Dennis, David P.Misunas. Preliminary Architecture for a Basic Data-Flow Processor. — NY.: ACM Sigarch Computer Architecture News, 2014.

  11. Тыугу Э. Х. Концептуальное программирование М.: Наука. Главная редакция физико-математической литературы, 2014. — с.32