Языки программирования
Сначала всегда разрабатывается алгоритм действий, а потом он записывается на одном из таких языков. В итоге получается текст программы - полное законченное и детальное описание алгоритма на языке программирования. Затем этот текст программы специальными служебными приложениями, которые называются трансляторами, либо переводится в машинный код, либо исполняется.
Языки программирования являются искусственными языками, в них синтаксис и семантика строго определены. Поэтому языки программирования, в отличие от естественных языков, не допускают многозначных и произвольных толкований.
Синтаксис - это набор правил, которые определяют основные внутренние структуры и последовательности символов, допустимых в языке программирования. Семантика - это значения языковых единиц (слов, словосочетаний, предложений).
Составление программ для ЭВМ первого поколения велось исключительно на машинном языке, который представляет собой свод правил кодирования действий ЭВМ с помощью чисел. Для всех цифровых ЭВМ «понятна» только двоичная система счисления (СС), которая для сокращения записи часто заменяется восьмеричной или шестнадцатеричной СС. Восьмеричная и шестнадцатеричная СС используются лишь для облегчения работы программистов. Для технической реализации ЭВМ нужна только двоичная СС.
Более высоким уровнем, по сравнению с машинными языками, являются машинно-ориентированные языки символического кодирования. Основной принцип создания языков символического кодирования состоит в замене машинных кодов на их буквенные обозначения, а также в автоматизации процесса распределения памяти и диагностики ошибок. Такой машинно-ориентированный язык получил название языка Ассемблера.
ЭВМ «понимает» только машинный язык, только команды, операнды и адреса, записанные с помощью двоичных чисел. Поэтому для преобразования программы, написанной на языке Ассемблера, в машинные коды необходим «переводчик».
Перевод программы, написанной на языке Ассемблера, на машинный язык осуществляется с помощью транслятора (переводчика) - специальной программы, которая имеет созвучное с именем языка название: ассемблер.
Недостатком машинно-ориентированных языков является невозмож-ность выполнения программы, составленной для процессора одного типа, на ЭВМ, которая построена на процессоре другого типа. Другими словами, вид программы зависит от типа машины.
На следующем уровне развития языков находятся процедурно-ориентированные языки. В отличие от машинноориентированных языков, синтаксис и семантика этих языков не зависят от состава имеющихся команд конкретной ЭВМ (конкретного процессора). Привязку составленной программы к конкретному типу ЭВМ осуществляет транслятор (программа-переводчик).
После ввода в ОЗУ исходной программы, составленной на языке программирования высокого уровня, осуществляется ее трансляция. В результате создается программа на машинном языке, т.е. программа, состоящая из команд того процессора (той машины), с помощью которого будет решаться задача.
Процесс перевода программы и процесс ее исполнения могут происходить двумя способами. Первый способ, называемый компиляцией, заключается в том, что процесс выполнения программы ЭВМ осуществляется после того, как процесс перевода полностью завершен. Для компиляции характерно то, что осуществляющая ее программа-транслятор во время выполнения программы уже не нужна и потому не находится в ОЗУ, тем самым достигается экономное использование ОЗУ.
Второй способ - интерпретация - предполагает, что отдельные операторы (или другие части исходной программы) сразу после трансляции выполняются, после чего та же процедура совершается над другими операторами и т.д. При интерпретации во время выполнения рабочей программы транслятор находится в ОЗУ, т.е. занимает дополнительный объем оперативной памяти. Кроме того, процесс решения задачи замедляется, так как между отдельными этапами выполнения рабочей программы управление передается транслятору.
Интерпретатор можно сравнить с переводчиком, который выполняет устный синхронный перевод с одного естественного языка на другой (например, перевод кинофильма с английского языка на русский язык). Интерпретатор переводит и сразу выполняет программу последовательно, строчку за строчкой.
Компилятор можно сравнить с переводчиком, который делает письменные перевод статьи или книги. Компилятор перед выполнением программы вначале полностью переводит весь текст программы на машинный язык.
Интерпретатор работает медленнее, чем компилятор, занимает больше места в оперативной памяти. Однако при отладке новых программ удобнее работать с интерпретатором, так как он позволяет после исправления ошибки продолжить выполнение программы с места остановки. При работе с компилятором после устранения ошибки необходимо повторно компилировать программу и запускать ее с самого начала, а не с места расположения обнаруженной ошибки.
Существуют комбинированные способы трансляции и выполнения программ. Например, язык Java позволяет сначала компилировать программу в некоторый промежуточный код (байт-код), а затем выполнять его с помощью интерпретатора (виртуальной Java-машины).
Далее рассмотрим общие характеристики различных языков программирования высокого уровня. При этом язык программирования нужно представлять себе как некоторый транслятор (интерпретатор или компилятор), который переводит программу, написанную на языке программирования, понятном для человека, в машинные коды, с которыми работает ЭВМ.
Запись программы на процедурно-ориентированном языке достаточно близка к общепринятой математической записи, компактна и удобна для восприятия. Следует заметить, что наиболее проста для понимания запись программы на процедурно-ориентированном языке. Наиболее сложна для понимания программа, написанная на машинном языке.
Одним из первых процедурно-ориентированных языков стал язык Фортран (FORmula TRANslation - преобразование формул). Фортран является компилирующим языком. Он просуществовал до наших дней, удерживая одно из первых мест в мире по распространенности. Среди причин такого долголетия можно отметить простую структуру, как самого Фортрана, так и предназначенных для его преобразования в машинные коды трансляторов. Сфера использования Фортран - научные и инженерно-технические вычисления.
Язык Фортран оказал сильное влияние на создание и развитие других языков программирования, например, Фортран заложен в основу диалогового языка Бейсик (BASIC - beginners all-purpose symbolic instruction code). Это переводится так: многоцелевой язык символьных команд для начинающих.
Язык Бейсик позволил привлечь к изучению технологии программирования большое число людей из различных предметных областей (непрофессионалов-программистов). В момент его создания он предназначался в основном для обучения программированию. Современные версии языка Бейсик позволяют решать сложные задачи на профессиональном уровне.
Первые версии Бейсика являлись интерпретаторами, что позволяло в диалоговом режиме быстро редактировать новые программы. Последние версии Бейсика позволяют использовать оба вида трансляции: и компиляцию, и интерпретацию. При разработке программ язык работает как интерпретатор, а для получения конечного варианта программа компилируется в машинные коды. Такой вариант позволяет получить высокую скорость отладки программы и одновременно большую скорость работы конечного продукта.
Алгол-60 (ALGOritmic Language - алгоритмический язык) - это более совершенный язык, чем Фортран. Решение экономических задач (учет материальных ценностей, выпущенной предприятием продукции, личного состава) в 60х гг. XX столетия удобно было выполнять на языке Кобол.
Языки Лисп (Lisp) и Пролог (Prolog) были разработаны для решения задач, относящихся к искусственному интеллекту. Эти языки позволяют обрабатывать текстовую (символьную) информацию, решать логические и математические задачи.
Язык Пролог является непроцедурным языком логического программирования. Он выбран основным языком при разработке ЭВМ пятого поколения, которые будут обладать искусственным интеллектом.
Язык ЛОГО (LOGO) используется для обучения детей основам программирования. Характерной особенностью языка является применение так называемой «черепашьей» графики (движущаяся черепаха оставляет за собой след в виде рисунка).
Обилие алгоритмических языков, появившихся в период разработки и внедрения второго поколения ЭВМ, объясняется невозможностью ни одним из существовавших языков рационально решать разнообразные задачи. Третье поколение ЭВМ поставило на повестку дня вопросы поиска нового подхода к созданию универсального алгоритмического языка.
Одной из попыток такого рода является создание фирмой IBM языка ПЛ/1 (Programming Language). Он основан на языках Фортран, Алгол и Кобол.
В 1971 г. появилась публикация с описанием языка Паскаль (Pascal), который является преемником Алгола-60. Он имеет конструкции, аналогичные существующим в ПЛ/1 и Алголе-60, однако более лаконичен. В Паскале проводятся идеи структурного программирования. Благодаря хорошей структурированности программ, написанных на языке Паскаль, над разработкой сложных проектов могут одновременно работать несколько программистов.
На основе языка Паскаль в конце 70-х гг. XX в. по заказу Министерства обороны США во Франции был разработан язык Ада (Ada). Язык назван в честь первой программистки Augusta Ada Byron, работавшей с Ч. Бэббиджем. Это хорошо структурированный язык, однако слишком громоздкий и многословный.
Назначение языка Ада - разработка программного обеспечения для компьютерных систем, встроенных в самонаводящиеся ракеты, космические объекты, самолеты. Эти системы работают в реальном масштабе времени, где накладываются жесткие требования на быстродействие. Язык Ада поддерживает параллельное выполнение задач в многомашинных и в многопроцессорных вычислительных системах. В этом случае программа делится на части и одновременно выполняется на нескольких процессорах.
Развитие современной вычислительной техники характеризуется тенденцией распространения многопроцессорных компьютеров и вычислительных сетей. Поэтому в области программного обеспечения вызывают все больший интерес языки, поддерживающие разработку распределенных программ (т.е. программ, которые выполняются с помощью нескольких процессоров или машин).
Одним из таких языков является Linda - язык, предназначенный для параллельной обработки данных. При использовании языка Linda вычислительный процесс делится на группу процессов, среди которых выделяется главный. Указанные процессы осуществляются одновременно на нескольких процессорах и синхронизируются один относительно другого.
Кроме языков Ада и Линда, существуют и другие языки параллельного программирования, например, Erlang, Modula, Occam.
Язык СИ достаточно полно отражает возможности современных компьютеров, позволяя писать эффективные программы, не прибегая к сложным конструкциям языков Ассемблера. На этом языке написана популярная операционная система UNIX.
Перспективным направлением дальнейшего развития технологии программирования явилось создание объектноориентированных языков.
Объекты представляют собой многократно используемые программные модули. Структурно объекты состоят из двух частей: методов и переменных.
Методы представляют собой набор процедур и функций, определяющих алгоритм работы объекта. Переменные могут содержать как простые данные (числа, массивы, текст и т.д.), так и информацию сложной структуры (графика, звуки и т.д.).
Однотипные объекты объединяются в классы.
Объектно-ориентированное программирование (ООП) характеризуется следующими тремя признаками: инкапсуляцией, наследованием и полиморфизмом.
С помощью инкапсуляции данные одного объекта могут быть защищены от других объектов. Такое «сокрытие» информации позволяет объектам спрятать их внутреннее устройство. При этом объект можно использовать, ничего не зная о механизме его работы и ненужных деталях.
При инкапсуляции объект заключается в непроницаемую оболочку, и только его внешний вид доступен для обозрения. Объект отвечает за корректность реализации своей функциональной способности, а вызывающая объект программа - за корректность использования объекта.
С помощью механизма наследования одни классы объектов могут происходить от других. Дочерний класс способен унаследовать от своего родительского класса все его методы и данные, причем потомок может унаследовать способности и от нескольких родителей.
Полиморфизм - присвоение единого имени процедуре, которая передается по иерархии объектов, с выполнением этой процедуры способом, соответствующим каждому объекту в иерархии.
Первым объектно-ориентированным языком программирования был Simula 67 (Симула). Он разработан в конце 60-х гг. XX в. в Норвегии для решения задач моделирования.
Первоначально прохладному отношению к языку Симула способствовало то обстоятельство, что он был реализован как интерпретируемый (а не компилируемый) язык, что в 60-е гг. прошлого столетия было существенным недостатком, так как интерпретация связана со снижением скорости выполнения программ.
Типичные современные объектно-ориентированные языки, такие как Си++ или Smalltalk, содержат инструменты, которые максимально облегчают повторное использование созданных программных модулей.
Язык Smalltalk - один из наиболее развитых и мощных объектно-ориентированных языков программирования. В нем присутствуют все основные признаки объектно-ориентированного языка, в том числе наследование, полиморфизм и инкапсуляция данных.
Дельфи (Delphi) разработан фирмой Borland на базе языка Турбо-Паскаль. Чаще всего этот язык программирования используется для работы с базами данных по технологии клиент-сервер. Основной упор в Дельфи делается на максимальном повторном использовании имеющихся программ. Это позволяет разработчикам строить приложения из уже существующих объектов, а также дает им возможность создавать свои собственные объекты.
Первая версия Visual Basic появилась в 1991 г. Он близок к объектно-ориентированным языкам, но по-прежнему остается процедурным языком.
Этот язык широко распространен, он интегрирован в пакеты Microsoft Office: СУБД MS Access, электронные таблицы MS Excel, текстовый редактор MS Word.
Язык гипертекстовой разметки HTML (HyperText Markup Language) был предложен Тимом Бернерсом-Ли в 1989 г. в качестве основного компонента технологии распределенной гипертекстовой системы World Wide Web (WWW).
Результирующий документ, составленный на языке HTML, кроме текста может содержать иллюстрации, аудио- и видеофрагменты. В основу гипертекстовой разметки положена теговая модель описания документа.
Теги (иначе таги или тэги) - это скобки, между которыми записаны команды, указывающие, как отображать данный фрагмент текста Web-страницы.
Язык DHTML (Dynamic Hyper Text Markup Language) является расширением, развитием языка HTML. Он позволяет создавать динамические, движущиеся объекты, подсвечивающиеся кнопки, бегущие строки и др.
Для придания Web-страницам интерактивности используется язык PERL. Язык является интерпретируемым. Он создан программистом Лари Уоллом (Larry Wall) для обработки текстов и файлов. PERL расшифровывается, как Practical Extraction and Report Language (язык для практического извлечения данных и составления отчетов).
С помощью PERL Web-дизайнеры реализуют интерактивные средства Интернета гостевые книги, чаты, поисковые системы, доски объявлений, службы рассылок виртуальных открыток и др. Пользователь имеет возможность заполнить соответствующие формы на Web-странице, и введенная информация будет обработана с помощью программ, написанных на языке PERL.
Сходными возможностями с языком PERL обладает язык PHP (Power Hypertext Preprocessor). Однако последний был разработан для преимущественного использования в сетевых технологиях (для создания интерактивных средств). Язык РНР служит для создания сценариев, выполняемых на стороне сервера. Первая версия языка РНР (Пи-Эйч-Пи) была разработана в 1994 г. программистом Расмусом Лердорфом (Rasmus Lerdorf). В разработке последующих версий участвовало большое число специалистов.
Язык моделирования виртуальной реальности Virtual Reality Modelling Language (VRML) предназначен для описания сред, имитирующих трехмерное пространство. Он является расширением гипертекстового языка разметки HTML, используемого для описания плоских изображений.
Данный язык не только позволяет создать трехмерную среду, но и указать места расположения источников освещения и точек обзора. Более того, VRML позволяет пользователю перемещаться в созданной виртуальной реальности.
Чаще всего язык VRML применяется в архитектуре для моделирования и проектирования зданий и помещений, в торговле - для выбора вариантов удобной компоновки мебели и оборудования, в химии - для визуализации молекул в процессе синтеза.
Язык Java (произносится джава или ява) предназначен для составления программ (приложений), которые работают в сетях. Программы, написанные на языке Java, часто используются для создания динамической рекламы в глобальной сети (анимация, телетайпные ленты, мерцающие надписи). Java-приложения «оживляют» статические картинки Web-страниц и тем самым привлекают внимание пользователей.
Язык Java является объектно-ориентированным языком. Java позволяет разрабатывать и настраивать приложения (синоним слова «программы»). В то же время Java во многом сохраняет синтаксис и стиль программирования языков С и C++.
Достоинством языка является то, что он независим от конкретной архитектуры ЭВМ, и Java-приложения могут работать на различных типах ЭВМ (на различных процессорах), под управлением различных операционных систем: Windows, UNIX и Macintosh и др. Такое свойство особенно привлекательно при работе в глобальной сети, состоящей из множества ЭВМ, реализованных на различных платформах.
Язык поддерживает технологию клиент-сервер. С помощью языка Java сложные приложения разбиваются на небольшие модули, которые называются компонентами (приложениями) или апплетами (applets). Компоненты располагаются на сервере и при работе передаются по сети на ЭВМ клиента (пользователя), где и исполняются.
При работе интерпретатора языка Java исходные тексты транслируются (преобразуются) в псевдокод виртуальной Java- машины. Заметим, что виртуальная Java-машина фактически не существует в виде реальных микросхем и других устройств, а представляет собой программный эмулятор (имитатор), выполненный на имеющейся у пользователя аппаратной платформе. Псевдокод чаще всего называют байт-кодом.
Программный эмулятор виртуальной Java-машины включен в состав распространенных программ-исследователей глобальных сетей (браузеров), таких как Microsoft Интернет Explorer и Netscape Navigator.
Корпорации SUN Microsystems и Netscape Communications создали язык JavaScript. JavaScript относится к языкам сценариев, которые позволяют «склеивать» готовые компоненты (вызывать подпрограммы при совершении каких-то событий). JavaScript - не единственный язык управления сценариями просмотра документов. Язык VBScript, созданный на основе языка Visual Basic, используется для решения таких же задач.
Управлять сценарием просмотра (т.е. последовательностью просмотра) можно и с помощью Java-апплетов. Активные объекты Java выполняются виртуальной машиной Java, которая не позволяет загруженному байт-коду получить доступ к другим частям компьютера.
В технологии ActiveX применяется иной подход. Элементы управления ActiveX могут непосредственно обращаться к жесткому диску и другим устройствам, что теоретически дает возможность создать элемент управления, который опасен для данного компьютера (например, можно тайно собирать и передавать информацию об используемом программном обеспечении).
Языки программирования (ЯП) по своим возможностям и времени создания принято делить на несколько поколений (Generation Language GL). Каждое из последующих поколений по своей функциональной мощности качественно отличается от предыдущего. К сегодняшнему дню насчитывается пять поколений ЯП.
В первое поколение входят языки, созданные в начале 1950-х гг., когда первые компьютеры только появились на свет. Это был первый язык ассемблера, созданный по принципу «одна инструкция - одна строка».
Расцвет второго поколения языков программирования пришелся на конец 1950-х - начало 60-х гг. Тогда был разработан символический ассемблер, в котором появилось понятие переменной. Он стал первым полноценным языком программирования. Благодаря его возникновению заметно возросли скорость разработки и надежность программ.
Появление третьего поколения языков программирования принято относить к 1960-м гг. В это время родились универсальные языки высокого уровня, с их помощью удается решать задачи из любых областей. Такие качества новых языков, как относительная простота, независимость от конкретного компьютера и возможность использования мощных синтаксических конструкций, позволили резко повысить производительность труда программистов. Понятная большинству пользователей структура этих языков привлекла к написанию небольших программ (как правило, инженерного или экономического характера) значительное число специалистов из некомпьютерных областей. Подавляющее большинство языков этого поколения успешно применяется и сегодня.
С начала 1970-х гг. по настоящее время продолжается период языков четвертого поколения. Эти языки предназначены для реализации крупных проектов, повышения их надежности и скорости создания. Они обычно ориентированы на специализированные области применения, где хороших результатов можно добиться, используя не универсальные, а проблемно-ориентированные языки, оперирующие конкретными понятиями узкой предметной области. Как правило, в эти языки встраиваются мощные операторы, позволяющие одной строкой описать такую функциональность, для реализации которой на языках младших поколений потребовались бы тысячи строк исходного кода.
Рождение языков пятого поколения произошло в середине 1990-х гг. К ним относятся также системы автоматического создания прикладных программ с помощью визуальных средств разработки, без знания программирования. Главная идея, которая закладывается в эти языки, - возможность автоматического формирования результирующего текста на универсальных языках программирования (который потом требуется откомпилировать). Инструкции же вводятся в компьютер в максимально наглядном виде с помощью методов, наиболее удобных для человека, не знакомого с программированием.
Сведения о некоторых языках программирования приведены в табл. 3.6.1.