Re: Существуют ли задачи, где использование GOTO оправдано?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.08.07 12:33
Оценка: 4 (2) :)
Здравствуйте, Vedrus, Вы писали:

V>Люди, кто-нибудь может привести пример, где использование GOTO оправдано?


Спецификация языка C#, Ecma-334, 15.9.1 The break statement

When multiple switch, while, do, for, or foreach statements are nested within each other, a break statement applies only to the innermost statement. To transfer control across multiple nesting levels, a goto statement (§15.9.3) shall be used.

Re[9]: Существуют ли задачи, где использование GOTO оправдан
От: SP_ Украина  
Дата: 27.08.07 13:47
Оценка: +1
Здравствуйте, konsoletyper, Вы писали:

K>Вот я и говорю: смартпоинтеры нужны, потому что нет GC. А выделенное — ложь, т.к. GC гораздо быстрее смартпоинтеров, а managed heap — быстрее unmanaged heap. Да и проблем от этих смартпоинтеров куча. Начиная хотя бы с того, что нужно не забывать использовать именно их, а не воспользоваться сдуру обычным указателем.


Достаточно смелое утверждение, особенно с учетом того что GC память тянет из обыкновенной unmanaged кучи. А если и получается быстрей то толко за счет использования пулов. Которые кстати и со смарт-пойнтерами можно реализовать

НО самое забавное получается когда несколько разных менеджеров памяти интенсивно работают одновременно. К примеру, запускаю явовский FireFox и дотнетовскую студию. Через некоторое время работы каждый из них подгреб к себе в кеш изрядное кол-во ОЗУ. И потом при переключении между задачами наблюдаем как он эти пулы на диск — с диска ворочает(с первым фаерфоксом вообще весело было, он кажется при сворачивании в таск бар себя полностью на диск высвапливал). А возможности сказать "родной освободи кеш, поерь мне что он тебе не понадобиться в ближайшее время" у юзверя нету
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Существуют ли задачи, где использование GOTO оправда
От: fefelov Россия  
Дата: 27.08.07 14:25
Оценка:
Здравствуйте, SP_, Вы писали:

SP_>НО самое забавное ... запускаю явовский FireFox


FF на яве написан???
Re[11]: Существуют ли задачи, где использование GOTO оправда
От: SP_ Украина  
Дата: 27.08.07 14:35
Оценка:
Здравствуйте, fefelov, Вы писали:

F>Здравствуйте, SP_, Вы писали:


SP_>>НО самое забавное ... запускаю явовский FireFox


F>FF на яве написан???

Никогда не интересоваля специально, но почему то всю жизнь думал так с Ну если нет — заменить слвоо "явовский" на "с самописным менеджером памяти" :-D
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Существуют ли задачи, где использование GOTO оправда
От: Eugeny__ Украина  
Дата: 28.08.07 07:58
Оценка:
Здравствуйте, fefelov, Вы писали:

F>Здравствуйте, SP_, Вы писали:


SP_>>НО самое забавное ... запускаю явовский FireFox


F>FF на яве написан???


Существует порт FF для java(WebRenderer), но сам он, конечно, не жавовский
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[10]: Существуют ли задачи, где использование GOTO оправда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.08.07 08:43
Оценка: 1 (1)
Здравствуйте, SP_, Вы писали:

SP_>НО самое забавное получается когда несколько разных менеджеров памяти интенсивно работают одновременно. :) К примеру, запускаю явовский FireFox и дотнетовскую студию. Через некоторое время работы каждый из них подгреб к себе в кеш изрядное кол-во ОЗУ. И потом при переключении между задачами наблюдаем как он эти пулы на диск — с диска ворочает(с первым фаерфоксом вообще весело было, он кажется при сворачивании в таск бар себя полностью на диск высвапливал). А возможности сказать "родной освободи кеш, поерь мне что он тебе не понадобиться в ближайшее время" у юзверя нету :)


А это общая проблема всего GC — оно не очень адекватно сочетается с виртуальной памятью, особенно с её "резиновой" реализацией в случае Mach-styled VM (это все юниксы и в заметной степени Windows). Единственный полностью адекватный этому вариант (но неудобный по другим параметрам) я видел в Lua: сборка полная (инкрементальной там нет) запускается когда сумма размеров объектов превысила удвоенную такую сумму сразу после предыдущей сборки. Противоположным примером была ранняя ява. Сейчас с распространением схем с поколениями, инкрементальностью и т.д. вообще непонятно, как оно себя будет вести;) а осознавать проблему на должном уровне и позволять настройки типа "приближаясь к границе 2*last_known, мы резко форсируем сборку" явовцы не хотят — видимо, им общность с нишей типа "мобилки" важнее:)

Вообще (отклоняясь в сторону) переделка VM под новые требования — давно назревшая проблема. В частности, в случае активного свопинга надо было бы раздавать процессам сообщения типа "урежьте осетра". В Win16 это было (WM_COMPACT). В Win32 похерили. Сейчас даже MSDN его не знает. Другой аспект — особенно важный для Mach-styled VM — что показатели затраты памяти процессами — это показатели примерно такого уровня, как средняя температура по больнице включая морг и крематорий: например, память процесса может состоять из
1) отображённых заведомо неизменяемых данных с диска (бОльшая часть кода и библиотек)
2) отображённых данных диска, которые могут быть локально изменены и будут наследоваться (в unix) потомками
3) отображённых данных диска, которые могут быть изменены и на диске
4) локальных данных процесса (например, стек) не порождённых как отображение диска
и при этом каждое (кроме первого) может быть общее на несколько процессов и создавать локальную копию по copy-on-write.
В этих условиях увидев, например, что пять одноимённых процессов съели по 100M памяти, нельзя сказать, сколько они съели в сумме — может, те же 100M, а может, 500M. Может быть реальной любая промежуточная цифра.
Но тут проблема даже не в учёте, а в неопределённости момента, когда переполнится память (неважно, вся системы, одного процесса или группы процессов) и как на это реагировать, учитывая, что очистительные действия тоже могут менять память и вызывать вследствие commit'а или copy-on-write новые выделения!
Лечения обсуждались, но на сейчас воз и ныне там.
The God is real, unless declared integer.
Re[10]: Существуют ли задачи, где использование GOTO оправда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.08.07 09:01
Оценка:
Здравствуйте, ionicman, Вы писали:

I>>>это называется getter & setter насколько я понимаю? В моделях класса СИ не сделана изза больших накладных расходов — раз

AJD>>Какие расходы? Это всего лишь синтаксический сахр.
I>>>и два — она не согласуется с прницпом что у класа есть methods & properties. т.к. она является средним между ними.
AJD>>Принцип methods & properties & variables не хуже :)
I>Почитай плиз про низкоуровневые язык и реализацию в них классов — как таблицы строятся как выборка проискходит — ибо
I>создание сеттеров и геетеров придется запихивать изза неоднозначностив таблицы — и поймешь почему.

Не понял. В чём неоднозначность-то? Компилятор ловит синтаксическое присвоение полю (переменной-члену) класса и переводит его в вызов метода (функции-члена). Где тут создавать неоднозначность? И при чём тут низкоуровневость?

I>Хм... а есть низкоуровневый язык с реализацией такого принципа methods & properties & variables?

I>Я просто не встречал ни разу такое.

А мы разве говорим про низкоуровневые языки? Уже C++ как минимум среднего уровня.
The God is real, unless declared integer.
Re[8]: Существуют ли задачи, где использование GOTO оправдан
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.08.07 09:04
Оценка:
Здравствуйте, ionicman, Вы писали:

N>>>>- принудительная инициализация полей класса до начала работы конструктора

I>>>эээ.... не понял... а чем мешает то? ну надо тебе в конструкторе проинитить — проинить в нем — ну будет 2 инициализации — чего страшного?
N>>При том, что бывают ситуации, когда необходимо, например,
N>>- вызвать некоторую сложную функцию для обработки входных данных конструктора
N>>- использовать её ответ для инициализации _нескольких_ полей
I>эээ:

I>somthing( a,b,c ) {

I> bigCount( &a,&b, &c );
this->>prop1 = a;
this->>prop2 = b;
I>...
I>}

I>это не канает?


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

N>>>>- принудительный вызов конструктора предка до конструктора потомка

I>>>эээ.... ну это очень спорный аргумент ибо есть извечная борьба курицы с яйцом.
N>>Аргумент о чём? Я и говорю, что было выбрано решение, жёстко ограничивающее возможности программиста.
I>как можно создать потомка без конструктора предка в НИЗКОУРОВНЕВОМ языке?

А при чём тут собственно уровень языка? Я уж не говорю, что низкоуровневым сейчас лучше назвать что-то вроде Си, а в нём есть полная свобода — вызывай, не вызывай:)
Но я не против вызова конструктора предка как такового. Я против того, чтобы это было так жёстко ограничено, как сейчас. Сейчас исключаются любые сложные подсчёты, что именно вызвать у предка (какой конструктор и с какими параметрами). При том, что компилятор в состоянии проверить, например, что код написан так, что конструктор зовётся во всех возможных ветках исполнения (это уже лет 20 не проблема проверить).

N>>>>- VMT при работе конструктора — VMT этого класса, а не создаваемого

I>>>ну это концепция языка, кстати достаточно существенно ускоряющая выборку и затраты для VMT
N>>Что она ускоряет, если каждому конструктору надо менять VMT на свою?
I>Выборку она ускоряет — для того чтобы определить нужный вектор не требуется бегать и собирать данные по наледышам

Здрасти. А кто сейчас "бегает"? Вы, видимо, не представляете себе, как строится VMT. Если, например, в A определены f() и g(), обе виртуальные, а в B переопределена f(), то VMT для A будет содержать указатели на A.f() и A.g(), а VMT для B — для B.f() и A.g(). Обе VMT сидят в неизменяемой памяти (скорее даже в .code), и всё "бегание" отработано во время компиляции, таблицы составлены и конструкторы просто ставят соответствующий указатель.

N>>>>- отказ от явного property

I>>>Вот про последнее не понял, что хотел сказать.
N>>Во многих языках property — это нечто выглядящее как переменная, но реально вызывающее методы _класса_ (а не этого поля) для чтения и присвоения. Хорошая замена традиционным для C++ getXxx(), setXxx().
I>это называется getter & setter насколько я понимаю? В моделях класса СИ не сделана изза больших накладных расходов — раз и два — она не согласуется с прницпом что у класа есть methods & properties. т.к. она является средним между ними.

Нет, это называется property:) А вот уже у property есть getter и setter. И, возможно, не только они (в идеале это может быть полноценный класс). А последней Вашей фразы я совсем не понял. У класса есть methods & fields (в терминологии object pascal), или member functions и member variables (в терминологии принятой в C++ среде). Properties там нет.

И откуда накладные расходы??? Во второй раз встречаю эту легенду и не понимаю, откуда она берётся.

I>Хотя да, достаточно удобно, согласен. албтернативы есть — тотже поток ввода, хотя так красиво конечно не будет.


/me совсем не понял, при чём тут поток ввода (istream?)

N>>Ага, ага. Как только говорится о том, что чего-то нет — мне сразу "на сегодня потребности в колбасе нет". Не надоело?

N>>Наконец, я не понимаю, к чему это всё, если предшествующая дискуссия шла в духе
N>>- C++ необычайно гибок, в нём нет искусственных ограничений
N>>- да вот же они: (1) (2) (3) (4)
I>Хехе. Видишь присуща языкам более высокого уровня. тебяж не смущает что в СИ именованых массивов нет?

Кто такой именованный массив? Хэш, он же словарь? Так неудивительно — уровень не тот.

I> Единственное с чем могу согласится это по поводу getters & setters. но мож и будет в след. стандартах.


А с тем, что ограничения искусственны — согласен или нет?

I>Ну и не забывай — абсолютно универсального и свободного нет ничего. Просто в СИ всего n пунктов тебя не устраивающих — в жругих языках гораздо больше будет, только сравнивай языки одного уровня.

Дык и не забываю.

N>>Или Вы считаете, что эти все ограничения, которые я перечислил — "естественны"? Ну тогда посмотрите ещё несколько ООП языков, где решения совсем иные — и подумайте, почему там эти вещи сделаны совсем иначе.:)

I>Конечно. Приведи пример таких языков? я таких не знаю.

Object Pascal, включая наиболее известный диалект от Борланда и диалект принятый на Маках. Крупное принципиальное отличие — работа с VMT в конструкторах/деструкторах — там всегда используется VMT "конечного" класса. Из-за этого переписка Trubo Vision на C++ дала множество извратов.

Python. Да, уже другой мир (динамический). В частности, есть properties (как минимум в двух разных реализациях). Ну и вообще поведение класса меняется очень жестоко хотя бы из-за __getattr__, __setaddr__ и аналогичных методов. Про метаклассы вообще не вспоминаю:)

Perl. В общем близко к Питону. За счёт основы на tied переменной вместо традиционного хэша можно вытворять много чего (те же properties — влёгкую).

Не будем растекаться в сторону например Smalltalk, чтобы не засорять тему:)
The God is real, unless declared integer.
Re[11]: Существуют ли задачи, где использование GOTO оправда
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.08.07 12:05
Оценка:
Здравствуйте, netch80, Вы писали:
N>Вообще (отклоняясь в сторону) переделка VM под новые требования — давно назревшая проблема. В частности, в случае активного свопинга надо было бы раздавать процессам сообщения типа "урежьте осетра". В Win16 это было (WM_COMPACT). В Win32 похерили. Сейчас даже MSDN его не знает.
Может, потому что он назывался WM_COMPACTING?
http://msdn2.microsoft.com/en-us/library/ms632618.aspx
Кстати, о нем до сих пор помнят: http://msdn2.microsoft.com/en-us/library/microsoft.win32.systemevents.lowmemory.aspx

N>Другой аспект — особенно важный для Mach-styled VM — что показатели затраты памяти процессами — это показатели примерно такого уровня, как средняя температура по больнице включая морг и крематорий: например, память процесса может состоять из

N>1) отображённых заведомо неизменяемых данных с диска (бОльшая часть кода и библиотек)
N>2) отображённых данных диска, которые могут быть локально изменены и будут наследоваться (в unix) потомками
N>3) отображённых данных диска, которые могут быть изменены и на диске
N>4) локальных данных процесса (например, стек) не порождённых как отображение диска
N>и при этом каждое (кроме первого) может быть общее на несколько процессов и создавать локальную копию по copy-on-write.
N>В этих условиях увидев, например, что пять одноимённых процессов съели по 100M памяти, нельзя сказать, сколько они съели в сумме — может, те же 100M, а может, 500M. Может быть реальной любая промежуточная цифра.
N>Но тут проблема даже не в учёте, а в неопределённости момента, когда переполнится память (неважно, вся системы, одного процесса или группы процессов) и как на это реагировать, учитывая, что очистительные действия тоже могут менять память и вызывать вследствие commit'а или copy-on-write новые выделения!
N>Лечения обсуждались, но на сейчас воз и ныне там.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Существуют ли задачи, где использование GOTO оправдан
От: vnp  
Дата: 28.08.07 22:18
Оценка: :)
Здравствуйте, x-code, Вы писали:

XC>Я видел куски кода, где операторов goto больше чем всех остальных операторов вместе взятых. Если добавить к этому, что практически все переменные там были глобальные, их имена — сокращения на невероятной смеси транслита и английского, в которой от каждого слова вставлено 1-2 буквы, выравнивания кода нет в принципе, а комментарии используются исключительно для комментирования неработающих почему-то кусков кода... то после 10 минут работы с этим хотелось запретить не только goto, но и все не-ООП возможности С++, а ООП сделать в 100 раз строже.


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

Страшилка:
Досталась мне в переделку системка. Все было написано на асме, без операционки и т.д. и т.п. Частью ее был умеренно сложная процедура; алгоритм известен только понаслышке. Поручил сотруднику неназываемой национальности переписать на Ц. Он переписал:

unsigned int AX, BX, CX, DX;
...


Угадайте, какой оператор там использовался чаще всего?
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: alexeiz  
Дата: 29.08.07 05:50
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>
vnp>unsigned int AX, BX, CX, DX;
vnp>


Нестандартное мышление, однако.
Re[4]: Существуют ли задачи, где использование GOTO оправдан
От: Sni4ok  
Дата: 29.08.07 05:55
Оценка: :)
Здравствуйте, alexeiz, Вы писали:

vnp>>
vnp>>unsigned int AX, BX, CX, DX;
vnp>>


A>Нестандартное мышление, однако.


согласен, стандартно было бы

unsigned int Rax, Rbx, Rcx, Rdx;
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: Erop Россия  
Дата: 03.09.07 19:12
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>
vnp>unsigned int AX, BX, CX, DX;
vnp>...
vnp>


vnp>Угадайте, какой оператор там использовался чаще всего?

А как он, например, витвлся. Вообще имел доступ к слову флагов?
Как делал pop и push?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Существуют ли задачи, где использование GOTO оправда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.09.07 19:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, netch80, Вы писали:

N>>Вообще (отклоняясь в сторону) переделка VM под новые требования — давно назревшая проблема. В частности, в случае активного свопинга надо было бы раздавать процессам сообщения типа "урежьте осетра". В Win16 это было (WM_COMPACT). В Win32 похерили. Сейчас даже MSDN его не знает.
S>Может, потому что он назывался WM_COMPACTING?
S>http://msdn2.microsoft.com/en-us/library/ms632618.aspx

Я искал по WM_COMPACT, не нашёл в MSDN, нашёл пару упоминаний в гугле и решил, что этого доставточно. OK, название было неправильное. Но в текущих статьях чётко написано, что он только для совместимости с Win16. То есть потом таки похерили. Это основное моё утверждение здесь, название для меня несущественно.
The God is real, unless declared integer.
Re[9]: Существуют ли задачи, где использование GOTO оправдан
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 05.09.07 16:03
Оценка:
Здравствуйте, Sergey, Вы писали:

>> S>И насколько оно будет медленнее, если вместо goto там написать просто break?

>>
>> break там ни к месту, если вы смотрели код внимательно.

S>Может я конечно что-то и проглядел, но все goto там только и делают, что осуществляют выход из switch. При этом я не обнаружил ни одного места, где goto были бы во вложенных в switch циклах. Так что лучше просто скажите, где конкретно break там не подходит?


Теоретически, любой код с использованием goto можно заменить на соответствующий switch внутри цикла, и осуществлять переход на как goto label, а как { new_state = label; break; }. Только это (1) две строчки вместо одной (2) дополнительный lookup по таблице вместо jump (3) дополнительная нагрузка для мозгов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Существуют ли задачи, где использование GOTO оправдан
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 05.09.07 16:27
Оценка: +1
Здравствуйте, Vedrus, Вы писали:

V>ЗЫ. Может у кого ещё примеры есть


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

e2-e4
Ng1 — f3
e5 : d4
e5 x d4
e4
Nf3
Nxf3
Ngf3
Ngxf3
N1d2
N1xd2
Qa1b2
Qa1xb2
exd4
ed
ed4

Собственно говоря, я это реализовал через цикл (не хотелось огорчать заказчика goto), но думаю, что использование goto тут дало бы более читабельный вариант

  state = START;
    while (state != FINISH)
      switch(state)
        {
          case START:
              /* ... */
                state = AFTER_FIGURE;
                break;
            case AFTER_FIGURE:
      ............
           case AFTER_FILE:    
      ............
           case AFTER_RANK:    
      ............
           case DEST_FILE:    
        }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Существуют ли задачи, где использование GOTO оправдан
От: vnp  
Дата: 05.09.07 17:47
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, vnp, Вы писали:


vnp>>
vnp>>unsigned int AX, BX, CX, DX;
vnp>>...
vnp>>


vnp>>Угадайте, какой оператор там использовался чаще всего?

E>А как он, например, витвлся. Вообще имел доступ к слову флагов?
E>Как делал pop и push?

Вручную!
Re[10]: Существуют ли задачи, где использование GOTO оправда
От: Sergey Россия  
Дата: 06.09.07 07:14
Оценка:
>>> S>И насколько оно будет медленнее, если вместо goto там написать просто break?
>>>
>>> break там ни к месту, если вы смотрели код внимательно.
>
> S>Может я конечно что-то и проглядел, но все goto там только и делают, что осуществляют выход из switch. При этом я не обнаружил ни одного места, где goto были бы во вложенных в switch циклах. Так что лучше просто скажите, где конкретно break там не подходит?
>
> Теоретически, любой код с использованием goto можно заменить на соответствующий switch внутри цикла, и осуществлять переход на как goto label, а как { new_state = label; break; }. Только это (1) две строчки вместо одной (2) дополнительный lookup по таблице вместо jump (3) дополнительная нагрузка для мозгов.

В данном конкретном случае ситуация обратная — два слова goto label можно поменять на один break. Впрочем, вы меня не поняли — я вовсе не критикую само решение использовать в этом коде goto. Как ни странно, применение там break только ухудшит читаемость. Просто аргументация насчет производительности мне показалась не соответствующей действительности.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.