Автор Тема: [Oberon7] "Man or Boy test" by Donald Knuth  (Прочитано 46489 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #30 : Июль 07, 2013, 12:20:24 pm »
Попробуй всё же вот так:
Результат тот же - при параметре больше 3-х трап по переполнению стека активности (в нативе стек активности 128К, в WinAos - по умолчанию для CreateThread).

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #31 : Июль 07, 2013, 01:23:41 pm »
Попробуй всё же вот так:
Результат тот же - при параметре больше 3-х трап по переполнению стека активности (в нативе стек активности 128К, в WinAos - по умолчанию для CreateThread).

Странно, при k = 4 происходит всего 8 вызовов A и 7 вызовов B -- как может стек переполниться???
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #32 : Июль 07, 2013, 07:22:10 pm »
Подумал над задачкой. Самое смешное, что на Обероне (Oberon/Oberon-07/Oberon-2/CP) похоже не удастся обойтись без использования динамической памяти (кучи), стека не достаточно.

Да, я чего-то тоже не могу придумать как такое на обероне07 без NEW сделать...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #33 : Июль 07, 2013, 07:27:36 pm »
Подумал над задачкой. Самое смешное, что на Обероне (Oberon/Oberon-07/Oberon-2/CP) похоже не удастся обойтись без использования динамической памяти (кучи), стека не достаточно.

Да, я чего-то тоже не могу придумать как такое на обероне07 без NEW сделать...
Да и на КП тоже. На всей линейке "классических" оберонов.
Y = λf.(λx.f (x x)) (λx.f (x x))

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #34 : Июль 08, 2013, 07:33:53 am »
а он мне раз и заявил: "Нельзя, мол, ссылаться на локальную процедуру"!
Компилятор от akron1 с ним солидарен...

Совершенно правильное ограничение.... дабы отсекать сами попытки ваять такую замудрённую и двусмысленную чушь, как протаскивание контекстов процедур и т.п.
В том же JS "эти ваши замыкания" используются направо и налево от отсутствия модульности и удобного "не-ассемблерного" ООП (как и в ФП их главная роль - быть альтернативой ООП).
Я в JS сначала поигрался с замыканиями, когда обнаружил, что для удержания этого клубка в голове и его объяснения кому-то нужны дополнительные усилия, послал их в..., кроме совсем ограниченных случаев, типа обработки событий и т.п.

Хочется таскать контекст - задекларируй явно объект для этого контекста, как тип данных, - и таскай...
Неявщину, умолчания, запутанные клубки связей - в.... топку :)






valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #35 : Июль 08, 2013, 07:48:44 am »
а он мне раз и заявил: "Нельзя, мол, ссылаться на локальную процедуру"!
Компилятор от akron1 с ним солидарен...

Совершенно правильное ограничение.... дабы отсекать сами попытки ваять такую замудрённую и двусмысленную чушь, как протаскивание контекстов процедур и т.п.
В том же JS "эти ваши замыкания" используются направо и налево от отсутствия модульности и удобного "не-ассемблерного" ООП (как и в ФП их главная роль - быть альтернативой ООП).
Я в JS сначала поигрался с замыканиями, когда обнаружил, что для удержания этого клубка в голове и его объяснения кому-то нужны дополнительные усилия, послал их в..., кроме совсем ограниченных случаев, типа обработки событий и т.п.

Хочется таскать контекст - задекларируй явно объект для этого контекста, как тип данных, - и таскай...
Неявщину, умолчания, запутанные клубки связей - в.... топку :)

Ну, если в качестве эталона языка для использования замыканий брать js, то действительно, замыкания - богомерзкая дрянь :-) (впрочем, это к любой концепции относится - динамическая типизация, синтаксис, сборщик мусора, прототипное наследование - что ни рассматривай на примере js, всё дрянью покажется) А вот если брать что-то более вменяемое, ну там haskell например, то становится очевидно что это классная штука, которая делает код яснее, и не столь запутанным, как в случае ОО-языков.

И нет, у замыканий роль не в "замене" ООП. Программирование не крутится вокруг объектной методологии.

PS. А модульность вооще тут ортогональна. Замыкание контекста штука динамическая, а модуль штука статическая.

PPS. А ООП в Обероне, таки ассемблерного типа.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #36 : Июль 08, 2013, 07:57:02 am »
Странно, при k = 4 происходит всего 8 вызовов A и 7 вызовов B -- как может стек переполниться???
Нет, оказывается результаты моего варианта и твоего несколько отличаются:
Если взять к = 100,
то в твоём варианте:
ink = 0
k = 0
A called = 101
B called = 101
результат - TRAP access violation.

В моём же варианте:
k=94200383
A called=23547
B called=23547
и результат - TRAP stack overflow

в диапазоне 0..3 оба диапазона ведут себя одинаково и выдают правильные результаты.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #37 : Июль 08, 2013, 10:33:17 am »
Странно, при k = 4 происходит всего 8 вызовов A и 7 вызовов B -- как может стек переполниться???
Нет, оказывается результаты моего варианта и твоего несколько отличаются:
Если взять к = 100,
то в твоём варианте:
ink = 0
k = 0
A called = 101
B called = 101
результат - TRAP access violation.

В моём же варианте:
k=94200383
A called=23547
B called=23547
и результат - TRAP stack overflow

в диапазоне 0..3 оба диапазона ведут себя одинаково и выдают правильные результаты.

Боюсь, для того что бы процедура A выполнилась при k = 100, не хватит времени существования вселенной, ну и памяти тоже. Теоретический предел на 32-битной архитектуре -- k = 32, практический предел на этой архитектуре -- что-то около k = 27... Для того, чтобы получить результат для k = 100, нужно уже делать мемоизацию процедуры A...

Что-то не то генерирует компилятор в A2...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #38 : Июль 08, 2013, 11:05:31 am »
Что-то не то генерирует компилятор в A2...
Об этом и речь

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #39 : Июль 08, 2013, 11:22:26 am »
Что-то не то генерирует компилятор в A2...
Об этом и речь

А что там вообще сказано в описании активного оберона про передачу ссылок на локальные прцедуры? Если в репорте сказано что это нельзя, то надо бы им багрепорт отправить )

Вапще, скачал на днях эту A2, запустил -- и увидел пустой сиреневый экран, а по краям какие-то непонятные серые полоски... Так что я не удивлён, что компилятор что-то не то генерирует у них )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #40 : Июль 08, 2013, 11:42:50 am »
Хочется таскать контекст - задекларируй явно объект для этого контекста, как тип данных, - и таскай...
Неявщину, умолчания, запутанные клубки связей - в.... топку :)

Ага, ООП тоже вреден -- всякие хрупкие классы там, только для ГУИ годится, а для всего остального -- в топку...
И ваще назад в машкоды пора вернуться...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #41 : Июль 08, 2013, 12:32:14 pm »
А что там вообще сказано в описании активного оберона про передачу ссылок на локальные прцедуры? Если в репорте сказано что это нельзя, то надо бы им багрепорт отправить )
Репорт давно устарел.
По трассировке вызовов видно, что при каждом вызове A стек опускается на 44 байта (стек для A - 32 байта и - 12 для B ), при вызове B адрес k для A и B одинаков(как и адреса всех параметров) и так продолжается до 5-го вызова B, после чего стек вдруг не минусуется на -12, а плюсуется +20, и всё, фрейм данных потерян, и дальше пошла полная фигня.
Вапще, скачал на днях эту A2, запустил -- и увидел пустой сиреневый экран, а по краям какие-то непонятные серые полоски... Так что я не удивлён, что компилятор что-то не то генерирует у них )))
у меня всё работает, загружается с флешки, никаких странных серых полосок нету. Но можешь WinAos попробовать.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #42 : Июль 08, 2013, 12:36:45 pm »
А что там вообще сказано в описании активного оберона про передачу ссылок на локальные прцедуры? Если в репорте сказано что это нельзя, то надо бы им багрепорт отправить )
Репорт давно устарел.
По трассировке вызовов видно, что при каждом вызове A стек опускается на 44 байта (стек для A - 32 байта и - 12 для B ), при вызове B адрес k для A и B одинаков(как и адреса всех параметров) и так продолжается до 5-го вызова B, после чего стек вдруг не минусуется на -12, а плюсуется +20, и всё, фрейм данных потерян, и дальше пошла полная фигня.
Вапще, скачал на днях эту A2, запустил -- и увидел пустой сиреневый экран, а по краям какие-то непонятные серые полоски... Так что я не удивлён, что компилятор что-то не то генерирует у них )))
у меня всё работает, загружается с флешки, никаких странных серых полосок нету. Но можешь WinAos попробовать.

Народ, правильно ли я понял, что сий замечательный тест Кнута позволил выявить странный баг в компиляторе АО? То есть тест оказался таки полезным для одного из потомков Алгола-60?
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #43 : Июль 08, 2013, 12:52:43 pm »
Но можешь WinAos попробовать.
Я как раз WinAOS и пробовал...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: [Oberon7] "Man or Boy test" by Donald Knuth
« Ответ #44 : Июль 08, 2013, 02:21:58 pm »
Народ, правильно ли я понял, что сий замечательный тест Кнута позволил выявить странный баг в компиляторе АО? То есть тест оказался таки полезным для одного из потомков Алгола-60?
Пока неясно, может проблема связана с выравниванием в процессорах AMD, надо на интеле проверять