В развитии инструментального программного обеспечения рассматривают пять поколений языков программирования (ЯП). Языки программирования как средство общения человека с ЭВМ от поколения к поколению улучшали свои характеристики, становясь все более доступными в освоении непрофессионалам.
Первые три поколения ЯП характеризовались более сложным набором зарезервированных слов и синтаксисом. Языки четвертого поколения все еще требуют соблюдения определенного синтаксиса при написании программ, но он значительно легче для освоения. Естественные ЯП, разрабатываемые в настоящее время, составят пятое поколение и позволят определять необходимые процедуры обработки информации, используя предложения языка, весьма близкого к естественному и не требующего соблюдения особого синтаксиса (табл. 2)
Таблица 2. Поколения ЯП | ||
Поколения | Языки программирования | Характеристика |
Первое | Машинные | Ориентированы на использование в конкретной ЭВМ, сложны в освоении, требуют хорошего знания архитектуры ЭВМ |
Второе | Ассемблеры, макроассемблеры | Более удобны для использования, но по-прежнему машинно-зависимы |
Третье | Языки высокого уровня | Мобильные, человеко-ориентированные, проще в освоении |
Четвёртое | Непроцедурные, объектно-ориентированные, языки запросов, параллельные | Ориентированы на непрофессионального пользователя и на ЭВМ с параллельной архитектурой |
Пятое | Языки искусственного интеллекта, экспертных систем и баз знаний, естественные языки | Ориентированы на повышение интеллектуального уровня ЭВМ и интерфейса с языками |
7 языков программирования для Хакера | Какой язык программирования учить в 2022? | UnderMind
ЯП первого поколения представляли собой набор машинных команд в двоичном (бинарном) или восьмеричном формате, который определялся архитектурой конкретной ЭВМ. Каждый тип ЭВМ имел свой ЯП, программы на котором были пригодны только для данного типа ЭВМ. От программиста при этом требовалось хорошее знание не только машинного языка, но и архитектуры ЭВМ.
Второе поколение ЯП характеризуется созданием языков ассемблерного типа (ассемблеров, макроассемблеров), позволяющих вместо двоичных и других форматов машинных команд использовать их мнемонические символьные обозначения (имена). Являясь существенным шагом вперед, ассемблерные языки все еще оставались машинно-зависимыми, а программист все также должен был быть хорошо знаком с организацией и функционированием аппаратной среды конкретного типа ЭВМ. При этом ассемблерные программы все так же затруднительны для чтения, трудоемки при отладке и требуют больших усилий для переноса на другие типы ЭВМ. Однако и сейчас ассемблерные языки используются при необходимости разработки высокоэффективного программного обеспечения (минимального по объему и с максимальной производительностью).
Третье поколение ЯП начинается с появления в 1956 г. первого языка высокого уровня — Fortran, разработанного под руководством Дж. Бэкуса в фирме IBM. За короткое время Fortran становится основным ЯП при решении инженерно-технических и научных задач. Первоначально Fortran обладал весьма ограниченными средствами обеспечения работы с символьной информацией и с системой ввода-вывода. Однако постоянное развитие языка сделало его одним из самых распространенных ЯВУ на ЭВМ всех классов — от микро- до суперЭВМ, а его версии используются и для вычислительных средств нетрадиционной параллельной архитектуры.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ. ЧТО НУЖНО ЗНАТЬ!
Вскоре после языка Fortran появились такие ныне широко известные языки, как Algol, Cobol, Basic, PL/1, Pascal, APL, ADA, C, Forth, Lisp, Modula и др. В настоящее время насчитывается свыше 2000 различных языков высокого уровня.
Языки четвертого поколения носят ярко выраженный непроцедурный характер, определяемый тем, что программы на таких языках описывают только Что, а не как надо сделать. В программах формируются скорее соотношения, а не последовательности шагов выполнения алгоритмов. Типичными примерами непроцедурных языков являются языки, используемые для задач искусственного интеллекта (например, Prolog, Langin). Так как непроцедурные языки имеют минимальное число синтаксических правил, они значительно более пригодны для применения непрофессионалами в области программирования.
Второй тенденцией развития ЯП четвертого поколения являются объектно-ориентированные языки, базирующиеся на понятии программного объекта, впервые использованного в языке Simula-67 и составившего впоследствии основу известного языка SmallTalk. Программный объект состоит из структур данных и алгоритмов, при этом каждый объект знает, как выполнять операции со своими собственными данными. На самом деле, различные объекты могут пользоваться совершенно разными алгоритмами при выполнении действий, определенных одним и тем же ключевым словом («так называемое свойство полиморфизма). Например, объект с комплексными числами и массивами в качестве данных будет использовать различные алгоритмы для выполнения операции умножения. Такими свойствами обладают объектно-ориентированные Pascal, Basic, C++, SmallTalk, Simula, Actor и ряд других языков программирования.
Третьим направлением развития языков четвертого поколения можно считать языки запросов, позволяющих пользователю получать информацию из баз данных. Языки запросов имеют свой особый синтаксис, который должен соблюдаться, как и в традиционных ЯП третьего поколения, но при этом проще в использовании. Среди языков запросов фактическим стандартом стал язык SQL (Structured Query Language).
И, наконец, четвертым направлением развития являются языки параллельного программирования (модификация ЯВУ Fortran, языки Occam, SISAL, FP и др.), которые ориентированы на создание программного обеспечения для вычислительных средств параллельной архитектуры (многомашинные, мультипроцессорные среды и др.), в отличие от языков третьего поколения, ориентированных на традиционную однопроцессорную архитектуру.
К интенсивно развивающемуся в настоящее время пятому поколению относятся языки искусственного интеллекта, экспертных систем, баз знаний (InterLisp, ExpertLisp, IQLisp, SAIL и др.), а также естественные языки, не требующие освоения какого-либо специального синтаксиса (в настоящее время успешно используются естественные ЯП с ограниченными возможностями — Clout, Q
— возможность использования конкретных аппаратных ресурсов;
— предсказуемость объектного кода и заказов памяти;
— для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;
— трудоемкость процесса составления программ (особенно на машинных языках и ЯСК), плохо защищенного от появления ошибок;
— низкая скорость программирования;
— невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов.
Машинно-ориентированные языки по степени автоматического программирования подразделяются на классы.
^ 2.1.1. Машинный язык
Как я уже упоминал, в введении, отдельный компьютер имеет свой определенный Машинный язык (далее МЯ), ему предписывают выполнение указываемых операций над определяемыми ими операндами, поэтому МЯ является командным. Однако, некоторые семейства ЭВМ (например, ЕС ЭВМ, IBM/370/ и др.) имеют единый МЯ для ЭВМ разной мощности. В команде любого из них сообщается информация о местонахождении операндов и типе выполняемой операции.
В новых моделях ЭВМ намечается тенденция к повышению внутренних языков машинно – аппаратным путем реализовывать более сложные команды, приближающиеся по своим функциональным действиям к операторам алгоритмических языков программирования.
2.1.3. Автокоды
Есть также языки, включающие в себя все возможности ЯСК, посредством расширенного введения макрокоманд -они называются Автокоды.
В различных программах встречаются некоторые достаточно часто использующиеся командные последовательности, которые соответствуют определенным процедурам преобразования информации. Эффективная реализация таких процедур обеспечивается оформлением их в виде специальных макрокоманд и включением последних в язык программирования, доступный программисту. Макрокоманды переводятся в машинные команды двумя путями – расстановкой и генерированием. В постановочной системе содержатся «остовы» — серии команд, реализующих требуемую функцию, обозначенную макрокомандой. Макрокоманды обеспечивают передачу фактических параметров, которые в процессе трансляции вставляются в «остов» программы, превращая её в реальную машинную программу.
В системе с генерацией имеются специальные программы, анализирующие макрокоманду, которые определяют, какую функцию необходимо выполнить и формируют необходимую последовательность команд, реализующих данную функцию.
Обе указанных системы используют трансляторы с ^ ЯСК и набор макрокоманд, которые также являются операторами автокода.
Развитые автокоды получили название Ассемблер ы. Сервисные программы и пр., как правило, составлены на языках типа Ассемблер. Более полная информация об языке Ассемблер а см. ниже.
2.1.4. Макрос
Язык, являющийся средством для замены последовательности символов описывающих выполнение требуемых действий ЭВМ на более сжатую форму — называется Макрос (средство замены).
В основном, Макрос предназначен для того, чтобы сократить запись исходной программы. Компонент программного обеспечения, обеспечивающий функционирование макросов, называется макропроцессором. На макропроцессор поступает макроопределяющий и исходный текст. Реакция макропроцессора на вызов-выдача выходного текста.
Макрос одинаково может работать, как с программами, так и с данными.
^ 2.2. Машинно – независимые языки
Машинно – независимые языки – это средство описания алгоритмов решения задач и информации, подлежащей обработке. Они удобны в использовании для широкого круга пользователей и не требуют от них знания особенностей организации функционирования ЭВМ и ВС.
Подобные языки получили название высокоуровневых языков программирования. Программы, составляемые на таких языках, представляют собой последовательности операторов, структурированные согласно правилам рассматривания языка(задачи, сегменты, блоки и т.д.). Операторы языка описывают действия, которые должна выполнять система после трансляции программы на машинном языке.
Т.о., командные последовательности (процедуры, подпрограммы), часто используемые в машинных программах, представлены в высокоуровневых языках отдельными операторами. Программист получил возможность не расписывать в деталях вычислительный процесс на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма.
^ 2.2.1. Проблемно – ориентированные языки
С расширением областей применения вычислительной техники возникла необходимость формализовать представление постановки и решение новых классов задач. Необходимо было создать такие языки программирования, которые, используя в данной области обозначения и терминологию, позволили бы описывать требуемые алгоритмы решения для поставленных задач, ими стали проблемно – ориентированные языки. Эти языки, языки ориентированные на решение определенных проблем, должны обеспечить программиста средствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме.
Проблемных языков очень много, например:
^ Фортран, Алгол – языки, созданные для решения математических задач;
Simula, Слэнг — для моделирования;
Лисп, Снобол – для работы со списочными структурами.
Об этих языках я расскажу дальше.
^ 2.2.2. Универсальные языки
Универсальные языки были созданы для широкого круга задач: коммерческих, научных, моделирования и т.д. Первый универсальный язык был разработан фирмой IBM, ставший в последовательности языков Пл/1. Второй по мощности универсальный язык называется Алгол-68. Он позволяет работать с символами, разрядами, числами с фиксированной и плавающей запятой.
Пл/1 имеет развитую систему операторов для управления форматами, для работы с полями переменной длины, с данными организованными в сложные структуры, и для эффективного использования каналов связи. Язык учитывает включенные во многие машины возможности прерывания и имеет соответствующие операторы. Предусмотрена возможность параллельного выполнение участков программ.
Программы в ^ Пл/1 компилируются с помощью автоматических процедур. Язык использует многие свойства Фортрана, Алгола, Кобола. Однако он допускает не только динамическое, но и управляемое и статистическое распределения памяти.
^ 2.2.3. Диалоговые языки
Появление новых технических возможностей поставило задачу перед системными программистами – создать программные средства, обеспечивающие оперативное взаимодействие человека с ЭВМ их назвали диалоговыми языками.
Эти работы велись в двух направлениях. Создавались специальные управляющие языки для обеспечения оперативного воздействия на прохождение задач, которые составлялись на любых раннее неразработанных (не диалоговых) языках. Разрабатывались также языки, которые кроме целей управления обеспечивали бы описание алгоритмов решения задач.
Необходимость обеспечения оперативного взаимодействия с пользователем потребовала сохранения в памяти ЭВМ копии исходной программы даже после получения объектной программы в машинных кодах. При внесении изменений в программу с использованием диалогового языка система программирования с помощью специальных таблиц устанавливает взаимосвязь структур исходной и объектной программ. Это позволяет осуществить требуемые редакционные изменения в объектной программе.
Одним из примеров диалоговых языков является ^ Бэйсик.
Бэйсик использует обозначения подобные обычным математическим выражениям. Многие операторы являются упрощенными вариантами операторов языка Фортран. Поэтому этот язык позволяет решать достаточно широкий круг задач.
^ 2.2.4. Непроцедурные языки
Непроцедурные языки составляют группу языков, описывающих организацию данных, обрабатываемых по фиксированным алгоритмам (табличные языки и генераторы отчетов), и языков связи с операционными системами.
Позволяя четко описывать как задачу, так и необходимые для её решения действия, таблицы решений дают возможность в наглядной форме определить, какие условия должны быть выполнены прежде чем переходить к какому-либо действию. Одна таблица решений, описывающая некоторую ситуацию, содержит все возможные блок-схемы реализаций алгоритмов решения.
Табличные методы легко осваиваются специалистами любых профессий.
Программы, составленные на табличном языке, удобно описывают сложные ситуации, возникающие при системном анализе.
Источник: infopedia.su
Языки программирования
На практике в качестве исполнителей алгоритмов используются специальные автоматы — компьютеры. Для того, чтобы ЭВМ могла выполнять программу, программа должна быть записана по строгим правилам в виде, доступном для обработки на ЭВМ. Программа для такой машины записывается на так называемом машинном языке, т. е. представляет собой последовательность двоичных чисел. Придумывать и записывать программу на машинном языке неудобно. Это нудная и долгая работа не обходилась без ошибок, которые было очень непросто найти.
Поэтому возникла идея записывать программу на так называемом алгоритмическом языке или языке программирования. Языки программирования – специально разработанные искусственные языки, предназначенные исключительно для записи алгоритмов, исполнение которых поручается ЭВМ.
Обычный разговорный язык состоит из четырех основных элементов: символов, слов, словосочетаний и предложений. Алгоритмический язык содержит подобные элементы, только слова называют элементарными конструкциями, словосочетания — выражениями, предложения — операторами. Алгоритмический язык (как и любой другой язык), образуют три его составляющие: алфавит, синтаксис и семантика.
Алфавит – фиксированный для данного языка набор символов (букв, цифр, специальных знаков и т.д.), которые могут быть использованы при написании программы.
Синтаксис — правила построения из символов алфавита специальных конструкций, с помощью которых составляется алгоритм.
Семантика — система правил толкования конструкций языка. Таким образом, программа составляется с помощью соединения символов алфавита в соответствии с синтаксическими правилами и с учетом правил семантики.
Краткая история и классификация языков программирования
Первые языки программирования были очень примитивными и мало чем отличались от формализованных упорядоченных последовательностей единиц и нулей, понятных компьютеру. Использование таких языков было крайне неудобно с точки зрения программиста, так как он должен был знать числовые коды всех машинных команд, должен был сам распределять память под команды программы и данные.
Для того, чтобы облегчить общение человека с ЭВМ были созданы языки программирования типа Ассемблер. Переменные величины стали изображаться символическими именами. Числовые коды операций заменились на мнемонические обозначения, которые легче запомнить. Язык программирования приблизился к человеческому языку, и отдалился от языка машинных команд.
Один из первых языков программирования – Фортран (For mula Tran slation) был создан в середине 50-х годов. Благодаря своей простоте и тому, что на этом языке накоплены большие библиотеки программ Фортран и в наши дни остается одним из самых распространенных. Он используется для инженерных и научных расчетов, для решения задач физики и других наук с развитым математическим аппаратом.
Для решения экономических задач был создан язык программирования — Кобол.
Расширение областей применения ЭВМ влечет за собой создание языков, ориентированных на новые сферы применения: Снобол – алгоритмический язык для обработки текстовой информации, Лисп — алгоритмический язык для обработки символов. Лисп находит широкое применение в исследованиях по созданию искусственного интеллекта.
В 1968 г. был объявлен конкурс на лучший язык программирования для обучения студентов. Победителем стал язык Алгол-68, но широкого распространения не получил. Для этого конкурса Никлаус Вирт создал язык Паскаль, достаточно простой, удобный, с наличием мощных средств структурирования данных.
Хотя Паскаль был разработан как язык для обучения программированию, он впоследствии получил широкое развитие и в настоящее время считается одним из самых используемых языков. Для обучения младших школьников Самуэлем Пайпертом был разработан язык Лого. Он отличается простотой и богатыми возможностями.
Широкое распространение в школах в качестве обучающего языка получил язык Бейсик, позволяющий взаимодействовать с ЭВМ в режиме непосредственного диалога. Спустя много лет после изобретения Бейсика, он и сегодня самый простой для освоения из десятков языков общецелевого программирования.
Необходимость разработки больших программ, управляющих работой ЭВМ, потребовала создания специального языка программирования СИ в начале 70-х г. Он является одним из универсальных языков программирования. В отличии от Паскаля, в нем заложены возможности непосредственного обращения к некоторым машинным командам и к определенным участкам памяти компьютера.
Си широко используется как инструментальный язык для разработки операционных систем, трансляторов, баз данных и других системных и прикладных программ. Си – это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью. Во многих случаях программы, написанные на Си, сравнимы по скорости с программами, написанными на языке Ассемблера. При этом они имеют лучшую наглядность и их более просто сопровождать. Си сочетает эффективность и мощность в относительно малом по размеру языке.
Появление функционального программирования привело к созданию языка Пролог. Этот язык программирования разрабатывался для задач анализа и понимания естественных языков на основе языка формальной логики и методов автоматического доказательства теорем.
В 80-х г. 20 века был создан язык Ада. Этот язык в дополнение к классическим свойствам, обеспечивает программирование задач реального времени и моделирования параллельного решения задач.
Существуют различные классификации языков программирования. По наиболее распространенной классификации все языки программирования делят на языки низкого, высокого и сверхвысокого уровня.
В группу языков низкого уровня входят машинные языки и языки символического кодирования: (Автокод, Ассемблер). Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т. е. являются машинно-зависимыми. Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).
Следующую, существенно более многочисленную группу составляют языки программирования высокого уровня. Это Фортран, Алгол, Кобол, Паскаль, Бейсик, Си, Пролог и т.д. Эти языки машинно-независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках.
К языкам сверхвысокого уровня можно отнести лишь Алгол-68 и APL. Повышение уровня этих языков произошло за счет введения сверхмощных операций и операторов.
Другая классификация делит языки на вычислительные и языки символьной обработки. К первому типу относят Фортран, Паскаль, Алгол, Бейсик, Си, ко второму типу — Лисп, Пролог, Снобол и др.
В современной информатике можно выделить два основных направления развития языков программирования: процедурное и непроцедурное.
Процедурное программирование возникло на заре вычислительной техники и получило широкое распространение. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий.
Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки: Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.
Непроцедурное (декларативное) программирование появилось в начале 70-х годов 20 века, но стремительное его развитие началось в 80-е годы, когда был разработан японский проект создания ЭВМ пятого поколения, целью которого явилась подготовка почвы для создания интеллектуальных машин. К непроцедурному программированию относятся функциональные и логические языки.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь разлагаются на еще более простые и т.д. Один из основных элементов в функциональных языках — рекурсия, то есть вычисление значения функции через значение этой же функции от других элементов. Присваивания и циклов в классических функциональных языках нет.
В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком.
Классическим языком логического программирования считается Пролог. Построение логической программы вообще не требует алгоритмического мышления, программа описывает статические отношения объектов, а динамика находится в механизме перебора и скрыта от программиста.
Можно выделить еще один класс языков программирования — объектно — ориентированные языки высокого уровня. На таких языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Объектно-ориентированные языки, благодаря богатому пользовательскому интерфейсу, предлагают человеку решить задачу в удобной для него форме. Примером такого языка может служить язык программирования визуального общения Object Pascal.
Языки описания сценариев, такие как Perl, Python, Rexx, Tcl и языки оболочек UNIX, предполагают стиль программирования, весьма отличный от характерного для языков системного уровня. Они предназначаются не для написания приложения с нуля, а для комбинирования компонентов, набор которых создается заранее при помощи других языков. Развитие и рост популярности Internet также способствовали распространению языков описания сценариев. Так, для написания сценариев широко употребляется язык Perl, а среди разработчиков Web-страниц популярен JavaScript.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru
К какой группе программ относятся языки программирования
В статье рассматривается проблема эффективного обучения программированию в вузе, так как фундаментальность подготовки в области программирования во многом определяется классификацией языков программирования. На данный момент существует большое разнообразие, как языков программирования, так и их классификаций.
В работе предложена следующая классификация языков программирования: императивные и функциональные. Императивные языки программирования включают четыре группы: первая — ассемблер, интерпретаторы Бейсик, Фортран; вторая – Паскаль; третья – Си; четвертая – специализированные языки программирования. Возможным критерием классификации функциональных языков может являться – использование функций: узкого класса (Пролог) и разных классов (Хаскел). Построенная классификация используется авторами в рамках преподавания таких дисциплин, как: «Программирование», «Языки и методы программирования», «Искусственный интеллект», «Теория алгоритмов».
объектно-ориентированные языки программирования
аппликативные
функциональные
императивные
классификация языков программирования
язык программирования
программирование
1. Душкин Р. В. Функциональное программирование на языке Haskell. Текст лекций по курсу «функциональное программирование» М. 2001
2. Иванова Л.В., Чекушина В.Е. Методы и формы обучения программированию в вузе. //Сборник научных трудов SWorld. -Выпуск 3. Том 17. -Одесса: КУПРИЕНКО СВ., 2013. -ЦИТ:313-0324. -С. 18-22.
3. Иванова Л.В. Методические аспекты обучения программированию будущих учителей информатики. Материалы XII Международной научно-методической конференции «Информатика: проблемы, методология, технологии», Воронеж, 9-12 февраля 2012, том 2, 92-94
4. Иванова Л.В. Методические аспекты преподавания дисциплины «Информатика и программирование». //Сборник научных трудов SWorld. -Выпуск 1. Том 13. -Одесса: КУПРИЕНКО СВ, 2014 — ЦИТ: 114 — 509. С. 41-43
5. Лаптев В.В., Швецкий М.В. Методическая система фундаментальной подготовки в области информатики: теория и практика многоуровневого педагогического университетского образования. — Спб.: Издательство Санкт-Петербургского университета, 2000. – 508 с.
6. Лапчик М.П. и др. Методика преподавания информатики: Учеб. пособие для студ. пед. вузов/ М.П.Лапчик, И.Г.Семакин, Е.К. Хеннер; Под общей ред. М. П. Лапчика. — М.: Издательский центр «Академия», 2001. — 624 с.
7. Пильщиков В.Н. Сборник упражнений по языку Паскаль: Учеб. пособие для вузов. –М.: Наука. Гл. ред. физ.-мат. лит., 1989.-160 с.
8. Пратт Т., Зелкович М. Языки программирования: разработка и реализация / Под общей ред. А. Матросова. – СПб.: Питер, 2002. – 688 с.: ил.
Программирование — раздел информатики, занимающийся разработкой средств решения задач на компьютере и созданием программного обеспечения, с помощью которого реализуется вычислительный процесс и обмен информацией с внешним миром. Из всего многообразия языков программирования активно применяется только часть их, другие же стали историей языков программирования. В конструкциях различных языков программирования много общего, они классифицируются по своим возможностям, конструктивным особенностям и сферам применения. Программирование из искусства постепенно превращается в промышленное изготовление программ, для чего создаются разнообразные технологии программирования.
Программа — это алгоритм, исполнителем которого может быть компьютер. Во многих учебниках по программированию или алгоритмизации не обращается достаточного внимания на следующую двойственность алгоритма:
- Алгоритм может быть исполнен.
- Алгоритм может быть записан.
В языке Бейсик четко выделены команды list — просмотреть запись текста программы и run — исполнить эту программу Язык программирования — возможность реализации записи алгоритма для компьютера.
В настоящее время количество языков программирования огромно. Имеется потребность их классификации. Попыток классифицировать их принималось много, например, в книге Т. Пратта и М.Зелковича [8] языки программирования разделены на четыре группы:
- императивные;
- аппликативные;
- основанные на системах правил;
- объектно-ориентированные.
Приведены описания этих групп языков, но четких признаков, по которым тот или иной язык программирования относится к определенной группе не выделено.
Приведенный в качестве примера языка, основанного на системах правил, Пролог вполне может рассматриваться как функциональный язык, в котором используются функции, возвращающие логическое значение. С другой стороны, совершенно не определено словосочетание «система правил». В любом языке программирования есть некоторая система правил, например, правил оформления записей.
Считаем также несостоятельным выделение в отдельную группу объектно-ориентированные языки. Мы также выделяем эти языки, но как подгруппу алгоритмических языков, поскольку имеется достаточно много общего с другими языками основной группы. Представляется, что все объектно-ориентированные языки программирования, есть набор библиотек самостоятельных программ, неважно, на каком языке написанных изначально, но они исполняются операционной системой. Фактически, объектно-ориентированный язык предоставляет возможность программисту использовать в своих проектах уже готовые объекты операционной системы. Просто правила конструирования новых проектов имеют в основе правила записи языков прародителей.
Вывод о том, что объектно-ориентированный язык программирования просто представляет собой возможность подключения к своим проектам ресурсов операционной системы, подтверждается тем, что во многих учебниках по таким языкам раздел о создании собственных объектов представлен очень слабо, а в некоторых учебниках вообще отсутствует. С другой стороны, уделяется большое внимание подключению и вопросам совместимости библиотек программ.
Предлагается разделить все языки программирования четко на две группы: императивные и функциональные.
Классификация языков программирования
Императивные
Функциональные
Синонимы
Память
Система «склада». Изначально «склад» заполняется исходными данными, получаемыми непосредственно (с помощью специальной операции присваивания) или извне (с устройств ввода). Далее, данные берутся из одного «помещения» склада, обрабатываются (изменяются) и размещаются в другом. Результат — появление требуемых данных в указанном «помещении» склада (заполнение видеопамяти обеспечивает вывод ответа на мониторе ПК).
Отсутствие «склада». Для получения данных один «специалист» требует их непосредственно от другого «специалиста», тот от следующего.
Переменная
Фиксированное помещение выше упомянутого «склада». Всегда глобальны, но придуманы способы «скрытия» отдельных «помещений», например системы «видимости» имен переменных, позволяющие иметь локальные переменные.
Информация, передаваемая от одного процесса обработки другому. Существует лишь для момента процесса передачи. Всегда локальны.
Теоретичес-кая база
Принципы фон-Неймана, машина Тьюринга.
Исчисление Черча, вычислимые функции.
Режим работы
Компиляционный. Высокое быстродействие.
Интерпретационный. Режимы реального времени.
Описание действий (процедурность).
Описание возможностей (декларативность).
Передаваемые (через «склад» или нет) данные обладают определенными свойствами (типы данных). По этому параметру императивные и функциональные не различаются.
Дальнейшую классификацию проводим для каждой группы отдельно.
Императивные языки программирования классифицируем по работе с переменными и подпрограммами, тенденция — приближение по возможностям к функциональным языкам.
Классификация императивных языков программирования
Переменные
Подпрограммы
Проблемы
Явно глобальные. Только базовые типы данных.
Необходимость следить за тем, чтобы в одну переменную не попадали разные данные, переприсваивание перед вызовом подпрограмм и после их исполнения.
Фиксирование некоторых имен переменных, работающих одинаково, например, до сих пор счетчики в циклах обозначаются i, j.
Появление областей видимости
Разделяются на процедуры и функции
Возможность применения рекурсии.
Появление сложных (структурированных) данных, которые пока невозможно возвращать как значения функций.
Унификация подпрограмм — только функции.
Активное применение указателей.
Возвращение структурированных объектов подпрограммами, как адресов этих объектов.
Появление проблемы «очистки мусора».
Объединение в единое целое данных и средств их обработки (объекты).
Объектно-ориентированные языки программирования
Использование программными системами уже имеющихся средств — объектов операционной системы.
В языки программирования первой подгруппы получение информации обеспечивается, в основном, присваиванием. Появляется режим пакетной обработки информации. По сути, получение пакета — обобщение операции присваивания.
Для работы этих языков программирования операционная система не нужна. Средства языка достаточны для замены операционной системы. Много персональных компьютеров («Ямаха», «БК») выпускались с встроенным языком программирования, таким, как Бейсик или Фокал.
К языкам этой группы можно отнести ассемблер, интерпретаторы Basic, Фортран. Язык ассемблера можно и отделить, как имеющий слабую типизацию данных, «машинно-зависимый» язык. Фортран тоже занимает особую позицию, но с другой стороны: имеет достаточно серьезную типизацию данных.
Глобальность переменных приводит к необходимости большого количества переприсваиваний. Перед каждым входом в подпрограмму (GWbasic, Qbasic) выполняется заполнение переменных подпрограммы значениями из переменных основной программы и обратная передача информации после завершения подпрограмм.
Недопустимость одноименности переменных в программах и подпрограммах является причиной ошибок в больших программах и затрудняет использование чужих подпрограмм. Во избежание этих трудностей, в языки программирования второй группы, каждой подпрограмме предоставляется своя область определения, в том числе и имен. Появляется иерархия.
При необходимости значения переменных берутся из области имен самой подпрограммы, если переменная в подпрограмме не объявлена, ищем в области определения подпрограммы, вызвавшей данную подпрограмму. Оказывается возможным применение рекурсии. В задачнике Пильщикова В.Н.[7] знаком повешенной трудности отмечено задание на вычисление значения Sin(Sin(. Sin(x))).
Для языка Паскаль, поддерживающего рекурсию, данное задание трудностей не представляет. По-видимому, автор перерабатывал задания для языка Фортран, где, из-за недопустимости рекурсивных вызовов, при выполнении задания возникают проблемы.
Компиляционный режим работы требует наличия в памяти кода всех подпрограмм программы, но оперативная память компьютеров не безгранична. Появляется возможность создания оверлейных программ, когда часть оперативной памяти предоставляется для хранения отдельных модулей кода программы, заменяемых по необходимости.
Примерами языков программирования второй подгруппы являются: QBasic, Паскаль.
Во всех рассмотренных языках сохраняется четкое разделение элементов программы на команды и выражения. И при выполнении программ, и при вычислении выражений часто приходится выполнять одинаковые действия, что организуется в виде подпрограмм. Подпрограммы — элементы программ получили название «процедуры», фактически, после объявления — отдельные команды программы.
Подпрограммы — элементы выражений, называют функциями. С развитием теории алгоритмов, появляется отождествление понятий «алгоритм» и «функция». Как только мы представим исполнение программы вычислением некоторого результата (результатом, кроме данных, может быть и действие), а исходные данные сопоставим с аргументами, разница между процедурами и функциями стирается.
Представителем языка программирования третьей подгруппы можем считать язык Си.
Представителем языков программирования четвертой подгруппы можем считать языки dBASE, FoxPro.
Работа с объектами появляется в очередных версиях языка Паскаль, Си и других.
Языки группы объектно-ориентированных, как уже отмечалось выше, по сути одно и то же. Традиционными остались формы записи основных алгоритмических структур и объявление переменных, как у предшественников, но других различий почти нет. Basic → VisualBasic, Pascal → Delphi, C → C++→C#. Существенную часть программ на этих языках составляют объекты системных библиотек, одних и тех же.
Попытаемся классифицировать функциональные языки. Возможен критерий — по используемым функциям.
Классификация функциональных языков программирования
Функции
Примеры
В языке программирования «Пролог» имеем функции, возвращающие результат только логического типа.
Язык программирования «Хаскел» работает с различными функциями.
В математике известно заявление Пратта Т., что любое высказывание математики может быть записано предложениями «Если . то . ». Существует так же раздел «математическая логика», включающий «исчисление предикатов». Двоичная система, выдающая результат «да» или «нет», лежит в основе практически всех наук, от арифметики, до юриспруденции. Как видим, существуют широко используемые, замкнутые системы логических функций. Компьютерной реализацией оболочки подобной системы можем считать язык Пролог.
Если в алгоритмических языках мы описываем необходимые для получения результата действия, с указанием порядка их выполнения (детерминированность), то в пролог-системе мы просто перечисляем действия, которые можно выполнить (декларативность). Появляется новая категория — цель. Цель представляет собой так же некоторое действие. Основным вопросом программирования на языке Пролог является: возможно ли достичь поставленной цели, не выходя за рамки имеющихся правил? Сам путь достижения цели, важный пользователю, для пролог-системы вторичен.
Реализация поиска результата сопоставима с поиском пути в графе. В алгоритмических языках, для работы с иерархическими графами известен алгоритм перебора с возвратом. Используя этот алгоритм, можно составить список действий, выполнив который получаем результат. Базой функциональных языков является конструкция «список», основанная на понятии «монада».
Список — есть набор из двух элементов: первый элемент — «голова», и «хвост» — снова такой же список остальных элементов. Для завершенности конструкции добавляем возможность «пустого» списка.
Первым из языков, предназначенным для работы со списками, считается Лисп. Лисп занимает двоякую позицию: с одной стороны, он может быть отнесен к алгоритмическим языкам, с другой, наличие аппарата работы со списками, позволяет решать задачи функциональных языков.
Языки Лисп и Пролог используются для создания систем искусственного интеллекта, представляющих собой наборы правил «Если . то . », задачей которых является диагностика имеющейся ситуации и выполнение соответствующих действий для достижения цели.
Как в математике «математическая логика» не охватывает всех имеющихся возможностей, так и языков логического программирования недостаточно для решения различных задач. Появляются реализованные на функциональной основе возможности обработки не только логических данных.
В настоящее время существует несколько функциональных языков программирования, например, Душкин Р. В. [1] выделяет:
- Lisp (List processor). Считается первым функциональным языком программирования. Нетипизирован. Содержит массу императивных свойств, однако, в общем поощряет именно функциональный стиль программирования. Существует объектно-ориентированный диалект языка — CLOS.
- Scheme. Диалект Lisp’а, предназначенный для научных исследований в области computer science. При разработке Scheme был сделан упор на элегантность и простоту языка.
- ML (Meta Language). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями.
- Miranda. Разработан в качестве стандартного функционального языка, использовавшего отложенные вычисления. Имеет строгую полиморфную систему типов. Оказал большое влияние на разработчиков языка Haskell.
- Haskell. Один из самых распространённых нестрогих языков. Имеет очень развитую систему типизации. Несколько хуже разработана система модулей. Последний стандарт языка — Haskell-98.
- Gofer (GOod For Equational Reasoning). Упрощённый диалект Haskell’а. Предназначен для обучения функциональному программированию.
- Clean. Специально предназначен для параллельного и распределённого программирования. По синтаксису напоминает Haskell. Clean использует отложенные вычисления.
С некоторой натяжкой, к функциональным языкам программирования, можно отнести системы редактирования (работа в интерпретационном режиме со специализированными данными — тексты, изображения). Как примеры, назовем HTML, Flash.
Представление о классификации языков программирования необходимы, например, при переводе алгоритмов с одного языка на другой.
Заключение
Фундаментальная подготовка будущих учителей информатики в нашем вузе на физико-математическом факультете осуществляется с 1987 года [5], с 2011 года — бакалавров по направлениям подготовки: 230700.62 Прикладная информатика и профилю подготовки «Прикладная информатика в экономике», 010200.62 Математика и компьютерные науки (профиль — «Математическое и компьютерное моделирование»).
Предложенный в данной работе подход к классификации языков программирования на две группы: императивные и функциональные апробирован в рамках таких дисциплин, как: «Программирование», «Языки и методы программирования», «Практикум решения задач на ЭВМ», «Информатика и программирование», «Теория и методика обучения информатике», «Искусственный интеллект», «Теория алгоритмов» [6]. Важность выбора языка программирования в фундаментальной подготовке специалистов в области информатики и программирования, методические аспекты эффективного обучения программированию рассматривались авторами в таких статьях, как [2-4].
Рецензенты:
Ахметов Л.Г., д.п.н., профессор кафедры теории и методики профессионального образования, ЕИ К(П)ФУ, г. Елабуга.
Мухаметшин А.Г., д.п.н., профессор кафедры педагогики и психологии, декан факультета педагогики и психологии, НИСПТР, г. Набережные Челны.
Источник: science-education.ru