IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Немного о синтаксисе и безопасности, языков программирования
сообщение
Сообщение #1


Гость






Итак, Новый Год, заняться особенно нечем, а давайте я вас чуть-чуть "подразню" что-ли? smile.gif Покажу вам на простых примерах некоторые возможности одного из языков программирования, который многие считают устаревшим. Не вопрос, считайте дальше, на данный момент мы пользуемся Стандартом 2005-го года, т.е., новее, чем у С++, к 2012 готовится очередная версия Стандарта.

Но, собственно, я не собираюсь разжигать здесь холивар, максимум - пробудить интерес. Если кто-то заинтересуется - уже хорошо, если нет - то будем считать, что это все написано, чтоб провести время, не просто так смотря в монитор...

Итак.

С чего начнем? Наверное, с Hello World? Нет, не интересно. Напишем хоть сколько-нибудь полезную программку. Пускай она получает от пользователя число, и определяет, положительное оно или отрицательное:

(Паскаль)
var i: integer;
begin
write('i = '); readln(i);

if i > 0 then writeln('positive')
else writeln('negative or zero');
end.


(Ада)
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
i: integer;
begin
Put("i = ");
Get(i);

if i > 0 then Put_Line ("positive");
else Put_Line("negative or zero");
end if;

end;

Что бросается в глаза? "Многословность". Похоже, это - единственный недостаток Ады smile.gif

Давайте теперь немного поговорим о преимуществах.

0. Описание переменных по мере необходимости. (Показать/Скрыть)

1. Циклы For. (Показать/Скрыть)

2. Проверка логических условий. (Показать/Скрыть)

3. Оператор Goto (Показать/Скрыть)

4. Дефолтные параметры процедур/функций. (Показать/Скрыть)

5. Инициализация массивов. (Показать/Скрыть)

6. Еще немного о массивах. (Показать/Скрыть)

7. Параметры подпрограмм. (Показать/Скрыть)

8. Дженерики. (Показать/Скрыть)



Немного о безопасности

Недавно мне задали вот такой (очень, казалось бы, простой) вопрос: "Везде, где написано про язык программирования Ада, есть утверждение, что он - более безопасный, чем тот же С/С++. А в чем это выражается?"

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

1. Пример программы на С
#include <stdio.h>
int main () {
int length = 8265;
int width = 0252;
int height = 8292;
printf ("length = %d\n", length);
printf ("width = %d\n", width);
printf ("height = %d\n", height);
}
Программа прекрасно компилируется и запускается на выполнение...
Но каким будет ее вывод?

Вот таким будет вывод: (Показать/Скрыть)


2. Корректен ли следующий код:
#include <limits.h>

/*
Если *y - ноль и x > 0, то *k приравнять максимальному положительному числу
Если *y - ноль и x <= 0, оставить *k без изменений
Если *y - не ноль, присвоить *k значение x деленного на *y, и увеличить *y на 1
*/
void check_divide (int *k, int x, int *y) {
if (*y = 0)
if (x > 0)
*k = INT_MAX;
else
*k = x / *y /* Здесь делить на *y безопасно, поскольку нулю оно не равно */;
*y++;
}
? Несмотря на то, что программа компилируется, здесь присутствуют как минимум 4 серьёзные проблемы. Какие?

... (Показать/Скрыть)


3. Что касается ассоциативности и приоритета операций:

Что означает условие
if (x & mask == 0) ...
?

Оно компилируется, но... (Показать/Скрыть)


А вот это:
if (x < y < z) ...
?

И это тоже компилируется, но... (Показать/Скрыть)


4. Еще о синтаксисе...

Корректен ли следующий код:
// -- Если впереди "зелёный" свет - увеличить скорость
void increase_speed_if_safe (int speed, int signal) {
if (signal == CLEAR);
increase_speed ();
}
?

Код компилируется без предупреждений, но... (Показать/Скрыть)


5. Поговорим о перечислениях...

enum Alert_Type {LOW, MEDIUM, HIGH, VERY_HIGH};

void handle_alert (enum Alert_Type alert) {
switch (alert) {
case LOW:
activate_camera ();
case MEDIUM:
send_guard ();
case HIGH:
sound_alarm ();
}
}

void process_alerts () {
handle_alert (2);
...
Программа компилируется, но выполняться будет совсем не так, как кажется. В чем дело?

А дело в том, что... (Показать/Скрыть)


6. Неопределенности

Что здесь происходит:
{
int k = 0;
int v [10];
k = v [k++];
}
?
А происходит здесь... (Показать/Скрыть)


7. Проблемы с системой типов языка.

Программа компилируется, но все равно в ней что-то не так:
typedef int Time;
typedef int Distance;
typedef int Speed;

// ...
const Speed SAFETY SPEED = 120;

void increase_speed (Speed s);

// …
void check_speed (Time t, Distance d) {
Speed s = d/t;
if (s < SAFETY_SPEED)
increase_speed (t);
}

void perform_safety_checks () {
Time t = get_time ();
Distance d = get_distance ();
// …
check_speed (d, t);
}

Что именно?
Уууу... Да здесь целый букет... (Показать/Скрыть)


8. Проблема переполнения.

Что произойдет в следующем фрагменте программы на С (или на С++):

#include <limits.h>
void compute () {
int k = INT_MAX;
k = k + 1;
}

?
... (Показать/Скрыть)


Disclaimer
Только не надо говорить, что примеры-искусственные, и специально подобраны так, что Ада показана выигрышно. Попробуйте привести примеры, как избежать в С/С++ тех неоднозначностей, о которых я написал, чтобы дать возможность компилятору не пропустить ошибку или недочет программиста.

По большей части смысл данной темы - в том, чтобы показать, что большинство проблем связано с излишней "гибкостью" языка, в котором "разрешено все то, что не запрещено" (а запрещено явно очень немного вещей), что то же самое и даже гораздо большее можно сделать и без этих правил, разрешающих "всё и вся", с таким строгим синтаксисом, как у Ады.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Итого: недостаток вычислительной мощности, из-за которого программисты осмысленно снимают защиту (что в результате приводит к сбою) - это проблема языка?

Это может быть проблемой компилятора, не умеющего эффективно оптимизировать код (не знаю, насколько это относится к Аде).


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
volvo   Немного о синтаксисе и безопасности   4.01.2011 15:32
Unconnected   Фухх, осилил) С многим сам сталкивался, вот наприм…   4.01.2011 19:05
volvo   Ну вот и приведи мне решение (хочешь - на Паскале,…   4.01.2011 23:47
-TarasBer-   > Что бросается в глаза? "Многословность…   5.01.2011 0:09
-TarasBer-   А вот что меня напрягает в синтаксисе Паскаля (и у…   5.01.2011 0:17
volvo   Это настраиваемо. Мой компилятор с этим справляетс…   5.01.2011 0:43
TarasBer   > Ниже я написал один из способов применения. Э…   5.01.2011 2:22
volvo   Угу. -- В отдельном пакете описываем объект: …   5.01.2011 3:29
TarasBer   > Для Controlled-типов процедуры Initialize и F…   5.01.2011 4:03
volvo   Есть. Без формошлепалки, IDE для Win/Lin со всеми …   5.01.2011 4:16
TarasBer   > Нет, только In-параметры. Даже In Out не могу…   5.01.2011 4:28
volvo   :lol: Я посмотрю, что ты скажешь, когда Ада заст…   5.01.2011 5:20
Lapp   volvo, спасибо за это эссе, +1 :good: Я встряну…   5.01.2011 17:20
TarasBer   > Все Сиш-ные и Дельфийские замашки, основанные…   5.01.2011 19:29
TarasBer   > for i in 1 .. 10 loop -- i вообще не описывае…   5.01.2011 19:59
volvo   Для крайних случаев (когда без этого уже совсем ни…   5.01.2011 21:08
TarasBer   > Я посмотрю, что ты скажешь, когда Ада застави…   6.01.2011 0:24
volvo   Легко... Будет перебираться весь тип, от самого …   6.01.2011 1:29
TarasBer   > Обрати внимание, для того чтобы напечатать ид…   6.01.2011 1:51
volvo   Ну, максимум что можно предложить - это описать за…   6.01.2011 2:47
TarasBer   > и, следовательно, разрешит менять селектор в …   6.01.2011 2:57
volvo   Обрати внимание на вывод внизу экрана, ошибки уже …   6.01.2011 3:56
TarasBer   Я нашёл в википедии забавный пример, который показ…   9.01.2011 17:53
Lapp   зачем в Си такой switch.Аму-дарьеть.. Я б сам ни …   9.01.2011 18:54
volvo   Чтоб огрести проблем с выходом новой редакции Стан…   9.01.2011 19:24
volvo   Из недавнего - просто вспомнилось (к вопросу о без…   20.01.2011 23:10
TarasBer   Эээ, а кто может обеспечить безопасность данных, п…   20.01.2011 23:37
volvo   Хм. Значит, надо было отменять модификатор const, …   21.01.2011 0:55
TarasBer   Забавно, но самый страшный баг был написан именно …   10.02.2011 19:57
volvo   Блин... Это не проблема Ады. Есть посекундный анал…   10.02.2011 20:42
TarasBer   > Есть посекундный анализ этой катастрофы, кото…   10.02.2011 21:04
volvo   Уточняю: во воех русскоязычных официальных источни…   10.02.2011 21:20
TarasBer   > Итого: недостаток вычислительной мощности, из…   10.02.2011 21:28


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 6:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name