Если возможность настроить периферию и установить ПО чистым мышкотыканьем — да, тут винде нет равных.
Ага, в линуксе гуглишь команду и пишешь в консоли. В винде начинаешь лазить по дебрям менюшек, причём что-то продвинутое приходится искать на англоязычных сайтах, поэтому приходится ещё догадываться, что и как было переведено или почему у тебя вообще нет нужного пункта в меню.
Я бы сказал, что это предустановленная винда стоит "второй системой", за последние полтора года ни разу её не запускал. Сёрфить интернет без разницы на чём, программировать удобнее в линуксе, в игры я практически не играю. Играл в факторио — на линуксе она есть.
От винды одни неудобства с постоянными обновлениями и невозможностью настройки. Чуть захочешь чего-нибудь нестандартного, начинается "фича есть, только я вам её не отдам, у вас pro-лицензии нет". Линукс же просто работает. Ноутбук не перезагружаю месяцами, обновления ставятся практически мгновенно.
У меня на улице при отрицательной температуре провод наушников-вкладышей затвердевал буквально на глазах. Достал из кармана клубок проводов, не успел размотать за десяток секунд — всё, провода превратились в что-то похожее на пластик и гнуться не хотят, фиг распутаешь.
Интересно, у меня такой фигни нет. Наверно, потому что я не звоню/не пишу смс, за интернет стабильно 150р/мес уходят, а я их стабильно почуть-чуть кладу на счёт. Если деньги начнут пропадать, я об этом быстро догадаюсь.
Впрочем, они те ещё 3.14***ы, сами перевели меня с тарифа за 100р/мес на 150р/мес. Более нове тарифы ещё хуже. А ещё их цены в 99р/мес и 149 р/мес подразумевают месяц в 30дней и потому по факту это почти 100.5р за средний месяц: 99 / 30 365 = 1204.5 > 100 12.
final в Java используют только тогда когда это просит компилятор.
С каждой новой версией компилятора таких просьб всё меньше и меньше.
final позволяет писать многопоточный код. Он пишется не только для программиста, а для того чтобы Java Memory Model гарантировала безопасность несинхронизованного многопоточного доступа.
Теперь про оптимизации:
Если я объявлю переменную c final, то копилятор имеет полное право инлайнить её где ему угодно. Если же слова final нет, то в один прекрасный момент с помощью рефлексии, простого присовоения значения или загрузки класса, который захочет поменять поле, оно может поменяться. (Если я рефлексией поменяю final поле, то я сам себе злобный буратино). Это касается практически всех языков, в которых есть виртуальные машины.
Поскольку существует проблема останова, мы не всегда можем сказать, что какой-то код будет исполнен или нет. Нет никаких гарантий, что компилятор в каждом случае сам догадается, что переменная неизменяемая. Нет никаких гарантий, что программист не ошибётся и случайно не напишет где-нибудь в дебрях кода pi = pi / 2. В java новые классы могут подгружаться прямо во время исполнения программы, а так же есть рефлексия, так что доказательство "неизменяемости" становится ещё сложнее, и его надо будет постоянно поддерживать в актуальном состоянии, и потом в один прекрасный момент переменная может стать изменяемой.
Кроме того, jit — очень сложная штука, вот пример: https://habr.com/post/305894/.
Когда я добавляю константность для полей объектов, я даю больше возможностей jit-компилятору для проведения оптимизаций.
"С той стороны" тоже неплохо хакают. Например, если время исполнения после приёма заявления регламентировано, то они могут как-нибудь хитро не принимать само заявление.
Я так загранпаспорт оформлял целых полгода. Никуда не торопился, но вообще-то его должны сделать за месяц.
Итак, декабрь 2017 — я попытался запросить загранпаспорт через госуслуги ради экономии 30% от суммы. После того как я всё-всё ввел, при отправлении мне выдаёт что-то типа "неизвестная ошибка, попробуйте завтра" (насколько я понял — не с моей стороны). "Завтра" не наступает. Я пишу в техподдержку. Проходит декабрь, январь. Я удаляю старую форму, отправляю запрос заново. Хотя это раньше не помогало, теперь сработало. Спустя энное время мне приходит письмо типа "приём только по предварительной записи там-то и возьмите необходимые документы". Я все госуслуги облазил — где происходит эта электронная запись, не нашёл. На сайте того-то места (тот ещё квест) нерабочая форма — нельзя выбрать ни одной даты. На телефон они в принципе не отвечают, пытался звонить в разные дни и разное время суток. Написал в техподдержку госуслуг с вопросом, где же записаться в ту самую очередь. Прошёл ещё месяц. В итоге на форуме своего города (я даже не знал про существование форума) нагуглил, что для записи надо прийти лично в определённое время в в некоторые дни. Божественно!
Пришёл, меня записали во внутренний журнальчик на через пару месяцев. Через пару месяцев я принёс всякие документы, и после этого они операвивно недельки через три я получил загран.
Формально — они сделали загран за 3 недели. Реально они его делали почти три месяца и ещё месяца три я потратил на "взаимодействие" с госуслугами.
Финал: ещё где-то через месяц от госуслуг пришло сообщение типа "сообщений в техподдержку было слишком много, мы не успели их обработать, ответа можете не ждать"
В моём ближайшем МФЦ на стойке для выдаче талончиков прям на экране приклеена бумажка типа "не работает", потом говоришь специально обученной женщине, она отклеивает бумажку от экрана, выбирает там что надо и приклеивает бумажку обратно. (Я об этом поначалу не знал, и за 15 минут до окончания работы мфц мне просто не дали талончик, а взять его из "неработающей" стойки я не догадался) В ещё одном МФЦ видел хак — есть специальные маленькие штучки с тремя смайликами, на которых после обслуживания клиент может поставить свою оценку. В моём городе они стоят как надо, а вот там — тупо развёрнуты от посетителей, и работники сами себе ставят максимальные оценки. И всё, "все довольны", блин.
Нет, не так. Вот я менял права полтора года назад: надо зарегистрироваться на госуслугах, в госуслугах выбрать ближайшее свободное время (не факт, что сегодня-завтра оно будет) (отделение гаи — не любое, а именно то, где сдавал на права), приехать в гаи в 11 утра, простоять больше часа в очереди таких же людей, которые тоже приехали вовремя и которых до сих пор не обслужили. Получить права.
Как я их получал лет 7 назад: пришёл в гаи, постоял 5 минут в очереди, получил права. Всё.
Можно сделать "приватное поле" и "методы с произвольными модификаторами доступа", потому что в некоторых языках публичные поля практически не используются. "Приватность" поля даёт компилятору простор по порядку расположения полей, а так же можно будет безболезненно переместить поле из объекта, например, во вложенный объект и поменять геттеры/сеттеры на возвращение значения оттуда.
В идеальном языке подпрограммы, объявленные как функции, должны контролироваться на чистоту.
Потому что процедура — не возвращает значения. Если у неё ещё и побочных действий не будет — она станет совсем не нужна.
Хм, а если на это взглянуть иначе? Допустим, функции должны быть чистыми — поэтому они обязаны что-то возвращать.
Что запрещает процедурам (с побочными действиями) тоже иметь возвращаемые значения? Например, процедура пытается сохранить текст в файл и возвращает флаг-результат.
И ещё — получается, из функций нельзя вызывать процедуры?
Хм. Тут подвох? Я вижу два варианта ответа, но не могу сказать, какой из них лучше:
можно сказать, что выбор типа X не влияет на U, и потому левый будет подтипом. С другой стороны, если предположить, что T₁ это bottom type, а T₂ и U₁ — нет, то левый не сможет быть подтипом правого.
В С при увеличении указателя на void людя хотят именно перемещаться по байтам в памяти. Если размер void вместо 1 станет 0, то тогда сломается совместимость.
Вы хотите потребовать, чтобы для свойства a указывали явно тип принимающей переменной? int q = A.a? Разработчики будут против, это неудобно.
Указание типа будет требоваться только для разрешения неоднозначности, когда имена проперти и метода совпадают. В обычных случаях ничего не изменится.
А зачем?
Потому что он есть. Кому это мешает?
прекрасный пример с SO:
Это уже больше похоже на некорректную ситуацию. Ну так запрещать надо именно такое, а не все совпадения имён!
Вдобавок, даже из этой ситуации можно было вывернуться, если бы проперти было доступно как метод get_Q(), а в неоднозначности из примера отдавался бы приоритет методу Q.
В языках типа Groovy/Scala проперти играют роль синтаксического сахара, который использовать не обязательно — можно напрямую звать геттеры и сеттеры. С моей точки зрения происходящее в С# выглядит лишним усложнением.
Потому что невозможно будет определить, что такое var q = A.a.
Не вижу проблемы. Если у класса несколько методов, то тоже невозможно определить, к чему относится A.a При этом всё нормально работает:
class A {
public void a(double c){}
public int a(){return 1;}
}
public static void Main()
{
Func<int> a = new A().a;
Action<double> a2 = new A().a;
var a3 = new A().a();
}
Проблема в том, что усложнился весь язык.
Проперти считается отдельной сущностью, хотя реализована через методы
Геттер будет реализован как метод get_a, но при этом я не могу в классе определить ни одного метода с именем a.
метод get_a() объявить тоже не получится. (Единственный логичный пункт)
Метод геттера get_a() нельзя вызвать как метод. Но можно через рефлексию.
Л-логика! В C# создали проблемы на пустом месте.
Вот пример на скале:
class A() {
val x = 1
def x(s: String): Unit = println(s)
def x(arg: Int): Unit = x(arg.toString)
}
val a = new A()
a.x(a.x)
val method: String => Unit = a.x(_)
Eдинственное, что запрещает язык — сделать метод с именем 'x', который ничего не принимает, поскольку геттер является этим самым методом.
Тоже читаю Терри Пратчета, но у него какой-то сложный английский с использованием редких слов и персонажами, которые иногда коверкают слова. У меня идёт сложно.
class A {
public void a(double c){}
public void a(int x, int y){}
//public int a{get; set;}
}
Почему я могу сделать несколько методов с одинаковым именем и разный сигнатурой, и это нормально, а если я для проперти попробую использовать то же самое имя, то нельзя? И это не смотря на то, что "под капотом" геттер и сеттер это всё равно методы. Это ограничение мне кажется совершенно искусственным, как и отдельный синтаксис для определения геттеров и сеттеров.
Ну я больше описал "как я бы хотел", а не "как оно получится после столкновения с реальностью". Первичной целью является получение опыта и знаний. В идеале я бы хотел потеснить lua — сделать маленький гибкий язык, чтобы его можно было встраивать куда угодно. Ещё я хотел попробовать Graal VM, но у меня никак не дойдут руки(
В скале 2 нет типов-сумм, есть только очень ограниченная поддержка в виде case классов. Есть мелочи типа не устаканившихся макросов и некоторых костылей для обхода ограничений jvm. Есть некоторые моменты, которые, как мне кажется, сделаны слишком сложно. Всякие интересные возможности добавляют в dotty, но я не знаю, как их поддержка повлияет на производительность кода. Не хватает возможности в качестве шаблонного параметра передать число (в scala native это нужно для описания типа массива фиксированной длины). В scala native после компиляции получаются подозрительно большие бинарники. Код (jar файлы) получаются тоже довольно большими, на порядок больше того что в java (именно мой код, без учёта стандартной библиотеки). Вдобавок, чувствуется, что скала создавалась под jvm, это выражается в некоторых ограничениях. Например, для интерфейса c методом print(t: T) и не могу сделать, чтобы один класс реализовал интерфейс одновременно и для T=int и для T=String
Забавно наблюдать, как опыт автора от использования предыдущих языков влияет на синтаксис и фичи придумываемого им языка.
P.S. Я пробовал создать свой язык, он у меня совсем другим получался. (По крайней мере, идея, до практики я не довёл). И синтаксис, и фичи, и базовые термины, в которых я мыслил — всё иное.
Принципиально — не отличается; но поскольку государств относительно мало, их репутацию выяснить намного проще, чем репутацию частных лиц.
Ну вообще-то, уже в средневековой европе частные лица объединялись в цехи с жёсткими стандартами качества, и в случае фейла репутационные издержки нёс сам цех, и потому внутри него как-то отслеживалось качество продукции.
Аналогично и сейчас, я могу даже в незнакомом городе зайти в кафешку типа мака и там будет стандартный набор еды и цен на неё.
Если я беру в магазине молоко, а оно оказывается прокисшим, то государство мне никак не помогает. Работает репутация, когда я перестаю ходить в магазин А, т.к. там продавцы обсчитывают и в магазин Б, т.к. там попадается просроченный товар. С редкими покупками типа автомобиля снова работает репутация, основанная на опыте знакомых и т.п. Опять же, хороший автопроизводитель даёт гарантию и бесплатно ремонтирует авто, не потому что государство так сказало (бывают случаи, когда какой-нибудь производитель юлит и не признаёт гарантийным случай, наличие нашего государства не особо помогает), а потому что ему дорога его репутация.
Ага, в линуксе гуглишь команду и пишешь в консоли. В винде начинаешь лазить по дебрям менюшек, причём что-то продвинутое приходится искать на англоязычных сайтах, поэтому приходится ещё догадываться, что и как было переведено или почему у тебя вообще нет нужного пункта в меню.
Я бы сказал, что это предустановленная винда стоит "второй системой", за последние полтора года ни разу её не запускал. Сёрфить интернет без разницы на чём, программировать удобнее в линуксе, в игры я практически не играю. Играл в факторио — на линуксе она есть.
От винды одни неудобства с постоянными обновлениями и невозможностью настройки. Чуть захочешь чего-нибудь нестандартного, начинается "фича есть, только я вам её не отдам, у вас pro-лицензии нет". Линукс же просто работает. Ноутбук не перезагружаю месяцами, обновления ставятся практически мгновенно.
Скайп там есть. Такой же убогий как под osx, но это "заслуга" скайпа, а не операционной системы.
У меня на улице при отрицательной температуре провод наушников-вкладышей затвердевал буквально на глазах. Достал из кармана клубок проводов, не успел размотать за десяток секунд — всё, провода превратились в что-то похожее на пластик и гнуться не хотят, фиг распутаешь.
Интересно, у меня такой фигни нет. Наверно, потому что я не звоню/не пишу смс, за интернет стабильно 150р/мес уходят, а я их стабильно почуть-чуть кладу на счёт. Если деньги начнут пропадать, я об этом быстро догадаюсь.
Впрочем, они те ещё 3.14***ы, сами перевели меня с тарифа за 100р/мес на 150р/мес. Более нове тарифы ещё хуже. А ещё их цены в 99р/мес и 149 р/мес подразумевают месяц в 30дней и потому по факту это почти 100.5р за средний месяц: 99 / 30 365 = 1204.5 > 100 12.
final позволяет писать многопоточный код. Он пишется не только для программиста, а для того чтобы Java Memory Model гарантировала безопасность несинхронизованного многопоточного доступа.
Теперь про оптимизации:
Если я объявлю переменную c final, то копилятор имеет полное право инлайнить её где ему угодно. Если же слова final нет, то в один прекрасный момент с помощью рефлексии, простого присовоения значения или загрузки класса, который захочет поменять поле, оно может поменяться. (Если я рефлексией поменяю final поле, то я сам себе злобный буратино). Это касается практически всех языков, в которых есть виртуальные машины.
Поскольку существует проблема останова, мы не всегда можем сказать, что какой-то код будет исполнен или нет. Нет никаких гарантий, что компилятор в каждом случае сам догадается, что переменная неизменяемая. Нет никаких гарантий, что программист не ошибётся и случайно не напишет где-нибудь в дебрях кода
pi = pi / 2
. В java новые классы могут подгружаться прямо во время исполнения программы, а так же есть рефлексия, так что доказательство "неизменяемости" становится ещё сложнее, и его надо будет постоянно поддерживать в актуальном состоянии, и потом в один прекрасный момент переменная может стать изменяемой.Кроме того, jit — очень сложная штука, вот пример: https://habr.com/post/305894/.
Когда я добавляю константность для полей объектов, я даю больше возможностей jit-компилятору для проведения оптимизаций.
Я новую категорию открывал. Может быть, с просто заменой прав иначе.
Вот здесь пишут, что вроде бы можно без госуслуг обойтись: https://autoprav.com/vu/kak-poluchit-prava-posle-sdachi-ekzamenov.html
И оно вполне похоже на правду (как и то, что талоны могут заканчиваться и надо будет рано утром приезжать или брать талон на другой день).
Ах да, через госуслуги дешевле на 30%. Так что вариант с записью через госуслуги мне кажется менее неудобным, чем вживую ехать за талончиком.
"С той стороны" тоже неплохо хакают. Например, если время исполнения после приёма заявления регламентировано, то они могут как-нибудь хитро не принимать само заявление.
Я так загранпаспорт оформлял целых полгода. Никуда не торопился, но вообще-то его должны сделать за месяц.
Итак, декабрь 2017 — я попытался запросить загранпаспорт через госуслуги ради экономии 30% от суммы. После того как я всё-всё ввел, при отправлении мне выдаёт что-то типа "неизвестная ошибка, попробуйте завтра" (насколько я понял — не с моей стороны). "Завтра" не наступает. Я пишу в техподдержку. Проходит декабрь, январь. Я удаляю старую форму, отправляю запрос заново. Хотя это раньше не помогало, теперь сработало. Спустя энное время мне приходит письмо типа "приём только по предварительной записи там-то и возьмите необходимые документы". Я все госуслуги облазил — где происходит эта электронная запись, не нашёл. На сайте того-то места (тот ещё квест) нерабочая форма — нельзя выбрать ни одной даты. На телефон они в принципе не отвечают, пытался звонить в разные дни и разное время суток. Написал в техподдержку госуслуг с вопросом, где же записаться в ту самую очередь. Прошёл ещё месяц. В итоге на форуме своего города (я даже не знал про существование форума) нагуглил, что для записи надо прийти лично в определённое время в в некоторые дни. Божественно!
Пришёл, меня записали во внутренний журнальчик на через пару месяцев. Через пару месяцев я принёс всякие документы, и после этого они операвивно недельки через три я получил загран.
Формально — они сделали загран за 3 недели. Реально они его делали почти три месяца и ещё месяца три я потратил на "взаимодействие" с госуслугами.
Финал: ещё где-то через месяц от госуслуг пришло сообщение типа "сообщений в техподдержку было слишком много, мы не успели их обработать, ответа можете не ждать"
В моём ближайшем МФЦ на стойке для выдаче талончиков прям на экране приклеена бумажка типа "не работает", потом говоришь специально обученной женщине, она отклеивает бумажку от экрана, выбирает там что надо и приклеивает бумажку обратно. (Я об этом поначалу не знал, и за 15 минут до окончания работы мфц мне просто не дали талончик, а взять его из "неработающей" стойки я не догадался) В ещё одном МФЦ видел хак — есть специальные маленькие штучки с тремя смайликами, на которых после обслуживания клиент может поставить свою оценку. В моём городе они стоят как надо, а вот там — тупо развёрнуты от посетителей, и работники сами себе ставят максимальные оценки. И всё, "все довольны", блин.
Нет, не так. Вот я менял права полтора года назад: надо зарегистрироваться на госуслугах, в госуслугах выбрать ближайшее свободное время (не факт, что сегодня-завтра оно будет) (отделение гаи — не любое, а именно то, где сдавал на права), приехать в гаи в 11 утра, простоять больше часа в очереди таких же людей, которые тоже приехали вовремя и которых до сих пор не обслужили. Получить права.
Как я их получал лет 7 назад: пришёл в гаи, постоял 5 минут в очереди, получил права. Всё.
Можно сделать "приватное поле" и "методы с произвольными модификаторами доступа", потому что в некоторых языках публичные поля практически не используются. "Приватность" поля даёт компилятору простор по порядку расположения полей, а так же можно будет безболезненно переместить поле из объекта, например, во вложенный объект и поменять геттеры/сеттеры на возвращение значения оттуда.
Хм, а если на это взглянуть иначе? Допустим, функции должны быть чистыми — поэтому они обязаны что-то возвращать.
Что запрещает процедурам (с побочными действиями) тоже иметь возвращаемые значения? Например, процедура пытается сохранить текст в файл и возвращает флаг-результат.
И ещё — получается, из функций нельзя вызывать процедуры?
можно сказать, что выбор типа X не влияет на U, и потому левый будет подтипом. С другой стороны, если предположить, что T₁ это bottom type, а T₂ и U₁ — нет, то левый не сможет быть подтипом правого.
В С при увеличении указателя на void людя хотят именно перемещаться по байтам в памяти. Если размер void вместо 1 станет 0, то тогда сломается совместимость.
Указание типа будет требоваться только для разрешения неоднозначности, когда имена проперти и метода совпадают. В обычных случаях ничего не изменится.
Потому что он есть. Кому это мешает?
Это уже больше похоже на некорректную ситуацию. Ну так запрещать надо именно такое, а не все совпадения имён!
Вдобавок, даже из этой ситуации можно было вывернуться, если бы проперти было доступно как метод get_Q(), а в неоднозначности из примера отдавался бы приоритет методу Q.
В языках типа Groovy/Scala проперти играют роль синтаксического сахара, который использовать не обязательно — можно напрямую звать геттеры и сеттеры. С моей точки зрения происходящее в С# выглядит лишним усложнением.
Не вижу проблемы. Если у класса несколько методов, то тоже невозможно определить, к чему относится
A.a
При этом всё нормально работает:Проблема в том, что усложнился весь язык.
get_a
, но при этом я не могу в классе определить ни одного метода с именемa
.get_a()
объявить тоже не получится. (Единственный логичный пункт)Л-логика! В C# создали проблемы на пустом месте.
Вот пример на скале:
Eдинственное, что запрещает язык — сделать метод с именем
'x'
, который ничего не принимает, поскольку геттер является этим самым методом.Тоже читаю Терри Пратчета, но у него какой-то сложный английский с использованием редких слов и персонажами, которые иногда коверкают слова. У меня идёт сложно.
Вот пример.
Почему я могу сделать несколько методов с одинаковым именем и разный сигнатурой, и это нормально, а если я для проперти попробую использовать то же самое имя, то нельзя? И это не смотря на то, что "под капотом" геттер и сеттер это всё равно методы. Это ограничение мне кажется совершенно искусственным, как и отдельный синтаксис для определения геттеров и сеттеров.
Ну я больше описал "как я бы хотел", а не "как оно получится после столкновения с реальностью". Первичной целью является получение опыта и знаний. В идеале я бы хотел потеснить lua — сделать маленький гибкий язык, чтобы его можно было встраивать куда угодно. Ещё я хотел попробовать Graal VM, но у меня никак не дойдут руки(
В скале 2 нет типов-сумм, есть только очень ограниченная поддержка в виде case классов. Есть мелочи типа не устаканившихся макросов и некоторых костылей для обхода ограничений jvm. Есть некоторые моменты, которые, как мне кажется, сделаны слишком сложно. Всякие интересные возможности добавляют в dotty, но я не знаю, как их поддержка повлияет на производительность кода. Не хватает возможности в качестве шаблонного параметра передать число (в scala native это нужно для описания типа массива фиксированной длины). В scala native после компиляции получаются подозрительно большие бинарники. Код (jar файлы) получаются тоже довольно большими, на порядок больше того что в java (именно мой код, без учёта стандартной библиотеки). Вдобавок, чувствуется, что скала создавалась под jvm, это выражается в некоторых ограничениях. Например, для интерфейса c методом print(t: T) и не могу сделать, чтобы один класс реализовал интерфейс одновременно и для T=int и для T=String
Забавно наблюдать, как опыт автора от использования предыдущих языков влияет на синтаксис и фичи придумываемого им языка.
P.S. Я пробовал создать свой язык, он у меня совсем другим получался. (По крайней мере, идея, до практики я не довёл). И синтаксис, и фичи, и базовые термины, в которых я мыслил — всё иное.
Ну вообще-то, уже в средневековой европе частные лица объединялись в цехи с жёсткими стандартами качества, и в случае фейла репутационные издержки нёс сам цех, и потому внутри него как-то отслеживалось качество продукции.
Аналогично и сейчас, я могу даже в незнакомом городе зайти в кафешку типа мака и там будет стандартный набор еды и цен на неё.
Если я беру в магазине молоко, а оно оказывается прокисшим, то государство мне никак не помогает. Работает репутация, когда я перестаю ходить в магазин А, т.к. там продавцы обсчитывают и в магазин Б, т.к. там попадается просроченный товар. С редкими покупками типа автомобиля снова работает репутация, основанная на опыте знакомых и т.п. Опять же, хороший автопроизводитель даёт гарантию и бесплатно ремонтирует авто, не потому что государство так сказало (бывают случаи, когда какой-нибудь производитель юлит и не признаёт гарантийным случай, наличие нашего государства не особо помогает), а потому что ему дорога его репутация.