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

Классификация языков программирования. Критерии выбора среды и языка разработки программ Легкость написания программы

Содержание:

Введение

Целью данной работы является сравнение четырех языков: Ada, C, C++ и Java. А также поиск достоинств и недостатков каждого из них, сфер наиболее разумного применения.

Общие сведения о языках

С: Язык программирования Си отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, после компиляции каждой элементарной составляющей программы соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад, к уже откомпилированному тексту. Поэтому использованию функции должно предшествовать её объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практически на любой модели компьютера. Си часто называют языком среднего уровня, учитывая то, как близко он работает к реальным устройствам.

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

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

Благодаря близости по скорости выполнения программ, написанных на Си, к языку ассемблера, этот язык получил широкое применение при создании системного программного обеспечения и прикладное программное обеспечение для решения широко круга задач. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования как C++, C# и Java.

C++ : компилируемый статически типизированный язык программирования общего назначения. Поддерживая разные парадигмы программирования, сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «C++» происходит от языка C, в котором унарный оператор ++ обозначает инкремент переменной.

Являясь одним из самых популярных языков программирования, C++ широко используется для разработки программного обеспечения. Область его применения включает операционные системы, прикладные программы, драйверы устройств, приложения для встраиваемых систем, высокопроизводительные серверы, а также развлекательные приложения, например, видео игры. Существует несколько реализаций языка, как бесплатных, так и коммерческих. Их производят GNU Project, Microsoft, Intel и Embarcadero (Borland). C++ оказал огромное влияние на другие языки программирования, в первую очередь на C# и Java.

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

Ada: Язык Ada - результат самого обширного и самого дорогостоящего из когда-либо предпринимавшихся проектов по созданию языка программирования. Язык Ada разрабатывался для Министерства обороны США, так что состояние существовавшей вычислительной среды способствовало определению его формы.

Работы по разработке были начаты в 1975 году после того как в Министерстве Обороны США был разработан список требований к языку, который был широко распространен. Однако, ни один из существовавших на тот момент времени языков программирования не соответствовал выдвинутым требованиям. В итоге, в 1977 году Министерство Обороны США выдвигает предложение создать новый язык.

Из большого числа предложений было отобрано четыре, для последующего пересмотра и доработки. Позже, для дальнейшего уточнения, из них отобрали два, и в финале выбрали проект представленный компанией Cii-Honeywell Bull. Этому языку и было дано имя Ада, в честь Августы Ады Байрон, графини Лавлейс, дочери английского поэта лорда Байрона. Она была сотрудницей Чарльза Беббиджа, изобретателя аналитической машины, и написала для этой машины программу вычисления чисел Бернулли - Августа Ада по праву считается первым в мире программистом. Разработкой данного проекта руководил Jean Ichbiah.

В 1983 году язык становится стандартом ANSI/MIL-STD-1815A-1983, а затем и международным стандартом ISO 8652:1987. Язык описывается в справочном руководстве по языку (Language Reference Manual), часто называемом LRM. Ссылки на это справочное руководство часто встречаются в книгах, посвященных языку программирования Ада, а также во многих сообщениях об ошибках компилятора.

Язык претерпел пересмотр при введении нового ISO стандарта в начале 1995 года (ISO/IEC 8652:1995).

Этот стандарт исправляет многие упущения и недостатки оригинального языка, и дополняет его многими новыми полезными свойствами.

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Приложения Java обычно транслируется в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры.

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

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

  • применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
  • широкое использование платформенно-ориентированного кода (машинный-код) в стандартных библиотеках,
  • аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++.

Сравнение языков

Парадигмы

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

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

Именно они отражают принципы Фон Неймана

  • Понятия переменной, являющейся аналогом ячейки оперативной памяти
  • Операторов ввода\вывода информации в ячейки
  • Операторов присваивания, отражающих пересылки информации между ячейками
  • Команд управления(усл. переход, циклы)

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

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

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

Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.

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

Декларативная - противоположность императивному. Декларативный язык описывает не столько решение задачи, сколько саму задачу («ЧТО» нужно получить), а каким образом получить решение, уже должен определять компьютер.

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

Ada

C

C++

Java

Императивный

+

+

+

+

Объектно-ориентированный

+

-

+

+

Функциональный

-

-

+

-

Рефлексивный

-

-

-

-

Обобщенное программирование

+

-

+

+

Логическая

-

-

-

-

Декларативная

-

-

-

-

Распределенная

+

+

+

+

Исторические критерии

1 Мобильность.

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

  • Ада При создании компилятора языка Ада Министерство обороны США требовало не засорять язык. Каждый компилятор проходил проверку, пропуская через него серию из порядка 2000 специальных тестов.
  • C Язык C позволяет писать для Unix-систем эффективным код и является основным средством переноса программ между Unix-системами. Стандартизация языка ANSI(Американским национальным институтом) и ISO(Международной организацией по стандартам) закрепила роль языка, как средство написания эффективным и переносимых программ.
  • C++ Как и СИ, C++ проектировался в расчете на переносимость. В программах, написанных на C++ можно использовать библиотеки C. Почти все программы, рассчитанные на C, можно использовать и в C++.
  • Java Программы, написанные на Java запускаются в специальной виртуальной машине (песочнице) и работают на любом оборудовании, где установлена соответствующая виртуальная машина. Следовательно программы даже не нуждаются в какой-либо доработке и абсолютно мобильны.

Вывод: все языки являются мобильными, но у Java эта ключевая особенность реализована лучше всех.

2 Мощность языка

Определяется разнообразием задач, которые программируются на данном языке.

  • Ada Ада предназначалась для военных целей, к которым предъявлялись большие требования надежности. Однако ввиду надежности этот язык нашел применение в медицине, телекоммуникации, банковских системах и промышленной автоматике.
  • C Язык C можно считать универсальным. Так как в него включены средства программирования почти на уровне ассемблера. Большой набор операторов и операций позволяет писать весьма компактные программы.
  • C++ Ключевой отличительной особенностью языка C++ от C и Ада является класс. Класс – это определяемый пользователем тип. В C++ сохранены также все возможности C. Что позволяет достаточно эффективно реализовать программы.
  • Java, как и С++ является полноценным объектно-ориентированным языком. Он используется в веб-приложениях, а также на телефонах, ввиду сильного разнообразия железа.

Вывод: Все эти языки довольно популярны, из-за многих сфер их применения.

3 Уровень языка

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

Все четыре языка относятся к языкам программирования высокого уровня, а C и C++ включают в себя свойства и низкоуровневых языков.

Современные критерии

Читабельность программы

2.1Простота написания программы

Языки C, C++, Ada, Java имеют понятную модульную структуру программы. Приведем пример простой программы на этих языках:

С

С++

Ada

Java

#include <stdio.h>

int main()

{

printf ("Hello, world\n");

return 0;

}

#include <iostream>

using namespace std;

void main()

{

cout << “Hello, world!”;

return 0;

}

with Ada . Text_IO;

procedure Hello is

use Ada . Text_IO;

begin

Put_Line ( " Hello World ! " ) ;

end Hello ;

class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

1.2Разнообразие типов и структур данных. Ортогональность структур данных.

Булевый тип.
  • Ada есть булевый тип, который может принимать два значения: true и false
  • C В языке Си в явном виде нет булевого типа, а значения true и false обозначают ненулевым и нулевым значением соответственно.
  • C++ Определен тип bool , который хранит две булевы константы: true и false. Если рассматривать bool в арифметическом выражении, то true = 1, а false = 0.
  • Java есть булевый тип, который может принимать два значения: true и false

Целые, вещественные, символьные типы

Тип данных в C

Тип данных в C++

Тип данных в Ada

Тип данных в Java

Размер занимаемой памяти (байт)

Минимальный диапазон

Целый тип

int

Int

integer

short

2

от – 32768 до 32767

Модификатор целого типа

long int

long int

long_integer

int

4

от

– 2147483648 до 2147483647

Модификатор целого типа

short int

short int

short_integer

short int

4

от -32767 до 32767

Вещественный тип

float

float

float

float

4

от 3.4E–38 до 3.4E38

Вещественный тип

double

double

double

8

от 1.7E–308 до 1.7E308

Модификатор вещественного типа

long double

long double

10

от 3.4E–4932 до 3.4E4932

Символьный тип.

char

char

character

char

1

от -128 до 127 (С, С++)

от 0 до 255 (Ада)

Модификатор символьного типа.

wide_character

1

от 0 до 4294967295

Булевский тип

bool

bool

boolean

1

True(1) или false (0)

Массивы

Во всех 4х языка программирования есть возможность создавать массивы. Отметим ряд особенностей:

  • ADA В языке Ада есть возможность задания отрезка массива (array slice). Пример:

Имя_ массива ( диапазон_значений_индекса )

abc (5..10) := (5, 6, 7, 8, 9, 10);

Также есть возможность использования «анонимных» массивов (без использования предопределенного типа)

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

Пример:
int A [10], i;

for (i=0; i<100; i++) A[i]=i;

  • Java Для создания массива нужно пользоваться квадратными скобками, расположив их справа от имени массива или от типа объектов, из которых составлен массив, например:

int nNumbers[];

int[] nAnotherNumbers;

Записи

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

Ада

Си

С++

Java

Type имя_записи is

Record

Имя_поля_1:тип_поля_1;

Имя_поля_2:тип_поля_2;

Имя_поля_N:тип_поля_N;

End record;

union un_tag {

int a;

float b;

char *c;

} un;

union { // анонимное

// объединение

int i;

char a[5];

};

// непосредственный доступ к переменным i и a

i = 10;

a[1] = 'A';

public class MYRecord {

public int X;

public String Y;

public double Z;

}

Подпрограммы

Тип подпрограммы

Ада

С и C++

Java

Процедура

procedure имя_процедуры

[(формальные параметры)] is

Begin

End имя_процедуры;

Процедура заменяется функцией без возврата.

В Java вместо процедур и функций есть сущность «Метод». Можно объявить, определить и запустить.

class Main{

public void CallMe(){

System.out.println("Hi");

}

}

Функция

function имя_функции

[(формальные параметры)]

return тип_возвр_значения is

Begin

End имя_функции;

<тип> <имя > [(формальные

параметры)] {

//

return … ;

}

2.4 Циклы и операторы.

Тип

C и C++

Ада

Java

Условный оператор if

if (<логическое_выражение>) оператор1;

[else оператор2;]

if <логическое_выражение> then

Оператор1;

elsif <логическое_выражение> then.

Оператор2;

elsif <логическое_выражение> then

Оператор3;

else

Оператор4;

end if;

If (булево выражение)

{

тело

}

Оператор выбора (case,switch)

switch (выражение)

{

[case константное-выражение_1]:[операторы_1];

[case константное-выражение_2]:[операторы_2];

[default:[операторы]];

}

case (выражение) is

when (значение_выбора) => действия

when (значение_выбора) => действия

when others => действия

end case;

switch (a) {

case 1: a = 1; break;

case 2:

a = 2;

break;

default: a = 3;

break;

}

Цикл с параметром (for).

for(выражение1;выражение2;выражение3) {тело_цикла;}

Выражение1 устанавливает начальное значение переменных. управляющих циклом. Выражение2 - это условие, при котором тело цикла будет выполняться. Выражение3- это изменение переменных.

for счетчик in [reverse- счетчик в обратном порядке] диапазон_значений_счетчика loop

--тело цикла

end loop;

for Count in 1..20 loop

Put (Count);

end loop;

for(инициализация,булево выражение, смена счетчика)

{

тело

}

Легкость написания программы

Языки Java, C, C++, Ада имеют понятную модульную структуру программы. Все четыре языка имеют зарезервированные слова, также есть возможность добавления комментариев к программному коду, есть наличие перегрузки процедур и функций. Их все можно отнести к весьма выразительным. Пример выразительности в C и C++: i ++; i --;

Абстрактный тип данных и инкапсуляция.

  • С++ и C В языке C++ введено понятие класса, который непосредственно поддерживает абстрактные типы данных. В языке C++ переменные объявляются как сущности, имеющие тип данного класса. Таким образом, классы похожи на встроенные типы. Программная единица на языке C++, которая объявляет экземпляр класса, имеет доступ к любым скрытым сущностям в этом классе, но только через экземпляр этого класса. Классы в языке C++ являются расширением типа «struct» языка C.
  • Ада обеспечивает средства инкапсуляции, которые можно использовать для моделирования абстрактных типов данных. Конструкции инкапсуляции в языке Ада называются пакетами(packages). Пакеты могут состоять из двух частей, каждая из которых также называется пакетом. В языке Ада, в отличие от языка C++, не существует спецификатора доступа public .
  • Java В языке Java понятие класса неотъемлемо, так как в нем вместо процедур и функций присутствуют только методы. (Метод — это функция или процедура, принадлежащая какому-то классу или объекту). Также он обладает инкапсуляцией

Надежность языка

4.1 Контроль типов данных

  • Ада и Java являются строго типизированными языками, в них четко рассмотрены вопросы эквивалентности типов. Также в Ada есть возможность нарушать правила контроля типов, с помощью функции unchecked_conversion.
  • С и С++ не являются сильно-типизированными , тем не менее контроль типов в C++ реализовано более полно чем в С.

4.2 Обработка исключительных ситуаций.

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

  • В языке Ада существует 5 исключений, которые стандартно предопределены.
  • Constraint_Error – ошибка ограничения.
  • Numeric_Error – ошибка числа.
  • Program_Error – ошибка программы.
  • Storage_Error – ошибка памяти.
  • Tasking_Error – ошибка задачи.
  • В языке C практически полностью отсутствует обработка исключительных ситуаций.
  • В C++ обработка исключительных ситуаций реализуется с помощью трех ключевых слов: try, catch и throw.
  • Все исключения в Java являются объектами. Поэтому они могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком.Исключения делятся на несколько классов, но все они имеют общего предка — класс Throwable. Его потомками являются подклассы Exception и Error. Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых числах.

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

В Java все исключения делятся на три типа: контролируемые исключения (checked) и неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors) и исключения времени выполнения (RuntimeExceptions, потомок класса Exception).

Заключение

Индекс популярности рассмотренных языков, согласно статистике Wolfram Alpha

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

Рейтинг в декабре 2013 г.

С

17.890 %

Java

17.311%

С++

8.268 %

Ада

0.322 %

У каждого языка есть свои сильные и слабые стороны и, следовательно, разные сферы применения. Так для систем, где требуется безопасность предпочтительнее использовать язык Ада, чем C или C++. Но язык ада требует хорошего знания языка программисту. Язык Java мультиплатформенный, следовательно хорошо подходит для написания нересурсоемких программ, совместимых с разными архитектурами. Тяжело однозначно сказать какой язык значительно лучше.

Список Литературы

  1. Русская Википедия
  2. Гавва А. «Адское» программирование. Ada-95. Компилятор GNAT
  3. К. Сьерра, Б. Бейтс - Изучаем Java
  4. Шилдт Г. С++ Базовый курс, 3-е издание,2010
  5. М. Болски «Язык программирования Си».