машинные коды языки программирования высокого уровня языки ассемблера
В чем разница между машинным кодом и языком сборки
Содержание:
Ключевые области покрыты
1. Что такое машинный код
— определение, функциональность
2. Что такое язык ассемблера
— определение, функциональность
3. В чем разница между машинным кодом и языком сборки
— Сравнение основных различий
Основные условия
Ассемблер, ассемблер, машинный код, языки программирования
Что такое машинный код
Программист пишет компьютерные программы, используя языки программирования высокого уровня. Эти языки имеют простой и легко понятный синтаксис, похожий на английский язык. C, C ++, Python, Java являются примерами языков программирования высокого уровня. Тем не менее, процессор не понимает эти программы или исходные коды. Поэтому необходимо преобразовать эти программы высокого уровня в машинно-понятный машинный код. Компилятор или интерпретатор выполняет это преобразование.
Рисунок 1: Машинный код
Мы также называем машинный код как машинный язык, Он состоит из двоичных цифр, которые являются нулями и единицами. «Один» указывает на истинное состояние, а «ноль» указывает на ложное состояние.
Что такое язык ассемблера
Ассемблер является промежуточным языком между языком высокого уровня и машинным кодом. Это на один уровень выше машинного кода и на один уровень ниже языков высокого уровня. Более того, он имеет синтаксис, похожий на английский, но он сложнее, чем языки программирования высокого уровня.
Рисунок 2: Язык ассемблера
Язык ассемблера ближе к аппаратному уровню. Поэтому он считается языком низкого уровня. При этом программист должен хорошо понимать архитектуру компьютера и структуру регистра для написания программ на ассемблере. Затем ассемблер преобразует программу на ассемблере в машинный код. Следовательно, этот язык более полезен для построения встроенных систем реального времени.
Разница между машинным кодом и языком ассемблера
Определение
Синтаксис
Машинный код состоит из двоичных файлов, которые являются нулями и единицами. Язык ассемблера, с другой стороны, следует синтаксису, подобному английскому языку. Следовательно, это является основным отличием машинного кода от языка ассемблера.
усвояемость
Только процессор понимает машинный код; однако программист понимает язык ассемблера.
зависимость
Другое различие между машинным кодом и языком ассемблера состоит в том, что машинный код зависит от платформы или операционной системы. Но язык ассемблера состоит из набора стандартных инструкций.
использование
Учитывая использование, ЦП может напрямую выполнять машинный код для выполнения определенных задач в компьютерной программе. С другой стороны, системы реального времени и встроенные системы на основе микроконтроллеров являются некоторыми примерами приложений, использующих язык ассемблера.
Заключение
Вкратце, язык ассемблера на один уровень опережает машинный код. Основное различие между машинным кодом и языком ассемблера состоит в том, что машинный код представляет собой язык, состоящий из двоичных файлов, которые могут непосредственно выполняться компьютером, в то время как язык ассемблера является языком программирования низкого уровня, для которого требуется программное обеспечение, называемое ассемблером, для преобразования его в Машинный код.
Ссылка:
1. «Машинный код». Википедия, Фонд Викимедиа, 24 сентября 2018 г.
Машинные языки, языки ассемблера и языки высокого уровня
Лекция 1
ВВЕДЕНИЕ. ОСНОВЫ ПРОГРАММИРОВАНИЯ
Для работы с микроконтроллерами сегодня адаптировано множество традиционных языков программирования и их вариантов. Тем не менее основным языком для профессионального программирования микроконтроллеров является С или С++.
Основной задачей курса является изучение применяемого на сегодняшний день повсеместно объектно-ориентированного подхода при проектировании и разработке приложений с использованием языка С++, а также изучение методов программирования программ под ОС Microsoft Windows.
Инструментальное программное обеспечение
Инструментальное программное обеспечение обеспечивает создание новых программных продуктов для ПК. Инструментальное программное обеспечение представлено языками и системами программирования.
Язык программирования – формальная знаковая система, предназначенная для описания алгоритмов в форме, которая удобна для исполнителя (например, компьютера).
Составными частями языка программирования являются:
— алфавит – конечный набор элементарных символов, разрешенных для использования;
— синтаксис – набор правил образования языковых конструкций и символов алфавита;
— семантика – набор правил однозначного толкования языковых конструкций.
Система программирования – это система разработки программного обеспечения на каком-либо языке программирования, включающая в себя следующие компоненты:
— интегрированную среду программирования;
— редактор текстов программ,
Интегрированная среда программирования (от англ. Integrated Development Environment, IDE) – это программа, имеющая встроенный редактор текстов, подсистему работы с файлами, транслятор, встроенный отладчик, справочную систему, некоторые библиотеки функций. Многие современные среды разработки также включают браузер классов, инспектор объектов и диаграмму иерархии классов — для использования при объектно-ориентированной разработке программного обеспечения.
Транслятор – программа, которая преобразует команды программ, написанных на языках высокого уровня, в команды, записанные в машинных кодах, использующих двоичный алфавит (в последовательность чисел понятную ПК). Трансляторы бывают двух видов: интерпретаторы и компиляторы. Оба вида трансляторов выполняют одну и туже операцию, но делают это по-разному.
Интерпретаторы, преобразуя команду на машинный язык, сразу же дают указания на ее выполнение, не записывая перевод. Так происходят с каждой командой программы. Программа будет выполнена машиной только при наличие интерпретатора, который от строки к строке переводит команды и сразу же их выполняет. При повторном выполнении программы снова выполняется перевод.
Компилятор же не выполняет команды, а просто переводит всю программу на машинный язык и записывает свой перевод в специальную, так называемую, исполнимую программу, программу, записанную в двоичном коде.
В простейшем случае интерпретатор читает исходный текст программы по одной строке за раз, выполняет эту строку и только после этого переходит к следующей. Компилятор читает сразу всю программу и конвертирует ее в объектный код (машинный двоичный код). Когда программа скомпилирована, в ее коде уже нет отдельных строк исходного кода.
Машинные языки, языки ассемблера и языки высокого уровня
На сегодня существуют сотни языков программирования. Их можно разделить на три основных типа:
– языки высокого уровня
Любой компьютер может непосредственно понимать лишь свой собственный машинный язык. Он определяется при проектировании аппаратных средств этого компьютера. Машинные языки в общем случае содержат строки чисел (в конечном счете сокращенные до единиц и нулей), которые являются командами компьютеру на выполнение большинства элементарных операций. Машинные языки машинно-зависимы, т.е. каждый машинный язык может быть использован только на компьютере определенного типа.
Ассемблер – средство, упрощающее написание программ путем написания машинных кодов в некоторых мнемонических обозначениях с последующим автоматическим переводом. Для преобразования программ на языке ассемблера в машинный язык были разработаны программы трансляции, называемые ассемблерами. Дальнейшее развитие привело к созданию первых языков программирования высокого уровня, в которых длинные и сложные последовательности машинных кодов были заменены одним обозначающих их словом – оператором.
Язык С является базисным для языка программирования С++. Поэтому кратко остановимся на предыстории этого языка.
Язык программирования С был разработан в лабораториях Bell Laboratories в США в период с 1969 по 1973 год Кеном Томпсоном и Деннисом Ритчи (практически в одно время с Паскалем) для организации операционной системы UNIX. Предшественниками языка С явились языки Algol 60, CPL, BCPL и B.
Для выполнения этой работы Ритчи нуждался в таком языке программирования, который был бы кратким, а так же мог бы обеспечивать эффективное управление аппаратными средствами и создание компактных, быстро работающих программ. Традиционно такие потребности программистов удовлетворял язык ассемблера, который тесно связан с внутренним машинным языком компьютера. Однако язык ассемблера – это язык низкого уровня, т.е. он привязан к определённому типу компьютера. Поэтому, если программу на языке ассемблера необходимо перенести на компьютер другого типа, то её приходится переписывать заново на другом языке ассемблера. Операционная система UNIX предназначалась для работы на разнообразных типах компьютеров (или платформах). А это предполагало использование языка высокого уровня, который ориентирован на решение задач, а не на конкретное программное обеспечение. Это обеспечивается использованием специальных программ (компиляторов), которые переводят программу с языка высокого уровня на машинный язык. Поэтому программу на языке высокого уровня можно использовать на разных платформах, применяя соответствующий компилятор.
|
Рисунок 1 – Схема развития языка программирования С++
Денис Ритчи создал независимость языка от конкретного оборудования и сохранил возможность прямого доступа к оборудованию. Денис Ритчи был признанным специалистом в области системного программирования, а именно языков программирования, операционных систем, и генераторов программ. Язык С представляет собой язык программирования относительно низкого уровня, что позволяло контролировать каждую мелочь в работе алгоритма и достигать максимальной эффективности. В то же время в С заложены принципы языка высокого уровня, что позволяет избежать зависимости программ от особенностей архитектуры конкретного компьютера. Это повышало эффективность процесса программирования.
Язык программирования С – стандартизованный процедурный язык программирования, обеспечивающий структурный стиль программирования.
Особенность языка С заключается в том, что будучи языком высокого уровня, он сохранил многие черты языка низкого уровня. Язык С расположен где-то между языками очень высокого уровня и языками низкого уровня, и в этом его сильные и одновременно слабые стороны. Как и язык ассемблера (язык низкого уровня), язык программирования С может непосредственно управлять памятью компьютера. С другой стороны, С обладает чертами языков высокого уровня, поэтому программы на языке С читать и создавать легче, чем программы на языке ассемблера. Язык С является очень удобным для написания системных программ, но в программах на языке С для иных целей зачастую трудней разобраться, нежели в программах, написанных на других языках.
Чтобы преодолеть эти и другие недостатки языка С был разработан на его основе язык программирования С++ сотрудником научно-исследовательского центра AT&T Bell Laboratories (Нью-Джерси, США) Бьярном Страуструпом в 1979 году. Первоначальное название «С++ с классами» было изменено на С++ в 1983 году. С++ обеспечивает возможность ООП
Существует множество различных реализаций для С++. Каждая из них имеет свои достоинства и недостатки. Наибольшей популярностью пользуются реализации этого языка фирм Borland – Turbo C++, C++ Builder и Microsoft – Visual C++, а также Symantec – Symantec C++.
С++ обеспечивает концептуальный фундамент, на который опираются другие языки программирования и многие современные средства обработки данных. Потомками С++ стали такие почитаемые языки, как С# (С Sharp от Microsoft) и Java (от Sun Microsystems), используемые для написания web-приложений. C-подобный синтаксис имеют также языки PHP, Java Script, Nemerle, D.
Информационные технологии копия 2
Языки программирования
Как мы уже знаем, компьютерная программа представляет собой логически упорядоченную последовательность команд, предназначенных для управления компьютером. Процессор компьютера – это большая интегральная схема. Все данные и команды он получает в виде электрических сигналов. В двоичном коде наличие сигнала описывается понятием «1», а его отсутствие – понятием «0». Команды, обрабатываемые процессором, можно интерпретировать как ряд чередующихся определенным образом единиц и нулей. То есть любая команда преобразуется в двоичное число. Таким образом, процессор исполняет программы, представляющие собой последовательность чисел и называемые машинным кодом.
Писать программы в машинных кодах очень сложно, причем с ростом размера программы эта задача усложняется. В компьютерах первого поколения использовались программы, написанные в машинных кодах, причем для каждого компьютера существовал свой собственный машинный код. Числовая кодировка команд, адресов ячеек и обрабатываемых данных, зависимость вида про граммы от ее места в памяти не давали возможность следить за смыслом программы. Это во многом ограничивало область применения компьютеров первого поколения. В тот период (начало 50-х гг.) средства программирования и программное обеспечение только зарождались и были еще не развиты. Для того чтобы сделать программу читабельной и иметь возможность следить за ее смысловой структурой, придумали символический язык ассемблер, близкий к машинному (конец 50-х – начало 60-х гг.), в котором появилось понятие переменной. Ассемблер стал первым полноценным языком программирования. Благодаря этому заметно уменьшилось время разработки и возросла надежность программ. Для записи кодов операций и обрабатываемой информации в ассемблере используются стандартные обозначения, позволяющие записывать числа и текст в общепринятом Виде, для кодов команд приняты мнемонические обозначения для обозначения величин, размещаемых в памяти, можно применять имена. После ввода программы ассемблер сам заменяет символические имена на адреса памяти, а символические коды команд на числовые. Использование ассемблера сделало процесс программирование более наглядным. Дальнейшее развитие этой идеи привело к созданию языков программирования высокого уровня, в которых длинные и сложные последовательности машинных кодов были заменены одним единственным обозначающим их словом – операторы.
Понятие «язык программирования»
Сегодня практически все программы создаются с помощью языков программирования. Теоретически программу можно написать и на естественном языке (говорят: программирование на метаязыке), но из-за неоднозначности естественного языка автоматически перевести такую программу в машинный код пока невозможно.
Языки программирования – это формальные искусственные языки. Как и естественные языки, они имеют алфавит, словарный запас, грамматику и синтаксис, а также семантику.
Алфавит – разрешенный к использованию набор символов, с помощью которого могут быть образованы слова и величины данного языка.
Синтаксис – система правил, определяющих допустимые конструкции языка программирования из букв алфавита.
Семантика – система правил однозначного толкования каждой языковой конструкции, позволяющих производить процесс обработки данных.
Взаимодействие синтаксических и семантических правил определяет основные понятия языка, такие как операторы, идентификаторы, константы, переменные, функции, процедуры и т.д. В отличие от естественных, язык программирования имеет ограниченный запас слов (операторов) и строгие правила их написания, а правила грамматики и семантики, как и для любого формального языка, явно однозначно и четко сформулированы.
Языки программирования, ориентированные на команды процессора и учитывающие его особенности, называют языками низкого уровня. «Низкий уровень» не означает неразвитый, имеется в виду, что операторы этого языка близки к машинному коду и ориентированы на конкретные команды процессора.
Языком самого низкого уровня является ассемблер. Программа, написанная на нем, представляет последовательность команд машинных кодов, но записанных с помощью символьных мнемоник. С помощью языков низкого уровня создаются компактные оптимальные программы, так как программист получает доступ ко всем возможностям процессора. С другой стороны, при этом требуется хорошо понимать устройство компьютера, а использование такой программы на компьютере с процессором другого типа невозможно. Такие языки программирования используются для написания небольших системных приложений, драйверов устройств, модулей стыковки с нестандартным оборудованием, когда важнее компактность, быстродействие, прямой доступ к аппаратным ресурсам.
Языки программирования, имитирующие естественные, обладающие укрупненными командами, ориентированные «на человека», называют языками высокого уровня. Чем выше уровень языка, тем ближе структуры данных и конструкции, использующиеся в программе, к понятиям исходной задачи. Особенности конкретных компьютерных архитектур в них не учитываются, поэтому исходные тексты программ легко переносимы на другие платформы, имеющие трансляторы этого языка. Разрабатывать программы на языках высокого уровня с помощью понятных и мощных команд значительно проще, число ошибок, допускаемых в процессе программирования, намного меньше. В настоящее время насчитывается несколько сотен таких языков (без учета их диалектов).
Таким образом, языки программирования высокого уровня, ориентированные на решение больших содержательных прикладных задач, являются аппаратно-независимыми и требуют использования соответствующих программ-переводчиков для преобразования текста программы в машинный код, который в итоге и обрабатывается процессором.
Компиляторы и интерпретаторы
С помощью языка программирования создается текст программы, описывающий разработанный алгоритм. Чтобы программа была выполнена, надо либо весь ее текст перевести в машинный код (это действие и выполняет программа – компилятор) и затем передать на исполнение процессору, либо сразу выполнять команды языка, переводя на машинный язык и исполняя каждую команду поочередно (этим занимаются программы – интерпретаторы).
Интерпретатор функционирует следующим образом: берет очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет. После успешного выполнения текущей команды интерпретатор переходит к анализу и исполнению следующей. Если один и тот же оператор в программе выполняется несколько раз, интерпретатор всякий раз воспринимает его так, будто встретил впервые. Поэтому программы, в которых требуется произвести большой объем повторяющихся вычислений, будут работать медленно. Для выполнения программы на другом компьютере также необходимо установить интерпретатор, так как без него программа представляет собой набор слов и работать не может.
Компиляторы полностью обрабатывают весь текст программы (его называют исходным кодом или source code). Они осуществляют поиск синтаксических ошибок, выполняют семантический анализ и только затем, если текст программы в точности соответствует правилам языка, его автоматически переводят (транслируют) на машинный язык (говорят: генерируют объектный код или object code). Нередко при этом выполняется оптимизация с помощью набора методов, позволяющих повысить быстродействие программы. Сгенерированный объектный код обрабатывается специальной программой сборщиком или редактором связей, который производит связывание объектного и машинного кодов. Текст программы преобразуется в готовый к исполнению ЕХЕ-файл (исполнимый код), его можно сохранить в памяти компьютера или на диске. Этот файл имеет самостоятельное значение, и может работать под управлением операционной системы. Его можно перенести на другие компьютеры с процессором, поддерживающим соответствующий машинный код.
Основной недостаток компиляторов – трудоемкость трансляции языков программирования, ориентированных на обработку данных сложной структуры, заранее неизвестной или динамически меняющейся во время работы программы. Для таких программ в машинный код вводятся дополнительные проверки и анализ наличия ресурсов операционной системы, средства динамического захвата и освобождения памяти компьютера, что на уровне статически заданных машинных инструкций осуществить достаточно сложно, а для которых задач практически невозможно.
С помощью интерпретатора, наоборот, для исследования содержимого памяти допустимо в любой момент прервать работу программы, организовать диалог с пользователем, выполнить любые сложные преобразования данных и при этом постоянно контролировать программно-аппаратную среду, что и обеспечивает высокую надежность работы программы. Интерпретатор при выполнении каждой команды подвергает проверке и анализу необходимые ресурсы операционной системы, при возникающих проблемах выдает сообщения об ошибках. В реальных системах программирования смешаны технологии компиляции и интерпретации. В процессе отладки программу можно выполнять по шагам (трассировать), а результирующий код не обязательно будет машинным, он может быть, например, аппаратно-независимым промежуточным кодом абстрактного процессора, который в дальнейшем будет транслироваться в различных компьютерных архитектурах с помощью интерпретатора или компилятора в соответствующий машинный код.
Процесс создания программы включает:
Все перечисленные выше действия требуют наличия специальных программных средств.
Совокупность этих программных средств входит в состав системы программирования:
Классификация и обзор языков программирования
Современное состояние языков программирования можно представить в виде следующей классификации (рис. 2).
Процедурное программирование
Процедурное или императивное (от лат. Imperativus – повелительный) программирование есть отражение фон Неймановской архитектуры компьютера. Программа на процедурном языке состоит из последовательности команд, определяющих процедуру решения задачи. Основным является оператор присваивания, предназначенный для определения и изменения содержимого памяти компьютера. Концепция памяти как места хранения данных, значения которых можно изменять операторами программы, является фундаментальным в императивном программировании.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, т.е. программа последовательно обновляет содержимое памяти, изменяя его от исходного состояния до результирующего.
Кобол ( СОmmon Вusiness Oriented Language – общепринятый деловой язык) – язык программирования, ориентированный на решение задач обработки данных. Широко используется для решения учетно-экономических и управленческих задач. Разработан в США в 1958-1960 гг. Программа на Коболе имеет вид ряда предложений на английском языке и напоминает обычный текст. Группы последовательно записанных операторов объединяются в предложения, предложения – в параграфы, параграфы – в· секции. Программист присваивает параграфам и секциям имена (метки), что облегчает непосредственное обращение к нужному участку программы. В СССР был принят русский вариант языка. В Коболе были реализованы мощные средства работы с большими объемами данных, хранящимися на различных внешних носителях. На этом языке создано много приложений; некоторые из них активно эксплуатируются и сейчас. Достаточно сказать, что одной из высокооплачиваемых категорией граждан в США являются программисты на Коболе.
Алгол (ALGOrithmic Language) разработан группой зарубежных специалистов в 1960 г., явился результатом международного сотрудничества конца 50-х гг. (Алгол-60). Алгол предназначался для записи алгоритмов, построенных в виде последовательности процедур, применяемых при решении поставленных задач. Специалисты-практики воспринимали этот язык неоднозначно, но тем не менее, он как признанный международный язык сыграл большую роль в становлении основных понятий программирования и для обучения программистов. В нем впервые введены понятия «блочная структура программы», «динамическое распределение памяти». Внутри блока в Алголе можно вводить локальные обозначения, которые не зависят от остальной части программы. Несмотря на свое интернациональноe происхождение, Алгол-60 получил меньшее распространение, чем Фортран. Например, не на всех зарубежных ЭВМ имелись трансляторы с Алгола-60. В 1968 г. в результате дальнейшего развития и усовершенствования Алгола-60 была создана версия Алroл-68. Это многоцелевой универсальный расширенный язык программирования. Последнее свойство позволяло с помощью одной и той же программы транслятора осуществлять трансляцию с различных расширенных версий языка без дополнительных затрат на приспособление этого языка к различным категориям пользователей, на получение проблемно-ориентированных диалектов языка. По своим возможностям Алгол-68 и сегодня опережает многие языки программирования, однако из-за отсутствия эффективных компьютеров для него не удалось своевременно создать хорошие компиляторы. В нашей стране в те годы под руководством академика Андрея Петровича Ершова был создан транслятор Альфа, который представлял достаточно удачную русифицированную версию Алгола.
В середине 60-х гг. сотрудники математического факультета Дартмутского колледжа Томас Курц и Джон Кемени создали специализированный язык программирования, который состоял из простых английских слов. Новый язык назвали универсальным символическим кодом для начинающих ( Beginners All-purpose Symbolic Instruction Code) или сокращенно BASIC (Бейсик). 1964 г. считают годом рождения этого языка. Он получил самое широкое распространение при работе на персональных компьютерах в режиме интерактивного диалога.
Популярность Бейсика объясняется как простотой его освоения, так и наличием достаточно мощных универсальных средств, пригодных для решения научных, технических и экономических задач, а также задач бытового характера, игровых и т.д. Согласно концепциям, заложенным в Бейсике, в нем широко распространены различные правила умолчания, что считается плохим тоном в большинстве языков программирования подобного типа. Возникло множество версий языка, зачастую мало совместимых друг с другом. Однако, зная одну из версий, можно без особого труда освоить любую другую. Бейсик активно поглощает многие концепции и новинки из других языков. Первоначально интерактивный режим осуществлялся с использованием интерпретатора, в настоящее время для этого языка имеются также и компиляторы.
В начале 60-х гг. каждый из существующих языков программирования был ориентирован на разные классы задач, но в той или иной мере привязан к конкретной архитектуре ЭВМ. Были предприняты попытки преодолеть этот недостаток путем создания универсального языка программирования. ПЛ/1 (PL/1- Programming Language Оnе) – первый многоцелевой универсальный язык, разработан в США фирмой IВM в 1963-1966 гг. Это один из наиболее распространенных универсальных языков, он хорошо приспособлен для решения задач в области вычислительной техники: исследования и планирования вычислительных процессов, моделирования, решения логических задач и исследования логических схем, разработки систем математического обеспечения. При разработке PL/1 были широко использованы основные понятия и средства языков Фортран, Алгол-60, Кобол. PL/1 – богатый и гибкий язык, дает возможность производить вставки, исправлять текст программы в процессе ее отладки. Язык получил широкое распространение, трансляторы с него имеются для многих типов компьютеров. Компания IBM и сегодня продолжает поддерживать этот язык.
Паскаль (Pascal) является одним из наиболее популярных процедурных языков программирования, особенно для персональных компьютеров. Созданный как учебный язык программирования в 1968-1971 гг. Никлаусом Виртом в Высшей технической школе (ЕТН) в Цюрихе (Швейцария), он был назван в честь французского математика и философа Блеза Паскаля (1623-1662). Целью работы Н. Вирта было создание языка, который строился бы на небольшом количестве базовых понятий; имел простой синтаксис; допускал перевод программ в машинный код простым компилятором.
Лингвистическая концепция Паскаля пропагандирует системный подход, выражающийся, в частности, в расчленении крупных задач на меньшие по сложности и размеру, легко поддающиеся решению. К основным принципам Паскаля следует отнести:
В основу разработки языка Паскаль был положен Алгол-60; но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его для создания крупных проектов, например, программ-трансляторов. Паскаль реализован для всех типов компьютеров, в настоящее время используется во многих учебных заведениях для обучения программированию, а также для создания больших реальных проектов.
Период с конца 60-х до начала 80-х гг. характеризуется бурным ростом числа различных языков программирования, сопровождавшим, как это ни парадоксально, кризис программного обеспечения. Этот кризис особенно остро переживало военное ведомство США. B январе 1975 г. Пентагон решил навести порядок среди бесчисленного множества трансляторов и создал комитет для разработки одного универсального языка. На конкурсной основе комитет рассмотрел сотни проектов и выяснил, что ни один из существующих языков не может удовлетворить их требованиям, для окончательного рассмотрения было оставлено два проекта. В мае 1979 г. был объявлен победитель – группа ученых во главе с Жаном Ихбиа. Победивший язык назвали АДА, в честь Ады Лавлейс, дочери великого поэта Байрона. Она в юности была увлечена идеями Чарльза Бэббиджа и помогала ему составлять описание машины, а в начале 40-х гг. XIX в. разработала первую в мире программу для вычислительной машины. Язык АДА – прямой наследник Паскаля. Он предназначен для создания и длительного сопровождения больших программных систем, управления процессами в реальном масштабе времени. В языке четко выражена модульность его конструкций, причем обеспечивается удобство организации разнообразных связей между модулями. Важным его достоинством является возможность параллельного программирования ветвей программы, которые затем могут реализоваться на многопроцессорных компьютерах. Язык АДА сложен для изучения.
Язык программирования С (Си) был разработан в лаборатории Bell для реализации операционной системы UNIX в начале 70-х гг. и не рассматривался как массовый. Он планировался для замены Ассемблера, чтобы иметь возможность создавать столь же эффективные и компактные программы, и в то же время не зависеть от конкретного типа процессора. В·С сочетаются достоинства современных высокоуровневых языков в части управляющих конструкций и структур данных с возможностями прямого доступа к аппаратным средствам компьютера. Синтаксис языка С обеспечивает краткость программы, его компиляторы генерируют эффективный объектный код. Одна из наиболее существенных особенностей С состоит в том, что различия между выражениями и операторами нивелируются, это приближает его к функциональным языкам. Например, выражение может обладать побочным эффектом присваивания, а также может использоваться в качестве оператора. Нет четкого различия между процедурами и функциями, более того, понятие процедуры вообще не вводится. Синтаксис языка затрудняет программирование и восприятие составленных программ. Отсутствует строгая типизация данных, что предоставляет дополнительные возможности программисту, но не способствует созданию надежных программ. Язык С приобрел большую популярность среди системных и прикладных программистов. В настоящее время этот язык реализован для большинства компьютерных платформ.
Функциональное программирование
Суть Функционального (аппликативного) программирования определена А. П. Ершовым как «способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени функции, а единственным правилом композиции – оператор суперпозиции функций. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни, тем более, блок-схем, ни передачи управления».
Основной конструкцией в функциональных языках является выражение. К выражениям относятся константы, структурированные объекты, функции, их тела и вызовы функций. Аппликативный язык программирования включает следующие элементы:
Программа представляет собой последовательность описаний функций и выражения, которые необходимо вычислить. Выражение вычисляется методом редукции, т.е. проводится серия упрощений, до тех пор, пока это возможно по следующим правилам: вызовы базовых функций заменяются соответствующими значениями; вызовы не базовых функций заменяются их телами, в которых параметры заменены аргументами.
Функциональное программирование не рассматривает память как хранилище значений. Понятие оператора присваивания отсутствует, поэтому переменные обозначают объекты программы, что полностью соответствует понятию переменной в математике. Можно составлять программы и без переменных. Нет существенных различий между константами и функциями, т.е. между программами и данными. В результате этого функция может быть значением вызова другой функции и может быть элементом структурированного объекта. Число аргументов при вызове функции не обязательно должно совпадать с числом параметров, указанных при ее описании.
Первым таким языком стал Лисп (LISP, LISt Processing – обработка списков), созданный в 1959 г. Джоном Маккарти. Этот язык ориентирован на структуру данных в форме списка и позволяет организовать эффективную обработку больших объемов текстовой информации. Существенная черта языка – унификация программных структур и структур данных: все выражения записываются в виде списков.
Логическое программирование
Создание языка искусственного интеллекта Пролог (PROLOG, PROgramming in LOGic – программирование в терминах· логики) в 1973 г. французским ученым Аланом Кольмероэ открыло новую область – логическое или реляционное программирование.
Центральным понятием в логическом программировании является отношение. Программа представляет собой совокупность определений отношений между объектами и цели. Процесс выполнения программы трактуется как процесс общезначимости логической формулы, построенной из программы по правилам, установленным семантикой используемого языка. Результат вычисления является побочным продуктом этого процесса. В логическом программировании нужно только специфицировать факты, на которых основывается алгоритм, а не определять последовательность шагов, которые требуется выполнить. Это свидетельствует о декларативности языка логического программирования. Логические программы имеют небольшое быстродействие, так как вычисления. осуществляются методом проб и ошибок, поиском с возвратами к предыдущим шагам.
Программа на языке Пролог, в основу которой положена математическая модель теории исчисления предикатов, Строится из последовательности фактов и правил, затем формулируется утверждение, которое Пролог будет пытаться доказать с помощью введенных правил. Пользователь только описывает структуру задачи, а внутренний механизм Пролога сам ищет решение с помощью методов поиска и сопоставления.
Объектно-ориентированное программирование ( ООП)
Пионером данного направления явился язык Смолток (Smalltalk), первоначально предназначенный для реализаций функций машинной графики. Работа над языком началась в 1970 г. в исследовательской лаборатории XEROX (США), а закончилась в 1980 г. окончательным вариантом интерпретатора Smalltalk-80. Данный язык оригинален тем, что его синтаксис очень компактен и базируется исключительно на понятии объекта. В нем отсутствуют операторы или данные, все, что входит в Смолток, является объектами, а объекты общаются друг с другом исключительно с помощью сообщений. В настоящее время версия Vis u a l Age for Smalltalk активно развивается компанией IBM.
Основой объектно-ориентированного программирования (ООП) является понятие объект. Его сущность выражается формулой «объект = данные + процедуры». Каждый объект содержит некоторую структуру данных и доступные только ему процедуры (методы) обработки этих данных. Используя эту методологию, можно создать свой собственный абстрактный тип и отобразить проблемную область в эту созданную абстракцию вместо традиционного ее отображения в предопределенные управляющие структуры и структуры данных языка программирования. Объединение данных и свойственных им процедур обработки в одном объекте называется инкапсуляцией и присуще ООП.
Другим фундаментальным понятием ООП является класс. Класс – это шаблон, на основе которого может быть создан конкретный программный объект, он определяет свойства и методы объекта, принадлежащего этому классу. Соответственно, любой созданный объект становится экземпляром класса. Класс обеспечивает скрытие данных, их гарантированную инициализацию, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций.
ООП является более естественным, так как предоставляет возможность выбрать имеющиеся или создать новые объекты и организовать взаимодействия между ними. Следовательно, объектно-ориентированные языки по сравнению с процедурными являются языками более высокого уровня.
К наиболее современным объектно-ориентированным языкам программирования относятся С++ и Java.
По определению автора, Java является простым объектно-ориентированным и архитектурно-нейтральным языком интерпретирующего типа, обеспечивающим надежность, безопасность и переносимость, обладает высокой производительностью, многопоточностью и динамичностью.
Идеи ООП проникли во многие процедурные языки. Например, в состав интегрированной системы программирования Паскаль (корпорации Borland International), начиная с версии 5.5, входит специальная библиотека ООП Turbo Vision.
С середины 90-х гг. многие объектно-ориентированные языки реализуются как система визуального программирования. Такие системы имеют интерфейс, позволяющий при составлении текста программы видеть те графические объекты, для которых она пишется. Отличительной особенностью этих систем является наличие в них среды разработки программ из готовых «строительных блоков» позволяющих создавать интерфейсную часть программного продукта в диалог