LINUX.ORG.RU

Дейкстра и стек

 


1

4

Почему Дейкстра был таким горячим поклонником стеково-ориентированных вычислений? Ведь это же отвратительно, если у нас нет GOTO, или, хотя-бы, его огрызка — RETURN, нам (машине) приходиться вычислять нафиг не нужные ветки. Что в этом хорошего то может быть?



Последнее исправление: ymn (всего исправлений: 1)
Ответ на: комментарий от qulinxao

ИМХО, семафоры, это настолько простая хрень, что любой студентишка их по 1000 раз переизобретает по мере написания кода, пока не узнает что был хрен, который считал это «изобретением».

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

Перечитай просто пример на фортране который.

   CALL CHECK(A, B, *10, *20, C)
   ...
10 ...
20 ...
   SUBROUTINE CHECK(X, Y, *, *, C)
   ...
50   IF (X) 60, 70, 80
60   RETURN
70   RETURN 1
80   RETURN 2
   END


Здесь как ты можешь заметить используется SUBROUTINE, а не FUNCTION, а SUBROUTINE не возвращает результата. Здесь звездочками(«*») обозначены альтернативные точки выхода. И при вызове RETURN 1, оно передает управление строку под номером 10, а при вызове RETURN 2, оно передает управление на строку под номером 20.
Но наслаждение не будет полным, если не знать, что точек входа в функцию тоже могло быть несколько, http://h21007.www2.hp.com/portal/download/files/unprot/fortran/docs/lrm/lrm01... и точки выхода с точками входа могли быть перемешаны.

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

Дейкстра был умным человеком. Умные люди обычно пытаются не изобретать правил на 100% случаев в жизни и относиться ко всему адекватно. Потому не сильно уверен что он поклонник чего-то там

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

В лиспах, например, call/cc вызывает наибольший попаболь, а не что-то другое.

call/cc

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

Virtuos86 ★★★★★
()
Ответ на: комментарий от avtoritetniy-expert

Он был против такого return и я в этом его полностью поддерживаю. Но он не был против того чтобы вызывать return в нескольких местах функции, главное чтобы она возвращала исполнение туда где был вызван call.

Tark ★★
()
Ответ на: комментарий от avtoritetniy-expert

Перечитай пример. Под отсутствием единой точки выхода в нем подразумевается не несколько мест «откуда» происходит выход из функции, а несколько мест «куда» он происходит.
Не несколько return, а то, что 2 последних return возвращают исполнение не туда, откуда функция была вызвана, а на метки, которые была переданы как параметр.

Tark ★★
()
Ответ на: комментарий от Tark

Под отсутствием единой точки выхода в нем подразумевается не несколько мест «откуда» происходит выход из функции

С чего ты взял? Или это твоя «бессмертная интерпретация» Великого учителя?

а несколько мест «куда» он происходит.

Выход, дружок, подразумевает «откуда», а не «куда».

avtoritetniy-expert
() автор топика
Ответ на: комментарий от avtoritetniy-expert

В таком ключе разговор не имеет смысла, если хочешь считать, что Дейкстра ошибался или я его не правильно понимаю, считай, твоё дело.

Tark ★★
()
Последнее исправление: Tark (всего исправлений: 1)
Ответ на: комментарий от avtoritetniy-expert
f(x) = if x > 0 then 1 else 2

Программа структурного / функционального программирования.

         #
       x > 0
      /     \
     /       \
  r <- 1    r <- 2
    @         @

Такой вариант с двумя выходами (@) на единственную точку которая вызвала (#) — вполне ок.

f:
    testl %edi, %edi
    jle .OTHERWISE
    movl $1, %eax
    ret
.OTHERWISE:
    movl $2, %eax
    ret

.globl main
main:
    movl $1, %edi
    jmp f
         #
       x > 0
      /     \
     /       \
  a <- 1    a <- 2
     \       /
      \     /
      r <- a
         @

Такой вариант с единственным выходом (@) на одну же (#) — тоже.

f:
    testl %edi, %edi
    jle .OTHERWISE
    movl $1, %eax
    jmp .RET
.OTHERWISE:
    movl $2, %eax
.RET:
    ret

.globl main
main:
    movl $1, %edi
    jmp f

Разные выходы (@) на разные (#) (как в примере с Fortan выше) — это уже что-то выходящие за рамки структурного / функционального.

И причём тут стек?

quasimoto ★★★★
()

Благодаря вам, суперхаккиллерам, девелопмент скоро превратится в героиновый притон.

anonymous
()
Ответ на: комментарий от Tark

Не несколько return, а то, что 2 последних return возвращают исполнение не туда, откуда функция была вызвана, а на метки, которые была переданы как параметр.

В этом коде

function foo (){bla-bla}
function bar (){bla-bla-bla; return another()}
function wrap () {if(bla) return foo(); else return bar()}
можно считать за метки имена функций, которые вызываются изнутри wrap. Переход возможен на любую из меток, разница в том, что все равно произойдет возврат. Основная претензия в том, что возврат произойдет и в том случае, когда он не нужен — лишние вычисления.

anonymous
()
Ответ на: комментарий от avtoritetniy-expert

Хоаровским и Бринч-Хансенсовсим вершинам мысли.

Это те, которые обосрались в свете Ъ (Хьюитовской) теории?

Выражаясь твоими терминами, «обосрались» как раз акторы, а мониторы и CSP и сейчас живее всех живых.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

и сейчас живее всех живых

Исключительно благодаря долбо*бам в CS и обезьянам за клавой. По той же причине вылетели лиспы и смолтоки. А педерасты качают права по европам. Не они (акторы) такие, жизнь такая.

anonymous
()
Ответ на: комментарий от anonymous

В этом коде wrap возвращает туда откуда её вызвали в любом случае — либо вызывает foo или bar которые возвращают в wrap (которая возвращает ...), либо делает хвостовой вызов foo или bar которые при возвращении оказываются в месте которое вызвало wrap.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

И причём тут стек?

Притом, что чисто стековое вычисление не позволит GOTO (сбросить со стека часть вычислений), вернувшись в некоторую точку.

anonymous
()
Ответ на: комментарий от anonymous

Это, разумеется, goto/jmp, только немного не в тему ветки про несколько-return-в-одну-точку-вызова (что обычно в си и продолжателях, равно как и в expression oriented) / несколько-return-каждый-куда-попало (что где вообще в чистом виде есть? это же типа как non-local goto / longjmp, только в виде такого странного return).

quasimoto ★★★★
()
Ответ на: комментарий от anonymous

<подставить-что-угодно> не позволит GOTO

Дейкстра и <подставить-что-угодно> ;)

(сбросить со стека часть вычислений), вернувшись в некоторую точку

Когда в си делают goto что-то сбрасывают со стека? Или я не так понял?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

При рекурсивных вызовах

            #
           / \
          @   good_result  
         / \
Левая ветка у Вас будет засирать стек, пока не вычислиться полностью. Если Вы прыгните из good_result в #, вычисления будут сброшены.

anonymous
()
Ответ на: комментарий от anonymous

# у меня это адрес на который был выполнен call (push ip + jmp или хвостовой jmp), @ — ret (pop ip + jmp), я не понял что значит ветвление из @, но в целом ок — не хвостовой вызов посредством call будет делать push (двигать sp), хвостовой — просто jmp.

И что это значит? Дядечка вроде про то как должен быть устроен язык высокого уровня — при реализации он может засирать стек или нет как хочет, делать jmp, call и что там выгодно делать.

quasimoto ★★★★
()
Ответ на: комментарий от anonymous

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

Tark ★★
()

Да и рекурсия вообще зло. Главная претензия Дийкстры к goto была в возможности выразить irreducible control flow. Так на взаимно рекурсивных функциях тоже элементарно попасть в irreducible flow.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.