LINUXTALKS.CO

Программный код без операторов ветвления.

 

L


0

1

Бывает ли программный код без операторов ветвления (совсем) может известны какие то программы.
Циклы можно, но без ветвления (if).
Вопрос конечно теоретический но мне всегда было интересно.


Циклы можно, но без ветвления (if).

Гхм, циклы без ветвления (проверки условия) в студию.

cocucka    
★★★★★★★★★★★★
Последнее исправление: cocucka (всего исправлений: 1)

Linux / Firefox (NL)

Хеллоуворлд — да. Программы — нет.

MrSugoma    
★★★
Linux / Firefox (US)

1 Ассемблер ARM, можно писать без прямого ветвления, за счет суффиксов добавляемых к инструкциям. Эти суффиксы заставляют инструкции выполняться только при опрелеленных условиях.

2

while (a>b) {
  a = a*b;
  break;
}

Вместо

if (a>b) {
  a = a*b;
}

И вперед.

JamesHolden    
★★★★★★★
Последнее исправление: JamesHolden (всего исправлений: 1)

Android / Firefox (BY)
Ответ на: комментарий от JamesHolden

Но ТС не в курсе, что этот код в результате исполняет абсолютно идентичные команды.

int test(int a, int b){
    while (a>b) {
    a = a*b;
    break;
    }
    return a;
}

int test2(int a, int b){
    if (a>b) {
    a = a*b;
    }
    return a;
}
test(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        nop
        mov     eax, DWORD PTR [rbp-4]
        cmp     eax, DWORD PTR [rbp-8]
        jle     .L3
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-4], eax
        nop
.L3:
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
test2(int, int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     eax, DWORD PTR [rbp-4]
        cmp     eax, DWORD PTR [rbp-8]
        jle     .L7
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        mov     DWORD PTR [rbp-4], eax
.L7:
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
cocucka    
★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от Holger

В любом цикле есть проверка условий, что есть операция ветвления по сути.

cocucka    
★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от cocucka

Ессесно. А ещё спрашивают, зачем надо учить ассемблер.

JamesHolden    
★★★★★★★
Android / Firefox (BY)
Ответ на: комментарий от cocucka

Вот, @Holger, тут ветвление компилятор реализовал через прыжок jle на метку, а в ARM ассемблере прыжка бы не требовалось, там просто суффиксом саму операцию a*b сделали бы условно выполняющейся.

JamesHolden    
★★★★★★★
Android / Firefox (BY)

Хорошо, но допустим вариант программулины которая делает запись в системный реестр винды. Вот ей то нахрена ветвления?

Holger    

Linux / Chrome (DK)
Ответ на: комментарий от Holger

Всмысле нахрена? Типа перед записью наличие узла, в который ты пишешь проверять не надо?

cocucka    
★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от cocucka

Так он по любому есть. И потом не будет записи нужной будет ошибка и вот и ее не надо обрабатывать.

Holger    

Linux / Chrome (DK)

Или программулина выводящая дату или количество прожитых дней врядли ветвления тут нужны.

Holger    

Linux / Chrome (DK)
Ответ на: комментарий от JamesHolden

Человек четко написал - циклы можно, if нельзя. Конец цитаты.

Это другое, это надо понимать.

MrSugoma    
★★★
Linux / Firefox (US)
Ответ на: комментарий от Holger

Так тут все равно есть условие.

MrSugoma    
★★★
Linux / Firefox (US)
Ответ на: комментарий от JamesHolden

Ну в одном из языков есть такой цикл повторить n раз без всяких while

Holger    

Linux / Chrome (DK)
Ответ на: комментарий от Holger

Ты почитай букварь какой, в самом то деле.

Повторить n раз - это цикл for, есть в любом языке, даже в нативном коде. И «повторить n раз» это УСЛОВИЕ, прикинь.

У вас что там, информатики в школе не было

JamesHolden    
★★★★★★★
Linux / Firefox (BY)
Ответ на: комментарий от JamesHolden

в том языке помнится нет for
а какого хрена надо еще лишние переменные задействовать для цикла?

Holger    

Linux / Chrome (DK)
Ответ на: комментарий от JamesHolden

Циклы for хороши для перебора значений массива.
А в остальном…
[code=python]
a = [9, 20, 4]
for x in a:
print (x)
[/code]

как то так

Holger    

Linux / Chrome (DK)

Для GPU пишут так чтоб не было ветвлений, из-за особенностей исполнения SIMT. Гуглится по словам «simt wavefront».
Ну еще при Data-oriented design.

Aber    
★★★★★★
Последнее исправление: Aber (всего исправлений: 1)

Ubuntu / Firefox (UA)
Ответ на: комментарий от JamesHolden

Ну строго говоря, можно бесконечный цикл запилить на безусловном переходе.

cocucka    
★★★★★★★★★★★★
iPhone / Firefox (NL)
Ответ на: комментарий от MrSugoma

Оно и заметно

cocucka    
★★★★★★★★★★★★
iPhone / Firefox (NL)
Ответ на: комментарий от Harald

Или не выходить

cocucka    
★★★★★★★★★★★★
Linux / Firefox (NL)
Ответ на: комментарий от Holger

Хорошо, но допустим вариант программулины которая делает запись в системный реестр винды. Вот ей то нахрена ветвления?

Догадываешься ли ты, что вызываемая для этой цели функция содержит операторы ветвления?

rezedent12    
★★★★★★★
Linux / Chrome (RU)
Ответ на: комментарий от Holger

В машинном коде, если это конечно не какой то экзотический процессор, нет for, do, loop и прочей заloop. В нём есть только if и jmp.

Что бы ты не написал осмысленного (имеющего практический смысл) на языке высокого уровня, компилятор сгенерирует код с условными переходами.

rezedent12    
★★★★★★★
Linux / Chrome (RU)
Ответ на: комментарий от Holger

какие такие нужны операторы ветвления если надо получить текущую дату или unixtime?

Если учитываются часовые пояса и реформы времени, то придётся в цикле сравнивать значения со списком.

rezedent12    
★★★★★★★
Linux / Chrome (RU)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)