@gogolang

Страница 1554 из 1630
Alexander
14.10.2018
10:55:31
Не шутите так
А я не шучу. В клиентском коде дженерики по большей части не нужны, зато необходимы в библиотеках.

Ну так для этого есть Rust. А Go вроде как другой язык. Или я что-то путаю?
Rust — совсем о другом, это язык с совсем другой областью применения.

Alexander
14.10.2018
10:57:20
А чем Rust не подходит под это описание?
В Rust нет GC, это создаёт некие сложности при написании кода.

Google
xPushkin
14.10.2018
10:57:40
Rust — совсем о другом, это язык с совсем другой областью применения.
Rust это прямой соперник C++ Увы Gо никакой язык не заменит

Алексей
14.10.2018
10:57:48
Go программисты почему-то говорят так, будто в go вообще нет задач для гегериков, вот только они есть и даже решаются. Вот только решаются они просто суперкостыльно.

Alexander
14.10.2018
10:58:34
Какие же сложности?
Ну напишите какой нибудь циклический граф на расте, поймёте что за сложности.

SkyCoffee
14.10.2018
10:58:59
Go программисты почему-то говорят так, будто в go вообще нет задач для гегериков, вот только они есть и даже решаются. Вот только решаются они просто суперкостыльно.
Надо конкретную задачу решить "суперкостыльно" и генериками и посмотреть, что лучше читается. Только задача нужна практическая, а не "напишите генерик с параметром-типом"

Artem
14.10.2018
11:01:07
Боюсь авторы языка не осилят. Параметрический полиморфизм — не та фича, которую можно нахрапом взять.
Не все за 1 день делается. Если реально хочется помочь, то нужно подготовить толковое предложение, иначе это все просто "вот там, за бугром хорошо, а тут ужасно и бла бла бла"

SkyCoffee
14.10.2018
11:01:18
> практическая То есть не библиотечный код, да?
а библиотеки не выполняют практических задач? Библиотеки и "клиентский код" в сущности отличаются только тем, что "клиентский код" сохраняют для переиспользования в библиотеки

Алексей
14.10.2018
11:02:18
Надо конкретную задачу решить "суперкостыльно" и генериками и посмотреть, что лучше читается. Только задача нужна практическая, а не "напишите генерик с параметром-типом"
Ну среднестатистическому гоферу конечно будет нечитаемо и непонятно. Также как всяким джавистам непонятен и нечитаем вывод типов.

Alexander
14.10.2018
11:03:16
а библиотеки не выполняют практических задач? Библиотеки и "клиентский код" в сущности отличаются только тем, что "клиентский код" сохраняют для переиспользования в библиотеки
Практическая задача - мономорфизация и статическая диспетчеризация ради повышения производительности за бесплатно вместо использования интерфейсов.

Daniel
14.10.2018
11:03:37
О_о

Google
Алексей
14.10.2018
11:04:18
Pawel
14.10.2018
11:05:03
глупый вопрос var a int go func() { for range time.Tick(time.Millisecond) { a++ } }() go func() { fmt.Println(a) time.Sleep(time.Second) }() это ж будет неопределённое поведение и data race?

Alexander
14.10.2018
11:05:17
Ну я ещё и по джавистам прошёлся
Ещё можно по C++никам пройтись, те тоже по большей части предпочитают пребывать в своем манямирке и не вылазить наружу.

SkyCoffee
14.10.2018
11:06:27
глупый вопрос var a int go func() { for range time.Tick(time.Millisecond) { a++ } }() go func() { fmt.Println(a) time.Sleep(time.Second) }() это ж будет неопределённое поведение и data race?
да, это data race. Есть пакет sync, если нужно обращаться к одной переменной из одновременно работающих горутин

Pawel
14.10.2018
11:09:52
да, это data race. Есть пакет sync, если нужно обращаться к одной переменной из одновременно работающих горутин
спор возник на работе. мне чел доказывал что "один писатель - много читателей" - безопасно. настолько он в этом убеждён, что я аж усомнился

SkyCoffee
14.10.2018
11:10:25
Сам принцип правильный, но работает он не обязательно везде

SkyCoffee
14.10.2018
11:11:45
Есть базы данных с принципом один писатель - много читателей, там этот принцип работает прекрасно

Alexander
14.10.2018
11:12:57
Либо транзакции.

Алексей
14.10.2018
11:14:07
спор возник на работе. мне чел доказывал что "один писатель - много читателей" - безопасно. настолько он в этом убеждён, что я аж усомнился
Один писатель запишет что-нибудь, но не до конца, а парочка читателей уже прочтут это что-то в не до конца записанном состоянии.

Pawel
14.10.2018
11:15:01
байт не до конца запишет??

xPushkin
14.10.2018
11:15:37
Ну напишите какой нибудь циклический граф на расте, поймёте что за сложности.
Это не ответ. Какие именно сложности? Компилятор вас ругается за плохие привычки?

SkyCoffee
14.10.2018
11:15:41
int бывает больше байта

вообще именно int может и прокатит, его трудно не до конца переписать, но со всякими структурами точно бывает неполная дозаписанность

Алексей
14.10.2018
11:16:09
в случае какого-нибудь инкремента числа - скорее всего всё будет норм, но для более сложных стркутур всё будет очень плохо

Alexander
14.10.2018
11:16:55
Это не ответ. Какие именно сложности? Компилятор вас ругается за плохие привычки?
Компилятор и Rc не умеют в циклические структуры данных.

Google
Pawel
14.10.2018
11:17:05
я и для интов юзаю atomic от греха по дальше

Алексей
14.10.2018
11:17:10
вот много читателей вполне могут читать без блокировок, когда писатель ничего не пишет

Alexander
14.10.2018
11:18:31
я и для интов юзаю atomic от греха по дальше
Лол, до чего го людей доводит.

Алексей
14.10.2018
11:18:47
в случае какого-нибудь инкремента числа - скорее всего всё будет норм, но для более сложных стркутур всё будет очень плохо
Но конечно же стоит сказать, что хоть int скорее всего всегда будет в неком корректном состоянии, но без синхронизаций не факт, что это самое состояние для всех читателей будет одинаковым. Потому что в случае многих ядер или процессоров нужно ещё кэши синхронизировать.

Volodymyr
14.10.2018
11:21:35
когда то препод в универе по сишке говорил, что блокировки нужны только на запись, а на чтения не нужны.

в го лучше всегда использовать мютекс?

Sergey
14.10.2018
11:21:58
вы тут переизобретаете RWLock что ли? (котоpый RwMutex в го)

SkyCoffee
14.10.2018
11:23:52
в го лучше всегда использовать мютекс?
если переменная используется из разных одновременно работающих горутин и не константа, то mutex было бы неплохо. Чтоб при случайном забывании, что в переменную нельзя писать, ничего плохого не случилось

Sergey
14.10.2018
11:24:24
Alexander
14.10.2018
11:24:32
Zver
14.10.2018
11:26:12
спор возник на работе. мне чел доказывал что "один писатель - много читателей" - безопасно. настолько он в этом убеждён, что я аж усомнился
В данном случае вполне безопасный код, так как будет выполняться атомарная процессорная операция. Если хочется уверенности, то тогда атомик использовать. Для более сложных данных уже мютексы.

Алексей
14.10.2018
11:26:45
лок фри это какое-то слишком сильное колдунство

Alexander
14.10.2018
11:28:01
лок фри это какое-то слишком сильное колдунство
Для гоферов так точно. Ведь если дженериков нет, то им STM и твари для каждого типа придется самому имплементить.

Volodymyr
14.10.2018
11:30:48
наверно в одноядерных системах на int не нужен мютекс.

Zver
14.10.2018
11:31:14
а точно перезапись инта атомарная оперция? атомик-функции для интов же не просто так придумали
Ну процессор ее, насколько в курсе, атомарно выполняет. Кстати, сами атомик укладываются в несколько ассемблерных инструкций (там мютексы не задействуются).

Алексей
14.10.2018
11:31:36
наверно в одноядерных системах на int не нужен мютекс.
в одноядерных системах и Go не нужен

Google
Zver
14.10.2018
11:32:23
Единственное, может это не для всех видов процессоров выполнимо.

Volodymyr
14.10.2018
11:32:58
то есть мы пришли к выводу, что атомик или более сложный мютекс нужен всегда на чтения (даже для int-а) ?

Zver
14.10.2018
11:33:04
Тот же инкремент int64 на 32х разрядном атомарно не выполнить.

Alexander
14.10.2018
11:33:50
Насколько я помню никаких локов операции записи в оперативную память не содержат. А значит на многоядерных системах это гонка.

Алексей
14.10.2018
11:34:43
Просто инкремент значения - это чтение из памяти в регистр, инкремент регистра, запись обратно в память. В x86/x64 это одна комманда вида inc [eax], но насколько атомарно выполняет её сам процессор - это большой вопрос. Плюс ещё как кеши между ядрами синхронизируются.

так что я бы не стал так сильно утверждать что, инкремент на 100% безопасен и атомарен

Zver
14.10.2018
11:35:51
то есть мы пришли к выводу, что атомик или более сложный мютекс нужен всегда на чтения (даже для int-а) ?
Для int желателен. Чтобы на каком-нибудь процессоре конфуза не вышло.

Алексей
14.10.2018
11:36:27
Так что можно сказать, что для всего обязательно, чтобы где-нибудь конфуза не вышло.

Алексей
14.10.2018
11:37:47
И да, это 100% атомарно
Откуда такие сведения?

А с чего ты взял, что он в регистре всегда?
Ну я сомневаюсь, что процессор прямо в памяти будет делать инкремент.

Сергей
14.10.2018
11:38:21
Zver
14.10.2018
11:38:26
Интеловские могут вроде бы и памяти инкрементить без загрузки в регистры.

Алексей
14.10.2018
11:38:34
Архитектура x86
Да неужели?

Сергей
14.10.2018
11:38:54
Ну я сомневаюсь, что процессор прямо в памяти будет делать инкремент.
Тебе компилятор не даёт гарантий, где будет размещена переменная, в регистрах или оперативке

Алексей
14.10.2018
11:39:14
Вы вообще в курсе, что машинные комманды и то что реально выполняет процессор - это не всегда одно и тоже?

Google
Сергей
14.10.2018
11:40:08
Вы вообще в курсе, что машинные комманды и то что реально выполняет процессор - это не всегда одно и тоже?
Это не важно. Важно, что в конечном итоге твой код выполнится как гарантируется спекой архитектуры

Алексей
14.10.2018
11:40:28
Алексей
14.10.2018
11:41:24
Inc да
какой inc?

Сергей
14.10.2018
11:41:33
Инкремент

Алексей
14.10.2018
11:41:49
Инкремент
инкремент чего?

вот inc eax скорее всего атомарный

а другая команда inc [eax] уже может быть как-то не очень атомарной

Сергей
14.10.2018
11:42:53
Ты тролль чтоль?

Алексей
14.10.2018
11:43:04
нет. я серьёзно спрашиваю

Сергей
14.10.2018
11:43:12
Ты не можешь обну ассемблерную команду нептомарно выполнить

Алексей
14.10.2018
11:43:12
это разные команды

Сергей
14.10.2018
11:43:15
Никак

Я понимаю, что разные

Алексей
14.10.2018
11:43:27
Alexander
14.10.2018
11:43:45
Можно ещё вспомнить, что существуют ещё архитектуры кроме древнего x86

Алексей
14.10.2018
11:45:21
Можно начать с того, что ассемблерная команда/команда машинного кода - это уже некая абстракция, потому что к примеру есть тот же кэш, который никак не отражён в этих командах. Есть конвеер, который сразу кучу команд читает и проводит всякие оптимизации.

Страница 1554 из 1630