Сообщение Re: Важны ли мелочи в ЯП? от 04.01.2025 21:18
Изменено 04.01.2025 21:25 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, затрагивающий, в том числе, генерики и функциональные типы:
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# или Джавы.
А ведь "оно же" работает не только для либ, но и для твоего кода! ))
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, затрагивающий, в том числе, генерики и функциональные типы:
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# или Джавы.
А ведь "оно же" работает не только для либ, но и для твоего кода! ))
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# или Джавы.
А ведь "оно же" работает не только для либ, но и для твоего кода! ))