При сравнении Ada и C они похожи по скорости и эффективности использования памяти. Что их отличает?

 

Итак, что такое Ада?

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

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

Рассмотрим фрагмент кода на C (Рис. 1) и в Ada (Рис. 2), который берет некоторые числа из командной строки и сохраняет их в массиве. Затем мы суммируем все значения в массиве и печатаем результат. Сложность в том, что мы работаем со значениями, моделирующими угол в градусах. Мы знаем, что углы являются модульными, а это означает, что углы, превышающие 360°, также могут быть представлены как Angle mod 360. Итак, если у нас есть угол 400 °, это эквивалентно 40 °.

Рис. 1. Этот фрагмент кода C берет некоторые числа из командной строки и сохраняет их в массиве

 

 

Рис. 2. Этот фрагмент кода Ada также берет некоторые числа из командной строки и сохраняет их в массиве.

 

Моделирование для C

Чтобы смоделировать это поведение в C, нам пришлось создать макрос MOD_DEGREES, который выполняет операцию модуля. Когда мы читаем значения из командной строки, мы конвертируем их в целые числа и выполняем модуль перед сохранением их в массиве. Затем мы вызываем add_angles, который возвращает сумму значений в массиве. Можете ли вы определить проблему с кодом C?

Попробуйте запустить примеры Ada и C, используя входную последовательность 340 2 50 70. Что выводит программа C? Что выводит программа на Аде? Почему они разные?

Проблема с кодом C заключается в том, что мы забыли вызвать MOD_DEGREES в цикле for add_angles. Это означает, что add_angles может возвращать значения, превышающие DEGREES_MAX.

 

Версия Ады

Давайте теперь посмотрим на эквивалентный код Ada, чтобы увидеть, как Ada справляется с ситуацией. Первое, что мы делаем в коде Ada, — это создаем тип Degrees, который является модульным типом. Это означает, что компилятор будет обрабатывать выполнение операции модуля. Если мы используем тот же цикл for в функции Add_Angles, мы увидим, что мы не делаем ничего особенного, чтобы убедиться, что наше результирующее значение находится в пределах диапазона 360 °, в котором оно должно быть.

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

В этом примере мы забыли поставить проверку в коде C. Компилятор вставил для нас проверку в код Ada, потому что мы сообщили компилятору, что пытаемся достичь, определяя строгие типы.

 

Мощность или точность, или и то, и другое?

В идеале нам нужна вся мощь, которую язык программирования C может дать нам для управления оборудованием, над которым мы работаем, давая нам возможность более точно моделировать данные безопасным способом. Таким образом, перед нами стоит дилемма: что может дать нам возможности операций, подобных языку C, но также предоставить нам функции, которые могут минимизировать вероятность ошибки разработчика? Поскольку этот курс посвящен Аде, можно поспорить, что мы собираемся представить язык Ада в качестве ответа на этот вопрос …

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

Если бы мы сравнили одно и то же приложение, написанное на C, и с Ada с использованием высокоуровневых конструкций, мы бы увидели схожую производительность с точки зрения скорости и эффективности использования памяти. Если мы сравним объектный код, сгенерированный обоими компиляторами, возможно, они даже выглядят одинаково!

Источник: www.electronicdesign.com