По способу выполнения языки программирования делятся на компилируемые, интерпретируемые, компилируемые на основе псевдокода и совмещенные.
Компилируемые языки. К этой группе относят языки программирования, исходный код которых преобразуется специальной программой-компилятором в объектные модули, которые затем собираются при помощи программы сборки (линковщика) в единый загружаемый модуль. Этот модуль представляет собой выполняемую программу. Компилируемыми являются языки С, С++, Object Pascal.
Интерпретируемые языки. К этой группе относят языки программирования, исходный код которых считывается и выполняется специальной программой- интерпретатором инструкция за инструкцией. Интерпретируемыми являются большинство версий языков Basic и Porth.
Языки, компилируемые на основе псевдокода («шитого» кода). В этих языках исходный код программы компилируется и выполняется как последовательность вызовов подпрограмм из существующих библиотек. Таковыми являются некоторые версии Basic.
Совмещенные языки. В совмещенных языках исходный код проходит две стадии обработки. На первой стадии происходит компиляция исходного кода до уровня промежуточного языка (байт-код в Java или язык MSIL в технологии.NET). На второй стадии происходит интерпретация промежуточного кода (в Java этим занимается виртуальная машина Java) или докомпиляция промежуточного кода до выполняемого машинного кода (эту функцию осуществляет среда выполнения CLR в технологии.NET).
По факту созданию процесса языки программирования делятся на создающие процесс и сценарные.
Языки, создающие процесс. После запуска программы создается отдельный процесс выполнения этой программы. Так происходит в языках С, С++, Oblect Pascal.
|
Сценарные языки. Сценарий, или скрипт, – это программа, которую выполняет другая программа. В качестве примером можно привести скрипты оболочки в UNIX, программы на языках PHP, Python, Ruby.
По степени автономности языки программирования делятся на автономные и встроенные.
Автономные языки программирования (С, С++, Java) являются автономным инструментом для создания программ.
Встроенные языки программирования являются частью какой-то системы и позволяют создавать программы, предназначенные для работы только в этой системе. Пример наиболее известного встроенного языка – VBA (Visual Basic for Application), который используется только внутри приложений Microsoft Office для автоматизации и расширения их функциональности. Встроенными являются также язык программирования системы 1С и язык JavaScript, который выполняется только внутри интернет-приложений.
По уровню отдаленности языка программирования от естественных языков их делят на низкоуровневые и высокоуровневые.
Языки низкого уровня ближе к логике процессора вычислительной машины, например, машинный язык, ассемблер.
Языки высокого уровня ближе лингвистически к человеческому языку. Это все остальные языки программирования.
По парадигмам языки программирования делятся на императивные (процедурные), функциональные, логические и объектно-ориентированные.
Императивные (процедурные) языки описывают решение задачи как последовательность процедур. К императивным относится большинство современных языков программирования.
Функциональные языки описывают требуемый результат в виде набора вложенных друг в друга функций (Haskell).
|
Логические языки описывают требуемый результат в виде суммы логических операций (Prolog).
Объектно-ориентированные языки способны определять абстрактные типы данных и реализовывать основные парадигмы объектно-ориентированного программирования (ООП): инкапсуляцию, наследование и полиморфизм (С++, Java, Object Pascal, и др.).
История языков программирования (с. 559-562)
Концепция объектно-ориентированного программирования
Поскольку все современные средства разработки программного обеспечения, языки и технологии создания программ продолжают основываться на объектно-ориентированном программировании, предлагаем ознакомиться с основными положениями этого подхода. Объектно-ориентированное программирование базируется на четырех основных принципах: абстракции, наследовании, инкапсуляции и полиморфизме.
Абстракция
Абстракция – это способность языка программирования отображать объекты внешнего мира в форме абстрактных структур в соответствии с решаемой задачей.
Абстрактные структуры, при помощи которых реализуется этот принцип, называются классами.
Класс – это структура описывающая объекты внешнего о мира с помощью двух типов элементов: состояние объекта описывается полями класса (переменными разного типа), а поведение, объекта – его методами (процедурами и функциями).
Классы представляют собой абстрактные описания структур данных, но сами данные они не содержат. Данные появляются тогда, когда по описаниям классов в памяти программы выделяется необходимое пространство и в нем создаются экземпляры класса, или объекты. Тогда для каждого поля класса отводится необходимая область памяти и в эту область можно поместить нужное значение.
|
Пример. Предположим, у нас есть три измерительных прибора: термометр, барометр и весы. Чтобы описать эти приборы внутри программы, мы абстрагируем важные для программы свойства этих приборов и создаем три класса (рис. 11.2).
Рис. 11.2. Классы
По названиям в соответствующих ячейках видно, что поля класса содержат в себе данные, описывающие состояние класса. Методы класса представляют реализацию некоторых действий, то есть описывают поведение класса. Например, метод класса «термометр», который носит название «измерить температуру», призван помещать значение температуры в поле с именем «температура». На рис. 11.3 представлены объекты (экземпляры класса).
Рис. 11.3. Экземпляры классов
Наследование
Наследование – это свойство класса порождать другие классы таким образом, что в порожденном классе (классе-потомке) содержатся все поля и все методы класса-родителя (базового класса), а также дополнительно собственные поля и методы.
Пример. В рассмотренном примере у трех разных классов есть одинаковые поля: Инв. номер, Название, Цвет, Исполнение. Каждый раз при создании нового класса измерительного прибора приходится снова и снова создавать эти поля. Данная ситуация значительно упрощается за счет наследования: мы создаем класс Измеритель, в который помещаем эти повторяющиеся поля, а затем наследуем от него наши классы Термометр, Весы и Барометр (рис. 11.4).
Рис. 11.4. Наследование
Широкая кривая на рисунке показывает, что при наследовании поля и методы базового класса включаются в состав класса потомка.
Полиморфизм
Полиморфизм – это способность объектов выполнять одну и гуже команду разными способами.
Полиморфизм основывается на двух свойствах, которые реализуют объектно-ориентированные языки программирования: способности трактовать объект класса-наследника как тип базового класса и способности класса иметь виртуальные методы. Особенность виртуального метода состоит в том, что он надежно связан с созданным экземпляром класса.
Пример. Если добавить в каждый из классов (в класс Измеритель и каждый из его наследников) метод Сигналить, а в реализации этого метода описали бы для каждого класса свой способ подавать сигнал (для термометра – мигать, для весов – издавать звук сирены, а для барометра – свистеть), то мы могли бы всем объектам, потомкам класса Измеритель, дать команду: измерители, сигналить! И каждый из них подал бы сигнал: термометры бы замигали, весы издали звук сирены, а барометры засвистели. Это и есть результат работы виртуальных методов.
Инкапсуляция
Инкапсуляция – это способность класса скрывать от внешнего мира детали внутренней реализации.
Инкапсуляция реализуется в объектно-ориентированном программировании при помощи областей видимости. Области видимости обозначаются в структуре класса специальными служебными словами. Например, слово priyate означает, что все поля и методы, объявленные в этой области видимости, невидимы для внешнего мира, a public, наоборот, – что все, объявленное в этой зоне, для внешнего мира открыто. Таким образом, у класса появляется своего рода защитный корпус, предохраняющий от излишней перегрузки программы объявленными именами и методами. Наружу класс экспонирует только то, что составляет его интерфейс и предназначено для внешнего взаимодействия. Все остальные поля и методы он скрывает внутри, помещая их в область видимости private.