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
syoma 17.02.2018 03:34 # 0
j123123 17.02.2018 04:39 # +1
3.14159265 17.02.2018 06:52 # 0
Еще и доказывают превосходство.
>PHP
> элегантно
Ыыы..
3.14159265 17.02.2018 06:54 # +5
Троллейбус из хлеба какой-то.
>То ли дело ассемблер. Можно тупо отмотать стек в нужное место
throw return_3;
Но сишникам не понять.
Стандартная практика как брейкать циклы из лямбдовых for-each.
bormand 17.02.2018 09:13 # +3
SemaReal 20.02.2018 01:07 # 0
Из ниокуда реально вернется ее стек? или будет UB?
g0_1494089131830 20.02.2018 01:07 # 0
SemaReal 20.02.2018 01:20 # 0
jmp_buf хранит и укойзатель насуществующий стек и просто отматывает его в нужное место, или там реально где-то в кишках рантаймы сохраняется весь стек до этого места?
Наверняка же нет, да?
g0_1494089131830 20.02.2018 01:20 # 0
bormand 20.02.2018 06:59 # 0
g0_1494089131830 20.02.2018 11:02 # 0
SemaReal 21.02.2018 04:19 # 0
Хочу прыгать в стек другого потока
g0_1494089131830 22.02.2018 15:24 # 0
SemaReal 22.02.2018 17:10 # 0
Они делают то, о чем я говорил. И из них можно делать континиуэйшены
g0_1494089131830 22.02.2018 17:10 # 0
SemaReal 22.02.2018 17:28 # 0
g0_1494089131830 22.02.2018 22:23 # 0
1024-- 17.02.2018 19:47 # +2
На ум из аналогичного приходят разве что исключения.
Но всё равно какая-то питушня. Функция по сути должна знать, кто её вызывает, чтобы принять такие решения. То есть должна быть жёстко закреплена в кобенном строе программы - никаких переиспользований, никаких абстракция - вся архитектура к хренам! Я такой уровень самоуправства только у функций, которые exit делают, и то они не более, чем void, возвращали.
j123123 17.02.2018 20:19 # 0
но могут возникнуть сложности, если используется вызов функций по указателям.
3.14159265 18.02.2018 03:06 # +3
Думаю макросом и шаблонами можно даже добиться нормально проверяемой компилятором тупизации.
j123123 17.02.2018 20:22 # 0
Это не особо-то и сложно, учитывая что в стеке есть адрес возврата, а "кто кого откуда может вызвать" можно узнать на этапе компиляций, кроме случаев, где происходят какие-нибудь вызовы функций по указателям
1024-- 17.02.2018 20:51 # +3
В моём представлении это способ сломать абстракции и контракты, добавление новых рёбер в граф зависимостей.
Вот, например, брала функция корень и если обнаруживала NaN, возвращала ноль. А тут вдруг корень в версии 2.0 стал в случае отрицательного операнда возвращать NaN сразу из нашей функции. И это никак не остановить. Абстракция протекает, не заткнёшь. Исключения и те резиновой пробкой затыкаются на любом уровне.
Единственное, что приходит в голову - какие-то подсказки компилятору для оптимизаций: в случае математических функций - по поводу пронесения NaN, в случае функций для работу с памятью - по поводу пронесения NULL. Но это если исключения и оптимизация по умолчанию тупые и медленные.
g0_1494089147484 17.02.2018 21:47 # 0
SemaReal 20.02.2018 14:40 # 0
если не херить BP (не включать FPO) то можно раскрутить весь стек до самого первого вызова жи.
зы:
"и еще хорошо если в стеке есть адрес возврата" (с)
g0_1494089131830 20.02.2018 14:40 # 0
SemaReal 21.02.2018 04:18 # 0
j123123 17.02.2018 20:32 # 0
3.14159265 18.02.2018 03:30 # +1
Думаю всё можно и даже нужно. Представим себе жс
По сути у нас цепочка однотипных функций (с одинаковыми сигнатурами!).
a().b().c().d()
А внутри монадка горит. А мы хотим скипнуть N вычислений.
>Функция по сути должна знать, кто её вызывает, чтобы принять такие решения. То есть должна быть жёстко закреплена в кобенном строе программы - никаких переиспользований, никаких абстракция
Думаю разные высокоуровневые языки запросто решат проблемы с питульной типизацией однотипных функций.
1024-- 18.02.2018 14:54 # 0
Кстати, в C++ можно с его развитыми кастами типы по всей цепочке гнать автоматически.
g0_1494089131830 20.02.2018 00:21 # 0
OlegUP 17.02.2018 10:20 # 0
А изнутри это все равно та же самая раскрутка стека. Согласно теории ЯП. Хотя я сужу по С++, и не могу точно сказать, как это реализовано в пхп.
Да и исключения, из-за той же раскрутки стека - это очень прожорливая вещь.
https://habrahabr.ru/post/208006/
bormand 17.02.2018 10:44 # +2
Bobik 17.02.2018 15:19 # 0
bormand 17.02.2018 17:51 # 0
SemaReal 23.02.2018 01:00 # 0
потому call/ret это вообще плохо, цари инлайнят функции
3oJIoTou_xyu 17.02.2018 11:07 # 0
vistefan 17.02.2018 13:48 # 0
И ещё несколько раз было.
inho 17.02.2018 13:50 # 0
bormand 17.02.2018 15:27 # 0
dm_fomenok 17.02.2018 17:35 # +2
В 5.4.0 убрали.
ideone.com/ofqFNk
3.14159265 17.02.2018 18:09 # +4
g0_1494089147484 17.02.2018 18:21 # +2
j123123 17.02.2018 18:47 # +3
j123123 17.02.2018 17:39 # 0
j123123 17.02.2018 17:49 # 0
dm_fomenok 17.02.2018 23:08 # +1
ideone.com/Vq7Qx7
SemaReal 18.02.2018 02:33 # 0
dm_fomenok 17.02.2018 17:36 # 0
j123123 17.02.2018 17:50 # 0
j123123 17.02.2018 17:58 # +2
> Оператор не является неограниченным "goto". Целевая метка должна находиться в том же файле, в том же контексте. Имеется в виду, что вы не можете ни перейти за границы функции или метода, ни перейти внутрь одной из них. Вы также не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break.
Хуевый какой-то goto. Настоящие цари хотят иметь возможность перейти из середины одного трижды вложенного for в середину другого трижды вложенного for.
3.14159265 17.02.2018 18:07 # 0
Я специально процитирую незелёным.
Ибо зачем goto, если никуда толком нельзя to go?
Особенно майндфачные, мозголомные переходы внутрь хитросплетённых свитчей.
>и обычным применением оператора goto является использование его вместо многоуровневых break.
Пхп во всей красе.
SemaReal 18.02.2018 03:33 # 0
Правда там был какой-то loop (со счетчиком в CX кажется)
3.14159265 18.02.2018 03:35 # 0
ЕМНИП loop очень медленный
Потому всё в порядке: Настоящие Цари никогда не опустятся до использования такой гнусной комманды, просаживающей пирфоманс.
SemaReal 18.02.2018 03:37 # 0
Кстати, копеляторы вроде не используют loop. или используют?
3.14159265 18.02.2018 03:39 # 0
Конечно знают. anger fog в помощь
>Кстати, копеляторы вроде не используют loop. или используют?
Нет, его не используют эдак с 486 процов
SemaReal 18.02.2018 03:46 # 0
Интересно, как он это померил? Интел давал утилиту или доки?
про loop понятно, но не понятен аргумент про преимущество simplest ops в pipeline. Все равно же они перемалываются в microops. Тем более что современные ISA имеют неебически сложные команды, всякие SIMD итд.
3.14159265 18.02.2018 03:48 # 0
Ха-ха.
>Интересно, как он это померил?
У него на сайте набор самописных тулзов с исходниками.
SemaReal 18.02.2018 03:53 # 0
гвозди-бы делать из таких людей:) Правда, это все будет менятся с каждой новой архитектурой же
Ну интел как-то давал утилиту чтобы измерять cache miss, так что иногда и там бывают просветления.
3.14159265 18.02.2018 04:05 # 0
Ну когда ryzen вышел он довольно быстро обновил свой pdf.
SemaReal 18.02.2018 04:07 # 0
а Касперси его еще в 2003 году назвал устаревшим
А он мало того что жив, да еще и за AMD следит
3.14159265 18.02.2018 05:43 # 0
3oJIoTou_xyu 18.02.2018 07:00 # +2
j123123 03.05.2018 05:37 # 0
yet_another_one_shit 03.05.2018 13:28 # 0