На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 394 395 [396] 397 398 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата MyNameIsIgor @
    Цитата D_KEY @
    Можно поговорить об освобождении ресурсов, GC, деструкторах, финализаторах и Dispose

    :lool:

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

    Цитата
    1. Почему в дельфи нет GC? Какие-то фундаментальные сложности? Или он всё же есть в виде каких-то библиотек/расширений?
    Если нет, то как бы мог выглядеть GC в дельфи?
    2. Зачем в шарпе финализаторы? На мой дилетантский взгляд они просто не нужны :P

    Спасибо :D !
      Цитата D_KEY @
      Ну так, можно сказать, последняя надежда на возрождение холивара.

      Чё, топоры точим? :D
        Цитата MyNameIsIgor @
        1. Почему в дельфи нет GC? Какие-то фундаментальные сложности? Или он всё же есть в виде каких-то библиотек/расширений?
        Если нет, то как бы мог выглядеть GC в дельфи?

        Хороший вопрос! Сейчас делфятники начнут что-то втирать про возможность использовать разные Менеджеры Памяти для разных модулей и т.п., но мы-то знаем, что просто "ниасилили" и тянули совместимость с Паскалем. Я еще понимаю зачем нужна совместимость с Си в С++, но с Паскалем-то зачем?.. Кодавая база на этом языке была и остается несравнимо меньше Сишной, можно было просто оставить этот хлам.

        И это при том, что профессор Н.Вирт, ЕМНИП, во всех своих языках после Паскаля использовал GC...
        Сообщение отредактировано: korvin -
          korvin, а про финализаторы что скажешь? Ты же используешь Яву?
          И, по традиции, можешь немного рассказать о "функциональщине" :)
          В часности интересно, как там решают проблемы с освобождением ресурсов.
            Цитата MyNameIsIgor @
            2. Зачем в шарпе финализаторы? На мой дилетантский взгляд они просто не нужны :P

            Ну это по-моему слабо. Если я правильно понимаю, что такое финализаторы в C#, то они нужны для того, чтобы объект мог освободить все занятые собой ресурсы, ведь только класс "видит" внутреннюю структуру объекта и имеет к ней доступ. С памятью проще, поэтому ее можно отдать на откуп GC.

            Кроме того обычно память не обязательно освобождать сразу после того, как объект стал недоступен (а нормальные GC так и не делают), в отличие от, например, открытого (на запись или просто монопольно) файла. Время же освобождения памяти пожалуй важно только в системах (жесткого) реального времени и, вероятно, других критичных к этому системах (я просто не знаю, где еще это важно). Хотя и на этот случай, насколько мне известно, разрабатывались (не знаю насчет реального применения) специальные GC для Java, например.

            Добавлено
            Цитата D_KEY @
            korvin, а про финализаторы что скажешь? Ты же используешь Яву?
            И, по традиции, можешь немного рассказать о "функциональщине" :)
            В часности интересно, как там решают проблемы с освобождением ресурсов.

            Точно также, как и в любом другом языке с GC -- подобиями try-finally. Плюс различные сахарные формы (синтаксические или просто функции) открытия одного ресурса с автоматическим вызовом закрытия (финализатора), например:

            синтаксическая форма:
            ExpandedWrap disabled
              (with-open-file (strem path)
                (read stream))

            файл будет гарантировано закрыт при выходе из блока with-open-file

            функция:
            ExpandedWrap disabled
              withOpenFile path { stream =>
                read stream
              }


            поэтому наличие общего интерфейса наподобии
            ExpandedWrap disabled
              interface Resource {
                open();
                close();
              }


            вполне полезно
              Цитата korvin @
              Если я правильно понимаю, что такое финализаторы в C#, то они нужны для того, чтобы объект мог освободить все занятые собой ресурсы

              Проблема в том, что тебе не известно, когда и в каком контексте вызовется финализатор и вызовется ли он вообще :)
              Так что для освобождения ресурсов его использовать очень странно - для этого используется во всех современных языках RAII(пришедший из С++).
              Но в языках с GC нет деструкторов, потому используется специальные конструкции, using в C#, with в Python и try-with-resources в Java :)
              Про финализаторы в Java могу процитировать негативные отзывы, все тех же, Эккеля("Философия Java") и Блоха("Эффективное использование Java"), которых цитировал по поводу конструкторов и finally.
                Цитата korvin @
                Ну это по-моему слабо.

                Просто основной шмат говнеца заготовлен на тот момент, когда шарписты начнут доказывать, что без него никуда :yes:
                Цитата korvin @
                Если я правильно понимаю, что такое финализаторы в C#, то они нужны для того, чтобы объект мог освободить все занятые собой ресурсы

                Для этого у них есть волшебный IDisposable :) А в финализаторах они имеют привычку проверять, вызывался ли метод Dispose. Если нет, то чистят. А память да, на откуп GC. Так собственно вопрос: правильно ли я понимаю, что финализатор спасает обезьянок, которые вовремя Dispose не вызвали, создавая иллюзию правильно работающей программы? Ведь по сути что получается - GC рулит память, он же вызывает финализатор, который может вызвать Dispose, который в свою очередь чистит ресурсы-не-память. Таким образом с плеч обезьянок снимается и на GC вешается управление не-памятью.
                  Цитата D_KEY @
                  Проблема в том, что тебе не известно, когда и в каком контексте вызовется финализатор и вызовется ли он вообще :)

                  А, т.е. я неправильно понял. Финализатор выполняется перед освобождением памяти объекта? Ну тогда его видимо можно использовать для освобождения каких-то ресурсов, время освобождения которых также не важно. Хотя я и не скажу, что это могут быть за ресурсы. И еще смущает "неизвестно ... вызовется ли он вообще", т.е. может и не вызваться? Если не сложно, процитируй краткое определение/описание финализаторов.
                    В Python'е используется управление памятью на основе счетчиков ссылок, поэтому объект разрушается сразу, как только на него исчезает последняя ссылка. Кроме того в питоне объект может иметь деструктор (специальный метод __del__), поэтому для этого языка тоже возможно нормальное использование RAII. Ссылки правда там пропадают только при выходе из функции, поэтому гибкость хуже, чем в C++. С другой стороны, если объект оказывается включен в циклическую структуру, он может быть вычищен сборщиком мусора. Правда наличие деструктора может помешать в таком случае удалить объект.
                    Собственно, ничто не мешает программировать на питоне без использования finally.
                      Цитата amk @
                      В Python'е используется управление памятью на основе счетчиков ссылок

                      Точно? Или всё же GC?
                      Цитата amk @
                      в питоне объект может иметь деструктор (специальный метод __del__), поэтому для этого языка тоже возможно нормальное использование RAII

                      Я думал, что RAII работает с помощью блока with...
                      Сообщение отредактировано: MyNameIsIgor -
                        Цитата korvin @
                        А, т.е. я неправильно понял. Финализатор выполняется перед освобождением памяти объекта?

                        Ну фактически так. Его дергает GC

                        Цитата
                        И еще смущает "неизвестно ... вызовется ли он вообще", т.е. может и не вызваться?

                        Поскольку он дергается из GC, то и зависит все от того, как этот самый GC работает, как часто вызывается, много ли памяти, часто ли создаются объекты и т.п.
                        В общем случае нельзя утверждать, что финализатор будет вызван вообще, поскольку при определенных обстоятельствах(малой интенсивности создания объектов и большом объеме свободной памяти) GC может или быть вообще не вызван, или не дойдет до нашего объекта(например, при сборке с поколениями).

                        Цитата
                        Если не сложно, процитируй краткое определение/описание финализаторов.

                        Ну так гугл ж :D
                        А так - метод, который дергается GC перед освобождением памяти, выделенной под объект.

                        Добавлено
                        Цитата amk @
                        В Python'е используется управление памятью на основе счетчиков ссылок, поэтому объект разрушается сразу, как только на него исчезает последняя ссылка. Кроме того в питоне объект может иметь деструктор (специальный метод __del__), поэтому для этого языка тоже возможно нормальное использование RAII. Ссылки правда там пропадают только при выходе из функции, поэтому гибкость хуже, чем в C++. С другой стороны, если объект оказывается включен в циклическую структуру, он может быть вычищен сборщиком мусора. Правда наличие деструктора может помешать в таком случае удалить объект.
                        Собственно, ничто не мешает программировать на питоне без использования finally.

                        В питоне работает подсчет ссылок + опциональный GC, который чистит циклы.
                        Цитата
                        garbage collection
                        The process of freeing memory when it is not used anymore. Python performs garbage collection via reference counting and a cyclic garbage collector that is able to detect and break reference cycles.


                        А для RAII там "менеджеры контекста" и with.

                        Добавлено
                        Цитата korvin @
                        Точно также, как и в любом другом языке с GC -- подобиями try-finally. Плюс различные сахарные формы (синтаксические или просто функции) открытия одного ресурса с автоматическим вызовом закрытия (финализатора), например

                        А, ну тоже RAII :)
                          Цитата MyNameIsIgor @
                          1. Почему в дельфи нет GC? Какие-то фундаментальные сложности? Или он всё же есть в виде каких-то библиотек/расширений?
                          Если нет, то как бы мог выглядеть GC в дельфи?

                          См. Delphi Prism.
                          Цитата MyNameIsIgor @
                          2. Зачем в шарпе финализаторы? На мой дилетантский взгляд они просто не нужны :P

                          Чтобы освобождать ресурсы, время использования которых не критично. И да, зачастую вызывают Dispose(), т.к. лучше поздно, чем никогда :)
                          Цитата MyNameIsIgor @
                          Просто основной шмат говнеца заготовлен

                          :lol: У тебя его всегда в избытке заготовлено.
                            Цитата IL_Agent @
                            Чтобы освобождать ресурсы, время использования которых не критично

                            А можно пример таких ресурсов?
                            Цитата IL_Agent @
                            У тебя его всегда в избытке заготовлено.

                            Даже не знаю... Это комплимент?
                              Цитата IL_Agent @
                              Чтобы освобождать ресурсы, время использования которых не критично.

                              Это что за ресурсы такие?

                              Цитата
                              И да, зачастую вызывают Dispose(), т.к. лучше поздно, чем никогда :)

                              А разве это не бага?
                                Цитата MyNameIsIgor @
                                А можно пример таких ресурсов?

                                Я, например, использовал однажды. Надо было создавать базу, а потом она должна была удаляться...
                                Цитата MyNameIsIgor @
                                Даже не знаю... Это комплимент?

                                Ну ты сам решай :D
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 394 395 [396] 397 398 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5598 ]   [ 14 queries used ]   [ Generated: 30.07.26, 08:00 GMT ]