Алексей
если кто-то мне прояснит, то будет вообще круто
Илья
исторические причины, помоему
Roman
Алсо ИМХО иммутабельность по дефолту не нужна.
в языке про конкурентность иммутабельность вдруг "не нужна", нуда нуда 🙂
Andrei 🦉
не сравнивайте Go с Rust. Это абсолютно разные инструменты для решения абсолютно разных проблем. https://www.quora.com/Will-Go-over-take-Rust-as-the-most-popular-language-compiled-to-WebAssembly/answers/97741098
не совсем, rust сейчас активно допиливают для врыва в веб, до конца года обещают завести async в stable и обсуждают аналог горутин на этом async’е
Алексей
исторические причины, помоему
Ну учитывая, что они компилятор с сишки транслировали, то вполне возможно
Илья
просто fmt был изначально, а парсер написали к 1.5
Savely
не совсем, rust сейчас активно допиливают для врыва в веб, до конца года обещают завести async в stable и обсуждают аналог горутин на этом async’е
Раст всё ещё нацелен на решение других задач. Его врыв в веб это конечно хорошо, но нишу Го он вряд ли отвоюет без боя.
Алексей
Причём там написано в стиле Роба Пайка, то есть всё руками без особой кодогенерации через какой-нибудь bison/antlr/что угодно
Алексей
Причём в обоих парсерах
Andrei 🦉
Раст всё ещё нацелен на решение других задач. Его врыв в веб это конечно хорошо, но нишу Го он вряд ли отвоюет без боя.
не, там серьезно нацелились на нишу разработки высокопроизводительных веб апи, то есть нишу го
Алексей
хотя я с таким подходом не согласен совершенно
Roman
Растоманам может и нужна. Там я против неё ничего не имею, безопасность и всё такое. У Го немного другой прицел, ИМХО.
какой другой прицел? безответственность? я не предлагаю убирать GC и завозить ownership & borrowing взамен. я предлагаю уточнить систему типов, которая по описаниям в пропосале - чуток хромает из-за того что иммутабельных типов нет, которые же можно без проблем завезти. основная разница Rust'а и Go это разные подходы к МЕНЕДЖМЕНТУ ПАМЯТИ! - GC (Go) это просто - ownership & borrowing (Rust) это сложнее - RAII (C++) это очень сложно - alloc/delete (C) это адово сложно поэтому не надо сравнивать Rust и Go и гнать на compile-time security. Потому-что compile-time security это очень важно во времена большого, сложного, конкуррентного open source кода. А имутабельные типы НЕ вносят значительный overhead в процесс компиляции (в теории, числа зависят от конкретной имплементации)! Понижение скорости компиляции настолько незначительное что вы его не заметите.
Artem
какой другой прицел? безответственность? я не предлагаю убирать GC и завозить ownership & borrowing взамен. я предлагаю уточнить систему типов, которая по описаниям в пропосале - чуток хромает из-за того что иммутабельных типов нет, которые же можно без проблем завезти. основная разница Rust'а и Go это разные подходы к МЕНЕДЖМЕНТУ ПАМЯТИ! - GC (Go) это просто - ownership & borrowing (Rust) это сложнее - RAII (C++) это очень сложно - alloc/delete (C) это адово сложно поэтому не надо сравнивать Rust и Go и гнать на compile-time security. Потому-что compile-time security это очень важно во времена большого, сложного, конкуррентного open source кода. А имутабельные типы НЕ вносят значительный overhead в процесс компиляции (в теории, числа зависят от конкретной имплементации)! Понижение скорости компиляции настолько незначительное что вы его не заметите.
и после последнего предложения я ожидал увидеть пруфы/бенчи, которых нет =(
Алексей
да тут и не надо особо пруфов
Алексей
и так понятно, что иммутабельность - это явно не та вещь, которая может замедлять компиляцию
Aleksey
какой другой прицел? безответственность? я не предлагаю убирать GC и завозить ownership & borrowing взамен. я предлагаю уточнить систему типов, которая по описаниям в пропосале - чуток хромает из-за того что иммутабельных типов нет, которые же можно без проблем завезти. основная разница Rust'а и Go это разные подходы к МЕНЕДЖМЕНТУ ПАМЯТИ! - GC (Go) это просто - ownership & borrowing (Rust) это сложнее - RAII (C++) это очень сложно - alloc/delete (C) это адово сложно поэтому не надо сравнивать Rust и Go и гнать на compile-time security. Потому-что compile-time security это очень важно во времена большого, сложного, конкуррентного open source кода. А имутабельные типы НЕ вносят значительный overhead в процесс компиляции (в теории, числа зависят от конкретной имплементации)! Понижение скорости компиляции настолько незначительное что вы его не заметите.
Здесь есть люди пилящие го компайлер? Их много?
Алексей
Здесь есть люди пилящие го компайлер? Их много?
я в нём ковыряюсь, но не особо глубоко
Алексей
да и скорее всего если я даже сделаю pull request, то его наверняка не примут
Roman
и после последнего предложения я ожидал увидеть пруфы/бенчи, которых нет =(
👆🏻 исправил: (в теории, числа зависят от конкретной имплементации) дело в том, что всё что компилятор должен сделать это пройтись по иммутабельным типам и проверить assignment'ы полей и вызовы методов с мутабельным питом receiver'а, это вам NP проблема...
Алексей
так что мои изменения (если их удастся внести) скорее всего так и останутся моими :(
Artem
а что с ними?
var a const func() что значит
Roman
var a const func() что значит
это типичная иммутабельная переменная, это означает что в a нельзя присвоить никакую другую функцию: var a const func() { fmt.Print("A") } /*...*/ a = const func() { fmt.Print("B") } // Compile-time error .example.go:3:3: cannot assign to immutable variable a
Roman
А каков в итоге план? Тут в чатике с экспертами классно, конечно обсуждать, но мне интересено послушать доводы go core-developers
как только я допишу этот proposal я буду пушать его в массы и в том числе опубликую в официальном issue section. в идеале нужно написать PoC линтер, который позволил бы представить идею в работе без поддержки const квалификатора компилятором, но это уже более затратно по времени, посмотрим
Алексей
Вообще сама идея мне нравится
Алексей
а вот насчёт реализации я не уверен
Алексей
это я про иммутабельность если что
Savely
Зе сейм. Но я не знаю что ещё можно предложить, не поломав совместимость с Go1.
Roman
я подумываю переименовать документ в Go 1/2 - Immutable Types
Savely
ничего там не ломается, читай
Я и говорю, что предложенное тобой, единственное, что ничего не ломает.
Savely
Но можно сделать синтакс лучше, поломав :)
Dmitry
Подскажите best practice по написанию тестов на Go? Или киньте ссылкой, пожалуйста
Savely
@Romshark ImmutableField const *Object, а если вот так объявить, то что будет? Я туповат под вечер
Savely
Ты в примере пишешь: type Object struct { ImmutableField const * const Object // Immutable MutableField *Object // Mutable }
Roman
Но можно сделать синтакс лучше, поломав :)
не только синтаксис, но и safety
Roman
Подскажите best practice по написанию тестов на Go? Или киньте ссылкой, пожалуйста
а что конкретно тебя интересует то? best practice описаны в официальных доках
Savely
не понял вопрос
type Object struct { ImmutableField const * const Object // Immutable MutableField *Object // Mutable }
Savely
Я вот про этот пример.
Roman
Ты в примере пишешь: type Object struct { ImmutableField const * const Object // Immutable MutableField *Object // Mutable }
const * Object это иммутабельный указатель на мутабельный объект: https://github.com/romshark/Go-2-Proposal---Immutability#2911-immutable-pointer-to-mutable-object
Savely
const * Object это иммутабельный указатель на мутабельный объект: https://github.com/romshark/Go-2-Proposal---Immutability#2911-immutable-pointer-to-mutable-object
То есть я не смогу изменить указатель, но смогу поменять к примеру поля в теле объекта?
Roman
То есть я не смогу изменить указатель, но смогу поменять к примеру поля в теле объекта?
совершенно верно, и зачем это надо описано вот здесь: https://github.com/romshark/Go-2-Proposal---Immutability#49-why-do-we-need-the-distinction-between-immutable-and-mutable-reference-types
Savely
Ага, понял
Алексей
вот это как раз выглядит как-то не очень
Roman
То есть я не смогу изменить указатель, но смогу поменять к примеру поля в теле объекта?
вернее, ты сможешь изменить сам указатель, указывать на другой объект. Но сам объект на который этот указатель указывает - изменить не сможешь
Roman
вот это как раз выглядит как-то не очень
иначе никак. я в большинстве случаев привожу worst case'ы, best case'ы в пропосале мало кого интересуют
Roman
вот это как раз выглядит как-то не очень
а вообще для этого имеются Type Aliases: type ObjectRef const * const Object
Roman
Разве это не * const Object?
наоборот const квалификатор применяется всегда к тому что справа от него, так-же как указатель применяется на тип справа от него
Алексей
а вообще для этого имеются Type Aliases: type ObjectRef const * const Object
это кстати тоже не особо круто в плане читаемости, потому что у Go так type устроен очень кратко
Алексей
слишком кратко я бы сказал
Savely
наоборот const квалификатор применяется всегда к тому что справа от него, так-же как указатель применяется на тип справа от него
справа от него как раз Object, ты пишешь "но сам объект на который этот указатель указывает - изменить не сможешь"
Savely
Вот и получается что не наоборот, разве нет?
Алексей
с синтактической подсветкой всё норм, мы не в 1970 году
Роб Пайк не любит синтаксическую подсветку
Roman
Роб Пайк не любит синтаксическую подсветку
а mutable shared state он любит?)) он сам сказал что не любит: https://youtu.be/BBbv1ej0fFo
Алексей
а mutable shared state он любит?)) он сам сказал что не любит: https://youtu.be/BBbv1ej0fFo
бедный D, у него будущего нет, да и прошлого тоже
Алексей
да и Go не про системное программирование
Roman
справа от него как раз Object, ты пишешь "но сам объект на который этот указатель указывает - изменить не сможешь"
const * const Object иммут. указатель на иммут. структуру const * Object иммут. указатель на мут. структуру * const Object мут. указатель на иммут. структуру * Object мут. указатель на мут. структуру https://github.com/romshark/Go-2-Proposal---Immutability#291-pointer-examples
Savely
да и Go не про системное программирование
Алсо я теперь всегда должен буду пробел ставить?)
Savely
Можно же написать *Object по классике?)
Roman
Roman
Можно же написать *Object по классике?)
const*const Object согласись как-то не очень?
Алексей
const*const Object согласись как-то не очень?
ну постоянные const в стиле крестов тоже так себе
Savely
Потенциальное mut * mut Object меня тоже не сильно радует
Savely
такого не будет
Так вон: https://github.com/romshark/Go-2-Proposal---Immutability#3-immutability-by-default-go--2x
Алексей
аа
Roman
ну постоянные const в стиле крестов тоже так себе
поэтому immut по умолчанию предлагаю для Go 2, ибо по статистике мутабельности должно быть меньше чем немутабельности
Roman
Алексей
а, я думал и mut и const вместе
Алексей
уф
Savely
Почему, кстати, там так: Immutable_immutMap_of_immutObj map[Object] Object // immutable key Mutable_mutMap_of_immutObj mut [Object] Object // immutable key Mutable_mutMap_of_mutObj mut [mut Object] mut Object // mutable key А не вот так: Immutable_immutMap_of_immutObj map[Object] Object // immutable key Mutable_mutMap_of_immutObj mut map[Object] Object // immutable key Mutable_mutMap_of_mutObj mut map[mut Object] mut Object // mutable key