2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Управление программой, исходно написанной на C++
Сообщение26.12.2019, 03:28 


06/04/18

323
В книгах и статьях, посвященных программированию на C++, часто встречаются термины управление (control) и поток управления (control flow или flow control). Я пытаюсь найти, что означают эти термины, но единственное, что нашлось — это эта статья: https://en.cppreference.com/book/intro/control

Приведу несколько примеров использования термина:
Цитата:
Variables declared at block scope with the specifier static or thread_local have static or thread storage duration but are initialized the first time control passes through their declaration
Цитата:
If a function-local (block-scope) static object was destroyed and then that function is called from the destructor of another static object and the control flow passes through the definition of that object, the behavior is undefined.
Понятно, что термин относится к выполнению программы, но непонятно, какое это имеет отношение к исходному языку. Программа будет выполняться не по инструкциям исходного языка, а эти инструкции будут откомпилированы до уровня машинных команд; и тот порядок, который имеется в исходниках, может вообще никак не соответствовать порядку выполнения машинных команд.

 Профиль  
                  
 
 Re: Управление программой, исходно написанной на C++
Сообщение26.12.2019, 04:12 
Заслуженный участник


16/02/13
4207
Владивосток
Qlin в сообщении #1431992 писал(а):
порядок, который имеется в исходниках, может вообще никак не соответствовать порядку выполнения машинных команд
Ну, обычно таки соответствует. Сильно несоответствовать — это при глубокой оптимизации, которую, как слышал, редко используют ввиду как раз трудностей отладки.

 Профиль  
                  
 
 Re: Управление программой, исходно написанной на C++
Сообщение26.12.2019, 10:53 
Заслуженный участник


20/08/14
11797
Россия, Москва
К исходному языку это имеет ровно то отношение, что наблюдаемый результат выполнения машинных команд будет в точности такой же, как и при выполнении инструкций исходного языка в том порядке, как они написаны (про методы параллельного программирования забудем). "А если не видно разницы - зачем платить больше?"(с)реклама. Так что всегда можно проигнорировать наличие машинных команд и оптимизатора и считать что выполняется прямо код исходного языка. В терминах которого и используется control flow для пояснения что и в каком порядке выполняется. И существование более низких уровней (компиляция и машинные команды и оптимизация) для понимания ничего не меняют.
Ещё раз подчеркну что именно наблюдаемый результат: из-за этого добавление отладочного кода (например вывода значений переменных куда-то), даже вроде бы никак не влияющего на основной алгоритм работы, может кардинально изменить скомпилированный код (порядок и состав машинных команд) при включенной оптимизации.

PS. Если погрузиться ещё на уровень глубже, то и машинные команды выполняются современным (с технологией out-of-order) процессором не в том порядке как записаны в исполняемом файле. А ещё уровнем ниже и микрокоманды тоже выполняются в другом порядке (и вообще параллельно). И однако наблюдаемый результат всегда (про исключения не буду) идентичен строго последовательному выполнению машинных команд из исполняемого файла.
PPS. Хоть и офтопик, но добавлю: надо не забывать что UB (undefined behavior) означает именно произвольное поведение, в том числе и нормальное (ожидаемое программистом). И если два запуска одной и той же программы с идентичными данными вдруг выдают разное поведение при наличии в коде UB - то это именно не различное поведение, а одинаковое (произвольное)! Частая ошибка считать, что раз программа отработала правильно (как ожидал программист), то она правильная - при наличии в коде UB это не так, она неправильная, но случайно отработала ожидаемо/правильно. Но нет никакой гарантии что в следующий раз будет так же.

-- 26.12.2019, 11:12 --

Поток управления (control flow) - обычно просто порядок, в котором выполняются инструкции исходного языка. Не как они записаны, а как будут выполняться. Используется часто для объяснения почему не все записанные в коде операторы будут реально выполняться именно в порядке записи исходного текста.
Простые примеры:
Используется синтаксис C++
int a=3;
if (b>0) {
  int c=5;
  cout << c*a+b;
}
cout << c;
Объявление переменной c происходит внутри условного оператора и снаружи её не видно, хотя вот же код написан и даже порядок выполнения не нарушается, казалось бы можно и дальше ею пользоваться, однако обращение к ней в последней строке - ошибка (если она не была объявлена и инициализирована где-то выше показанного куска кода).
Используется синтаксис C++
int b;
for (int a=1; a<3; a++) {
  if (a==2) {
    cout << a+7; b=13;
  }
  if (a==1) {
    cout << a*b;
  }
}
Это пример что порядок выполнения инструкций (control flow) не всегда ровно в порядке написания: при первом проходе условных операторов выполнится второй из них, а при втором проходе - первый. В данном случае control flow будет в порядке: int; for; if(a==2); if(a==1); cout<<a*b; for; if(a==2); cout<<a+7; b=13; if(a==1); for;, хотя записаны они в другом порядке. И обращение к переменной b во втором if - ошибка, потому что она к этому моменту ещё не инициализирована. Именно из-за отличия control flow (порядка выполнения) от порядка записи в файле.

 Профиль  
                  
 
 Re: Управление программой, исходно написанной на C++
Сообщение26.12.2019, 11:45 
Заслуженный участник
Аватара пользователя


16/07/14
9166
Цюрих
Дополню цитатой из стандарта
Стандарт, 1.9 писал(а):
1. The semantic descriptions in this International Standard define a parameterized nondeterministic abstract machine. This International Standard places no requirement on the structure of conforming implementations. In particular, they need not copy or emulate the structure of the abstract machine. Rather, conforming implementations are required to emulate (only) the observable behavior of the abstract machine as explained below.
<...>
5. A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input. However, if any such execution contains an undefined operation, this International Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group