Добавлен: 10.11.2023
Просмотров: 196
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждениевысшего образования
«МИРЭА − Российский технологический университет» РТУ МИРЭА
Институт искусственного интеллекта
Базовая кафедра №252 −информационной безопасности
КУРСОВАЯ РАБОТА
Тема курсовой работы: «Сравнительный анализ языков Ada, C и C++»
Студент группы ККСО-06-21 | Блинов М.Ю. | |
| | (подпись) |
Руководитель курсовой работы | Профессор | |
| Лукинова О. В. | (подпись) |
Работа представлена к защите | «»2022 г. | |
Допущен к защите | «»2022 г. | |
Москва –2022
Содержание
Критерии и цель сравнения …………………………………………………….3
Описание критериев сравнения …………………………………..……………3
Скорость работы языка …………………………………………………………6
Пример сравнения скорости работы языков С и Аda ………………………...7
Количество памяти, занимаемой языком ………………...……………………8
Кросс-платформенность языка ………………………………………………....9
Безопасность языка ...…………………………………………………………..10
Простота языка ………………………………………………………………....11
Список источников …………………………………………………………….13
Критерии
1) скорость работы
2) количество занимаемой памяти
3) кросс-платформенность
4) классы и структуры данных
5) безопасность
6) простота
Цель: сравнение языков программирование проводиться по нескольким причинам, таким как: выбор самого подходящего языка для определенной задачи, нахождение языка, который способен обработать большое количество данных за короткий промежуток времени, а так же нужда в том чтобы язык программирования не допускал утечек памяти и уязвимостей.
Некоторые языки программирования обладают всеми нужными для конкретных задач свойствами, другие же - не подходят. В этой работе проводится сравнительный анализ трех языков программирования: Ada, C, C++.
Описание критериев сравнения:
Быстродействие - является одним из основных критериев качества программы, которое достигается в том числе и за счет выбранного языка программирования. Например, некоторые языки программирования используют внутренние средства, позволяющие добиться ускорения работы программы (например отключение синхронизации потоков ввода и вывода в С++).
Количество занимаемой памяти - не менее важный критерий качества программы.Данное требование появляется, когда программа разрабатывается для встраиваемых систем, мобильных платформ, микроконтроллеров и так далее. В данных случаях, чем меньше памяти расходует программа на данном языке – тем лучше. К таким языкам, опять же, относятся ассемблер, С/С++, Objective-C и другие.
Кроссплатформенность – возможность работы программы на различных платформах, в различных ОС с минимальными изменениями.На чистом С++ написать кроссплатформенную программу довольно трудно, у кода возникает обширная избыточность, теряется достоинство в скорости выполнения. Облегчают задачу кроссплатформенные библиотеки, например, Qt, которые позволяют добиться принципа «один код на все платформы», однако на каждую платформу нужно программу собирать отдельно (при этом разными компиляторами).
Классы и структуры данных - структуры данных и классов позволяют удобно описать, объекты из реальной жизни, а также производить операции с данными этих объектов.
Безопасность - это важный критерий языка программирования.Ошибка буфера (CWE-119) - наиболее распространенная уязвимость безопасности в языке C, аналогичная профилю уязвимости C ++. CWE большинства языков программирования относится к Web и Web-сервисам. Ошибки буфера и другие связанные CWE вряд ли появятся в языках управления. Язык С считается самым небезопасным языком программирования, так как в нем довольно легко ошибится в работе с памятью и это является главной проблемой безопасности этого языка.
Простота - критерий, который указывает на то насколько понятен синтаксис в этом языке и насколько прост он в освоении.Если говорить теоретически, то С имеет одно огромное преимущество перед С++ - простота языка и, как следствие, простота в изучении. С++ сложнее учить, но если его знаешь хорошо, то писать на нем на порядок проще, особенно большие сложные проекты (да и маленькие тоже).
| Скорость работы | Количество занимаемой памяти | Кросс-платформенность | Безопасность | Простота | Общая оценка |
Ada | 2 | 3 | 3 | 3 | 3 | 14 |
C | 3 | 1 | 2 | 1 | 2 | 9 |
C++ | 2 | 2 | 3 | 2 | 2 | 11 |
Скорость работы
Язык программирования Ада родился в середине 1970-х, когда министерство обороны США и министерство обороны Британии решили заменить сотни специализированных языков программирования для встроенных вычислительных систем, всё чаще использовавшихся в военных проектах. Язык Ада разрабатывали так, чтобы это был единственный язык, способный работать на всех этих встроенных системах, и при этом обеспечивает надежность и быстродействие уровнем не хуже специализированных.
Скорость C или C ++ сильно зависит от созданного кода в целом. Хорошо написанный код на C ++ может работать лучше или так же, как хорошо написанный код на C.
Например, более надёжное программирование, вероятно, будет быстрее на C ++, чем на C. Поэтому специалисты не утверждают, что один язык быстрее, чем другой. В случае производительности C по сравнению с C ++ часто утверждается, что C ++ соответствует C.
C ++ действительно предлагает множество функций, которые могут привести к снижению производительности, но использовать их необязательно. Даже если вы это сделаете, разница в скорости благодаря современным компиляторам, вероятно, будет недостаточно значительной.
| |||
Пример сравнения скорости работы языков С и Аda | |||
binary-trees source | mem | gz | cpu |
C gcc #2 | 168,384 | 809 | 4.32 |
C gcc #3 | 134,068 | 836 | 4.71 |
Ada 2012 GNAT #4 | 203,012 | 2107 | 10.20 |
Ada 2012 GNAT | 266,008 | 888 | 21.99 |
C gcc | 263,664 | 654 | 22.16 |
C gcc #5 | 351,304 | 908 | 32.02 |
Ada 2012 GNAT #3 | 528,532 | 1266 | 34.15 |
Количество памяти, занимаемой языком
Ада реализует модель ссылочных типов вместо низкоуровневых указателей. Каждый ссылочный тип обрабатывается пулом памяти, либо заданным по умолчанию, либо определённым программистом при необходимости работы с более экзотическими реализациями памяти типа NUMA. Программисту никогда не приходится обращаться к памяти напрямую, он должен использовать обработчик пула памяти.
Наконец, компилятор или программа во время исполнения решает, как передавать данные в функцию или из неё. И хотя направление передачи каждого параметра указывать нужно (‘in‘, ‘out‘, или ‘in out‘), но итоговое решение о том, передаются ли данные через регистры, кучу или по ссылке, принимает компилятор или программа во время выполнения, но не программист. Это предотвращает проблемы с переполнением стека.
На этапе работы можно проверить ошибки типа неверного доступа к памяти, переполнения буфера, выхода за установленные пределы, ошибки ±1, доступа к массиву. Затем их можно безопасно обработать, вместо того, чтобы ронять всё приложение.
Все данные в языке Си имеют свой тип. Переменные определенных типов занимают в памяти какое-то место, разное в зависимости от типа. В С нет четкого закрепления количества памяти за определенными типами. Это отдано на реализацию конкретного компилятора под конкретную платформу. Например, переменная типа int в одном компиляторе может занимать в памяти 16 бит, в другом — 32 бита, в третьем — 8 бит. Все определяет конкретный компилятор. Правда, все стремятся к универсализации, и в основном в большинстве компиляторов тип int, например, занимает 2 байта, а тип char — один.
Кросс-платформенность
Язык Ada способен работать на всех ОС без изменений, а вот языки С и С++ нужно будет подвергать некоторым изменениям, чтобы они работали корректно на всех платформах.
Различные версии UNIX и Windows имеют некоторую форму совместимости друг с другом. Это позволяет двоичному файлу, созданному для одной версии ОС, работать на других версиях ОС.
В UNIX выбор вашей машины сборки определяет совместимость. Наименьшей версией ОС, которую вы хотите поддерживать, должна быть ваша сборочная машина, и она будет создавать двоичные файлы, совместимые с последующими второстепенными версиями, до тех пор, пока они не внесут критические изменения (не рекомендуется использовать библиотеку).
В Windows и Mac OS X вы выбираете SDK, который позволяет вам ориентироваться на набор ОС с теми же проблемами, что и при критических изменениях.В Linux каждая ревизия ядра ABI несовместима с любой другой, и модули ядра необходимо перекомпилировать для каждой ревизии ядра.
Безопасность
У Ada – простой, понятный, легко читаемый синтаксис, который существенно снижает риск ситуаций, когда случайная опечатка приводит к тому, что код не становится формально неправильным, но существенно меняется его семантика.
Ада добавляет дополнительные слои защиты в проверках на этапах компиляции и запуска. В Аде программист должен явно указывать закрывающие операторы для блоков и границы, в которые должно укладываться значение переменной. Ада не определяет стандартные типы вроде int или float, а требует, чтобы программист с самого начала создал типы с определённым диапазоном. Это верно и для строк – за исключением неограниченных строк, у всех строк длина фиксирована.