0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
// http://www.compiler.su/prodolzhenie-tsikla-i-vykhod-iz-nego.php
// В PHP выход из вложенного цикла выглядит, на мой взгляд, значительно элегантнее. После «break» указывается количество вложенных циклов, которые должен «покинуть» оператор «break». В приведённом примере, который аналогичен приведённому выше для Java, «break» должен «пересечь» две фигурные скобки «}», чтобы оказаться за пределами двух циклов.
for($i=0; $i < $Imax; ++$i)
{
// ...
for($j=0; $j < $Jmax; ++$j)
{
// ...
if(условие)
break 2;
// ...
}
// ...
}
Интересно, а почему б нечто подобное не сделать для функций? Ну например есть функция a() которая вызывает функцию b() которая вызывает функцию c(), которая вызывает функцию d(), и например в функции d() чтоб сделать особый return_3, который бы вернул управление на три уровня вниз, сразу в функцию a()? Хотя не, хуйня, надо ведь еще знать, какой там тип возвращается в функцию a() из функции b().
То ли дело ассемблер. Можно тупо отмотать стек в нужное место
Запостил:
j123123,
16 Февраля 2018
Еще и доказывают превосходство.
>PHP
> элегантно
Ыыы..
Троллейбус из хлеба какой-то.
>То ли дело ассемблер. Можно тупо отмотать стек в нужное место
throw return_3;
Но сишникам не понять.
Стандартная практика как брейкать циклы из лямбдовых for-each.
Из ниокуда реально вернется ее стек? или будет UB?
jmp_buf хранит и укойзатель насуществующий стек и просто отматывает его в нужное место, или там реально где-то в кишках рантаймы сохраняется весь стек до этого места?
Наверняка же нет, да?
Хочу прыгать в стек другого потока
Они делают то, о чем я говорил. И из них можно делать континиуэйшены
На ум из аналогичного приходят разве что исключения.
Но всё равно какая-то питушня. Функция по сути должна знать, кто её вызывает, чтобы принять такие решения. То есть должна быть жёстко закреплена в кобенном строе программы - никаких переиспользований, никаких абстракция - вся архитектура к хренам! Я такой уровень самоуправства только у функций, которые exit делают, и то они не более, чем void, возвращали.
но могут возникнуть сложности, если используется вызов функций по указателям.
Думаю макросом и шаблонами можно даже добиться нормально проверяемой компилятором тупизации.
Это не особо-то и сложно, учитывая что в стеке есть адрес возврата, а "кто кого откуда может вызвать" можно узнать на этапе компиляций, кроме случаев, где происходят какие-нибудь вызовы функций по указателям
В моём представлении это способ сломать абстракции и контракты, добавление новых рёбер в граф зависимостей.
Вот, например, брала функция корень и если обнаруживала NaN, возвращала ноль. А тут вдруг корень в версии 2.0 стал в случае отрицательного операнда возвращать NaN сразу из нашей функции. И это никак не остановить. Абстракция протекает, не заткнёшь. Исключения и те резиновой пробкой затыкаются на любом уровне.
Единственное, что приходит в голову - какие-то подсказки компилятору для оптимизаций: в случае математических функций - по поводу пронесения NaN, в случае функций для работу с памятью - по поводу пронесения NULL. Но это если исключения и оптимизация по умолчанию тупые и медленные.
если не херить BP (не включать FPO) то можно раскрутить весь стек до самого первого вызова жи.
зы:
"и еще хорошо если в стеке есть адрес возврата" (с)
Думаю всё можно и даже нужно. Представим себе жс
По сути у нас цепочка однотипных функций (с одинаковыми сигнатурами!).
a().b().c().d()
А внутри монадка горит. А мы хотим скипнуть N вычислений.
>Функция по сути должна знать, кто её вызывает, чтобы принять такие решения. То есть должна быть жёстко закреплена в кобенном строе программы - никаких переиспользований, никаких абстракция
Думаю разные высокоуровневые языки запросто решат проблемы с питульной типизацией однотипных функций.
Кстати, в C++ можно с его развитыми кастами типы по всей цепочке гнать автоматически.
А изнутри это все равно та же самая раскрутка стека. Согласно теории ЯП. Хотя я сужу по С++, и не могу точно сказать, как это реализовано в пхп.
Да и исключения, из-за той же раскрутки стека - это очень прожорливая вещь.
https://habrahabr.ru/post/208006/
потому call/ret это вообще плохо, цари инлайнят функции
И ещё несколько раз было.
В 5.4.0 убрали.
ideone.com/ofqFNk
ideone.com/Vq7Qx7
> Оператор не является неограниченным "goto". Целевая метка должна находиться в том же файле, в том же контексте. Имеется в виду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них. Вы также не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break.
Хуевый какой-то goto. Настоящие цари хотят иметь возможность перейти из середины одного трижды вложенного for в середину другого трижды вложенного for.
Я специально процитирую незелёным.
Ибо зачем goto, если никуда толком нельзя to go?
Особенно майндфачные, мозголомные переходы внутрь хитросплетённых свитчей.
>и обычным применением оператора goto является использование его вместо многоуровневых break.
Пхп во всей красе.
Правда там был какой-то loop (со счетчиком в CX кажется)
ЕМНИП loop очень медленный
Потому всё в порядке: Настоящие Цари никогда не опустятся до использования такой гнусной комманды, просаживающей пирфоманс.
Кстати, копеляторы вроде не используют loop. или используют?
Конечно знают. anger fog в помощь
>Кстати, копеляторы вроде не используют loop. или используют?
Нет, его не используют эдак с 486 процов
Интересно, как он это померил? Интел давал утилиту или доки?
про loop понятно, но не понятен аргумент про преимущество simplest ops в pipeline. Все равно же они перемалываются в microops. Тем более что современные ISA имеют неебически сложные команды, всякие SIMD итд.
Ха-ха.
>Интересно, как он это померил?
У него на сайте набор самописных тулзов с исходниками.
гвозди-бы делать из таких людей:) Правда, это все будет менятся с каждой новой архитектурой же
Ну интел как-то давал утилиту чтобы измерять cache miss, так что иногда и там бывают просветления.
Ну когда ryzen вышел он довольно быстро обновил свой pdf.
а Касперси его еще в 2003 году назвал устаревшим
А он мало того что жив, да еще и за AMD следит