Информация об изменениях

Сообщение Re: Важны ли мелочи в ЯП? от 04.01.2025 21:18

Изменено 05.01.2025 20:59 vdimas

Re: Важны ли мелочи в ЯП?
Здравствуйте, Shmj, Вы писали:

S>1. Для всех целых чисел один тип int.


Который Int64, т.е. сам язык Dart был разработан для актуальной нынешней ширины слова процессоров в мейнстриме.

Плюс интероперабельность с JS, где есть только Number (Float64) и BigInt — в Dart-е аналогично поддерживаются эти типы.

Не забываем, что и v8, и Dart писался одной конторой и в большинстве своём одними и теми же людьми.
Унутре v8 хранит в том числе целые числа (хотя в спецификации JS их нет, т.е. это результат JIT-оптимизаций), но хранит или по указателю целиком 64 бит, или как 32-битные "плоские" значения (младший бит 1 — указатель, младший бит 0 — плоское значение в старших 32 битах).

Dart позволяет лучшую типизированность, поэтому может хранить 64-битные целые без траты бит на признаки типа значения.


S>Там все. Если вам нужна экономия байт — подключайте спец. библиотеки с экономными типами (1, 2, 4 байта и т.д.).


Всё верно, бо ширина данных меньше слова оправдана только при хранении заметного кол-ва данных, поэтому, эти типы представлены сразу в виде их хранилищ.

Dart разрабатывался как язык, который может работать с сильной типизацией или нет.
А для слабой/динамической типизации обилие базовых типов — зло.
Не зря же скриптовые языки имеют минимум базовых типов.


S>2. Область видимости методов класса — только public и private. И то нет даже спец. слова — просто все что начинается со знака подчеркивания — это private.


Что тоже отражает популярный мейнстримовый приём — именовать приватные члены с подчёркивания.
Ведь в теле методов нет аннотаций мемберов, верно? Ну и вот...


S>3. Генерики — без сложных ограничений или ковариантности.


А в C# какие есть "сложные" ограничения, кроме появившихся не так давно struct и unmanaged?
В Dart такие же точно ограничения на основе интерфейсов (неявных оных в механике Dart, образованных из публичных членов классов).

Плюс крутой typedef, затрагивающий, в том числе, генерики и функциональные типы:
typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // Verbose.
ListMapper<String> m2 = {}; // Same thing but shorter and clearer.


typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}


S>4. Базовые коллекции — 3 штуки — список, словарь и set (уникальные).


В поставке идёт намного больше, чего стоит один только TypedDataList или Uint8ClampedList. ))

Т.е., в Dart пошли от обратного — "плоский массив" — это отдельный класс и только для байт, либо же для view массива байт, где этот view может маппиться только на последовательность чисел различной разрядности.

А встроенные в язык массивы — динамические, представленные генериком List<>.
Это позволило оперировать удобным синтаксисом [], не хуже, чем в JS.
Для сравнения, в C# и Джаве в плане синтаксиса для динамических массивов всё плохо.

Плюс они избежали многих проблем, вызванных в C# или Джаве одновременным наличием встроенных массивов и высокоуровневых объектов List/ArrayList.

Плюс сделали операторы+ для списков, что сделало синтаксис приятней.

В общем, язык явно писался "для себя", и потому что особенности других мейнстримовых недоязыков заметно подбешивают своей сыростью-недоработанностью.

Как ни крути, но C# и Джава — это очень сырые, очень незрелые, местами крайне раздражающие своими детскими болезнями языки, которые еще дорабатывать и дорабатывать.
А ведь им по 25-30 лет.

Котлин чуть повзрослее будет, но тоже еще расти ему прилично.

Dart сразу появился относительно взрослым, ему расти меньше всех.


S>5. Нет даже деструкторов — ни встроенного dispose ничего. Т.е. руками.


В GC-языках по-определению не может быть scope-based финализации, она отродясь там жила через finally.

В C# придумали уродский сахарок using(IDisposable obj = ...) {}, которому потребовалось аж 22 года, чтобы превратиться в человеческий using var obj=...; в текущем scope.


S>6. С лямбдами раз в 5 меньше фишек.


С лямбдами там раз в 10 лучше, чем в C#.
Они не сделали ошибки типизации делегатов, там функциональный тип вполне честный, как в JS, поэтому всё нааамного проще/интероперабельней.


S>Но оно в принципе работает. Т.е. язык до максимума примитивен


Он не примитивен, он выразителен.
В нём сразу избежали многих ненужных повторений и громозкости, как в дихотомии массивов/ArrayList/Lis<> в C# или в несовместимых их делегатах.


S>но тем не менее он строго типизирован и все эти мелочи, в принципе, не так уж и важны.


Это не мелочи.
Это отсутствие постоянного раздражения на ровном месте.

Понятно же, что внутренний перфекционист любого адекватного разработчика страдает при пользовании Джавой, C#, JS, Питоном, С++...

Dart в этом смысле наименее из раздражающих глупостями или унаследованными атавизмами-уродствами язык в современном мейстриме.
Банально "уютный" язык.
Просто надо помнить, что он не для битовыжимания и не для матана, а для выразительности и читабельности при неплохой производительности того самого "бизнес-кода", куда можно отнести и GUI.
Flutter относится к батарейке экономно и вообще летает.


S>Ваше мнение — важны ли вам мелочи?


У Дарта с либами из поставки всё неплохо, т.е. на любую мелочь почти всегда есть готовый ответ.
Постепенно обрастает и третьесторонними либами...

И что впечатляет — это размеры исходного кода этих либ (базовых и третьесторонних).
Сравнить с оными из C# или Джавы.

А ведь "оно же" работает не только для либ, но и для твоего кода! ))
Re: Важны ли мелочи в ЯП?
Здравствуйте, Shmj, Вы писали:

S>1. Для всех целых чисел один тип int.


Который Int64, т.е. сам язык Dart был разработан для актуальной нынешней ширины слова процессоров в мейнстриме.

Плюс интероперабельность с JS, где есть только Number (Float64) и BigInt — в Dart-е аналогично поддерживаются эти типы.

Не забываем, что и v8, и Dart писался одной конторой и в большинстве своём одними и теми же людьми.
Унутре v8 хранит в том числе целые числа (хотя в спецификации JS их нет, т.е. это результат JIT-оптимизаций), но хранит или по указателю целиком 64 бит, или как 32-битные "плоские" значения (младший бит 1 — указатель, младший бит 0 — плоское значение в старших 32 битах).

Dart позволяет лучшую типизированность, поэтому может хранить 64-битные целые без траты бит на признаки типа значения.


S>Там все. Если вам нужна экономия байт — подключайте спец. библиотеки с экономными типами (1, 2, 4 байта и т.д.).


Всё верно, бо ширина данных меньше слова оправдана только при хранении заметного кол-ва данных, поэтому, эти типы представлены сразу в виде их хранилищ.

Dart разрабатывался как язык, который может работать с сильной типизацией или нет.
А для слабой/динамической типизации обилие базовых типов — зло.
Не зря же скриптовые языки имеют минимум базовых типов.


S>2. Область видимости методов класса — только public и private. И то нет даже спец. слова — просто все что начинается со знака подчеркивания — это private.


Что тоже отражает популярный мейнстримовый приём — именовать приватные члены с подчёркивания.
Ведь в теле методов нет аннотаций мемберов, верно? Ну и вот...


S>3. Генерики — без сложных ограничений или ковариантности.


А в C# какие есть "сложные" ограничения, кроме появившихся не так давно struct и unmanaged?
В Dart такие же точно ограничения на основе интерфейсов (неявных оных в механике Dart, образованных из публичных членов классов).

Плюс крутой typedef, затрагивающий, в том числе, генерики и функциональные типы:
typedef ListMapper<X> = Map<X, List<X>>;
Map<String, List<String>> m1 = {}; // Verbose.
ListMapper<String> m2 = {}; // Same thing but shorter and clearer.


typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}


S>4. Базовые коллекции — 3 штуки — список, словарь и set (уникальные).


В поставке идёт намного больше, чего стоит один только TypedDataList или Uint8ClampedList. ))

Т.е., в Dart пошли от обратного — "плоский массив" — это отдельный класс и только для байт, либо же для view массива байт, где этот view может маппиться только на последовательность чисел различной разрядности.

А встроенные в язык массивы — динамические, представленные генериком List<>.
Это позволило оперировать удобным синтаксисом [], не хуже, чем в JS.
Для сравнения, в C# и Джаве в плане синтаксиса для динамических массивов всё плохо.

Плюс они избежали многих проблем, вызванных в C# или Джаве одновременным наличием встроенных массивов и высокоуровневых объектов List/ArrayList.

Плюс сделали операторы+ для списков, что сделало синтаксис приятней.

В общем, язык явно писался "для себя", и потому что особенности других мейнстримовых недоязыков заметно подбешивают своей сыростью-недоработанностью.

Как ни крути, но C# и Джава — это очень сырые, очень незрелые, местами крайне раздражающие своими детскими болезнями языки, которые еще дорабатывать и дорабатывать.
А ведь им по 25-30 лет.

Котлин чуть повзрослее будет, но тоже еще расти ему прилично.

Dart сразу появился относительно взрослым, ему расти меньше всех.


S>5. Нет даже деструкторов — ни встроенного dispose ничего. Т.е. руками.


В GC-языках по-определению не может быть scope-based финализации, она отродясь там жила через finally.

В C# придумали уродский сахарок using(IDisposable obj = ...) {}, которому потребовалось аж 22 года, чтобы превратиться в человеческий using var obj=...; в текущем scope.


S>6. С лямбдами раз в 5 меньше фишек.


С лямбдами там раз в 10 лучше, чем в C#.
Они не сделали ошибки типизации делегатов, там функциональный тип вполне честный, как в JS, поэтому всё нааамного проще/интероперабельней.


S>Но оно в принципе работает. Т.е. язык до максимума примитивен


Он не примитивен, он выразителен.
В нём сразу избежали многих ненужных повторений и громозкости, как в дихотомии массивов/ArrayList/List<> в C# или в несовместимых их делегатах.


S>но тем не менее он строго типизирован и все эти мелочи, в принципе, не так уж и важны.


Это не мелочи.
Это отсутствие постоянного раздражения на ровном месте.

Понятно же, что внутренний перфекционист любого адекватного разработчика страдает при пользовании Джавой, C#, JS, Питоном, С++...

Dart в этом смысле наименее из раздражающих глупостями или унаследованными атавизмами-уродствами язык в современном мейстриме.
Банально "уютный" язык.
Просто надо помнить, что он не для битовыжимания и не для матана, а для выразительности и читабельности при неплохой производительности того самого "бизнес-кода", куда можно отнести и GUI.
Flutter относится к батарейке экономно и вообще летает.


S>Ваше мнение — важны ли вам мелочи?


У Дарта с либами из поставки всё неплохо, т.е. на любую мелочь почти всегда есть готовый ответ.
Постепенно обрастает и третьесторонними либами...

И что впечатляет — это размеры исходного кода этих либ (базовых и третьесторонних).
Сравнить с оными из C# или Джавы.

А ведь "оно же" работает не только для либ, но и для твоего кода! ))