Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Результаты опроса: Какой язык лучше
C# лучше всегда и везде 17 36.17%
Kotlin лучше всегда и везде 3 6.38%
Kotlin лучше для Android-а, C# в остальных случаях 5 10.64%
C# лучше для Web-а, Kotlin в остальных случаях 0 0%
Kotlin для Android-а, C# для Web-а, в остальном одинаковы 0 0%
C# лучше для Android-а, Kotlin в остальных случаях 0 0%
C# для Android-а, Kotlin для Web-а, в остальном одинаковы 1 2.13%
Примерно одинаково хороши во всех областях применения 6 12.77%
Оба бесперспективны 5 10.64%
Оба "Тьюринговская трясина" (п. введён для Fulcrum_013) 4 8.51%
Свой вариант (желательно о нём рассказать) 6 12.77%
Голосовавшие: 47. Вы ещё не голосовали в этом опросе

 
 
Рейтинг 4.69/162: Рейтинг темы: голосов - 162, средняя оценка - 4.69
Модератор
 Аватар для Curry
5165 / 3527 / 536
Регистрация: 01.06.2013
Сообщений: 7,677
Записей в блоге: 9

C# vs Kotlin

30.11.2018, 18:26. Показов 38447. Ответов 384
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!

Java c C# уже сравнивали несколько раз. А как насчёт улучшенного (а может кто то считает "улучшенного") варианта java - языка Kotlin?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2018, 18:26
Ответы с готовыми решениями:

Xamarin vs Kotlin?
Здравствуйте, возник такой вопрос, если откинуть на время ios, и разрабатывать android приложения, что из них будет лучше Xamarin или...

Kotlin vs Java
Добрый день, проконсультируйте плиииз! Больше года не садился за проги под андроид и решил "восстановить навык"... (вобще...

Язык программирования Kotlin
Достаточно интересный новый (2011г.) язык Kotlin, предлагающийся компанией JetBrains (как? вы не слышали про JetBrains?:p:rtfm:) на замену...

384
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 12:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
GC - инструмент хороший и практичный.
Доказательства где?

Добавлено через 59 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
Это вы у нас тут доказательств нормальных (обратного) привести не смогли.
Вам приведено доказательство бесполезности GC. И это мы еще не касались такого насущного вопроса как динамический ребиндинг.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Инициатива источника не подразумевает ссылку на КАЖДЫЙ из таких источников
Достаточно того что форма имеет ссылку на источник а источник на форму чтобы GC уже стал бесполезным. При этом все таки удобней биндить поле непосредственно к контролу который его отображает а навигатор к самой таблице.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
19.12.2018, 12:08
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Доказательства где?
Везде. Любое ПО на управляемом языке работает. Включая форум на котором вы пеной брызжете. Включая компилятор, который на C# написан (Roslyn). Вы не смогли предоставить описания сценария и примера кода, когда приложение с GC не сможет нормально работать. Не смогли.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вам приведено доказательство бесполезности GC.
Ничего не привели вы. Только эмоции один и ветер от махания языком. Код мне приведите, где видно было бы, что GC не позволяет писать эффективные и нормальные рабочие приложения. Вы этого не сможете, ибо не знаете такой ситуации.

Добавлено через 1 минуту
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Достаточно того что форма имеет ссылку на источник а источник на форму чтобы GC уже стал бесполезным. При этом все таки удобней биндить поле непосредственно к контролу который его отображает а навигатор к самой таблице.
В том же WinForms применяется BindingSource, который выступает простейшей ViewModel. Ссылка на него одна, сколько бы у вас контролов ни было на форме. Выбрасывается форма, выбрасывается её ViewModel. Всё диспозится самим WinForms и никаких утечек не происходит. Всё просто работает.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 12:08
Цитата Сообщение от Usaga Посмотреть сообщение
Любое ПО на управляемом языке работает.
Работоспособность ПО не может являться доказательством необходимости GC. Реально он только мешает автоматической работе с памятью и это вам было продемонстрировано.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
19.12.2018, 12:09
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Работоспособность ПО не может являться доказательством необходимости GC. Реально он только мешает автоматической работе с памятью и это вам было продемонстрировано.
Работоспособность ПО доказывает, что GC как минимум не мешает написанию такого ПО. По факту - помогает. И да, вы ничего не продемонстрировали. Код где, Карл?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 12:10
Цитата Сообщение от Usaga Посмотреть сообщение
По факту - помогает.
ПО факту мешает.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
19.12.2018, 12:11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ПО факту мешает.
Нет. ПО на управляемых языках, любой сложности, существует и отлично работает. Обратного вы не смогли доказать ни кодом ни ссылкой.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 12:56
Цитата Сообщение от Usaga Посмотреть сообщение
Код где, Карл?
Да будет вам код. Довырежу на примерчик и будет. Задача как понимаете последней стпени важности. Или вы думаете вам всю библиотеку автоматического управления памятью проприентарного фреймверка вывалят без купюр?
А пока можете погуглить как аналогичная задачка на искоробочных средствах STL решается. Это на каждом заборе расписано. Оно правда по возможностям в планеразборки иерархий от GC недалеко ушло, потому как предназначалось аки его заменитель для бедных. Но для примитивных хранилищ данных хватает выше крыши и вообще самое то. А для активных объектов конечно поудобнее более продвинутая система на двунаправленных ссылках.

Добавлено через 38 минут
Цитата Сообщение от Usaga Посмотреть сообщение
ПО на управляемых языках, любой сложности, существует и отлично работает
Касательно к примеру любого веб-проекта ПО на управляемых языках делает ровно 0,1% работы которая вся заключается в разравнивании ввода-вывода. А остальные 99,9% делает как раз нативное ПО как то ОС,СУБД,Веб-Сервер, виртуальные машины, боаузер и т.д. Так что про любой сложности не надо заливать.Примитивнейший CURD и тот манаджеду дается с трудом и кучей костылей.

Добавлено через 56 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
Выбрасывается форма, выбрасывается её ViewModel.
А другая форма которая ту же таблицу пользует как?
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
19.12.2018, 13:05
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да будет вам код. Довырежу на примерчик и будет. Задача как понимаете последней стпени важности. Или вы думаете вам всю библиотеку автоматического управления памятью проприентарного фреймверка вывалят без купюр?
Мне не нужна библиотека. Мне нужен пример кода на управляемом языке, где было бы видно, что GC бесполезен. Я не собираюсь сравнивать языки с GC с С++ или любым другим неуправляемым языком, что удобнее, а что нет. Мне интересно увидеть пример, где видно, что приложение с GC вообще не работоспособно.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Касательно к примеру любого веб-проекта ПО на управляемых языках делает ровно 0,1% работы которая вся заключается в разравнивании ввода-вывода. А остальные 99,9% делает как раз нативное ПО как то ОС,СУБД,Веб-Сервер, виртуальные машины, боаузер и т.д. Так что про любой сложности не надо заливать.Примитивнейший CURD и тот манаджеду дается с трудом и кучей костылей.
Я вам уже называл не примитивнейшие приложения. Тот же Roslyn. Kestrel - веб-сервер платформы ASP.NE Core - тоже на C# и тоже прекрасно работает.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Примитивнейший CURD и тот манаджеду дается с трудом и кучей костылей.
Например?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А другая форма которая ту же таблицу пользует как?
ViewModel идёт на одну форму. "Источники" данных спрятаны за ней и развязываются с формой. И это не костыль для борьбы с GC, а вариант архитектурного решения. Поскольку у "таблицы" нет ссылки на форму, то форма спокойно собирается GC.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 14:54
Usaga, Доказательством ненужностти GC может быть невозможность реализовать тот же функционал автоматики что и на языках с более совершенными средствами. Вы сами согласились что автоматически такой функционал при помощи GC реализовать не возможно. Какие еще доказательства отсталости GC от современных средств вам нужны?
0
Модератор
 Аватар для Curry
5165 / 3527 / 536
Регистрация: 01.06.2013
Сообщений: 7,677
Записей в блоге: 9
19.12.2018, 15:06  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Какие еще доказательства отсталости GC от современных средств вам нужны?
А современны средства это только С++ и его претендент на наследство D ?
Как вы думаете, почему во всех остальных языках появившихся после С++ нет автоматически вызываемых деструкторов?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 15:28
Цитата Сообщение от Curry Посмотреть сообщение
почему во всех остальных языках появившихся после С++ нет автоматически вызываемых деструкторов?
По привычке. Аки в симуле. Да и мощу автовызова и куда ее прикрутить более-менее осознали не раньше 10 лет назад.
При этом как бы тулзы для спецов есть и их изобретать не надо, достаточно совершенствовать.
Но потому как квалифицированных спецов дефицит жуткий, все это время во всю пузырился рынок срамо-агиловых антинаучных псевдометодик и неквалифицированных быдлокодеров с примитивнейшими хеллоувердами - ну типа бум веббыдлодева и прочих типа напишите свое приложение через 21 день и продавайте в майкрософт сторе. А им эти топ-тулзы как видите не осилить в принципе. Тут знания нужны и понимания графов ссылок с которыми нужно работать и принципы их построения и разборки. Вот и изобретают для них так чтоб типа без знаний но сразу оп и в дамки. Но так не бывает. В результате получают с современными архитектурами полностью ручное управление памятью - все эти пройти вручную ничем не отличаются от ручного вызова delete. В результате тонны быдлоскрипта и постоянного его рефакторинга уже давно создают больше проблем чем дают толку.
Ну а вообще очень серьезный барьер который сейчас не могут преодолеть в дизайне языков - цепные функции с автоматическим вызовом. Т.е. как деструктор но для любой функции. Вся проблема в том что непонятно как назначать критерии ее автовызова - если по выходу из скопа то это от деструктора ничем не отличается, а как указать другие критерии концептуально не ясно.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
19.12.2018, 18:35
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Доказательством ненужностти GC может быть невозможность реализовать тот же функционал автоматики что и на языках с более совершенными средствами. Вы сами согласились что автоматически такой функционал при помощи GC реализовать не возможно. Какие еще доказательства отсталости GC от современных средств вам нужны?
Нет, не доказательство. Если вы не знаете, как реализовать на не С++ нечто, то это не значит что не можно, просто у вас квалификации на это нет. А значит и заявления свои вы можете при себе оставить. Я согласился только с тем, что GC сам ссылки не разрывает. Из этого следует ничего. В особенности бесполезность GC. Кейс, описанный ранее, крайне редок и решается по месту возникновения. Ваша "кастомная библиотека" - из той же оперы. Но почему-то, учитывание этого кейса на С++ с помощью "кастомной библиотеки" - нормально и по-пацански, а то же самое в C# - фу-фу-фу. Это предвзятость чистой воды.

Господин Fulcrum_013, всё, что вы доказали - только вашу некомпетентность и любовь помахать языком. Покажите мне код, в котором GC бесполезен. Чтобы я его мог у себя запустить и лично убедиться, что вы не балаболите. Пока что, вы уверенно и качественно доказываете обратное.
2
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
19.12.2018, 20:41
Usaga, Ну дак покажите вы как это реализовать в автоматическом режиме. Вы же сами сказали - только ручками.
Цитата Сообщение от Usaga Посмотреть сообщение
Покажите мне код, в котором GC бесполезен
99,99999% существующего кода.

Добавлено через 15 минут
Цитата Сообщение от Usaga Посмотреть сообщение
а то же самое в C# - фу-фу-фу.
Не тоже самое а вручную. Разницу понимаете между библиотечными средствами которые пишутся один раз, запускаются автоматически, и работают для любых наборов ссылок данной схемы и написанием очистки вручную для каждого случая использования схемы?

Цитата Сообщение от Usaga Посмотреть сообщение
Кейс, описанный ранее, крайне редок и решается по месту возникновения
Да что вы такое говорите. В той же VCL этот кейс встречается по куче раз в каждом модуле. И вообще кейс композит+обсервер+лайтвеигхт встречается везде и повсюду в любом софте. Даже в более-менее объемном веб-интерфейсе очень часто костылят викрефы с ручным инкрементом/декрементом чтобы эти кейсы разруливать. (сокет то у них один а то сайт пошлет).
При этом вы не привели ни одного кейса где ваш GC не может быть заменен даже искоробочным набором STL. И не приведете. Потому что такой юскейс действительно крайне редоки в иерархиях объектов вообще не встречается. При этом в комплекте с GC корректная работа WeakReference тоже никак не гарантирована. Что сужает реальное применение GC в автоматическом режиме до гораздо меньшего количества юскейсво чем даже решает искоробочная STL.

Добавлено через 6 минут
А причина вся в том что времена поменялись а соответсвенно и характер задач. GC проектировался в 50-ых и соответсвенно рассчитывался на работу с пассивными буферами данных. Обработка же и графы ссылок характерные для активных сущностей, таких как иерархии объектов, отличается кардинально. Здесь наиболее оптимальна двунаправленная схема слабо-владеющих и слабых ссылок с поддержкой самоудаления объекта. Работу с ней автоматика C++ способна обеспечить в 100% автоматическом режиме, в отличии от GC который потребует 100% ручного режима так же как и паскали и т.п.

Добавлено через 9 минут
Ну и главный момент - GC не есть и никогда не был средством защиты от утечек. Это средство защиты от висячих ссылок путем перевода их в утечки в надежде что эти утечки временны. Очевидно что склонность к труднообнаруживаемым утечкам - это главный недостаток GC. Система же защиты от висячих ссылок на двунаправленных ссылках такого недостатка лишена по определению. При этом именно двунаправленные ссылки востребованы в подавляющем большинстве современных юсекейсов для обеспечения взаимодействия объектов в иерархии. Очевидно что автоматика обеспечивающая работу такой системы наиболее эффективна как в плане удобства разработки так и в плане надежности и эффективности. Но такая автоматика не разу не про манаджед а про С++.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,869
20.12.2018, 07:59
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну дак покажите вы как это реализовать в автоматическом режиме. Вы же сами сказали - только ручками.
Как ссылки разорвать явно? Только руками. Как и в плюсах. Речь о том, что такое нужно крайне редко, чтобы не говорили разного рода личности.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
99,99999% существующего кода.
Откуда число взято? С потолка?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Не тоже самое а вручную. Разницу понимаете между библиотечными средствами которые пишутся один раз, запускаются автоматически, и работают для любых наборов ссылок данной схемы и написанием очистки вручную для каждого случая использования схемы?
В C# такая библиотека уже реализована в самом CLR - GC. И оно прекрасно работает. Случай, что вы выше описали, разруливается вручную в любом случае, в любом языке. И этот случай редок и не может выступать мерилом полезности\бесполезности GC.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да что вы такое говорите. В той же VCL этот кейс встречается по куче раз в каждом модуле. И вообще кейс композит+обсервер+лайтвеигхт встречается везде и повсюду в любом софте. Даже в более-менее объемном веб-интерфейсе очень часто костылят викрефы с ручным инкрементом/декрементом чтобы эти кейсы разруливать. (сокет то у них один а то сайт пошлет).
Мне плевать с высокой колокольни, что там в VCL, и где там нужно вручную подсчёт ссылок вести. В WinForms \ WPF ничего подобного делать не нужно вообще. Байндинги диспозятся, формы закрываются, "висяки" не появляются.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
При этом вы не привели ни одного кейса где ваш GC не может быть заменен даже искоробочным набором STL.
Я и не собирался) Я уже явно и чётко обозначил свою позицию: я не собираюсь сравнивать подходы, какой лучше, какой хуже. Я отстаиваю простую точку зрения: GC выполняет свои обязанности корректно и качественно на приложениях любого масштаба и сложности. И это подтверждается практикой (наличием популярного ПО на управляемых языках). Я вам даже названия говорил.

Т.е. мне всё равно какой подход эффективнее и гибче. GC справляется. Точка. А вы доказать обратного не можете.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А причина вся в том что времена поменялись а соответсвенно и характер задач. GC проектировался в 50-ых и соответсвенно рассчитывался на работу с пассивными буферами данных. Обработка же и графы ссылок характерные для активных сущностей, таких как иерархии объектов, отличается кардинально. Здесь наиболее оптимальна двунаправленная схема слабо-владеющих и слабых ссылок с поддержкой самоудаления объекта. Работу с ней автоматика C++ способна обеспечить в 100% автоматическом режиме, в отличии от GC который потребует 100% ручного режима так же как и паскали и т.п.
Это всё пустая болтовня ни о чём. Приложения любой сложности писать с применением GC можно и они будут работать хорошо. Это доказывают существующие решения.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну и главный момент - GC не есть и никогда не был средством защиты от утечек.
Внезапно, это никто и не утверждал. Это - средство уборки мусора, а не защита от утечек. Это лично я прекрасно понимаю и без вас.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это средство защиты от висячих ссылок путем перевода их в утечки в надежде что эти утечки временны.
Что за бредятина?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Очевидно что склонность к труднообнаруживаемым утечкам - это главный недостаток GC.
Тоже бред.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.12.2018, 19:04
Цитата Сообщение от Usaga Посмотреть сообщение
В WinForms \ WPF ничего подобного делать не нужно вообще.
ТАк в дельфе тоже ничего не нужно в том что реализовано в фреймверке . НО это сделано в ручную под капотом для того набора ссылок который уже есть для взаимосвязей созданных фреймверкам. Тоже самое в дельфе. Для добавляемых же вами взаимосвязей это придется точно так же делать вручную. Фактически аки в дельфе. Хотя бы потому что для разруливания таких связей необходима немедленная реакция на разрыв ссылки, чего GC делать не в состоянии.
Цитата Сообщение от Usaga Посмотреть сообщение
Случай, что вы выше описали, разруливается вручную в любом случае, в любом языке
А вот тут вы сильно заблуждаетесь. В плюсах это разруливается автоматом. Сам автомат конечно пишется один раз и вручную. Потом просто расставляются взаимосвязи, а вся работа по отслеживанию разрыва ссылки и реализации последствий разрыва происходит уже автоматтически.
Цитата Сообщение от Usaga Посмотреть сообщение
Это доказывают существующие решения.
Это ничего не доказывает потому что нет исходного кода этих решений а соответственно и не видно сколько там ручного обнуления. А его там на каждом шагу.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Это - средство уборки мусора,
Это средство защиты от висячек. Именно потому что уборка должна защищать от утечек и именно в этом ее смысл а GC таким средством не является.

Добавлено через 16 минут
Цитата Сообщение от Usaga Посмотреть сообщение
GC справляется.
Это не есть доказательством его незаменимости о которой в орете на каждом шагу. Точно так же только лучше с теми же задачами что и GC справляются и искоробочные смартпоинтеры STL. Но опять же в современном мире ни то ни другое не есть ни достаточным ни лучшим средством для разруливания основных юсекейсов даже банального набора паттернов "банды четырех".

Добавлено через 7 минут
Цитата Сообщение от Usaga Посмотреть сообщение
: GC выполняет свои обязанности корректно и качественно на приложениях любого масштаба и сложности
При этом актуальность его обязанностей равна 0,00001% от того что необходимо сделать. При этом GC мешает использованию других средств автоматики, которые эту остальную актуальную работу, которая в его обязанности не входит способны делать на 100%.

Добавлено через 4 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Например?
Да все тот же пример с картинки. В CURD эта структура ссылок - основа датабиндинга который нужен на каждом шагу.

Добавлено через 17 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Внезапно, это никто и не утверждал
А я и не говорил что вы это утверждали.
Цитата Сообщение от Usaga Посмотреть сообщение
Что за бредятина?
Объект висит в памяти пока на него есть ссылки а не пока его существование необходимо. Это временная утечка которая без ручного обнуления ссылок запросто перерастает в косвенную утечку. Т.е. суть косвенной утечки понимаете? Ссылка на объект есть, но сама ссылка никогда не будет переписана. Вот к таким утечкам и склонен GC. Причем такие утечки гораздо труднее обнаруживаемы и устраняемы чем висячие ссылки от которых он такой ценой защищает.
Цитата Сообщение от Usaga Посмотреть сообщение
Это - средство уборки мусора,
Таковым он не является. Уборка мусора- это средство эмуляции компьютера с бесконечной паматью. Очевидно что без надежной защиты от утечек такая эмуляция не возможна в принципе.

Добавлено через 12 минут
Цитата Сообщение от Usaga Посмотреть сообщение
Т.е. мне всё равно какой подход эффективнее и гибче.
Т.е. против того что GC как средство автоматики устарел вы ничего возразить не можете? Так именно об этом я и говорю.

Добавлено через 1 час 49 минут
Цитата Сообщение от Usaga Посмотреть сообщение
И этот случай редок и не может выступать мерилом полезности\бесполезности GC.
Этот случай - сочетание паттернов композит обсервер и лигхтвеигхт, которые являются основой современной разработки. А соответственно если GC для этого сочетания бесполезен, то и для современной разработки он бесполезен. Если же при этом учесть что он исключает применение современных средств, способных справится с таким графом ссылок автоматически, то он не просто бесполезен а вреден

Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Я и не собирался)
Ну вы же болоболите о незаменимости GC? Приведите хотя бы один пример где нельзя без него обойтись в автоматическом режиме.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Я и не собирался)
Ну вы же болоболите о незаменимости GC? Приведите хотя бы один пример где нельзя заменить GC более совершенными и эффективными средствами автоматики. Примеры же где такие средства невозможно заменить при помощи GC вам приведены.

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
А вы доказать обратного не можете
Обратное давно доказано - GC не способен работать в автоматическом режиме в графах ссылок характерных паттернам ООП при этом исключает возможность создания работающих с этими графами автоматических средств. Точка.
0
Модератор
 Аватар для Curry
5165 / 3527 / 536
Регистрация: 01.06.2013
Сообщений: 7,677
Записей в блоге: 9
21.12.2018, 04:54  [ТС]
Я тут прикинул как бы на C# могла бы выглядеть автоматика для двухстороннего байндинга.
Это просто набросок, не лягайтесь сильно.
Библиотечка в BaseBindingLib.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Collections.Generic;
 
namespace BaseBindingLib
{
    public interface IBindable
    {
        void AddBind(object bind);
        void UnBind(object bind);
    }
    public interface IBinder
    {
        void UnBind(object bindable);
    }
    public class BaseBindable<Bind> : IBindable
        where Bind : IBinder
    {
        protected SortedSet<Bind> binders = new SortedSet<Bind>();
        public void AddBind(object bind)
        {
            binders.Add((Bind)bind);
        }
        public void UnBind(object bind)
        {
            binders.Remove((Bind)bind);
        }
        public void UnBindAll()
        {
            foreach (var b in binders)
                b.UnBind(this);
            binders.Clear();
        }
    }
 
    public class BaseBinder<LeftBindable, RightBindable> : IBinder
        where LeftBindable  : class, IBindable
        where RightBindable : class, IBindable
    {
        protected LeftBindable left;
        protected RightBindable right;
        public BaseBinder(LeftBindable left, RightBindable right)
        {
            this.left = left;
            this.right = right;
            left.AddBind(this);
            right.AddBind(this);
        }
        public void UnBind(object bindable)
        {
            if (bindable != null)
            {
                if (bindable is LeftBindable && (object)left == bindable)
                {
                    right.UnBind(this);
                }
                else if (bindable is RightBindable && (object)right == bindable)
                {
                    left.UnBind(this);
                }
 /*              else return;
                left = null; // а нужно ли обнулять ? 
                right = null; //
*/
            }
        }
    }
}

И пример использования для построения какого то байндинга. Передача сообщений просто как демка - должно же что то между связанными объектами происходить.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using BaseBindingLib;
 
namespace GCTest
{
    class Source : BaseBindable<ExampleBinder>
    {
        public void Send(string s)
        {
            foreach (var b in binders)
                b.Transmith(s);
        }
    }
 
 
    class Destination : BaseBindable<ExampleBinder>
    {
        public void Receive(string s)
        {
            Console.WriteLine($"Destination.Receive: {s}");
        }
    }
 
    class ExampleBinder : BaseBinder<Source, Destination>
    {
        char[] dummy = new char[500 * 1024 * 1024]; // что бы GC изволил обратить внимание на объект
        public ExampleBinder(Source left, Destination right): base(left,right)
        {
        }
        public void Transmith(string s)
        {
            if (right != null)
                right.Receive(s);
        }
        ~ExampleBinder()
        {
            Console.WriteLine("ExampleBinder finalizing");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Source s = new Source();
            {
                Destination d = new Destination();
                new ExampleBinder(s, d);
                for (int i = 0; i < 3; i++)
                    s.Send(string.Format("Transmith from Source to Destination N{0}", i));
                d.UnBindAll();                
            }
            GC.Collect();
            Console.ReadKey();
        }
    }
}

Результат выполнения
Destination.Receive: Transmith from Source to Destination N0
Destination.Receive: Transmith from Source to Destination N1
Destination.Receive: Transmith from Source to Destination N2
ExampleBinder finalizing

Перед отправкой в мусор одного из связанных объектов для него нужно вызвать UnBindAll().
При реализации какого то реального байндинга этот вызов будет где то в недрах этой реализации.
Гуры C# конечно бы лучше сочинили, но, думаю, суть понятно, что забиндивание-разбиндивание вполне можно вынести в либу и использовать один раз.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
21.12.2018, 05:47
Цитата Сообщение от Curry Посмотреть сообщение
Перед отправкой в мусор одного из связанных объектов для него нужно вызвать UnBindAll().
Дык вот в тому и суть что надо. Оно и в дельфе без всякого GC вот именно так же работает - надо вызвать деструктор, надо вызвать из деструктора и т.д. В чем разница с полностью ручным управлением в дельфе и наличием GC в шарпе кроме того что GC ничего не делает и тормозит? Какой толк перелопачивать весь граф ссылок чтобы найти объекты которые мы по факту вынуждены явно помечать ненужными?
А других объектов в инфраструкутрах с деревом владения как то нема.
Т.е. получается что с GC хуже чем вообще без автоматики.

Добавлено через 6 минут
Curry, Надеюсь знаете же единственный случай возникновения оторванного кольца которое без GC не удаляется? Так в древовидных иерархиях неравноправных элементов ака композит, а особенно с тотальным запретом на передачу владения, возникновение такого кольца невозможно. А все остальное без GC разбирается лучше чем с GC.
0
Модератор
 Аватар для Curry
5165 / 3527 / 536
Регистрация: 01.06.2013
Сообщений: 7,677
Записей в блоге: 9
21.12.2018, 12:57  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
В чем разница с полностью ручным управлением в дельфе и наличием GC в шарпе
В моём примере, если бы сообщения отправлялись и принимались в трэдах, без GC пришлось бы освобождать память под сообщения ручками. В С++ всё равно без GC это чуть сложнее. А таких случаев много. В результате с GC добавляется одна строчка с UnBindAll(), но сокращается в других местах. В целом короче. И меньше человеческих ошибок. Если считать что программист никогда не ошибается, то GC менее полезен, наверное. Ну, да, есть потеря в runtime. Хотя авторы OCaml заявляли что он с некоторыми задачами справляется быстрее чем С++ и вообще его поцизионируют для мягкого realtime.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
21.12.2018, 17:45
Цитата Сообщение от Curry Посмотреть сообщение
В моём примере, если бы сообщения отправлялись и принимались в трэдах,
Если работать с объектами в иерархи через треды, то каждый объект к которому есть обращение на запись вообще надо лочить через мютекс. А потом унлочить. Иначе бяда бяда будет. С унлоком у С++ тоже покрасивше будет. Но вопрос в том что если нужна синхронизация то это уже не распараллеливание а эмуляция однопотока средствами многопотока. Т.е. параллелить нужно или в режиме разделения ресурсов или в другом месте.

Добавлено через 1 час 10 минут
Цитата Сообщение от Curry Посмотреть сообщение
Хотя авторы OCaml заявляли что он с некоторыми задачами справляется быстрее чем С++ и вообще его поцизионируют для мягкого realtime
Это говорит всего лишь об абсолютной безграмотности авторов OCaml в вопросах реалтайма и не более. В реалтайме важна не скорость как таковая, а предсказуемость времени выполнения каждой отдельно взятой операции. А GC вообще вреден, потому что перераспределение динамической памяти и бессмысленно и опасно а по сему избегают его как огня.
Автора явы тоже ее в начале для реалтайма позиционировали. Но оттуда их сразу поганой метлой погнали и вообще чуть не растреляли как вражеских диверсантов. Такое впечатление что у подобных авторов это способ пиара такой.

Добавлено через 14 минут
Цитата Сообщение от Curry Посмотреть сообщение
В моём примере, если бы сообщения отправлялись и принимались в трэдах,
В реальной жизни реального фреймверка другие треды (каллбеки из ядра оси) приходят именно в датамодули. Датамодули получают из них данные в синхронизируемые хранилища, потом синхронизируются с главным потоком путем отправки сообщения оси и уже в главном потоке напрямую обновляют данные связей.
Это сделано специально чтобы вынести мультипоточную работу с тяжелыми наборами данных из иерерахии, сделав все объекты редактировани/отображения к данных легковесными, а соответственно не требующими многопотока.
Т.е. сделано по принципу параллелить или в режиме разделения ресурсов или в другом месте. В результате весь многопоток изолирован в работе с буферами модулей данных, а синхронизация нужна минимально возможная, потому что при таком распараллеливании всю иерархию связанных объектов датамодули могут рассматривать как один цельный ресурс требующий синхронизации при обновлении.
А если делать по другому и рыться по иерархии в многопотоке, то придется синхронизировать доступ через мутексы при каждом доступе к каждому объекту в иерархии, вне зависимости от наличия или отсутсвия GC.

Добавлено через 16 минут
Тот же самый принцип применим в абсолютно всех других предметных областях. К примеру в САПР параллелить надо не работу по разборке/сборке/доступу к элементам чертежа, а решение уравнений пересечения поверхностей и прочий счет по данным генерируемым на основе созданной иерархии элементов.
0
Модератор
 Аватар для Curry
5165 / 3527 / 536
Регистрация: 01.06.2013
Сообщений: 7,677
Записей в блоге: 9
21.12.2018, 19:44  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если работать с объектами в иерархи через треды, то каждый объект к которому есть обращение на запись вообще надо лочить через мютекс. А потом унлочить.
Да ты что! Ну надо же.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С унлоком у С++ тоже покрасивше будет.
В С# c этим не хуже. И вообще, любые автоматические действия при выходе из скопа легко реализуются на языках где есть хотя бы обработка исключений и лямбды. А вот автоматические действия при отправке конкретных данных в мусор - это да, с этим не фатальный, но напряг без автодеструкторов.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
если нужна синхронизация то это уже не распараллеливание а эмуляция однопотока средствами многопотока
Нет такой терминологии. Есть распараллеливание, есть конкуренция. В обоих случаях есть синхронизация.
А ещё бывают языки с зелёными тредами, некоторые так спроектированы, что почти всё через создание дополнительных тредов делается цена создания которых мала. Но это не про С++/C#.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
В реальной жизни реального фреймверка другие треды (каллбеки из ядра оси) приходят именно в датамодули.
Да я не конретизировавал в примере что за модули связываются. Насчёт передачи данных сообщениями - так в винде и в некоторых рилтайм ОС для микроконтроллеров. Не уверен что так в линукс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2018, 19:44

Kotlin для Android
Здравствуйте, знаю Java SE на приличном уровне, но решил, что для разработки Android приложения лучше подойдет Kotlin, подскажите...

[Kotlin] ACM ICPC
Котлин уже попал в список языков чемпионата мира по программированию (ACM ICPC). Думаю, очень хорошие перспективы у этого языка.

Kotlin lateinit переменная
синтаксис на Kotlin. есть переменная lateinit , но когда при getApiServisce() я проверяю на null происходит фатальная ошибка lateint...

Простая задача по Kotlin
Дана непустая последовательность ненулевых целых чисел. Используя функцию, определить, сколько раз в этой последовательности меняется знак....

Как учить Kotlin и стоит ли?
Добрый день, вообще я фрилансер пишу сайты на таких технологиях HTML, CSS, jQuery, WordPress, сейчас для практики делаю для себя блог на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
240
Ответ Создать тему
Новые блоги и статьи
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru