2.12. Основы и уровни Языков программирования

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

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

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

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

Процесс поиска ошибок в программе называется тестированием, процесс уст­ранения ошибок – отладкой.

Уровни языков программирования

Процессоры разных типов  имеют разные наборы команд. Если язык программи­рования ориентирован на конкретный тип процессора и учитывает его особенности, то он называется языком программирования низкого уровня. В данном случае «низкий уровень» не значит «плохой». Имеется в виду, что операторы языка близки к машин­ному коду и ориентированы на конкретные команды процессора.

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

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

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

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

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

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

Языки программирования принято делить на пять поколений.

В первое поколе­ние входят языки, созданные в начале 1950-х годов, когда первые компьютеры только появились на свет. Это был первый язык ассемблера, созданный по принципу «одна ин­струкция – одна строка».

Расцвет второго поколения языков программирования пришелся на конец 1950-х – начало 1960-х годов. Тогда был разработан символический ассемблер, в котором появилось понятие переменной. Он стал первым полноценным языком программирования. Благодаря его возникновению заметно возросли скорость разработки и надежность программ.

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

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

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

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

Fortran (Фортран). Это первый компилируемый язык, созданный Джимом Бэ-кусом в 1950-е годы. Программисты, разрабатывавшие программы исключительно на ас­семблере, выражали серьезное сомнение в возможности появления высокопроизводи­

тельного языка высокого уровня, поэтому основным критерием при разработке компи­ляторов Фортрана являлась эффективность исполняемого кода.

Хотя в Фортране впервые был реализован ряд важнейших понятий программи­рования, удобство создания программ было принесено в жертву возможности получе­ния эффективного машинного кода. Однако для этого языка было создано огромное ко­личество библиотек, начиная от статистических комплексов и кончая пакетами управ­ления спутниками. Поэтому Фортран продолжает активно использоваться во многих организациях, а сейчас ведутся работы над очередным стандартом Фортрана F2k. Име­ется стандартная версия Фортрана – HPF (High Performance Fortran) для параллельных суперкомпьютеров со множеством процессоров.

Cobol (Кобол). Это компилируемый язык для решения бизнес-задач в экономи­ческой области, разработанный в начале 1960-х годов. Он отличается большой «много-словностно» – его операторы иногда выглядят как обычные английские фразы. В Ко­боле были реализованы очень мощные средства работы с большими объемами данных, хранящимися на различных внешних носителях. На этом языке создано очень много приложений, которые активно эксплуатируются и сегодня.

Algol (Алгол). Компилируемый язык, созданный в 1960 году. Он был призван заменить Фортран, но из-за более сложной структуры не получил широкого распро­странения. В 1968 году была создана версия Алгол 68, по своим возможностям и сего­дня опережающая многие языки программирования, однако из-за отсутствия достаточ­но эффективных компьютеров для нее не удалось своевременно создать хорошие ком­пиляторы.

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

Basic (Бейсик). Для этого языка имеются и компиляторы, и интерпретаторы, а по популярности он занимает первое место в мире. Он создавался в 1960-х годах в каче­стве учебного языка и очень прост в изучении.

С (Си). Данный язык был создан в лаборатории Bell и первоначально не рас­сматривался как массовый. Он планировался для замены ассемблера, чтобы иметь воз­можность создавать столь же эффективные и компактные программы и в то же время не зависеть от конкретного типа процессора.

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

C++ (Си++). Си++ – это объектно-ориентированное расширение языка Си, соз­данное Бьярном Страуструпом в 1980 году. Множество новых мощных возможностей, позволивших резко повысить производительность программистов, наложилось на унаследованную от языка Си определенную низкоуровневость, в результате чего соз­дание сложных и надежных программ потребовало от разработчиков высокого уровня профессиональной подготовки.

Java (Джава, Ява). Этот язык был создан компанией Sun в начале 1990-х годов на основе Си++. Он призван упростить разработку приложений на основе Си++ путем ис­ключения из него всех низкоуровневых возможностей. Но главная особенность этого языка – компиляция не в машинный код, а в платформно-независимый байт-код (каж­дая команда занимает один байт). Этот байт-код может выполняться с помощью интер­претатора – виртуальной Java-машины JVM (Java Virtual Machine), версии которой созданы сегодня для любых платформ.

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

Особое внимание в развитии этого языка уделяется двум направлениям: под­держке всевозможных мобильных устройств и микрокомпьютеров, встраиваемых в бы­товую технику (технология Jini), а также созданию платформно-независимых про­граммных модулей, способных работать на серверах в глобальных и локальных сетях с различными операционными системами (технология Java Beans). Пока основной недос­таток этого языка – невысокое быстродействие.