
Dmitry
15.09.2017
07:51:17
А хотя по идее тогда length надо задать

Maxim
15.09.2017
07:51:44
либо использовать Appender

Dmitry
15.09.2017
07:52:49
так он же на массиве будет почти как capacity работать как я понимаю

Maxim
15.09.2017
07:53:33
но вообще, конечно, нужно исходить из того, какой ты хочешь результат получить

Google

Dmitry
15.09.2017
07:55:02
а как put использовать?
int [] arr = [1,2,3,4,5];
arr.put(7);
Error: no property 'put' for type 'int[]'
сигнатура: void put(U)(U item)

Maxim
15.09.2017
09:01:10
auto arr = [1,2,3];
auto app = appender(&arr);
app.put(4);

Dmitry
15.09.2017
10:58:29
А как ты по сигнатуре понял как надо?

Maxim
15.09.2017
10:59:32
все просто)
google: dlang appender -> https://dlang.org/phobos/std_array.html#appender

Andrey
15.09.2017
12:13:08
а если вкратце - какие есть преимущества у динамических массивов перед контейнерами?
(мб, киллерфича какая есть)

Maxim
15.09.2017
12:14:20
перед какими конкретно контейнерами?)

Andrey
15.09.2017
12:15:15
ну вот динамический массив VS контейнерный массив, например

Dmitry
15.09.2017
12:15:57
Покажи пример плиз контейнерного массива

Andrey
15.09.2017
12:16:15
просто я тут зачитался темами типа - https://forum.dlang.org/post/mailman.307.1468487593.3131.digitalmars-d-learn@puremagic.com

Dmitry
15.09.2017
12:17:08

Google

Maxim
15.09.2017
12:17:26
просто закрались подозрения)

Andrey
15.09.2017
12:17:41
ну, например, Array!int a = make!(Array!int)();

Pavel
15.09.2017
12:17:45
Ну как выяснилось, GC в дланге довольно таки говно, и нередко создает проблемы. Обычный динамический массив аллоцирует то что потом чистит GC, это не очень хорошо

Andrey
15.09.2017
12:18:06
и потом в него и из него что хочешь то и делай
хошь инсерт

Pavel
15.09.2017
12:18:35
А контейнерные массивы не опираются на GC и работают поэффективнее

Andrey
15.09.2017
12:18:35
хошь ремув и прочее. а в сумме с темой ,ссылку на которую я привел, мне по-деревенски понятнее контейнер

Dmitry
15.09.2017
12:18:39

Maxim
15.09.2017
12:19:36
а там уже читать, смотреть и гуглить, если что не понятно, другого выхода нет)

Dmitry
15.09.2017
12:20:27
я просто думал мало ли. вдруг там именно по функции что-то понять можно

Maxim
15.09.2017
12:21:54
по идее, должно быть понятно по коду, но в стандартной библиотеке местами творится что-то невероятное в плане чистоты кода)
чистоты в смысле понятности для стороннего наблюдателя, который не в теме

Andrey
15.09.2017
12:22:42

Pavel
15.09.2017
12:23:32
Вручную ты его не убьешь, разве что извращаться с GC.free(). GC подхватит, только не сейчас а когда сам сочтет нужным.

Andrey
15.09.2017
12:23:51
понятно. тогда - хорошо (:

Pavel
15.09.2017
12:24:34
Иногда в самый неудобный момент, например когда к тебе прилетело 2000 запросов и надо их все за секунду обработать, а тут ГЦ решает провести уборочку и замораживает на полсекунды все треды.

Andrey
15.09.2017
12:25:20
но ведь это проблема в любом языке с уборщиком мусора?

Maxim
15.09.2017
12:25:34
как минимум в большинстве)
и как минимум в большинстве языков, где есть такая проблема, можно запретить сборщику вот именно сейчас запускаться

Google

Pavel
15.09.2017
12:26:10
Ну я на го и жаве не разрабатывал, но мне кажется там вылизан гц очень сильно
Так что это почти незаметно
Кроме того, я видел доклад какого-то человека про то как он написал свой ГЦ который работает на всех тредах, и там где обычный гц отрабатывает за секунду, его гц работает 40мс
То есть потенциал оптимизаций огромный

Maxim
15.09.2017
12:30:01
в D сборщик — достаточно прямолинейный парень)
видит, что памяти не хватает, останавливает всех и освобождает ее)

Andrey
15.09.2017
12:30:27
хочется за ним последить
поглядеть что и как

Dmitry
15.09.2017
12:41:25
Вопрос не по теме. А на Python кто в чем пишет из IDE?

qwerty
15.09.2017
12:51:46
выбор не велик. Хорошая поддержка есть только в Pycharm

Dmitry
17.09.2017
06:06:15
Я тут децл одну картинку подправил.

Andrey
17.09.2017
07:21:55
мне нравится вот это на тему язков - https://www.youtube.com/watch?v=niO16JEbpWs

Dmitry
17.09.2017
08:46:17
Go2 га картинке чем то Emacs напоминает.

Ievgenii
17.09.2017
10:58:30
)))

Dmitry
18.09.2017
05:30:00
Красиво сказано: "Красиво сказано: "Преобладающая парадигма программирования, — объектно-ориентированное программирование, не дает вам ничего в области параллелизма, а вместо этого поощряет опасный и подверженный ошибкам дизайн. Основные принципы объектной ориентированности: cокрытие, совладение и мутация данных — идеальная среда для гонок данных. Идея объединения данных с мьютексом, который их защищает, хороша, но, к сожалению, блокировки не компонуемы, и сокрытие блокировок делает дедлоки более вероятными и менее отлаживаемыми.""


Dmitry
18.09.2017
05:30:47
Красиво сказано: "Красиво сказано: "Преобладающая парадигма программирования, — объектно-ориентированное программирование, не дает вам ничего в области параллелизма, а вместо этого поощряет опасный и подверженный ошибкам дизайн. Основные принципы объектной ориентированности: cокрытие, совладение и мутация данных — идеальная среда для гонок данных. Идея объединения данных с мьютексом, который их защищает, хороша, но, к сожалению, блокировки не компонуемы, и сокрытие блокировок делает дедлоки более вероятными и менее отлаживаемыми.""
А где сказано?

Dmitry
18.09.2017
05:31:02
https://habrahabr.ru/post/245797/

Dmitry
18.09.2017
05:32:40
Красиво сказано: "Красиво сказано: "Преобладающая парадигма программирования, — объектно-ориентированное программирование, не дает вам ничего в области параллелизма, а вместо этого поощряет опасный и подверженный ошибкам дизайн. Основные принципы объектной ориентированности: cокрытие, совладение и мутация данных — идеальная среда для гонок данных. Идея объединения данных с мьютексом, который их защищает, хороша, но, к сожалению, блокировки не компонуемы, и сокрытие блокировок делает дедлоки более вероятными и менее отлаживаемыми.""
Какова тогда область применения ооп?

Google

Friedrich
18.09.2017
05:33:49
Красиво сказано: "Красиво сказано: "Преобладающая парадигма программирования, — объектно-ориентированное программирование, не дает вам ничего в области параллелизма, а вместо этого поощряет опасный и подверженный ошибкам дизайн. Основные принципы объектной ориентированности: cокрытие, совладение и мутация данных — идеальная среда для гонок данных. Идея объединения данных с мьютексом, который их защищает, хороша, но, к сожалению, блокировки не компонуемы, и сокрытие блокировок делает дедлоки более вероятными и менее отлаживаемыми.""
> Основные принципы объектной ориентированности: cокрытие, совладение и мутация данных
Ну глупость же.
Причём это переводчик переврал, заметьте. В оригинале было корректно:
> Data hiding, the basic premise of object orientation, when combined with sharing and mutation, becomes a recipe for data races.


Dmitry
18.09.2017
05:36:18
я хз, мы с приятелем тему ООП долго обсуждали в итоге возможно нужны нормальные модули, а не объекты. Ведь по идее вместо класса может быть просто модуль.
Правда я не претендую хоть на какую то грамотность в основах CS.

Maxim
18.09.2017
05:38:14
в императивном языке модуль будет аналогом синглтона же)

Sergey
18.09.2017
05:55:33
банальность скажу, но просто думал тема холиваров "чистая функциональность против ООП" уже мертва.
"Молоток хуже пласкогубцев, потому что им не так удобно выкручивать шурупы" - основной посыл холиварщиков.
Много всего было сказано на эту тему, но по факту мы видим, что мультипарадигмальные языки приобретают наибольшую популярность

Dmitry
18.09.2017
05:56:19
+1

Dmitry
18.09.2017
06:55:03
В статьях и блогах часто мелькает идея, что ФП это прям очень круто для параллелизма, спасение просто. А на деле множество функциональных языков вообще не умеют параллелизм (окамл, например), а в некоторых других нередко получается "чем больше потоков, тем медленнее" (например https://ghc.haskell.org/trac/ghc/ticket/9221 ), ибо сборщик мусора останавливает все потоки и чем больше потоков, чем быстрее они генерят мусор, тем чаще приходится их останавливать, а это тоже время занимает приличное (т.е. не только сама сборка, но синхронизация всех потоков). Найти функциональный язык, где действительно хорошо все с параллелизмом, - это еще надо постараться.

Pavel
18.09.2017
08:19:02
Просто тезис "иммутабельные данные позволяют не заботиться о доступе к ним из параллельных потоков команд" раздули до "все круто"

Admin
ERROR: S client not available

Dmitry
18.09.2017
13:21:10
Я постоянно путаюсь. Какая из этих функций мне нужна, чтобы текстовую строку перевести в объект типа JSON http://vibed.org/api/vibe.data.json/serializeToJson
Строка именно текстовая

Pavel
18.09.2017
14:24:33
http://vibed.org/api/vibe.data.json/parseJsonString

Dmitry
18.09.2017
15:14:19
а в чем отличие от serializeToJson?

Pavel
18.09.2017
15:17:31
сериализация - это процесс превращения сложного объекта в скаляр(строку)

Dmitry
18.09.2017
15:19:06
а тут чтот строка со структурой как у JSON чем не подходит?
http://vibed.org/api/vibe.data.json/serializeToJson
Вроде бы сигнатуры совпадают:
static T fromString(string src);
почему тут может выпадать?
выпадает на строке:
writeln(x["names"]);

Pavel
18.09.2017
15:24:04
Не надо использовать serializeTojson над строкой. Используй parseJsonString.

Dmitry
18.09.2017
15:24:56
чем ему конец то не нравится?

Google

Dmitry
18.09.2017
15:33:26
нет идей что может быть не так?
Ошибка не гуглится
вот тока что нашел https://github.com/dlang/dub/blob/master/source/dub/internal/vibecompat/data/json.d#L967

Friedrich
18.09.2017
15:35:15
{ "names" : ... }

Dmitry
18.09.2017
15:35:40
О! точно!


Andrey
19.09.2017
01:11:04
пробую разобраться с шаблонами никак не могу понять, почему происходит такая штука:
class cContainerArray{
template container(T){Array!T objects;}
this(){}
void add(T)(T obj){container!(T).objects ~= obj;}
ulong getSize(T)(){return container!(T).objects.length;}
}
cContainerArray cA = new cContainerArray();
cContainerArray cB = new cContainerArray();
cA.add!(object)(obj1);
cB.add!(object)(obj2);
writeln(«cB size is ", cB.getSize!(object)());
получаю результат - «cB size is 2», по идее должно быть 1
то есть obj1 и obj2 попадают в оба массива
переписал класс вот так:
class cContainerArray(T){
//template container(T){Array!T objects;}
Array!T objects;
this(){}
void add(T obj){objects ~= obj;}
ulong getSize(){return objects.length;}
}
и дело пошлО
В статьях и блогах часто мелькает идея, что ФП это прям очень круто для параллелизма, спасение просто. А на деле множество функциональных языков вообще не умеют параллелизм (окамл, например), а в некоторых других нередко получается "чем больше потоков, тем медленнее" (например https://ghc.haskell.org/trac/ghc/ticket/9221 ), ибо сборщик мусора останавливает все потоки и чем больше потоков, чем быстрее они генерят мусор, тем чаще приходится их останавливать, а это тоже время занимает приличное (т.е. не только сама сборка, но синхронизация всех потоков). Найти функциональный язык, где действительно хорошо все с параллелизмом, - это еще надо постараться.
мб, erlang?


Dmitry
19.09.2017
05:24:38
Да, кстати, эрланг хороший вариант. Там ко многому можно придраться, но мы не будем. В целом там с конкурентностью и параллельностью весьма хорошо, это его центральная тема.

Dmitry
19.09.2017
05:45:11
А как там она построена? Чем от Дишной отличается?


Dmitry
19.09.2017
06:48:32
Похоже на std.concurrency. Есть набор параллельно исполняемых сущностей (называемых там акторами), которые могут обмениваться сообщениями, как-то на них реагировать, порождаеть новые акторы.
Под капотом там "зеленые потоки", примерно как наши файберы. Много таких потоков могут работать в пределах одного потока ОС, держать и обслуживать их дешево, можно их иметь миллионы на одной машине. В отличие от Дишных файберов, эрланг подсчитывает для каждого зеленого потока сколько тот сделал операций и сам переключает с одного на другого, не надо вручную делать yield, и один задумавшийся зеленый поток не будет задерживать других.
При передаче сообщений, если там простые и небольшие данные, они копируются. У каждого потока свой GC, пока в одном зеленом потоке идет сборка мусора, остальные продолжают работать. В языке все иммутабельное, что сильно упрощает реализацию GC (старые объекты не могут начать указывать на молодые, поэтому граф указателей ориентирован, и сборщик его может легко обработать за один проход, не нужно париться всякими card marking, remembered sets и write barriers).
Длинные бинарные данные лежат в общей куче, при передаче в сообщении передается лишь ссылка на них. Вот тут есть слабое место, как я понимаю, - общую кучу таки надо иногда собирать. Хотя в ней мусор не копится так активно, там счетчики ссылок, вроде как, так что часть памяти освобождается еще в процессе обычной работы, без остановки на GC.
В языке удобные средства конструировать структуры данных и разбирать их (pattern matching).
Типизация динамическая, структуры строятся из одних и тех же конструкций, поэтому данные легко отправлять по сети акторам на других машинах. В результате твое дерево акторов элементарно можно распределить по нескольким машинам. Что локально посылать, что подальше - все одно. Масштабирование из коробки, так сказать.
Еще при создании акторов им может назначаться актор-супервизор, над ним - свой, и т.д. Получается такое дерево супервизоров, которые следят за своими детьми и если те плохо себя ведут (падают/виснут), перезапускают их, что обеспечивает какую-то надежность при наличии сбоев и ошибок. Если падает один актор, это не рушит другие, не рушит весь процесс, это безопасно и дешево. Поэтому практикуют принцип "fail fast" - кодишь оптимистично, забивая на потенциальные ошибки, если что-то идет не так, то актор падает и перезапускается. Можно быстро говнокодить и результат будет стабильно работать в большинстве случаев, сбои не убивают программу.
Самое смешное, что отцы ООП так свое видение и описывали: множество сущностей (объектов), которые обмениваются сообщениями, реагируют на них, создают новые объекты. Это философия Смолтолка и Руби. И в этом смысле Эрланг - чисто ОО язык. :)


Dmitry
19.09.2017
06:52:30
шикарно написал! спасибо большое!
@thedeemon а плюсы у Ди какие ты бы называл? Я просто думаю твой пост с указанием твоего авторства в FAQ ( dlang.ru/faq ) добавить

Dmitry
19.09.2017
07:09:39
Ровно 3 года назад я тут формулировал: http://www.infognition.com/blog/2014/why_d.html