◄ 1 2 3 ► |
Информационные технологии
:: Математика и алгоритмы
|
|
| ||
Почему 1С 12.02.21 - 14:20 | Может вопрос не по профилю форума, но видел подобные вопросы по compscience.
В общем вопрос такой, кто посоветует материал (курсы , книги), чтобы освоить лямбда функции, сами то они просты, но видимо требуют особого понимания как научится мыслить ими. Я могу читать и понимать код состоящий из каскада лямбда функций, но вот сам так писать не могу (всегда скатываюсь классический код без функциональщины), а хочу практики чтобы набить руку и при этом делать это правильно. Если кто имеет опыт буду благодарен если поделитесь. | ||
Кирпич 101 - 14.02.21 - 10:05 | (96) Неправильно. Правильно так: Процедурные языки хуже объектно-ориентированных, а объектно-ориентированные хуже процедурных. | ||
Serginio1 102 - 14.02.21 - 10:56 | (88) Ты не читатель. Еще раз про "не задумываясь" было про то как реализован в итоге Linq и замыкания на нижнем уровне.
Да я знаю как это работает и какие подводные камни, но мне не интересно во что конкретный Linq запрос преобразуется или async await. Я мыслю конструкциями высшего порядка. Мало того эта реализация меняется от версии к версии компилятора. Ты же это слово переиначил вообще ко всему. Не надо так нервничать. (89) Поверь можно.Есть IntPtr есть fixsed https://metanit.com/sharp/tutorial/8.4.php есть ref return https://habr.com/ru/company/microsoft/blog/423061/ | ||
Serginio1 103 - 14.02.21 - 11:48 | (73 ) >> Если ты пишешь цепочку типа list.filter(fn1).map(fn2).foldr(fn3), сколько в результате будет циклов по побору данных?
В .Net есть такая замечательная штука как yield return Суть её в том, что создается итератор (класс) с MoveNext и Current Тут подрасптсали https://habr.com/ru/post/136828/ https://ru.stackoverflow.com/questions/505018/В-чем-польза-yield И соответственно вычисление идет не с лева на право, а с права то есть foldr вызовет MoveNext у map, map у filter а filter у list В итоге будет всего один цикл. Поэтому я и не задумываюсь как будет реализовано в итог. И какие может выполнить оптимизации компилятор для оптимизации | ||
Вафель 104 - 14.02.21 - 12:01 | мап однозначно генерит новый массив | ||
Serginio1 105 - 14.02.21 - 12:08 | (104) Да, как и OrderBy итд (не массив а итератор).
https://metanit.com/sharp/tutorial/15.8.php Но я про то, что вычисления идут с права на лево | ||
Asmody 106 - 14.02.21 - 12:22 | (103) ну вот, а говорил "не задумываясь" | ||
Ненавижу 1С 107 - 14.02.21 - 12:35 | |||
Ненавижу 1С 108 - 14.02.21 - 12:35 | (107) 3,3 и 4 выдаст | ||
Serginio1 109 - 14.02.21 - 13:54 | |||
Кирпич 110 - 14.02.21 - 14:24 | Посравнивал linq с не linq
[1c] using System; using System.Linq; namespace csh { class Program { static void Main(string[] args) { int itercount = 10000; int numscount = 100000; var numbers = new double[numscount]; var r = new Random(); for (int i = 0; i < numscount; i++) { numbers[i] = r.Next(999); } Console.WriteLine("for"); int count = 0; var t = DateTime.Now; for (int i = 0; i < itercount; i++) { for (int ii = 0; ii < numscount; ii++) { if (numbers[ii] < 100) count++; } } var t2 = DateTime.Now; Console.WriteLine(t2.Subtract(t)); Console.WriteLine(count); Console.WriteLine("foreach"); count = 0; t = DateTime.Now; for (int i = 0; i < itercount; i++) { foreach (double d in numbers) { if (d < 100) count++; } } t2 = DateTime.Now; Console.WriteLine(t2.Subtract(t)); Console.WriteLine(count); Console.WriteLine("linq"); count = 0; t = DateTime.Now; for (int i = 0; i < itercount; i++) { count += numbers.Count(x => x < 100); } t2 = DateTime.Now; Console.WriteLine(t2.Subtract(t)); Console.WriteLine(count); } } } [/1c] | ||
Кирпич 111 - 14.02.21 - 14:25 | for
00:00:01.7805429 100070000 foreach 00:00:01.7357639 100070000 linq 00:00:07.5117874 100070000 | ||
Кирпич 112 - 14.02.21 - 14:26 | правда я в C# не шарю. мож чо неправильно написал | ||
Serginio1 113 - 14.02.21 - 14:54 | |||
Кирпич 114 - 14.02.21 - 15:06 | C# конечно загадочный. Мало того, что в него понапихали кучу всего, так еще надо знать как это всё внутри работает. Иначе будут тормоза и утечки памяти.
Вот как можно догадаться что numbers.Count(x => x < 100) будет работать медленнее чем numbers.Where(x => x < 100).Count() ??? | ||
Serginio1 115 - 14.02.21 - 15:09 | |||
Serginio1 116 - 14.02.21 - 15:10 | |||
Кирпич 117 - 14.02.21 - 15:14 | Получается, я должен все прибамбасы C# исследовать в доль и поперек, чтобы оно у меня быстро работало. А можно ничего не исследовать и писать тупыми дедовскими циклами сразу эффективно. | ||
Кирпич 118 - 14.02.21 - 15:15 | (115) Про утечки в .NET читал где то. | ||
Кирпич 119 - 14.02.21 - 15:16 | |||
Кирпич 120 - 14.02.21 - 15:17 | |||
Serginio1 121 - 14.02.21 - 15:26 | (117) Суть линка не в скорости выполнения, а в декларативном написнии запроса.
Быстрее пишешьшь код, проще читать. Ты же пишешь на 1С, а не каком то супер быстром языке. Опять же есть оптимизаторы которые ты игнорируешь. (118) Самая простая утечка памяти это статические переменные, и соответсвенно различные подписки итд. И если ты передаешь COM , в нативное приложение тоже понятно. Но это не утечка памяти. Утечки это когда нет статических переменных и внешних нативных приложений держащих ссылки | ||
Кирпич 122 - 14.02.21 - 15:32 | (121) "Суть линка не в скорости выполнения, а в декларативном написнии запроса."
Это я уже понял. Годится для тяп ляп и в кассу. | ||
Кирпич 123 - 14.02.21 - 15:36 | Стратегия linq понятна:
Пишем на linq, а если будут орать, что медленно и требовать деньги назад, то переписываем на циклы. | ||
Кирпич 124 - 14.02.21 - 15:37 | Переписываем, естественно, за деньги. :) | ||
Serginio1 125 - 14.02.21 - 15:40 | (122) Нет он годится для нормального написания кода.
В том числе и для Sql где в качестве коллекции это IQueriable и в качестве замыкания уже не лямбда выражения а деревья выражений. И задуман он был для SQL, а для списков это приятный довесочек. Так что любители эткономит на тактах добро пожаловать в адовый код циклов. А вот кто хочет писать и читать лаконичный, но легко читаемый код добро пожаловать в широкий мир C# где кроме Linq есть и async await (внутри тоже итераторы используются) (124) Тебе дан широкий спектр инструментов. Можешь вообще не писать. Проходили это все более 10 лет назад. И большинство приняло линк, отказавшись от циклов. | ||
Serginio1 126 - 14.02.21 - 15:44 | (124) Не надо ничего переписывать просто подключаешь https://github.com/antiufo/roslyn-linq-rewrite
Но ты же упорно игнорируешь. Главное обосрать! | ||
Кирпич 127 - 14.02.21 - 15:44 | (125) "И большинство приняло линк, отказавшись от циклов." да я тоже не против. Я на питоне тоже на linq строчу тыпляпы всякие. Но я от питона скорости не жду. | ||
Serginio1 128 - 14.02.21 - 15:55 | (127) Опять игнорируешь (126). Легким движением руки подключаешь https://github.com/antiufo/roslyn-linq-rewrite и твой тяп ляп превращается в высокоуровневые циклы! | ||
Кирпич 129 - 14.02.21 - 16:00 | (128) С костылями еще возиться. Лень | ||
Кирпич 130 - 14.02.21 - 16:01 | Я лучше подожду еще лет 5 пока микрософт нормальный C# сделает Рекламное место пустует | ||
ДедМорроз 131 - 14.02.21 - 16:04 | Тогда вообще проще исходно писать на метаязыке,в общем виде,а потом это в общем виде транслируем в то,что нужно.
Итераторы,это тот же самый цикл,и ничем не отличается,кроме того,что с помощью итератора можно вложенные циклы в один загнать,ну и скорости это не убавит,т.к.условия будут те же самые,просто проверяться будут все сразу,а не ступенчато,как во вложенных циклах. Другое дело,что вложенные циклы для читателя кода понятнее на несколько порядков. | ||
ДедМорроз 132 - 14.02.21 - 16:13 | И по поводу запроса в цикле.
В sql есть синтаксис prepare execute,который как раз предназначен для выполнения запроса в цикле. Не забываем,что поиск по индексным полям - это все равно цикл,и если мы его выполняем один раз для всех полей,то сначала будет цикл при выборке,потом будет цикл обхода результата,где ещё чего-то нужно будет искать,т.к. мы значения куда-то пишем. А если мы гоняем запрос в цикле,то,как ни странно,цикл-то будет один. Ну,если поиск не по индексным полям,то тут не проблема запроса в цикле,а проблема неоптимального запроса,которую цикл просто проявляет сильнее. | ||
Serginio1 133 - 14.02.21 - 16:18 | (130) Не C#, а компилятор. https://github.com/dotnet/runtimelab/tree/feature/NativeAOT И не пять лет его в .Net 6 обещают во всяком случае для блазора
(131) Еще раз Linq это прежде всего SQL а уже во вторую очередь итераторы. Если ты владеешь SQL то тебе писать и читать удобнее именно на SQL Вот пример Linq к объектам 1С http://catalog.mista.ru/1c/articles/402433/ var qr = from Номенклатура in бд.Спр_Номенклатура from единицы in бд.Спр_Единицы.Where(единица => единица.ВладелецId == Номенклатура.ID && единица.ШтрихКод.CompareTo("4") > 0).DefaultIfEmpty() select new { Номенклатура.Наименование, Номенклатура.ПолнНаименование, единицы.ШтрихКод, ОКЕИ = единицы.ОКЕИ.Наименование }; В C# есть два вида Linq. Оди из них Sql подобный https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq | ||
Кирпич 134 - 14.02.21 - 16:28 | (133) "В C# есть два вида Linq. Оди из них Sql подобный "
C# язык хороший, но одинеснику он не нужен. На нём только какую нибудь серверную хренотень писать. Сайты там всякие... Корпоративного масштаба. Одинесники таким не занимаются. | ||
Ненавижу 1С 135 - 14.02.21 - 16:33 | (134) а мне нравится идея. Тот же 1с только более развитый
Кстати как там веб страницы клиентские рисовать? Вот это всё же джаваскрипте | ||
Ненавижу 1С 136 - 14.02.21 - 16:37 | Скд тот же декларативный наверняка можно переложить на linq | ||
Serginio1 137 - 14.02.21 - 17:15 | (135) Blazor Webassembly сейчас развивается в том числе и компоненты
https://docs.microsoft.com/ru-ru/aspnet/core/blazor/components/?view=aspnetcore-5.0 И все это на C#. Можно и кроссплатформенные формы рисовать и единые классы использовать как на сервере так и на клиенте | ||
Доктор Манхэттен 138 - 15.02.21 - 01:23 | (103) Чем больше отдельных не взаимосвязанных шагов, тем проще поддерживать код, отлаживать, и тестировать. Если все вычисление будет в одном цикле, то это боль в заднице для поддержки.
Тот же ваш пример list.filter(fn1).map(fn2).foldr(fn3) можно спокойно отладить и оттестировать по шагам сперва получаем list, потом .filter(fn1), потом .map(fn2) потом .foldr(fn3) И на каждом шаге контролируем результат. | ||
Serginio1 139 - 15.02.21 - 14:19 | (138) Был вопрос
(73 ) >> Если ты пишешь цепочку типа list.filter(fn1).map(fn2).foldr(fn3), сколько в результате будет циклов по побору данных? В .Net в итоге будет один цикл (если map это Select). Отлаживай лямбды в чем проблема? | ||
Почему 1С 140 - 15.02.21 - 15:37 | (103) Похожее есть в Котлин (по моему они это с шарпа и позаимствовали). Так называемые sequence аля ленивые вычисления, вычисления идут как обычно слева направо, но вот анализ данных идет не горизонтально, а вертикально, то есть первый элемент коллекции прогоняется через все функции (filter, map, fold ....) и в итоге на всю цепочку получается один цикл. | ||
Кирпич 141 - 15.02.21 - 15:55 | От количества циклов тут мало что зависит. Это доли миллисекунды. Тормоза тут не в циклах, а в медленных вызовах через интерфейс и замыкания всякие. Чем больше итераций, тем больше вызовов и тормозов соответственно. | ||
Кирпич 142 - 15.02.21 - 16:06 | Собственно это и является причиной того, что компы становятся мощнее, а программы тормознее. ООП с виртуальными методами и всякие Linq с замыканиями упорно стараются свести старания Intel к нулю. | ||
Serginio1 143 - 15.02.21 - 16:12 | (138) В .Net можно собирать несколько запросов в 1
напрммер var query=list.Where(a=>a>0); query=query.Where(a=>a<5).Select(a=>a+8); В данном случае query это цепочка вызовов. Только когда вызывется MoveNext (foreach, ToList? Count итд) начинается вызов с конца цепочки MoveNext (140) Ничего не знаю про котлин, но легко проверить последовательность вызова функций или лямбд (142) Очень актуально на форуме 1С. | ||
Кирпич 144 - 15.02.21 - 16:14 | (143) " Очень актуально на форуме 1С."
нуачо. меня вот бесит, когда 1с по 5 минут открывается | ||
Serginio1 145 - 15.02.21 - 16:17 | (142) На самом деле сейчас с развитием компиляторв многое инлайнится даже виртуальные меоды если точно известно что через new создается.
Все течет все меняется и скорость выполнения от версии к версии языка компилятора. Ловить пару миллисекунд в ущерб скорости написания кода и удобства чтения кода большинство не хочет. (144) Но она написана на С++! | ||
Кирпич 146 - 15.02.21 - 16:24 | (145) "Но она написана на С++!"
А впечатление такое, что на питоне. И память жрет как не в себя. | ||
ДенисЧ 147 - 15.02.21 - 16:29 | (146) Память и процессор нынче не ресурс, пора привыкнуть. Для того, чтобы 2+2 посчитать - нужен минимум i9 | ||
Доктор Манхэттен 148 - 15.02.21 - 17:43 | (139) Лямбды в любом случае нужно отлаживать. А как отладить промежуточные результаты циклов? Никак. Поэтому нужно разбивать на отдельные шаги, а не лепить все в один цикл. | ||
Serginio1 149 - 15.02.21 - 18:05 | (148) Ты SQL запросы также отлаживаешь?
Еще раз Linq для коллекций это дополнительный бонус. Основное это SQL запросы. Но если ты привык мыслить циклами, то декларативное программирование не для тебя. | ||
Ненавижу 1С 150 - 15.02.21 - 18:06 | Просто в тему https://m.habr.com/ru/company/typeable/blog/542440/ | ||
Доктор Манхэттен 151 - 15.02.21 - 18:08 | (149) Мы не про SQL запросы говорим. Если не видишь разницы, то функциональное программирование не для тебя. | ||
Ненавижу 1С 152 - 15.02.21 - 18:09 | (151) почему то мне кажется ты тролль | ||
Вафель 153 - 15.02.21 - 18:10 | вот именно что отладка скл запросов это боль | ||
Доктор Манхэттен 154 - 15.02.21 - 18:10 | (152) Когда кажется, крестятся. | ||
Serginio1 155 - 15.02.21 - 18:18 | (151) Самому то не смешно? Мы говорим про Linq. Он имеет SQL подобный синтаксис смотри (133)
вот два одинаковых запроса первый SQL подобный Var numQuery1 = from num in numbers where num % 2 == 0 orderby num select num; Второй обычный //Method syntax: var numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n); Если в качестве источника будет выступать не IEnumerable а таблица БД IQueryable то будет запрос к таблице Вот пример http://catalog.mista.ru/1c/articles/402433/ (153) Linq помогает склеивать запросы. И это удобнее чес склеивать текстовые запросы. Отладив поодиночке можно их собирать. | ||
Доктор Манхэттен 156 - 15.02.21 - 20:26 | (155) А, это хрень для запросов. Тогда извиняюсь, ошибся. Я думал мы говорим про функциональное программирование. | ||
Serginio1 157 - 15.02.21 - 20:56 | (156) >> Но если ты привык мыслить циклами, то декларативное программирование не для тебя.
https://ru.wikipedia.org/wiki/Language_Integrated_Query LINQ к объектам Представляет собой не что иное, как функциональное программирование, замаскированное под синтаксис SQL[8]. | ||
Serginio1 158 - 15.02.21 - 21:11 | 157+ https://rsdn.org/article/dotnet/LinqAsStapToFp.xml#EZFAC
Многим может показаться странным то, что ФП в LINQ замаскировано под SQL. Однако это не просто маскировка. Идеи ФП нацелены на то, чтобы сделать программирование более декларативным. Программируя в стиле ФП, мы как бы описываем то, что хотим получить, а не то, как мы это хотим получить. Именно это призван делать и SQL. SQL – это язык запросов, с помощью которого мы лишь описываем, что хотим выбрать из БД (или как хотим ее изменить), но при этом мы не задаем конкретный (императивный) алгоритм обработки данных. | ||
Вафель 159 - 15.02.21 - 21:57 | а вот интересно. если в линк какую-нибудь функцию подсунуть что скл не поддерживает, то как оно в запрс транслируется? | ||
Serginio1 160 - 15.02.21 - 22:04 | (159) Там не функция а деревья выражений, хоть синтаксис и один. https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/expression-trees/
При обработке дерева выражений провайдером выдаст ошибку Рекламное место пустует | ||
Serginio1 161 - 16.02.21 - 00:01 | (141)>> От количества циклов тут мало что зависит. Это доли миллисекунды. Тормоза тут не в циклах, а в медленных вызовах через интерфейс и замыкания всякие.
А для промежуточных результатов нужно выделять дополнительные списки и значит дополнительные расходы на память и Add в список. Ну и конечно сравнивать инлайный if (d < 100) count++; не совсем правильно. При сравнении строк уже разница будет минимальна. Не говоря уже о group by, sort by, Select | ||
Доктор Манхэттен 162 - 16.02.21 - 00:19 | (155) По сути ничего не поменялось. Ну раскрыли скобки, убрали точки. Синтаксис немного поменялся, но в остальном все так же. | ||
Кирпич 163 - 16.02.21 - 08:12 | (161) "Ну и конечно сравнивать инлайный if (d < 100) count++; не совсем правильно."
Схрена ли неправильно. Очень даже правильно. Если большие объемы данных и нужна скорость, то linq использовать нельзя (если это не для SQL). Это же ясно как день. А то, что c Linq всё красиво и понятно - это тоже вопрос. Когда по одной строчке в лямбду, то да. А если по 100 строк, то вся красота и понятность исчезает и остаются только тормоза. | ||
Доктор Манхэттен 164 - 16.02.21 - 08:20 | |||
Кирпич 165 - 16.02.21 - 08:22 | (161) "А для промежуточных результатов нужно выделять дополнительные списки"
А нафига промежуточные результаты? Я так же могу всё сделать в одном цикле и выделить память только под конечный результат. Можно все сделать так же как в linq, только без лишних вызовов виртуальных методов. | ||
Почему 1С 166 - 16.02.21 - 09:02 | (165) Нужно просто красиво и с легкой поддержкой кода, быстро тоже нужно но в последнюю очередь. Я хоть и не умею еще писать подобное, но вот в чужом коде гораздо быстрее могу разобраться если он написан в функциональном стиле(условно). От того и интерес к этим лямбда выражениям | ||
Кирпич 167 - 16.02.21 - 09:23 | (166) "быстро тоже нужно но в последнюю очередь."
Быстро нужно когда надо, а не в последнюю очередь. Если тебе JSON гонять двум пользователям, то пожалуйста. А если у тебя игровой движок или какая нибудь 3D модель урагана Катрина, то совсем другое дело. | ||
Ненавижу 1С 168 - 16.02.21 - 09:36 | (167) Преждевременная оптимизация — корень всех зол. Дональд Кнут. | ||
Кирпич 169 - 16.02.21 - 09:38 | (168) Правильно. Пускай 1С открывается по 5 минут. Зато всё по Кнуту :) | ||
Кирпич 170 - 16.02.21 - 09:41 | (168) Да и Кнут это написал, когда оптимизацией считалось переписывание куска программы на ассемблере | ||
Почему 1С 171 - 16.02.21 - 09:43 | (167) А почему тогда для ураганов катарина, ИИ, дата майнига и других научных вычислений так популярен Питон, который совсем не про скорость выполнения.
(169) Я сейчас имею дело с конфой на 1С, которая по моим понятиям должно просто жестко висеть потому как очень много всего сделано не оптимально и не правильно сточки зрения практик и рекомендаций, но SQl каким то образом вытягивает это поделие до работоспособного состояния. | ||
Кирпич 172 - 16.02.21 - 09:44 | (171) "других научных вычислений так популярен Питон"
потому что в питоне используются библиотеки написанные на Си | ||
Почему 1С 173 - 16.02.21 - 09:49 | (172) Ну вот, острые умы найдут как оптимизировать высокоуровневый код которым будут пользоваться люди с умом попроще в LInq лямдах и питонах и всем будет хорошо | ||
Serginio1 174 - 16.02.21 - 10:38 | (164) Ты написал два вида Linq. Какой хочешь такой и используй.
Нередко приходится использовать 2 синтасиса. Опять же SelectMany проще и понятнее использовать в Sql синтаксисе var selectedUsers = from user in users from lang in user.Languages where user.Age < 28 where lang == "английский" select user; Для создания аналогичного запроса с помощью методов расширения применяется метод SelectMany: var selectedUsers = users.SelectMany(u => u.Languages, (u, l) => new { User = u, Lang = l }) .Where(u => u.Lang == "английский" && u.User.Age < 28) .Select(u=>u.User); Правда в Sql подобном синтаксисе есть let очень удобная вещь https://docs.microsoft.com/ru-ru/dotnet/csharp/linq/group-query-results https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/let-clause string[] strings = { "A penny saved is a penny earned.", "The early bird catches the worm.", "The pen is mightier than the sword." }; // Split the sentence into an array of words // and select those whose first letter is a vowel. var earlyBirdQuery = from sentence in strings let words = sentence.Split(' ') from word in words let w = word.ToLower() where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u' select word; | ||
Serginio1 175 - 16.02.21 - 10:44 | (165) Нужна скорость используй Linq Rewriter или LinqOptimizer. Только вот таких людей не очень много.
Не нужна экономия пару тактов. Ну и конечно же ты пишешь на С++, ибо на 1С и питоне про инлайнинг не знают. А в 1С и о замыканиях и не знают, не то, что о Linq | ||
Serginio1 176 - 16.02.21 - 10:57 | 174+ tot into
https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/into from row in rows select row.Split(',') into columns let identifier = columns[0].Replace("Prefix_", string.Empty) group columns by identifier into g select new Log { Identifier = g.Key, DurationInSeconds = (from dur in g let duration = DateTime.Parse(dur[1]) select duration.Hour * 3600 + duration.Minute * 60 + duration.Second).Sum() } | ||
Uberschall 177 - 16.02.21 - 12:08 | между делом спрошу, вдруг кто посоветует книгу для котлина по корутинам? | ||
Uberschall 178 - 16.02.21 - 12:15 | (175) по поводу оптимизации я выше писал, что есть разница между inline и не inline функциями (замыкания на не inline тратят время на создание оберток). по поводу циклов: есть возможность (не знаю как в C#) не создавать промежуточные выгрузки, а использовать отложенные операции через секвенции. При желании можно дальше пойти и использовать сплитераторы и многопоточную обработку stream'ов для java (но не все можно раздробить- это вопрос конурентности). Ну и не стоит забывать, что кроме оптимизации есть стоимость поддержки. Для декларативного стиля это большой плюс по сравнению с императивным- но это уже переход в DSL. | ||
Garykom 179 - 16.02.21 - 12:25 | (177) не тупи какие к черту корутины на котлине если основное применение котлина это трансляция в java совместимый байт код
короче книги по java и многопоточности в зубы и вперед | ||
Uberschall 180 - 16.02.21 - 12:27 | (179) это понятно. но хочется тему раскрыть для себя, чтобы, если зайдет обсуждение, понимать что там происходит. | ||
Кирпич 181 - 16.02.21 - 12:34 | (177) Кто будет писать книги про корутины. На хабре статью прочитай и хватит. https://habr.com/ru/company/alfa/blog/336228/ | ||
Uberschall 182 - 16.02.21 - 12:37 | (181) да, видел статью, но после java concurency (библиотека или книга) как-то не густо... | ||
Почему 1С 183 - 16.02.21 - 13:04 | (177) какое то своеобразное у тебя понимание применения котлина Kotlin > Java, это как сказать зачем тебе c++ когда он всего лишь переводит в машинный код. | ||
Почему 1С 184 - 16.02.21 - 13:06 | (182) Теория параллельных вычислений это одно, а конкретная реализация их в языке это более узкая тема которая действительно не стоит отдельной книги. | ||
Serginio1 185 - 16.02.21 - 13:42 | Мне в котлине понравилось легкое создание DSL. Например аналог lock в kotlin — можно реализовать просто функцией, а не отдельной языковой конструкцией:
lock(syncRoot) { doWork(); } https://kotlinlang.org/docs/reference/type-safe-builders.html | ||
Garykom 186 - 16.02.21 - 13:49 | (185) дык Java же | ||
Почему 1С 187 - 16.02.21 - 13:52 | (186) хочу видеть как этот код ты скомпилишь на java | ||
Garykom 188 - 16.02.21 - 13:56 | (187) https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
как бы наоборот котлина в яву "компилится" | ||
Почему 1С 189 - 16.02.21 - 14:18 | я про реализацию DSL не про конкретно lock, то есть synchronized это конструкция языка а lock это функция с лямбда параметром, а внутри скорее всего и сидит synchronized
То что Kotlin ограничен JVM не спорю, просто у него уровень абстракции выше и красивее все реализовывается | ||
Uberschall 190 - 16.02.21 - 15:04 | (183) а что в этом странного? Kotlin создавался на основе Java, за основу были взяты её библиотеки, требовалась прямая поддержка.
(189) реализация DSL (да и вообще большей части Kotlin) исходит из соглашений, позволяющих составлять синтаксические конструкции. те же инфиксные вызовы типа 1 to "one", можно делать в более традиционном стиле типа 1.to("one") из java и наоборот. "а внутри скорее всего и сидит synchronized" - совсем не факт. synchronized построен на мониторе, а Lock- на парковке потока. | ||
Uberschall 191 - 16.02.21 - 15:06 | (187) чтобы понять как перевести в более традиционный вид, здесь недостаточно информации. тут вообще lock может быть экземпляром объекта, для которого определен метод invoke (соглашение)... | ||
Почему 1С 192 - 16.02.21 - 15:19 | (191) ну тут фишка что последний параметр типа лямбда можно передавать не как параметр а описывать телом этой самой функции. Lock тут я понимаю как функцию
fun lock(par:Any, todo:()->Unit){ synchronized(par) { todo() } } | ||
Serginio1 193 - 16.02.21 - 15:20 | (190) lock это Monitor в try finally
https://stackoverflow.com/questions/2837070/lock-statement-vs-monitor-enter-method System.Threading.Monitor.Enter(x); try { ... } finally { System.Threading.Monitor.Exit(x); } | ||
Почему 1С 194 - 16.02.21 - 15:20 | Реализация функции естественно может быть любой, что тоже даст уровень абстракции в будущем | ||
Serginio1 195 - 16.02.21 - 15:21 | Вот все что в try{...} и есть лямбда, | ||
Uberschall 196 - 16.02.21 - 15:38 | (192) возможно.
(193) в java synchronized может быть либо методом, либо локальным блоком. скорее всего имелось ввиду что-то такое или как в (192) fun lock(syncRoot: Lock, action: ()->Unit){ lock.lock() try{action()} finally{lock.unlock} } вызов: val syncRoot = Lock() lock(syncRoot){prinln("внутри блокировки")} в общем, особо никаких проблем с вызовом из java | ||
Почему 1С 197 - 16.02.21 - 15:41 | (196) Java так умеет lock(syncRoot){prinln("внутри блокировки")}? | ||
Uberschall 198 - 16.02.21 - 15:42 | (197) lock(syncRoot, prinln("внутри блокировки")) - то же самое | ||
Почему 1С 199 - 16.02.21 - 15:47 | (198) что возвращает println? ))) но суть не в этом, а в том что в Котлин это реализовано красиво, хотя по функциональности может быть тем же самым | ||
Uberschall 200 - 16.02.21 - 15:53 | (199) соответствует сигнатуре параметра ()->Unit. println- стандартный метод, ничего не возвращает (в терминах Kotlin- это Unit). |
◄ 1 2 3 ► |
Список тем форума
|