Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
а) какой есть метод лучше, для оценки сложности языка (в терминологии сложности данной статьи)?
б) как можно объяснить достаточно очевидную корелляцию результатов у всех трех методик, если они несостоятельны и их результаты — результат случайного распределения?
Да и оценивать сложность языка бесполезно. Стоит оценивать сложность разработки на языке, а это уже оценка вместе с экосистемой и только на одинаковом спектре задач.
«сложность разработки на языке» кореллирует со «сложностью языка»
Функциональные языки вообще не хотел добавлять, потому что первые две методики работают лишь на похожих императивных языках.
жду ответа на два вопроса :)
эти цифры могут в той или мере кореллировать со сложностьюа могут и не коррелировать.
топорно подогнаны шкалыу вас — топорно подогнаны метрики и выборка языков. См. clojure.
Clojure — императивный язык?
При этом я буду анализировать языки, которые достаточно универсальны для решения большого круга задач, имеют достаточно большое сообщество и информация о них доступна. Экзотику вроде Brainfuck мы не рассматриваем.
Вы же не будете мне доказывать, что количество ключевых слов в C++ чисто случайно больше, чем в Go, и чисто случайно Go субъективно называется более простым?
Речь не в том, «сколько keyword-ов учить», а в том, что это кое-как коррелирует со сложностью языка, и это легко подсчитатьДа ну, это коррелирует со сложностью разработки компилятора и IDE для данного языка. У тебя нету никакого графика «сложности» языка и ты рассуждаешь о корреляции между сложностью и количеством чего-нибудь? Че, правда? Дай сводный график твоих трех методик и реальный график сложности языков и сравни.
Аргументы про «просто случайное распределение» я выслушал, понял, и не согласен.Да бля, ты сам-то на график посмотри. Ты смотришь на Go и C++, я смотрю на JS & Scala & C#. Какое еще нахер случайное распределение (мы до него еще тупо не дошли), если ты тупо игнорируешь свой график и чужое мнение?
Во-вторых, в Java и C# есть итераторы, и они определяются так же просто как и в обычных языках, зачем вы stream и linq приплели — не понятно.
move_next плюс функциональные ништяки.MoveNext, а потом отдельно появился Linq.(1 to 1000)
.filter(x => 1 == 1)
.filter(x => 1 == 1)
.head()(1 to 1000).view
.filter(x => 1 == 1)
.filter(x => 1 == 1)
.head()"abc".filter(_ != 'b') // "ac"Array('a', 'b', 'c').filter(_ != 'b') // Array(a, c)Внезапно, мне почему-то объекты нужны в правильном порядке. Я не помню когда Set в последний раз использовал.
new Dictionary<int, int>().Select(x => x.Value).force
это на ленивый HashSet потянет
Distinct
И результат — immutable
count() с O(n) и size_hint() (предполагаемая верхняя граница; может быть неизвестна).Sum() — O(n), а коли так, мне видется, можно заодно и посчитать count.В общем случае я не могу сделать итератор, который посчитает collection.Sum() / collection.Count() за один проход, для этого нужен foreach
collection.Aggregate(new { sum = 0, count = 0 }, (item, total) => new { sum = total.sum + item, count = total.count + 1 })Весь Linq — это extension methods.Для Linq-подобных интерфейсов extension methods не нужны. Нужны они только если надо навесить это поверх легаси.
Хотя бы потому, что IEnumerable реализуется без наследования проще, чем интерфейс с полусотней методов.На всякий случай уточню, что в Rust эта полусотня методов бесплатна :) Из обязательных для реализации только
next().trait AwesomeThing {
// ...
}
impl<T: Iterator> AwesomeThing for T {
// ...
}Не говоря уже о том, что 80% кода, который мне встречался, использует исключения не для обработки ошибок, а для «выкинуть и забыть об этом ненужном случае», что на практике приводит к некорректной и неправильной обработке последних.
Отвечу вам так — вы смотрите на вопрос «простоты» с позиции «простота для меня». Go смотрит на этот вопрос с позиции «простота для всех».
Я убеждён, что со временем исключения в Go появятся, когда будет осмысленна текущая философия языка.
Она более, чем осмыслена еще 5 лет назад.
5 лет назад Go только-только заявил о себе, он в принципе в то время не мог иметь законченный вид.Некоторые его аспекты — может быть. Но вот конкретно исключения — нет, решение об их применении было принято чуть не двадцать лет назад людьми, которые работали как с языками «зараженными» исключениями (Java, Python), так и с языками, где был выбор (C++) — причём в последнем случае выбор был сознательно сделан в пользу неиспользования исключений.
For existing code, the introduction of exceptions has implications on all dependent code. If exceptions can be propagated beyond a new project, it also becomes problematic to integrate the new project into existing exception-free code. Because most existing C++ code at Google is not prepared to deal with exceptions, it is comparatively difficult to adopt new code that generates exceptions.Замените здесь «C++» на «Go» и вы поймёте почему даже если вдруг Go появятся исключения (ну там, если разработку вдруг передадут в Микрософт, мало ли что) их в Гугле использовать не будут — а значит пока разработка Go контролируется людьми из Гугла их в языке не будет тоже.
Google — это авангард разработки ПО, они рождают новые технологии и языки, сталкиваются с проблемами и масштабами, с которыми другие столкнутся через 10 лет.
чем больше тебе дают свободы тем проще и понятнее программу писать и тем сложнее её читать.
Так вот это как минимум в среднем становится сложнее, чем больше там разных слов и по разному составленных предложений
Только в том случае, если вы владеете языком ниже определенного уровня. Кстати, для родного языка тоже верно.Вы всегда можете пропустить какое-нибудь двадцать пятое значение одного из сотен тысяч слов, а всякие идеомы легко пролетают мимо людей, даже если вы являетесь носителем.
Понимаете ли, удивительный факт, но увеличение числа понятий в естественных языках почему-то не усложняет чтение литературыУсложняет. Без вариантов. Сравните книжки для детей и взрослых.
Сравните книжки для детей и взрослых.
Вам может быть приятнее читать книги, написанные богатым языком, интереснее, но «проще»? Ни в коем случае.
увеличение числа понятий в естественных языках почему-то не усложняет чтение литературы
error, или хотя бы выдающий предупреждение об этом?panic, а не как error?defer — это круто)Есть ли в go механизм, гарантирующий невозможность скомпилировать код, не проверяющий возвращаемый error, или хотя бы выдающий предупреждение об этом?Нет, так как задача — не заставить человека сделать что-то, а сделать так, чтобы ошибка была видна. «Просто так» проигнорировать ошибку не получится, так как у вас программа не скомпилируется с сообщением о неиспользованной переменной. Всегда можно использовать «blank identifier» (подчёркивание), чтобы «проглотить» ошибку без жалоб, но это оставляет «следы» в коде, что, собственно, и требуется.Правильно ли я понимаю, что ошибки «изнутри» языка (например, nil dereferencing) при этом кидаются как panic, а не как error?Конечно. Как вы можете обработать nil dereference? И зачем? Это только разработчик может сделать увидев Stack Trace.
Нет, так как задача — не заставить человека сделать что-то, а сделать так, чтобы ошибка была видна. «Просто так» проигнорировать ошибку не получится, так как у вас программа не скомпилируется с сообщением о неиспользованной переменной. Всегда можно использовать «blank identifier» (подчёркивание), чтобы «проглотить» ошибку без жалоб, но это оставляет «следы» в коде, что, собственно, и требуется.
error от blank identifier на месте любого другого возвращаемого значения. Ведь так?Конечно. Как вы можете обработать nil dereference? И зачем? Это только разработчик может сделать увидев Stack Trace.
error и panic. Выводы из этого занятны, но, в общем случае, сводятся к тому, что обработка ошибок в Go концептуально не отличается от аналогичной в других языках с поддержкой exceptions.Вот мы и пришли к тому, что в Go, фактически, два механизма обработки ошибок — error и panic. Выводы из этого занятны, но, в общем случае, сводятся к тому, что обработка ошибок в Go концептуально не отличается от аналогичной в других языках с поддержкой exceptions.
panic нельзя перехватить или бросить пользовательским кодом?в смысле предположения?
Если вы не обработаете err в случае открытия файла например программа все равно дальше упадет при обращении к nil, так что не вижу проблемы с разным поведением
в Go ошибки не ловят, ошибка это просто некое значение.
Ну и самое главное — «никто не обрабатывает исключения», именно для нивелирования этого и придумали всякие аннотации с информацией о том что метод что-то там генерирует и т.п.
А ещё в библиотеках нужно оборачивать исключения в свой тип исключений иначе его могут не правильно поймать.
В общем то как это сделано в Go не серебрянная пуля, собственно как и исключения, но причины у этого вполне обоснованные.
я вам на конкретный вопрос отвечал про ожидаемую ошибку. не хотите обрабатывать, не обрабатывайте, оно все равно упадет
Так. в том то и цель чтобы не было не обработанных ошибок, для складывания есть panic.
затем, что вы должны понимать что происходит иначе когда у вас закончится память
а я кстати не говорил, что это проще
такая явность их возврата как раз для мотивации этой обработки и делалась
это зависит от того что произошло, если вас вызывают не правильно, говорят выдели мне 200гб памяти, а столько нет [...] это не нормально, программа написана не правильно, ее нужно переписывать и т.п.
если вы не можете достучаться до сервиса погоды, это нормально это ситуация, которая должна быть предусмотрена и обработана,
error в Go не содержит информации о месте где его создали и т.п., даже больше error это обычно глобальный immutable объект. так что вы можете получать 10, 100к и т.п. ошибок в секунду и у вас приложение будет работать, а вот если вы попробуете сгенерировать столько же исключений, будет грустно.
ну так есть recover
Собственно в случае исключений будет та же самая логика.
Не использовать Go?
Исключения не упрощают обработку ошибок, генерацию и игнорирование, да, а вот обработку нет. (ну и почитайте про panic)Ой да ну ладно вам. Это тот еще холивар: вы с легкостью найдете людей, которые считают что исключения это самый лучший способ; и с легкостью найдете людей, которые считают коды возврата ошибок замечательной штукой. Причем каждый, сука, встречается с обработкой ошибок в контексте разных задач и даже мозгами не думает, когда ему говорят что в другой задаче другой подход будет более адекватным.
Больше чем в 10 языках из статьи нет LINQ, тоже самое про деревья выражений.LINQ — это довольно примитивная вещь. IQueryProvider — это уже далеко не примитивная вещь (по сути я ни разу не видел людей, которые умеют это писать, но через эту штуку и работает C# -> SQL).
Вы путаете язык и «стандартную библиотеку», и тот же LINQ далеко не сразу появился.В C# язык и стандартная библиотека развиваются весьма параллельно, хотя разработчики компилятора предпочитают не завязываться на существование стандартной библиотеки.
Возможно низкая сложность языка является следствием не окончательного понимания предметной области, не полной «вынужденной сложности»?
И пока я не понимаю до конца почему
import std.stdio, std.string;
void main() {
uint[string] dictionary;
foreach (line; stdin.byLine()) {
foreach (word; splitter(strip(line))) {
if (word in dictionary) continue; // Nothing to do
auto newlD = dictionary.length;
dictionary[word] = newlD;
writeln(newlD, '\t', word);
}
}
}
Первые две метрики точно не годятся для поставленной задачи, ведь самый простой язык по ним — Brainfuck!
Ставлю на Эмпирику.

— Выбирать нужно то, что подойдёт для решения твоей задачи.
Сложно о простоте Go