Re[19]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 30.09.09 10:20
Оценка:
Здравствуйте, FR, Вы писали:

PD>>А человека, не умеющего писать циклы, как программиста рассматривать вообще нельзя. В школу!


FR>По моим наблюдениям люди не понимающие рекурсию


Не понимающие или не использующие? Если он ее понять не может — да, гнать. Но не использовать вполне может. Я о ней знал с самого начала карьеры, а использовал считанное число раз. Сколько я циклов написал за свою карьеру -учету не поддается.
With best regards
Pavel Dvorkin
Re[17]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 30.09.09 10:27
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>А с циклом писать корректные программы так таки совсем уж невозможно ? Писали, пишем и будем писать.


K>Мощное заявление. Которое неплохо бы подтвержить примером программ (написанной, находящейся в процессе написания, и, самое сложное, программы, которая еще не написана, но безусловно будет написана


Я как-то с трудом понимаю, как это можно привести пример программы, которая еще не написана, но безусловно будет написана . Независимо от того, какими средствами она будет написана.


>) с циклами и, желательно, > 10 KLOC каждая. Разумеется, с доказательством корректности для всех трех случаев.


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

А если серьезнее, то... Корректность программы отнюдь не значит, что я готов утверждать, что в ней нет ошибок вообще. А к доказательствам корректности я вообще отношусь с иронией. Я просто имел в виду, что уже 50 с лишним лет люди пишут программы, в них используют циклы, и , в общем, это все более или менее корректно работает , и никакой необходимости что-то тут менять я не вижу. Да никто и не будет.
With best regards
Pavel Dvorkin
Re[19]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 30.09.09 10:35
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Программиста, который умеет использовать рекурсию, но не знает все остальное, тоже вполне можно принять на работу.


Бери. Я его не возьму. Я его выгоню, если мне такорй студент попадется. Впрочем, не попадется — до 3 курса такие не доживают.

G>Вообще на работу можно принять кого угодно.


Можно. Секретаршей, машинисткой, менеджером, уборщицей, курьером.

PD>>Извини за грубость, но в гробу видел я эти общие подходы!!! Понять — дело замечательное, только, пожалуйста, после того, как понял, оставь это понимание для общего развития, а при реальной работе исходи не из общих подходов, а из реальной задачи, при программировании которой. может быть, лучше сделать вопреки всем общим подходам и самым безупречным теоретическим соображениям.

G>Пустая болтовня.

Замечательный аргумент. Главное — убедительно


G>Тебе еще раз повторить про ущербность самого наличия функции strlen, которая проистекает от ущербности наследния C?


Кто мне тут про общие принципы говорил ? Забудь про С и строки , и оставайся просто при общих принципах. Есть набор байтов, заканчивающийся нулем, найти сколько там байтов до нуля. Абстрактно, никакие не строки. Такая задача может возникнуть, или же, коль скоро в С такое используют для С-строк, надо эту задачу анафеме предать ?

G>На C вообще все плохо.




Вот якут Колодезников за отгон чужого оленя в тайгу получил в 1932 году
три года и, по правилам глубокомысленных перемещений, с родной Колымы был
послан отбывать под Ленинград. Отбыл, и в самом Ленинграде был, и привез
семье ярких тканей, и все ж много лет потом жаловался землякам и зэкам,
присланным из Ленинграда:
-- Ох, скучно там у вас! Ох, плохо!..

(C) А. Солженицын, Архипелаг Гулаг
With best regards
Pavel Dvorkin
Re[18]: Зачем нужны циклы если есть рекурсивные функции
От: Klapaucius  
Дата: 30.09.09 11:12
Оценка: +1 -1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я как-то с трудом понимаю, как это можно привести пример программы, которая еще не написана, но безусловно будет написана

PD>То есть ты хочешь. чтобы для еще не написанной программы я привел доказательства ее корректности ?

Вы верно ухватили суть. Доказать это невозможно. Поэтому слова "Писали, пишем и будем писать" в данном случае даже более пусты, чем межзвездное пространство.

PD>Корректность программы отнюдь не значит, что я готов утверждать, что в ней нет ошибок вообще.


Анекдот.

PD>Я просто имел в виду, что уже 50 с лишним лет люди пишут программы, в них используют циклы, и , в общем, это все более или менее корректно работает , и никакой необходимости что-то тут менять я не вижу. Да никто и не будет.


Да 50 лет это же все равно, что один миг. Та же олдовайская технология, например, использовалась почти два миллиона лет. Казалось бы, зачем что-то менять? Но, тем не менее, находятся безответственные товарищи, которые не ценят стабильность, не понимают, что технологии, они как вино — с каждым годом без изменений только лучше и лучше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[26]: Зачем нужны циклы если есть рекурсивные функции
От: FR  
Дата: 30.09.09 11:16
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Естественно. Ты докажи, что рекурсивная С-шная 4 — байтовая будет не медленее чем нерекурсивная С-шная 4-байтная, а они обе — чем ассемблерная 4-бафтовая, которой все мы пользуемся.


Я уже показал что разницы между рекурсивной и не рекурсивной нет. А ассемблерной мы все не пользуемся в gcc например ее нет.

PD>Всегда применим, по крайней мере, пока речь идет о неуправляемом коде.


Угу язык си придумали именно поэтому.

FR>>Ассемблерная кстати довольно тупая, при большом желании, которого у меня нет, вполне можно сишную более быструю написать чем эта конкретная ассемблерная.


PD>Если ты это сделаешь, благодарное человечество будет тебя помнить! . Но увы, у тебя нет желания заслужить его благодарность


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

PD>Как насчет рекурсивности команды repne scas ?


с этим к gear nuke
Re[20]: Зачем нужны циклы если есть рекурсивные функции
От: FR  
Дата: 30.09.09 11:21
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Не понимающие или не использующие? Если он ее понять не может — да, гнать. Но не использовать вполне может. Я о ней знал с самого начала карьеры, а использовал считанное число раз. Сколько я циклов написал за свою карьеру -учету не поддается.


Конечно не понимающие.
Но неиспользование по моему не повод для гордости
Re[21]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 30.09.09 11:33
Оценка:
Здравствуйте, FR, Вы писали:

FR>Конечно не понимающие.

FR>Но неиспользование по моему не повод для гордости

Да какая там гордость. Не требовалось просто, вот и все. Впрочем, несколько раз все же написал. Обход дерева и т.п.
With best regards
Pavel Dvorkin
Re[27]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 30.09.09 11:40
Оценка:
Здравствуйте, FR, Вы писали:


FR>Я уже показал что разницы между рекурсивной и не рекурсивной нет. А ассемблерной мы все не пользуемся в gcc например ее нет.


Уверен ? Приведи кусок кода из дизассемблера/отладчика

PD>>Всегда применим, по крайней мере, пока речь идет о неуправляемом коде.


FR>Угу язык си придумали именно поэтому.


При чем тут C ? Асм-вставки есть, например, и на Delphi, я уж не говорю о подключении extern функций из DLL, написанных на асме — это практически в любом языке можно.

FR>Не будет, даже не заметит. Так как в реальных программах даже если ускорить strlen в десять раз никакого ускорения вообще не будет.


Ох, не уверен. Ведь не одну strlen придется переписать, а весь string.h, если уж реализовать твою идею всерьез. А это обработка всех строк в С-коде, а это немалая часть этого кода, а этого кода тоже немало

PD>>Как насчет рекурсивности команды repne scas ?


FR>с этим к gear nuke


With best regards
Pavel Dvorkin
Re[28]: Зачем нужны циклы если есть рекурсивные функции
От: FR  
Дата: 30.09.09 12:00
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Уверен ? Приведи кусок кода из дизассемблера/отладчика


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

PD>>>Всегда применим, по крайней мере, пока речь идет о неуправляемом коде.


FR>>Угу язык си придумали именно поэтому.


PD>При чем тут C ? Асм-вставки есть, например, и на Delphi, я уж не говорю о подключении extern функций из DLL, написанных на асме — это практически в любом языке можно.


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

PD>Ох, не уверен. Ведь не одну strlen придется переписать, а весь string.h, если уж реализовать твою идею всерьез. А это обработка всех строк в С-коде, а это немалая часть этого кода, а этого кода тоже немало


Тоже фигня. Хочешь быстрой работы со строками забудь про string.h
Re[5]: Зачем нужны циклы если есть рекурсивные функции
От: LaptevVV Россия  
Дата: 30.09.09 13:26
Оценка: +1
Здравствуйте, gear nuke, Вы писали:

GN>А какая разница, как это реализуется, неужели от этого поменяется суть Впрочем, посмотрим, как...

GN>В последнем случает стек и для сохранения адреса возврата не используется. Да и что такое стек, адресуемая регистром общего назначения esp память? А почему именно esp, только потому, что в CISC x86 есть удобные команды для этого? Вот в самом первом примере стек значений от 5 до 0 реализован всего на одном регистре eax без посторонней памяти.
Не... Это не совсем регистр ОБЩЕГО назначения. Он является СПЕЦИАЛИЗИРОВАННЫМ регистром для указания именно вершины стека, поскольку и при выполнении команд CALL и ret, и при прерываниях (в частности в командах int xx и iret) его значение НЕЯВНО изменяется. Мы не можем задать ДРУГОЙ регистр, который вел бы себя аналогичным образом. И именно это неявное изменение и позволяет реализовать рекурсивные вызовы непосредственно на ассемблере. Таким образом, механизм поддержки рекурсии заложен непосредлственно в архитектуру.
То, что параметры при рекурсии складываются в стек, это необходимость для повторного входа. Но в архитектуре это не поддерживается и возлагается на программиста.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[16]: Зачем нужны циклы если есть рекурсивные функции
От: Gluk_Kazan  
Дата: 30.09.09 13:57
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>...потому что если цикл может быть реализован по регистру, рекурсия (если ее реализовать как положено) — это работа со стеком, то есть с памятью.

G>>Если рекурсию реализовать как положено, то она тоже прекратится в цикл в машинных кодах. Только не все компиляторы так умеют.

PD>Точнее сказать, никто не умеет. Потому что по calling convention, которые надо соблюдать, можно, конечно, аргументы передавать и через регистры, если их хватит, а вот адрес возврата всегда заносится в стек. По крайней мере в x86.


И gcc и MSVC давным давно умеют
Re[14]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 30.09.09 14:51
Оценка: 18 (1) +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Сколько раз писал mov eax, 0 — ошибок, связанных с тем, что при этом меняется EIP — не было. Другие были


Вопрос в решаемых задачах.

GN>>Из известных примеров — Windows при обработке 2х байтного int 3.


PD>М.б. Я честно сказать, не в курсе — вроде он был однобайтный. Мне такое самому писать не доводилось.


здесь

PD>За нашу и вашу свободу!




GN>>При этом, в зависимости от размера my_subroutine, может быть сделан "автоматический" выбор — инлайн, или call.


PD>Ну и прекрасно. То же, что и с inline в С — то ли будет, то ли нет, в зависимости от опций и настроения компилятора и фазы Луны. Еще есть __forceinline


Это все подконтрольно на самом деле.

GN>>Либо есть второй вариант — загнать себя в рамки без макросов


PD>Зачем ?


Потому что макросы якобы не есть Дзен и ведут к Немерло

>>и писать всё как настоящий джедай руками


PD>В кодах ?


На чистом ассемблере.

GN>>В машкодах нет, но на этом уровне абстракции никто и не работает.


PD>Как это никто не работает ? Люди — да.


Ну вообще-то иногда работают, но очень редко

PD> А процессор так вроде именно на этом уровне и работает. А выясняли мы вроде вопрос о подпрограммах именно в машинном коде. С командой ret , точнее, с командой из таких-то байтов (под рукой их нет)


У меня в примере мнемоники

Кстати, о ret. Мнемоника у неё retn. MASM понимает ret и автоматом подставит retn 8 при 2х входных параметрах stdcall подпрограммы. Говоря другими словами, команда перегружена В случае proc MASM ведёт себя как компилятор, можно даже представить себе транслятор который пойдёт дальше и будет инлайнить Хотя вряд ли кто будет писать — можно на макросах делать.

PD>Не увиливай. Я ничего не говорил о вызове и размере. Может, конечно. Только вот если код встраивается вместо вызова — это просто встраивание кода, а не вызов.


Я дополняю условия задачи до разумных, подпрограмма без вызова никому не нужна. А куда её встроит гипотетический транслятор — 80% его пользователей даже и не заметят

PD>Scheme я не знаю и маргинальными языками не интересуюсь.


Хм. Ну... тогда следует читать "LISP". Кстати создавали его что бы записывать алгоритмы для ассемблера. СОвременные макросы являются его жалким наследием

PD> Можно пример из какого-нибудь известного большинству языка? Pascal, C, C++, Java, C#, Basic, Fortran ...


А к чему ограничиваться этим списком?

Ок, возмём С: setjmp, CreateFiber, atexit() да и вообще разные колбэки. В С++ добавляются try {} catch {} Но это конечно цветочки...

PD>Может. При условии, что в том языке/системе это принято. В свое время (Win16) была calling conention Pascal (слева направо, стек очищает вызываемая). Если кто-то сейчас решится ее использовать -это будет ничем не оправданный трюк.


Этот — да. И это не отменяет возможную полезность других. На ассемблере каждый... пишет как он хочет (как лучше для решения задачи). Всё это "как принято" должно изучаться и писаться на других языках. Иначе на ассемблере не научиться, и писать смысла тоже нет — разве что времени куча.

PD>Я так подозреваю, что Hello, World в твоем определении тоже рекурсивна


Это вызов API (с побочным эффектом).
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 30.09.09 14:51
Оценка: -1
Здравствуйте, LaptevVV, Вы писали:

LVV>Не... Это не совсем регистр ОБЩЕГО назначения.


Я говорю не о 80286, а о 32ти битном режиме. Он ничем не хуже EDX.

LVV> Он является СПЕЦИАЛИЗИРОВАННЫМ регистром для указания именно вершины стека, поскольку и при выполнении команд CALL и ret,


Не "поскольку", а "в случаях, когда используются".

LVV>и при прерываниях (в частности в командах int xx и iret) его значение НЕЯВНО изменяется.


Перывания — тогда уж аппаратные надо упоминать. В Windows прерывания обрабатываются в ядре, в другом стеке.

LVV> Мы не можем задать ДРУГОЙ регистр, который вел бы себя аналогичным образом.


Если не вызывать внешнее API — можем.

LVV> И именно это неявное изменение и позволяет реализовать рекурсивные вызовы непосредственно на ассемблере. Таким образом, механизм поддержки рекурсии заложен непосредлственно в архитектуру.


Не вижу связи. "Неявное" (то есть описанное в доке) изменение можно всегда заменить не более чем парой отдельных команд. Intel C++ так делает при вызове stdcall API

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


Параметры при рекурсии могут передаваться в регистрах. Как в моих примерах. И если есть call — то же могут.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[20]: Зачем нужны циклы если есть рекурсивные функции
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 30.09.09 14:59
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Тебе еще раз повторить про ущербность самого наличия функции strlen, которая проистекает от ущербности наследния C?

PD>Кто мне тут про общие принципы говорил ? Забудь про С и строки , и оставайся просто при общих принципах.
Ну давай.

PD>Есть набор байтов, заканчивающийся нулем, найти сколько там байтов до нуля. Абстрактно, никакие не строки.

Ну покажи хоть одну реальную структуру, кроме asciiz строк, которая так выглядит.

А вот если еще более общий случай рассмотерть, такой как список, у которого голова и хвост, то именно на таких структурах используется рекурсия.
Кстати asciiz строка и является таким списком:
если p — char*, то получение головы — *p, хвоста — p+1, пустой список *p == NULL.

PD>Такая задача может возникнуть, или же, коль скоро в С такое используют для С-строк, надо эту задачу анафеме предать ?

Ну покажи хоть один реальный пример, иначе анафеме предаем.
Re[27]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 30.09.09 15:05
Оценка: :))
Здравствуйте, FR, Вы писали:

PD>>Как насчет рекурсивности команды repne scas ?


FR>с этим к gear nuke


С этим довольно просто — в мануалах действие команд описано алголоподобным синтаксисом, осталось выбрать другой
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[12]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 30.09.09 15:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

GN>>Да, новой не является. Пример с ASCIIZ — широко известный из учебников частный случай. И, что странно — зная про ASCIIZ, люди продолжают писать первый вариант цикла обработки битов. Попробу найти хоть одного человека, кто напишет 2й (можно изменить условия задачи, что бы было решабельно на ЯВУ).


PD>Ну посмотри, например, ассемблерный код strlen. Зная про ASCIIZ, люди из MS тем не менее не стали реализовать тупой проход (зато простой и понятный! ах как хорошо понятный , а устроили работу с DWORDами, далеко не столь ясную, да еще и на ассемблере. Из чего следует, что не все так просто, как тебе кажется. Как минимум — надо померить и тот,и другой алгоритмы по скорости.


Эх забыл я что тут любят уводить разговор в сторону и купился. Ответа на мой вопрос нет. Лаконичного императивного описания 2го кода отсюда
Автор: gear nuke
Дата: 28.09.09
нет и не будет. Ну и не надо: отрицательный результат — тоже результат
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Зачем нужны поля в .Net?
От: EvilChild Ниоткуда  
Дата: 30.09.09 16:06
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Мда уж. Это действительно то, что будет во второй бете? А почему в System.Collections.Generic

На эти вопросы скорее AVK ответит чем я.
now playing: Ellectrica — X File (Boris Brejcha Remix)
Re[22]: Зачем нужны циклы если есть рекурсивные функции
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.09.09 20:45
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Да какая там гордость. Не требовалось просто, вот и все.


Это многое говорит о твоих задачах.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
AVK Blog
Re[7]: Зачем нужны поля в .Net?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.09.09 20:45
Оценка:
Здравствуйте, EvilChild, Вы писали:

_FR>>Мда уж. Это действительно то, что будет во второй бете? А почему в System.Collections.Generic

EC>На эти вопросы скорее AVK ответит чем я.

AVK только слышал про наличие System.Reactive в SL3 Toolkit. При чем тут System.Collections.Generic я вообще не в курсе. В beta 2 скорее всего ничего, кроме IObserver/IObservable не будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237 on Windows 7 6.1.7100.0>>
AVK Blog
Re[29]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 04:15
Оценка: :)
Здравствуйте, FR, Вы писали:

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


Неубедительно. Платформы разные, но и библиотеки тоже разные. Я не знаю Unix, но сомневаюсь, что код strcpy берется там из *.lib файла

PD>>>>Всегда применим, по крайней мере, пока речь идет о неуправляемом коде.


FR>>>Угу язык си придумали именно поэтому.


PD>>При чем тут C ? Асм-вставки есть, например, и на Delphi, я уж не говорю о подключении extern функций из DLL, написанных на асме — это практически в любом языке можно.


FR>При том что появление языка си как раз и затолкало ассемблер в ту очень узкую нишу в которой он сейчас находится.

FR>Про дельфи не надо, я уже потрохов VCL накушался, там ассемблер по бедности, не смогли борландовцы нормальный оптимизатор осилить.

Ассемблер был еще в Турбо Паскале.

PD>>Ох, не уверен. Ведь не одну strlen придется переписать, а весь string.h, если уж реализовать твою идею всерьез. А это обработка всех строк в С-коде, а это немалая часть этого кода, а этого кода тоже немало


FR>Тоже фигня. Хочешь быстрой работы со строками забудь про string.h


Наоборот. Это самый быстрый код. Быстрее, чем std::string. На эту тему в форуме C++ много было.
With best regards
Pavel Dvorkin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.