|
GOTO (англ. go to — «перейти к») — в некоторых языках программирования — оператор безусловного перехода (перехода к определённой точке программы, обозначенной номером строки либо меткой). В более широком смысле, под «GOTO» подразумевают любой такой оператор, даже если в рассматриваемом языке он называется по-другому. В компилируемых языках GOTO можно рассматривать как основную операцию по передаче управления из одной части программы в другую, поскольку компилятор переводит все остальные операторы перехода в форму, аналогичную GOTO.
ФункциональностьВ абсолютном большинстве языков программирования, поддерживающих его использование, оператор GOTO состоит из двух частей: собственно имени оператора и метки, маркирующей целевую точку перехода в программе, то есть имеет вид Выполнение оператора перехода состоит в том, что следующим после него будет выполнен тот оператор программы, который стоит в тексте непосредственно за помеченным меткой местом (оператор, помеченный меткой), и далее будут последовательно выполняться операторы, расположенные после него (разумеется, до следующего оператора перехода, ветвления или цикла). В случае машинных языков (ассемблеров или непосредственно машинного кода) технический смысл команды перехода элементарен: она записывает в регистр процессора, хранящий адрес следующей выполняемой команды, адрес команды, помеченной меткой. РаспространениеGOTO имеется в таких языках, как Фортран, Алгол, КОБОЛ, Бейсик, Си, C++, D, Паскаль, Perl, Ада, а также во многих других. GOTO присутствует также во всех Ассемблерах в форме GOTO отсутствует в некоторых языках высокого уровня, например в Forth (но может быть реализовано средствами самого языка). В Паскаль GOTO первоначально включён не был, но недостаточность имеющихся языковых средств вынудила Никлауса Вирта его добавить. В более поздних своих языках Вирт всё же отказался от GOTO: этого оператора нет ни в Модуле-2, ни в Обероне и Компонентном Паскале. В Java есть зарезервированное слово КритикаОператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение нарушает иерархическую структуру программы и приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO»[2], который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность. Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения, и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO аннулирует многие возможности компилятора по оптимизации управляющих структур, из-за чего исполняемый код становится медленней и объёмней[3]. Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный. Это нашло своё отражение при проектировании новых языков программировании. Например, GOTO был намеренно полностью запрещён в Java и Ruby. Вместе с тем, в Аде — одном из наиболее продуманных с точки зрения архитектуры языке за всю историю[4], GOTO всё же был оставлен. Формально доказано, что применение GOTO не является обязательным (то есть не существует такой программы с GOTO, которую нельзя было бы переписать без этого оператора с полным сохранением функциональности). Одним из доводов против GOTO является то, что в некоторых случаях программисты ставят GOTO, чтобы быстрее достичь желаемого результата (написать фрагмент программы с определёнными свойствами), в то время как отсутствие GOTO заставило бы их провести более внимательный анализ задачи, который обычно приводит к получению более ясного, эффективного и лучше организованного кода. Оправданное применениеТем не менее, в практическом программировании применение GOTO в некоторых случаях можно считать допустимым. Поскольку GOTO — «простейший», «атомарный» оператор перехода, а все остальные являются «составными», производными от него, то применение GOTO допустимо и оправданно, когда другие средства языка не реализуют или недостаточно эффективно реализуют нужную функциональность. К таким случаям можно отнести:
int matrix[n][m]; int value; ... for(int i=0; i<n; i++) for (int j=0; j<m; j++) if (matrix[i][j] == value) { printf("value %d found in cell (%d,%d)\n",value,i,j); //act if found goto end_loop; } printf("value %d not found\n",value); //act if not found end_loop: ;
int fn(int* presult) { int sts = 0; TYPE entity, another_entity = NULL; TYPE2 entity2 = NULL; if ((entity = create_entity()) == NULL) {sts = ERROR_CODE1; goto exit0;} if (!do_something(entity) ) {sts = ERROR_CODE2; goto exit1;} if ( condition ) { if ((entity2 = create_another_entity()) == NULL ) {sts = ERROR_CODE3; goto exit1;} if ((*presult = do_another_thing(entity2) == NEGATIVE ) {sts = ERROR_CODE4; goto exit2;} } else { if ((*presult = do_something_special(entity) == NEGATIVE) {sts = ERROR_CODE5; goto exit2;} } exit2: if (entity2) destroy_another_entity(entity2); exit1: destroy_entity(entity); exit0: return sts; }
Главным критерием применимости Примечания
Ссылки |
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net