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

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

Содержание:

Введение

Причиной выбора данной темы: «Классификация языков программирования высокого уровня», было узнать языки программирования, определить их классификацию по уровням. Разные авторы книг разбивают языки на три уровня (машинные, машинно-ориентированные и машинно-независимые языки), либо на два уровня (языки программирования низкого уровня, языки программирования высокого уровня). В таком случае деления языков программирования на три уровня, которые будут низшим уровнем считаться машинный код – набор команд, которые выполняются конкретным процессором и разработанны специально для него. Обычно является последовательностью шестнадцатеричных символов. Средний уровень будет являться машинно-ориентированные языки, это те языки, которые призванные управлять непосредственно командами процессора, и более доступно человеку для восприятия языка. Примером являются языки ассемблера. Язык ассемблера, который по сути, представляет каждую команду машинного кода с помощью удобных для восприятия человеком символических команд – мнемокодов. Как правило, этот язык ассемблера использует особенности конкретного семейства процессоров. Высшим же уровнем будут считаться машинно-независимые языки. Они разработаны для удобства восприятия, которых будут быстро их понимать и легко работать с ними. Характерная черта этих языков программирования – абстракция, которая есть введении смысловых конструкций, кратко описывающих данные и операции над ними, описания которых в машинно- ориентированных языках очень длинны и сложны для понимания. Также они были призваны обеспечить платформенную независимость сути алгоритмов. С их появлением зависимость от платформы перекладывается на трансляторы, «переводящие» текст, написанный на языке высокого уровня, в элементарные машинные команды. Примерами языков программирования высокого уровня являются C++, C#, PHP, Perl, Java и многие другие. В современной классификации языков программирования по уровням всё чаще используют деление на два уровня: языки высокого и низкого уровней.

Глава 1. Языки Программирования и их развития

Исходное определение языка программирования

Язык программирования – это знаковая система, которая предназначена для планирования поведения компьютера. Знаковая система – это совокупность соглашений, которые определяют набор знаковых ситуаций. Знаковая ситуация – первичное понятие семиотики, ее элементами есть знак и денотат (рис.1.1).

Знак – это обозначение или имя, денотат – значение, смысл.

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

Язык программирования — это правила образования знаков (синтаксис) и согласованные с ними правила образования денотатов (семантика).

В языке программирования знаки — это элементы программ, а денотаты — характеристики поведения исполнителя (компьютера).

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

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

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

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

Семантические ошибки связаны с искажением смысла элементов сообщения, а прагматические ошибки — с искажением цели (назначения) элемента или сообщения.

Прагматические ошибки — самые трудные. Их примеры: часы хорошие-плохие, для выяснение смысла программы без знания ее назначения.

Для исключения ошибок необходимо, чтобы отправитель и адресат пользовались:

‰ одинаковыми правилами разложения сообщения на составляющие (предмет синтаксиса);

‰ согласованными правилами, придающие сообщению смысл (предмет семантики);

‰ согласованными целевыми установками (предмет прагматики).

Технологическое определение языка программирования

Язык программирования — инструмент для производства программных услуг.

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

Программы должны быть:

‰ надежными (содержать мало ошибок);

‰ устойчивыми (сохранять работоспособность в неблагоприятных условиях эксплуатации, ограниченности ресурсов, перегрузок, ошибок пользователя, сбоев и отказов аппаратуры);

‰ заботливыми (должны уметь объяснять свои действия и ошибки пользователя).

Известно, что создание программ — дорогое занятие. С современной точки зрения, аппаратура компьютера по относительной стоимости сравнима с упаковкой, в которую «заворачивается» программное изделие. Почему? Причина — сложность программирования. Известны два источника сложности [3, 13].

Семантический разрыв — разрыв между уровнем простых операций компьютера и уровнем потенциально возможных услуг. Компьютер — очень быстрый исполнитель операций. Отсюда желание программировать его на оказание сложных услуг (с помощью очень сложных программ). В свою очередь возможности человека при работе со связанными объектами ограничены числом ИНГВЕ = 7 ± 2. Выход из положения — создавать для определенного класса услуг подходящий язык программирования (со сложными операциями) и программировать на таком языке.

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

Примеры крупных программных ошибок:

‰ Космический аппарат «Маринер-1» (22 июля 1962 г.). Цель — Венера. Разрушен через 294,5 секунды после старта.

‰ Космический аппарат «Маринер-2» (27 августа 1962 г). Источник ошибки — пробел и отсутствие запятой в Фортран-программе управления (оператор цикла DO).

‰ Ракета-носитель «Ариан-5» (4 июня 1996 г.). Уничтожена при старте. Цена ошибки — $500 000 000.

‰ Массовые отключения электричества на северо-востоке Северной Америки (14 августа 2003 г.). Ценой — 10 миллиардов долларов.

Средство борьбы с семантическим разрывом — аппарат абстракции-конкретизации языка. Этот аппарат — основа ориентации на проблему. Например, в языке Fortran средство абстракции — подпрограмма, а соответствующее средство конкретизации — послания к ней с фактическими параметрами.

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

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

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

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

Рассмотрим проблему программирования в абсолютных (машинных) адресах.

Вычислительная машина (система), которая независимо от типа и поколения, состоит из двух основных типов устройств:

- центральное устройство (ЦУ), которое включает в себя центральный процессор (ЦП) и оперативную память (ОП).

- периферийные (внешние) устройства (ВУ).

Невзирая на то, что постоянно идут исследования в направлении разработки новых принципов структур и архитектур ЭВМ, тормозят в большинстве современных машин реализованы так называемые принципы Фон Неймана:

- ОП организована как совокупность машинных слов (МС) фиксированной длины или разрядности. Например, ранние ПЭВМ имели разрядность 8, затем появились 16-разрядные, а в последнее время 32- и 64-разрядные машины. В свое время существовали также 45-разрядные (М-20, М-220), 35-разрядные (Минск-22, Минск-32) и другие компьютеры.

- ОП образует единое адресное пространство, адреса МС возрастают от младших к старшим;

- в ОП размещаются как данные, так и программы, причем в области данных одно слово, как правило, оно соответствует одному числу, а в области программы – одной команде;

- команды выполняются в конкретной последовательности, если/пока не встретится команда управления, в итоге которой естественная последовательность нарушится;

-ЦП может хаотично обращаться к любым адресам в ОП для выборки и/или записи в МС чисел или команд.

Общий порядок функционирования некоторого абстрактного (упрощенного) ЦУ следующий:

° извлечение из ОП следующей команды. Характерная команда содержит: код операции (КОП), действия (сложение, вычитание чисел; сравнение строк; передача управления, обращение к ВУ и пр.); адреса операндов А1, А2 и т.д., участвующих в выполнении команды (чисел, строк, других команд программы);

° расшифровка КОП;

° выборка адресов А1, А2 и пр. в регистры адреса;

° выполнение операции (арифметической, логической и пр.) и

помещение результата в регистр результата;

° запись результата по одному из адресов (если необходимо);

° переход к следующей команде.

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

В качестве примера рассмотрим последовательность реализации вычисления по формуле у = (a + b)2 – c/d.

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

1. r1 =a + b; — операция сложения

2. r2 = r1 * r1; — операция умножения

3. r3 = c/d; — операция деления

4. у = r2 — r3; — операция вычитания

5. Стоп. — завершение обработки

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

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

Адресность команд ЦП связана с разрядностью ОП. Типичная команда состоит из фиксированной части (КОП) и адресной части, в указанных адресах операндов. Увеличение разрядности позволяет увеличить адресность команды и длину адреса (т.е. объём памяти, доступной данной команде). Увеличение адресности, в свою очередь, это приводит к повышению быстродействия обработки (за счет снижения числа требуемых команд). С увеличением разрядности увеличивается и диапазон значений которые обрабатывают числа и количества информации, извлекаемой за один такт работы машины из ОП, или записываемой в ОП. Ранние ПЭВМ имели разрядность 8, объем ОП б4 Кбайт, последние модели имеют разрядность 32 — б4 и объемом ОП 64-512 Мбайт.

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

Текст начальной программы на ассемблере состоит из операторов, каждый из которых занимает отдельную строку этого текста. Имеют различие два типа операторов: инструкции и директивы. Первые при трансляции реализуются в команды процессора, исполняющиеся после загрузки в память загрузочного модуля программы, и имеют расширение .СОМ или .ЕХЕ . Операторы второго типа управляют процессом ассемблирования — преобразования текста исходной программы в коды объектного модули (расширение .ОВJ). Ассемблер интерпретирует и обрабатывает операторы друг за другом, генерируя последовательность из команд процессора и байтов данных.

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

Третье поколение языков, которое начинается с появления в 1956 г. первого языка высокого уровня — Фортран, разработанного под руководством Дж. Бэкуса в фирме IВМ. За короткий промежуток Фортран становится основным языком программирования при решении инженерно-технических и научных задач. В первую очередь Фортран обладал весьма малыми средствами обеспечения работы с символьной информацией и с системой ввода-вывода. Однако постоянное развитие языка сделало его одним из самых востребованных ЯВУ на ЭВМ всех классов — от микро- до супер-ЭВМ, а его версии используются для вычислительных средств нетрадиционной параллельной архитектуры.

В ближайшее время, после языка Фортран появились такие ныне широко известны языки, как Ангол, Кобол, Бейсик, ПЛ/1, Паскаль, АРL, ADA, С, Forth, Липс, Модула и др. В настоящее время насчитывается свыше 2000 различных языков высокого уровня.

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

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

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

И, наконец, четвертым направлением развития являются языки параллельного программирования (модификация ЯВУ Фортран, языки Оккам, Сисал, FP и др.), ориентировавшиеся на создание программного обеспечения для вычислительных средств параллельной архитектуры, в отличие от языков третьего поколения, которые ориентированы на традиционную однопроцессорную архитектуру.

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

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

Глава 2. Языки программирования низкого уровня

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

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

Программы, составленные на языке ассемблера, требуют намного меньшего объема памяти и времени исполнения. Знание специалистом языка ассемблера и машинного кода дает ему понимание архитектуры машины. Кроме того, что большинство специалистов в области программного обеспечения разрабатывают программы на языках высокого уровня, таких, как Object Pascal или C, наиболее сильное и эффективное программное обеспечение полностью или частично составлено на языке ассемблера.

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

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

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

Глава 3. Языки программирования высокого уровня

Лисп

Один из первых давних языков программирования Фортран был создан в 50-х гг.. Фортран и другие ему похожие языки программирования (Алгол, ПЛ/1) предназначались для решения вычислительных задач, которые возникают в математике, инженерных расчетах, физике, экономике. Эти языки в основном работают с числами.

Второй давнейший язык программирования это был Лисп, создал его Дж. Маккарти в 1962 г. Предназначался больше для работы со строками символов, нежели как для работы с числами. Это особое назначение Лиспа показало программистам новую область деятельности, сейчас называемой, как «искусственный интеллект». В настоящее время Лисп успешно используется в системах аналитических вычислений, экспертных системах и т.п.

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

Существование огромного количества разных диалектов Лиспа привело к созданию в начале 80-х гг. Common Липс Комитета, который должен был выбрать наибольше подходящий диалект Лиспа и предложить его в качестве главного. Диалект, который был выбран Комитетом в 1985г., получил название Common Липс. В дальнейшем он был принят в университетах США, а также многими разработчиками систем искусственного интеллекта, в качестве основного диалекта языка Лисп.

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

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

Профессор Дж. Самман увидел, что математическая ясность и предельная четкость Лиспа – это еще не все. А самое главное – Лисп дает возможность сформулировать и запомнить «идиомы», которые характерные для проектов по искусственному интеллекту.

Фортран

Одним из первых и наиболее хороших компиляторов стал язык Фортран, который был разработан фирмой IBM. Профессор Дж. Букс и группа профессионалов в области программирования в 1954 году опубликовали первые новости о языке. Полное название языка FORmulae TRANslation –преобразование формул.

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

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

Модификация языка Фортран, которая появилась в 1958 году, дали ему название Фортран II и содержала понятие подпрограммы и общих переменных для обеспечения связи между сегментами.

К 1962 году относится появление языка, которого известно под именем Фортран IV и ставшего наиболее употребительным в настоящее время. К этому же времени относится и начало деятельности комиссии при Американской Ассоциации Стандартов, которая выработала к 1966 году два стандарта – языки Фортран и базисный Фортран. Эти языки приблизительно соответствуют модификациям IV и II, однако этот базисный Фортран является подмножеством Фортрана, в то же время, как этот Фортран II таковым для Фортрана IV не является. Язык Фортран до сих пор продолжает развиваться и совершенствоваться, который оказывает влияние на создание и развитие других языков. Например, Фортран положен в основу Basic – диалогового языка, очень популярного для решения небольших задач, который превосходно подходит для обучения навыкам применения алгоритмических языков в практике программирования. Разработан этот язык – BASIC – группой специалистов Вычислительного центра Дартмутского колледжа, штат Нью-Хемпшир созданного в 1964г.

Бейсик

Как знаменитые гамбургеры, бейсбол и баскетбол, Бейсик — это создание Новой Англии, который был разработан в 1964г., как первоначальный язык обучения программированию. Бейсик является общепринятым акронимом от "Beginner's All-purpose Symbolic Insruction Code" (BASIC) - Многоцелевой Символический Обучающий Код для Начинающих".

Вскоре как обучаемые, так и авторы программ увидели, что Бейсик может делать практически все то, что делает скучный неумелый Фортран. А так как Бейсику было не трудно обучиться и легко с ним работать, которые программы на нем писались как всегда были быстрее, чем на Фортране. Бейсик был также доступен на персональных компьютерах, так как он обычно встроен в ПЗУ. Так Бейсик завоевал большую популярность. Интересно, что спустя 20 лет после изобретения Бейсика, он и сегодня самый легкий для освоения из десятков языков общецелевого программирования, которые имеются в распоряжении любителей программирования. Более того, он хорошо справляется с любой работой.

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

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

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

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

Рефал

Рефал, был разработанный у нас в России (СССР), в 1966г. ИПМ АН СССР. Этот язык прост и удобен для описания манипуляций над произвольными текстовыми объектами.

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

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

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

Определенной спецификой обладают и переменные типа «выражения» – имеется в виду их способность удлиняться при отождествлении. Правильное применение переменных этого типа также позволяет очень значительно повысить эффективность Рефал – программы.

Пролог и Пролог ++

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

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

Все свойства языка по-прежнему доступны программистам. Следовательно, этот Пролог ++ можно отнести к группе гибридных языков, представителями которой считаются Object Pascal и C++. Расширение Пролог ++ поддерживает все параметры, которые присущие обычно объектно-ориентированным языкам: концепции объектов и классов, единичное и многократное наследование, имеют разбиение на подклассы и передачу сообщений. Поддерживаются также некоторые усовершенствованные параметры, которые существуют в таких языках, как C++ и Smalltalk, могут включать общие и частные методы.

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

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

Сам язык создан на концепции передачи сообщений. Программа на Прологе ++ разрабатывается вокруг множества объектов Пролога ++, которые обмениваются сообщениями. В этом смысле Пролог ++ рядом к чистому объектно-ориентированному языку, такому, как Smalltalk, чем C++ или Object Pascal. Определения объектов строятся исходя из вызовов.

Open_Object [имя_объекта] и Close_Object [имя_объекта], а методы распределяются практически так же, как в других объектно-ориентированных языках программирования. Для создания наследования можно явным образом показать, какой метод какого объекта должен наследоваться, это является необходимым для многочисленного наследования.

Лекс

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

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

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

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

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

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

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

Особенности языка Си

Язык Си имеет свои некоторые особенности, которые давайте перечислим из них:

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

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

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

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

Недостатки языка Си:

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

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

Си++

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

Название Си++ - изобретение лета 1983г. Более ранние версии языка использовались, начиная с 1980г и были известны как "Cи с Классами". Первоначально язык был разработан потому, что автор хотел написать событий, но управляемые модели для чего был идеален Simula67, если не принимать во внимание эффективность. "Cи с Классами" использовался для крупных проектов моделирования, в которых строго тестировались возможности составления программ, требующих (только) минимального пространства памяти и времени на выполнение. В "Cи с Классами" не хватало перегрузки операций, ссылок, виртуальных функций и многих деталей. Си++ был впервые внедрен за пределами исследовательской группы автора в июле 1983-го. Однако тогда большие особенности Си++ были еще не придуманы.

Название Си++ выдумал Рик Масситти. Название указывает на эволюционную природу перехода к нему от Cи. "++" — это операция приращения в Cи. Чуть более короткое имя Cи+ является синтаксической ошибкой, кроме того, оно уже было использовано как имя совсем другого языка программирования. Знатоки семантики Cи находят, что Си++ хуже, чем Cи ++. Названия D язык не получил, так как он является расширением Cи и в нем не дает попыток исцелиться от проблем путем выбрасывания различных особенностей.

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

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

В качестве начального языка для Си++ был выбран Cи, потому что он:

• многоцелевой, лаконичный и относительно низкого уровня:

• отвечает большинству задач системного программирования:

• идет везде и на всем:

• пригоден в среде программирования UNIX.

В Cи есть свои сложности, но в наспех спроектированном языке программировании тоже были бы свои, а сложности Cи нам известны. Самое главное, что работа с Cи позволила "Cи с Классами" быть полезным инструментом в ходе первых месяцев раздумий о добавлении к Cи Simula-подобных классов.

Си++ стал применяться шире, и по мере того, как возможности, которые предоставляется им помимо возможностей Cи, давались все не менее существенными, вновь и вновь назревал вопрос о том, чтобы сохранять ли совместимость с Cи. Ясно то что, отказавшись от некоторой части наследия Cи можно было бы избежать ряда проблем. Это не было сделано, потому что:

• есть миллионы строк на Cи, которые могли бы принести пользу в Си++ при условии, что их не нужно было бы полностью переписывать с Cи на Си++;

• есть сотни тысяч строк библиотечных функций и сервисных программ, которые написаны на Cи, можно было бы использовать из или на Си++ при условии, что Си++ полностью подходит с Cи по загрузке и синтаксически очень похож на Cи;

• есть десятки тысяч программистов, знающие Cи, и которым, поэтому, нужно только научиться применять новые особенности Си++, а не заново изучать его основы;

• поскольку Си++ и Cи будут применяться на одних и тех же системах одними и теми же людьми, отличия должны быть либо очень большими, либо очень маленькими, чтобы свести к минимуму ошибки и недоразумения.

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

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

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

Крайнее внимание, уделенное при разработке Си++ структуре, отразилось на возрастании масштаба программ, которые написаны со времени разработки Cи. Маленькую программу (меньше 1000 строк) вы можете заставить работать с помощью грубой силы, даже нарушая все правила хорошего стиля. Для программ больших размеров это не совсем так. Если программа в 10 000 строк может иметь плохую структуру, то вы обнаружите, что новые ошибки появляются так же быстро, как удаляются старые. Си++ был разработан так, чтобы дать возможность умным образом структурировать большие программы таким образом, чтобы для одного человека не было непомерным справляться с программами в 25 000 строк. Существуют программы гораздо больших размеров, всё же те, работающие в целом, как оказывается, состоят из большого числа почти независимых частей, размер каждой из которых намного нижеуказанных пределов.

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

Замечание по проекту языка Си++

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

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

Исключались те черты, которые могли бы повлечь дополнительные расходы памяти или времени выполнения. Например, мысли о том, чтобы сделать необходимым хранение в каждом объекте ”хозяйственной” информации, были отвергнуты. Если пользователь расписывает структуру, которая состоит из двух 16-битовых величин, то структура поместится в 32-битовый регистр.

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

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

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

ЗАКЛЮЧЕНИЕ

Изобретение высокоуровневого языка программирования дало возможность нам общаться с компьютером, понимать, как понимает американец немного знакомый с русским языком древнюю азбуку Кириллицы. Честно говоря, в нашем развитии науки программирования пока что с ЭВМ на ВЫ. Поверьте, это не сарказм вы только посмотрите, как развивалась наука программирования с того времени, как зародились языки программирования, а ведь высокоуровневый язык программирования, судя по всему ещё младенец. Но если мы обратим ваше внимание на темпы роста и развития новейших технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут воспроизвести на свет языки, которые умеют принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста. Так и хочется назвать это детище компьютеризированного будущего: «языки программирования "высочайшего" уровня». Возможно, решения этого вопроса проста, а в ближайшем будущем этого проекта уже не за горами, и в этот момент, где ни будь в Запорожье, Амстердаме, Токио или Иерусалиме, перед стареньким 133MHz горбится молодой, никем не признанный специалист и разрабатывает новейшую систему искусственного интеллекта, которая наконец-то позволит человеку, с помощью своих машинных языков, вести диалог с машиной на ТЫ.

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

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

Единственный способ изучать новый язык программирования – писать на нём программы.

Библиография

1) “LEX - генератор программ лексического анализа”

Давидов М. И.; Антонов В. Г. МОСКВА – 1985;

2) "BASIC Face-off", Justin J.Crom,

PC Tech Journal, September 1987, p.136

Перевод: Лопухов В.Н. (Интегратор Promt98);

3) “Язык программирования Си.” Б.В. Керниган, Д. Ритчи, А. Фьюэр.

Русский перевод: Москва: Финансы и Статистика. 1985 г.;

4) “Основы автоматизации” ч.1, Золотарев В.В., 1978 г.;

5) “Языки программирования” кн.5, Ваулин А.С., 1993 г.;

6) “Языки программирования: разработка и реализация”,

П. Терренс, 1979 г.;

7) “Введение в программирование на языке Ассемблер”

ч.1, Касвандс Э.Г.;

8) “Языки программирования высокого уровня”,

Хротко Г., 1982 г.;

9) “Языки программирования”,

Малютин Э.А., Малютина Л.В., 1982 г.;

10) “Новые языки программирования и тенденции их развития”,

Ушкова В., 1982 г.;

11) “Мир Лиспа” т.1, Хьювенен Э., Сеппенен Й., 1990 г.;

12) “Алгоритмические языки реального времени”, Янг С., 1985 г..