Рассуждаем про Swift

Научно-технические вопросы применения русского языка в программировании. Проекты с сайта программирование-по-русски.рф, кроме ЯОС . Информация об организациях и людях, использующих или изучающих русский язык в программировании. Сравнение операционных систем.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Рассуждаем про Swift

Сообщение БудДен » 10.10.18 12:22

#swift #blackboxcomponentbuilder
Пытался придумать, как сделать variant для ББЦБ. Так случайно совпало, что предложили постажироваться на проекте с использованием Swift, и, в то же время, один знакомый стал изучать swift. Вот какой диалог стал между нами происходить:

D: Еще в Swift интересно сделаны указатели: UnsafePointer подобные структуры. В Swift вообще нет простых типов. Так даже обыкновенно встроенные типы вроде Integer, в Swift это структуры.
И самое интересное, что это правильно.
Например, в C# Integer это объект, и тут возникает вопрос - объект как копируется, по значению, по ссылке?
Т.е. сразу неоднозначность. В Swift сруктура это почти объект, но передается по значению,
наследования нет, но есть имплементация протоколов (интерфейсов).
Это правильно, это мне подходит.
И вот мой ответ (в ходе мозгового штурма по добавлению variant-ов):
Интересный вопрос, но я не думаю, что у него есть простой ответ. Смотри, что тут есть.
1. Иммутабельность. Integer иммутабелен, ты не можешь из двойки сделать 5-ку. Поэтому не так важно, как он передаётся. В лиспе написано, что компилятор имеет право копировать числа в любой момент, или передавать по ссылке.
2. Разные определения эквивалентности. Ты можешь сравнивать записи как минимум, двумя способами: можно сравнивать их адреса (т.е. проверять, то же это объект в памяти или нет). А можно сравнивать их содержимое. В этом смысле всё же важно, передаёшь ты объект по копии или по значению. Оба способа сравнения имеют свою область применения, и выкинуть какой-то из них нельзя. Если мы рассматриваем integer как настоящую запись, то в принципе и для integer получается два разных способа сравнения. В лиспе так и есть - там есть eq - оно сравнивает адреса объектов. У тебя может быть (not (eq 1 1)), если две единицы хранятся по разным адресам. А есть сравнение с учётом семантики чисел - eql. Всегда (eql 1 1).

Так что есть две неоднозначности - как копировать и как сравнивать. Обе неустранимы. Хорошо здесь то, что эти неоднозначности выглядят одинаково для чисел и для других иммутабельных записей. Т.е. действительно, можно построить числа в общий ряд и это решение хорошее.

Но вот как в swift-е ты можешь выразить передачу по ссылке? Я так понял, http://qaru.site/questions/2425788/pass ... e-in-swift с помощью copy-on-write. Ну что же, это жизнеспособно, хотя я бы не сказал, что мне это нравится. Для меня явное всегда предпочтительнее неявного. Но может быть, я просто что-то в жизни не понял :)

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Рассуждаем про Swift

Сообщение Лис [Вежливый] » 10.10.18 14:45

в C# Integer это объект, и тут возникает вопрос - объект как копируется, по значению, по ссылке?
Integer это value type и копируется по значению.

А если надо по ссылке, то есть боксинг/анбоксинг.
https://docs.microsoft.com/en-us/previo ... (v=vs.110)

проблем с передачей ссылки на Integer созданный в куче в C# нет никаких.

вот пример, как записать боксинг:
https://stackoverflow.com/questions/989 ... eap-with-c

Код: Выделить всё

int number = 42;
object locatedOnTheHeap = number; // boxing
object anotherReferenceToTheSameObject=locatedOnTheHeap;
int numberUnboxed1 = (int)locatedOnTheHeap; // unboxing
int numberUnboxed2 = (int)anotherReferenceToTheSameObject; // unboxing via another reference
Структура в C# - это тоже value type, её тоже можно передавать по значению. А если надо по ссылке, то тоже можно, использовав boxing/unboxing.

Классы - это уже Reference Type, а не Value Type. Почитать надо про разницу между Reference Type и Value Type и вопроса бы не было.
Эта разница - одно из ключевых отличий C# от Java.

Т.е. в C# нет никакой неоднозначности, это у знакомого незнание технологии, с которой он пытается провести сравнение.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Рассуждаем про Swift

Сообщение БудДен » 10.10.18 15:53

Я не знаю C#, но мой товарищ его точно знает - он несколько лет семью этим кормил. Так что нужно искать, что он имел в виду. Моё мнение - имелось в виду, что значок "=" один, а смысл у него разный. Для чисел «=» как бы копирует число. Поэтому нельзя сказать, что в C# у «=» семантика копирования ссылки. С учётом присутствия var, вывода типов, неявного преобразования типов, может быть неясно из контекста, происходит ли в этом месте копирование объекта или нет. Хотя мы можем выкрутиться, сказав, что операции, такие, как «+», порождают новый объект типа «число», ссылка на который возвращается. Тогда мы вроде как приходим к тому, что «=» приобретает ссылочную семантику. Но это опять неправда, поскольку никакого объекта не создаётся и выделения на куче не происходит. Думается, у swift подсчёт ссылок, поэтому там это различие менее актуально.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Рассуждаем про Swift

Сообщение БудДен » 10.10.18 15:59

Ещё, если уж об этом пошла речь, меня неприятно поразило в C# https://docs.microsoft.com/ru-ru/dotnet ... rds/string сравнение строк. Строка - это ссылочный тип. Для ссылочного типа равенство - это, прежде всего, равенство ссылок. Однако == для строк сравнивает содержимое. Здесь опять лисп оказался на высоте. В лиспе есть eq (сравнение ссылок), eql (сравнение ссылок или чисел) и equal (сравнение по содержимому, в т.ч., строк). Правда, в лиспе плохо, что equal нельзя расширить. Но лисповое определение сравнения выглядит более ортогональным и системным, чем в C#, хотя для программиста, привычного к Дельфи, аномалия в C# может быть долго не осознаваемой.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Рассуждаем про Swift

Сообщение Лис [Вежливый] » 10.10.18 16:17

Ты так говоришь, как будто в C# нельзя сравнить строки не по содержимому.

Можно, функция называется .ReferenceEquals()

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Рассуждаем про Swift

Сообщение БудДен » 10.10.18 18:29

Я подозревал, что можно :) Но описать простыми словами, что делает ==, уже не получится. В лиспе это возможно. Тут на самом деле фишка в том, что несколько таких нерегулярностей, складываясь, дают уже серьёзные проблемы с понимаемостью языка. Важно не переборщить с ними.

Ответить