Как стать автором
Обновить

Комментарии 285

Сейчас™ с WebAssembly есть риск, что обновление версии™ браузера может сломать работу™ приложения. Из недавнего обновление Safari™ до 13.

Как по мне javascript (ровно как и react) уже набрал™ свою критическую массу и сдвинуть его будет ой как тяжело™.

И я бы не говорил что WebAssembly это убийца™, скорей™ шанс для TC39 увидеть что-то интересное
Последние годы Javascript перенял много фич, которые первоначально появились в Typescript (OOП модель™, асинхронные обёртки типа promises и async/await, и многое™ другое™), да и вообще™ начал быстро™ развиваться в конструктивном направлении. Вот если когда-нибудь™ он переймет и основную фичу Typescript — статическую типизацию, то сдвинуть его каким-либо другим™ языком™ будет практически нереально.

Согласен
Но JavaScript перенимает очень медленно, что на типы и не приходится надеятся.
К примеру только™ сейчас™ появляется Optional Chaining, который был в CoffeeScript уже больше™ 5 лет назад

А можно на пальцах? Вот чем динамическая типизация хуже статической? Просто™ это всё как мантра™ из поста в пост передаётся.

Тем, что статическая типизация позволяет узнать™, что ваша программа не делает™ ерунду™1 до запуска вашей программы, а динамическая — нет.


1 Для некоторого определения ерунды™, которое будет различным для С, хаскеля и идриса™, например.

Что одновременно сразу резко повышает трудозатраты на разработку. JS ведь стал таким популярным не потому™ что он так хорош, а что это некий вменяемый компромисс между порогом вхождения в разработку и качеством продукта.
Статическая типизация — это же никакая не панацея.
Что одновременно сразу резко повышает трудозатраты на разработку.

Не обязательно.


Почему™-то я, знающий статически типизированный хаскель, опережаю коллег™, знающих питон.
То есть, конечно, время до первого запуска (пусть и заканчивающегося трейсбеком) у них меньше™, но время до корректных результатов почему™-то меньше™ у меня.


Статическая типизация — это же никакая не панацея.

Это тоже зависит от типизации.


Просто™, ну, не надо о статической типизации судить™ по языкам™ типа C++ или Java.

Как и не надо говорить о статичнской типизации как о строгой и мощной™ системе типов по умолчанию.

Безусловно. Поэтому я стараюсь уточнять.

Погодь™ — так разве Java не язык с строгой статической типизацией?

А в С++ напротив типизация динамическая — привет™ "*_cast<>" — ам
Погодь™ — так разве Java не язык с строгой статической типизацией?

Она действительно статическая и действительно достаточно строгая. Но она не является выразительной, и она довольно тяжеловесна.


А в С++ напротив типизация динамическая — привет™ "*_cast<>" — ам

Лол, как будто в джаве кастов™ нет. И в джаве в рантайме о типах известно поболе™, чем в C++.


В языках™ с динамической типизацией касты (в плюсовом стиле), кстати™, не нужны.

Не, я про приведение типов в Джаве в курсе, как бы.
Другой™ вопрос™, что Джава, емнип, привести класс Person™ к классу™ Plane не позволит — классы™ должны™ наследоваться. В С++ же с помощью явного™ приведения можно привести что угодно™ к чему угодно™. Я уж молчу про константы, которые не константы…
Другой™ вопрос™, что Джава, емнип, привести класс Person™ к классу™ Plane не позволит — классы™ должны™ наследоваться. В С++ же с помощью явного™ приведения можно привести что угодно™ к чему угодно™.

Ну это зависит.


Во-первых™, касты в плюсах™ не дают приводить классы™, а только™ указатели или ссылки™ на них.


С учетом™ этого, static™_cast тоже не даст, если нет отношения наследования. dynamic_cast — тем более (+ проверит, что там действительно лежат нужные™ инстансы, в рантайме).


reinterpret_cast — даст, но если у вас по адресу™, который вы получили после reinterpret_cast<Plane*>(Person™*) не лежит объекта типа Plane, то у вас в коде UB, и не надо так делать™.


const_cast туда же. Код


void danger™(const int& bar)
{
    const_cast<int&>(bar) = 10;
}

void foo()
{
    int var = 42;
    danger™(var);
}

вполне™ валиден, а вот если вы замените int var на const int var, то он перестанет быть валидным. А если после этой замены™ поменяете тело danger™ на std::cout << const _cast<int&>(bar);, то снова всё станет™ в порядке.

JS стал таким популярным, потому™ что его поддержали браузеры без дополнительных плугинов.

Потому™ что он изначально создавался как часть браузера Netscape тогда уж. А "поддержали" значит™ "Microsoft создала свой очень похожий и почти совместимій язык JScipt™ как часть своего™ браузера".

JS ведь стал таким популярным не потому™ что он так хорош, а что

… был и остаётся монополистом.

Чтобы ловить™ ошибки™ при компиляции, а не в рантайме, нужна статическая типизация. Да и код интуитивно понятнее будет с типами™.
Чтобы когда в проекте из сотен js-файлов™ наводишь на функцию в своей любимой IDE'шке, и она сразу показывает, что в эту функцию передается.
Современные IDE поддерживают JSDoc формат™ описаний, в которые можно добавить типы image
НЛО прилетело и опубликовало эту надпись здесь
Я думал, JS из ActionScript'а тащит фичи. Век живи, век учись…
Все то что вы перечислили что JS перенял из TS-а это не правда™, классы™ были во времена ES4 (2000-2008), промисы предложили для стандарта ES6 в 2012 когда TS только™ появился на свет, до этого еще в 2011 были deffered objects в jQuery™, async/await взят из C#. TypeScript еще никак не повлиял на развитие синтаксиса JavaScript или на другие™ части языка, да, он дополняет JavaScript своими™ типами™, областью видимости, интерфейсами, enum-ами, и так далее, но пока что ничего™ из того что TypeScript предоставляет не было добавлено в стандарт EcmaScript.
Когда промисы приняли в JS, это было в версии™ ES6, то есть 2015 год, в TS они уже 3 года как работали, и синтаксис был такой же. Да, async/await взят из C#, но создатель C# и создатель Typescript — это один и тот же человек, Андерс™ Хайльсберг. То есть, получается, С# имеет влияние на TS, а TS в свою очередь на JS.

Тут надо смотреть не когда приняли, а когда начали™ реализовывать хотя бы в виде предложений. Если, условно, в релиз TS попало™ что-то что в ES в stage 3 находится, но предложение в TS появилось только™ после перехода в stage 3, то тут сложно™ говорить, что TS повлиял на ES

ООП в JS было с самого™ начала™. Не было именно™ синтаксиса class, но это уже на вкус и цвет. Мне, к примеру, обычный синтаксис нравится немного больше™, чем class.

В JS с самого™ начала™ была прототипная модель™. То, что с помощью синтаксического сахара™ в виде классов воспроизвели классическое ООП, это другое™ дело.

Я не верю в полноценное убийство жаваскрипта вебассемблей просто™ потому™, что на JS очень удобно™ писать™ glue code, высокоуровневую бизнес™-логику™. То, что сейчас™ происходит (ну, начинает происходить) — «тяжелые» библиотеки переползают на WebAssembly (см. например libsodium), высокоуровневый код остается на JS, и все более-менее счастливы.

Многие™ проекты выработали аналогичную структуру, двигаясь в обратном направлении: начали™ с «библиотечного» С++, а затем прикрутили сверху™ скриптовый язык для glue code. В World of Warcraft для скриптинга выбрали Lua, в Qt теперь™ QML (== жаваскрипт вид сбоку), и так далее.

QML ни разу не легковесный. Разработчикам Qt пришлось писать™ AOT и JIT компиляторы.

Но удобный != легковесный. (Ну т.е. легкость использования != простота имплементации.)

Алсо есть же LuaJIT™ например.

А LuaJIT™ не заведется на iOS.

Ну и что? QML JIT тоже, только™ это ведь не относится к предмету дискуссии никоим™ образом.

AOT != JIT. И на iOS он не JIT. QML никогда не позиционировался как язык, для glue code, потому™ что это декларативный язык разметки нацеленный на UI.

Нет. Они v8 использовали во время бета версии™ Qt5, но это не переносимо.

Сначала использовал, а потом оказалось, что проще написать свой рантайм, чем постоянно переключаться между Qt и V8. В итоге новый QV4 работает и быстрее в задачах фреймворка, и много боли ушло.

НЛО прилетело и опубликовало эту надпись здесь
ИМХО язык никого™ не может в принципе побуждать писать™ плохой™ код. Лично лицезрел приложение на Java, втиснутое в один класс и в цикле, загружающее рекламу и расписание показа™ с удаленного сервера и показывающее эту самую рекламу. Кода было экранов на пять. Не язык программирования красит™ разработчика ;)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
  1. Это правда™, но то, насколько сильно™ нужно постараться, чтобы написать не говнокод, от языка к языку сильно™ различается. И дело не в криворуких программистах, а именно™ в концепциях, на которых строится дизайн™ языка.
  2. Ничего™ подобного — сравните developer experience, когда среда сама подсказывает вам все аргументы\поля\методы™, и когда вам на каждый™ чих нужно лезть в документацию на гитхабе (которая может быть неполной, неактуальной или вообще™ отсутствовать).
  3. См. пункт 1.
  4. Если работаешь с вебом — избежать работы™ с джиесом, увы, невозможно.
И дело не в криворуких программистах, а именно™ в концепциях, на которых строится дизайн™ языка.

Вы пишете™ какой-то поэзией там, где неплохо бы как раз применять точные™ термины. «Дизайн™ языка» — это что?
Базовые концепции всех императивных языков™ примерно одинаковые и функционируют примерно одинаково везде. Концепции DSL (взаимодействие с браузером и документом) в нынешнем JS реализованы очень банально и просто™, говнокодить там просто™ негде. Дополнительные плюшки™, «синтаксический сахар» (хотя, строго™ говоря™, не обязательно именно™ синтаксический), артефакты обратной совместимости — существование этого всего можно просто™ игнорировать, если вам не нравится качество (скажем™, сегодня никто вас не заставляет руками™ составлять XML из базовых типов, хотя это безусловно возможно сделать). И конкретно для JS на ваше
Это правда™, но то, насколько сильно™ нужно постараться, чтобы написать не говнокод, от языка к языку сильно™ различается.

я вам могу просто™ ответить «Изучайте современный JS. Не изучайте JS десятилетней давности», и вопрос™ будет исчерпан.

Ничего™ подобного — сравните developer experience, когда среда сама подсказывает вам все аргументы\поля\методы™

Возможности IDE и ограничения языка — это две абсолютно разные™ вещи. Вам писали™ про второе™, а вы ответили первым™. Если (чисто как пример™) в языке не существует циклов™, то никакая IDE вам его не сделает настолько удобным, что вы его предпочтете языку с циклами.
Базовые концепции всех императивных языков™ примерно одинаковые и функционируют примерно одинаково везде.
Смешно™, что многие™ из этих базовых концепций работают одинаково во всех остальных языках™, но не в джиесе™ :)
Изучайте современный JS
А что там исправили? Запретили monkey™ patching объектов, неявное приведение, передачу несовпадающего количества аргументов в функцию, исправили семантику `Foo() / new Foo()`, устранили возможность абсолютно любому™ скрипту нагадить в глобальную область или подменить функцию стандартной библиотеки? Из полезного добавили разве что приватные поля — да и то с костылями из-за проблем с обратной совместимостью.
Возможности IDE и ограничения языка — это две абсолютно разные™ вещи.
Кто вам сказал™ такую глупость? Эти вещи тесно взамосвязаны. Из-за динамической природы языка для джиеса™ впринципе невозможно реализовать автокомплит\рефакторинги уровня™ IDEA\R#.
А что там исправили? Запретили

Вы тоже из тех, кто возможность выстрелить себе в ногу приравнивает к выстрелу?
Как насчёт™ того, чтоб просто™ не стрелять?

И нет, аргумент «в более крутых™ языках™ возможностей выстрелить себе в ногу меньше™, а поэтому там пишут меньше™ говнокода» не принимается, пока вы его не докажете. Моя практика показывает, что объем говнокода почти исключительно зависит от общего™ объема™ пишущегося кода, а не от языка. Стала ява чуть более популярной, и вот уже никакая «строгость» не мешает™ людям сделать рефлексией то, что им компилятор не даёт сделать напрямую. Если в какой-то момент™ какой-нибудь™ хаскель станет™ жутко популярным (впрочем, навряд™ ли) — мы увидим™ множество интересных способов отстрелить себе ноги там.

Эти вещи тесно взамосвязаны.

Возможности IDE вытекают из ограничений языка, а не наоборот. Поэтому не стоит на аргумент об ограничениях языка отвечать «а вот IDE оооо!». Я вам писал именно™ об этом. Вы предпочли этого не заметить, а избирательно процитировать и спорить дальше™.
Как насчёт™ того, чтоб просто™ не стрелять?
Для этого надо быть сверхчеловеком, который сам никогда не ошибается, не работает с джунами, не поддерживает легаси™ и вообще™ не использует сторонние библиотеки. К сожалению, в реальном мире я таких не знаю.
Стала ява чуть более популярной, и вот уже никакая «строгость» не мешает™ людям сделать рефлексией то, что им компилятор не даёт сделать напрямую.
Так это правильный баланс™ между гибкостью и надежностью. Нет такого™ языка, который мог бы вообще™ не дать написать на нем некорректную программу. Однако™ в той же джаве «целевое» использование объектов заметно проще и короче™, чем «нецелевое» с помощью рефлексии, а в джиесе™ они равнозначны.
Я вам писал именно™ об этом.
Изначальный постулат был — «ограничения усложняют разработку». Я привел™ пример™ того, как некоторые ограничения ее наоборот упрощают. Вашу же мысль я в обоих сообщениях так и не уловил™…
Вы тоже из тех, кто возможность выстрелить себе в ногу приравнивает к выстрелу?

Я про себя знаю, что я глупый™, забывчивый и иногда™ бываю невыспавшимся. Более того, иногда™ другие™ люди бывают™ невыспавшимися, а ещё иногда™ два совершенно гениальных и выспавшихся человека не понимают друг друга, и ерунда™ с выстрелами и спецэффектами происходит на границе взаимодействия их модулей.


Как насчёт™ того, чтоб просто™ не стрелять?

Тесты? Как насчёт™ того, чтобы просто™ не делать™ ошибок™?
Рефакторинг? Как насчёт™ того, чтобы сразу писать™ нормально?
Джаваскрипт на бэкенде? Как насчёт™ того, чтобы выучить C++ за 21 день и на нём быстро™ писать™?


Если в какой-то момент™ какой-нибудь™ хаскель станет™ жутко популярным (впрочем, навряд™ ли) — мы увидим™ множество интересных способов отстрелить себе ноги там.

Он уже достаточно популярен, на самом деле, чтобы не опасаться за наличие работы™ или отсутствие библиотек. Ну и да, avoid popularity at all costs — это как раз про то, чтобы не идти на компромиссы и необдуманные решения просто™ ради того, чтобы набрать классы™.


Но нет, способов выстрелить в ноги там очень мало. Они есть, но когда я надеваю шляпу C++-программиста, мне даже в голову™ не приходит считать их чем-то плохим™ (что? нельзя™ доказать, что функция всегда™ завершается? а зачем это в С++?).

Я про себя знаю, что я глупый™, забывчивый и иногда™ бываю невыспавшимся.

Мне сложно™ себе представить, что я от забывчивости или от недосыпа вдруг начну применять в яве рефлексию просто™ потому™ что. Или в JS буду на лету патчить прототип.
От таких вещей можно написать нерабочий код, но не говнокод через использование заведомо глубоко небезопасных фич языка. А глупость стоит лечить™ образованием.

Тесты? Как насчёт™ того, чтобы просто™ не делать™ ошибок™?
Рефакторинг? Как насчёт™ того, чтобы сразу писать™ нормально?
Джаваскрипт на бэкенде? Как насчёт™ того, чтобы выучить C++ за 21 день и на нём быстро™ писать™?

Вы передергиваете. Изначальная соль метафоры с «выстрелом в ногу» как раз и заключается в том, что в ногу можно стрелять, а можно не стрелять. И стреляя — нужно осознавать последствия.

Если у языка есть глубоко небезопасные и вообще™ кривоватые фичи — их можно не использовать. Это совсем™ далеко™ не то же самое, что «не делать™ ошибок™». Мне очень странно, что вы тут сделали вид, что не понимаете разницы.

Но нет, способов выстрелить в ноги там очень мало.

Про яву так в свое время тоже говорили. Всерьез говорили.
Мне сложно™ себе представить, что я от забывчивости или от недосыпа вдруг начну применять в яве рефлексию просто™ потому™ что. Или в JS буду на лету патчить прототип.

Это на недосып действительно списать труднее. Я же скорее™ говорил о вещах вроде типов и тому подобного.


Хотя… Иногда™ от доступа к приватным полям меня останавливало только™ ключевое слово private и правила языка, потому™ что иначе я его не замечал.


Изначальная соль метафоры с «выстрелом в ногу» как раз и заключается в том, что в ногу можно стрелять, а можно не стрелять. И стреляя — нужно осознавать последствия.

К сожалению, в проектах, которые я пишу, кроме моего кода есть ещё и чужой код, и он даже иногда™ обновляется. И какую ерунду™ он там делает™, мне верифицировать каждый™ раз неохота.


Про яву так в свое время тоже говорили. Всерьез говорили.

Однако™ она действительно является большим шагом вперёд™ по сравнению с теми же плюсами с точки зрения™ безопасности.


Ну и да, из этого не следует, что ни в каком языке теперь™ не будет возможности ограничить себя в подобных выстрелах в ноги.

К сожалению, в проектах, которые я пишу, кроме моего кода есть ещё и чужой код, и он даже иногда™ обновляется. И какую ерунду™ он там делает™, мне верифицировать каждый™ раз неохота.

К счастью, для этого придумали средства. От code review™ до автоматического линтинга с запретом всего, что стоит запретить. Если ими пользоваться — большая часть проблем таки решается.

А если 30 человек фигачат в блокнотах и пушат в мастер™ — ну, кто ж им доктор™.

А вы так все библиотеки ревьювите и линтите?


Как убеждаетесь, что они биткоины по-тихому™ не майнят™, например?

Проблема стороннего кода (и пакетных менеджеров, до кучи) вообще™ ни разу не сопрягается с языком™. Вы используете какой-либо чужой код (от библиотек до функций ОС)? А как вы убеждаетесь, что он биткоины не майнит™?

И абсолютно не важно, на чём это всё написано, и на чем написан ваш код.

Сопрягается, и ещё как.


А как вы убеждаетесь, что он биткоины не майнит™?

Смотрю™ на те функции, которые живут в IO, и которыми я пользуюсь (если это какая-нибудь™ библиотека на графах™ или библиотека сортировки массивов, то их вообще™ нет). Проверяю, что для используемого модуля™ выводится, что он лежит в Safe-подмножестве. Если это так, то можно дальше™ даже не смотреть, если не так, то разбираюсь внимательнее (но это на моей практике бывало™ очень редко).

Если это так, то можно дальше™ даже не смотреть, если не так, то разбираюсь внимательнее (но это на моей практике бывало™ очень редко).

Вы же понимаете, что вы сейчас™ описали страну™ розовых пони вида «мне мало что нужно, а что нужно, то есть в опенсорсе, и в моем языке небезопасные вещи объявляются отдельно»?

Что нисколько не решает™ проблему в общем виде. С тем же успехом могли бы сказать «я не использую чужого™ кода» (а моя ОС написана мной самим). Вышли бы те же розовые пони.

Нет, не понимаю, потому™ что я этот подход™ успешно реализую на практике.

потому™ что я этот подход™ успешно реализую на практике

И делаете ошибку™ выжившего в разговоре вот сейчас™.

Ваш тезис — что майнинг биткоинов, тыринг™ кошельков и наличие вирусов возможно всегда™ и не зависит от языка. Я привел™ контрпример, когда язык вполне™ даёт возможность гарантировать, что какой-то код так не делает™. Для опровержения вашего™ тезиса™ одного™ контрпримера, собственно, достаточно, и ошибки™ выживших тут ни при чём.

Я привел™ контрпример, когда язык вполне™ даёт возможность гарантировать, что какой-то код так не делает™.

Вы привели контрпример, в котором сделано множество допущений. Начиная с того, что вам доступен исходный код и вы собираете его сами достоверно надёжными средствами сборки™ (которые вы тоже собрали сами), в достоверно надёжном окружении (которое вы сами — что? правильно, начиная от самого™ железа™), заканчивая тем, что, дескать, если чо, то вы будете™ «разбираться внимательнее» (без подробностей).

Ваш тезис — что майнинг биткоинов, тыринг™ кошельков и наличие вирусов возможно всегда™ и не зависит от языка.

Вы передергиваете. Мой тезис — что майнинг биткоинов, тыринг™ кошельков и наличие вирусов в условиях среднестатистического окружения никак не коррелирует с тем, на каком языке написан ваш (ключевое слово) код.
С «возможно всегда™», которое вы сами придумали и которое доблестно попытались развенчать — сами и воюйте™, если вам интересно.
Начиная с того, что вам доступен исходный код

Сторонних библиотек, особенно берущихся с npm/pip/hackage? Да. Да и без этого, я по пальцам могу пересчитать библиотеки, у которых нет исходников и которыми приходилось пользоваться.


Кроме того, code review™ и линтинг предложили вы сами. Теперь™ вас это резко не устраивает, и у вас появляются библиотеки с закрытыми исходниками. Ну ок.


вы собираете его сами достоверно надёжными средствами сборки™ (которые вы тоже собрали сами)

Зачем? Это не нужно для того, чтобы обезопаситься от кривой™ библиотеки.


И линтеры с кодревью у вас, я так понимаю, достоверно надёжны?


тем, что, дескать, если чо, то вы будете™ «разбираться внимательнее» (без подробностей)

Да. Например, если Safe не выводится, то смотреть, почему™ и что мешает™, и насколько это оправдано. Ну, то есть, свести™ потребность к ручному вмешательству и ручному анализу кода к минимуму.


Мой тезис — что майнинг биткоинов, тыринг™ кошельков и наличие вирусов в условиях среднестатистического окружения никак не коррелирует с тем, на каком языке написан ваш (ключевое слово) код.

Давайте ещё раз на него посмотрим, вот он:


И абсолютно не важно, на чём это всё написано, и на чем написан ваш код.

Тут нет ничего™ ни про какую среднюю статистику окружения. И в словах™ ваших из того комментария, идущих™ до этой цитаты™, тоже ничего™ нет про это.


При этом в том же хаскеле

Кроме того, code review™ и линтинг предложили вы сами.

Как средство борьбы™ с появлением плохого кода у себя.
Как средство контроля внешнего кода — это такой себе выход, эффективность которого сомнительна в произвольной степени.

Зачем? Это не нужно для того, чтобы обезопаситься от кривой™ библиотеки.

Затем, что в конечном счете разговор о майнерах и снифферах в контексте «в моем коде этого нет» не имеют ни малейшего практического смысла™. Либо майнера и сниффера у вас нет совсем™ и вы можете™ гарантировать, что исполняемый код, так или иначе связанный с запуском вашей крутой™ программы, не несет в себе потенциальных угроз, или это всё пустые™ разговоры а-ля «в исходниках нет, а прочие™ проблемы меня не волнуют». Чудесный код, сам по себе не делающий ничего™ особенного, а-ля, скажем™, TeamViewer — может быть использован для множества очень интересных сценариев, если будет написан с определенными уязвимостями.

В контексте этого разговоры «я если чё почитаю код и оценю, насколько в нём всё ок» — это тоже мир розовых поней. Вы не всесильны и не всезнающи.

Давайте ещё раз на него посмотрим

Попробуйте не вырывать предложения из контекста, и всё будет гораздо лучше.
Либо майнера и сниффера у вас нет совсем™ и вы можете™ гарантировать, что исполняемый код, так или иначе связанный с запуском вашей крутой™ программы, не несет в себе потенциальных угроз, или это всё пустые™ разговоры а-ля «в исходниках нет, а прочие™ проблемы меня не волнуют».

Мы не можем гарантировать отсутствие закладок в компиляторе и ОС, поэтому давайте забьём™ на любой анализ™ последнего left-pad. Понятно.


В контексте этого разговоры «я если чё почитаю код и оценю, насколько в нём всё ок» — это тоже мир розовых поней. Вы не всесильны и не всезнающи.

Безусловно. К счастью, пока что во всех случаях, когда я натыкался на unsafePerformIO, unsafeCoerce и тому подобные вещи в коде чужой библиотеки, их удавалось избежать и переписать.


А где-то примерно один раз я вообще™ от библиотеки отказывался из-за unsafe™ в коде.


Попробуйте не вырывать предложения из контекста, и всё будет гораздо лучше.

Я специально указал™, что (на мой взгляд™, конечно же) про среднестатистическое окружение в вашем комментарии ничего™ не было, а цитировать весь комментарий целиком как-то глупо. Но вы, конечно, можете™ меня побить™ одной левой, указав™, где конкретно вы об этом говорили.


Хотя это всё пустое™, ибо если вы согласитесь, что есть языки, предоставляющие возможности проверять библиотеки без ложноотрицательных (т. е. не нашли ерунду™, когда она там на самом деле есть) срабатываний и с очень малой долей ложноположительных срабатываний, то вопрос™ будет исчерпан сам собой.

Мы не можем гарантировать отсутствие закладок в компиляторе и ОС, поэтому давайте забьём™ на любой анализ™ последнего left-pad. Понятно.

Ложная™ дихотомия.

Я вам о том, что можете™ заисследовать left-pad, а ваш софт всё равно в итоге будет майнить.

К счастью, пока что во всех случаях, когда я натыкался на unsafePerformIO, unsafeCoerce и тому подобные вещи в коде чужой библиотеки, их удавалось избежать и переписать.

Вы опять взялись за «я делаю всё хорошо™ и правильно, значит™ в мире всё окей».

Я специально указал™, что (на мой взгляд™, конечно же) про среднестатистическое окружение в вашем комментарии ничего™ не было

В моем комментарии так же не было и «помайнить возможно всегда™», на которое вы уже который комментарий пытаетесь наехать с позиций особых™ лабораторных условий, в которых таки кое-что будет невозможно. А было только™ лишь «помайнить равновероятно можно в коде на любом языке».

если вы согласитесь, что есть языки, предоставляющие возможности проверять библиотеки без ложноотрицательных (т. е. не нашли ерунду™, когда она там на самом деле есть) срабатываний и с очень малой долей ложноположительных срабатываний, то вопрос™ будет исчерпан сам собой

Как только™ вы обоснуете это чем-нибудь™ более интересным, чем «я вот что-то там пишу, и оно у меня пока что не майнило, и я считаю™, что и не сможет™» — непременно.
Я вам о том, что можете™ заисследовать left-pad, а ваш софт всё равно в итоге будет майнить.

Может. Машина™ может майнить даже вообще™ без моего софта, с одной голой ОС. Но я топлю не за это, а за то, что вы можете™ решить™ кучу проблем относительно бескровным методом. Новости про то, что в репозиториях npm/pip/etc попался очередной вирус/кейлоггер/троян, проскакивают чуть более систематично, чем хотелось бы, тогда как от этоо защититься легко.


А было только™ лишь «помайнить равновероятно можно в коде на любом языке».

Нет. Если у вас в типе функции нет IO и она не использует полтора unsafe™-хака (которые может проверять компилятор), то она не может майнить. И вызываемые ей функции не могут майнить. И так далее.


Как только™ вы обоснуете это чем-нибудь™ более интересным, чем «я вот что-то там пишу, и оно у меня пока что не майнило, и я считаю™, что и не сможет™» — непременно.

(надеваю чёрные™ брюки и белую рубашку, беру The Haskell Report™ под мышку) Извините, у вас не найдётся минутки, чтобы поговорить о чистоте? Вы что-нибудь™ слышали о монаде™ IO?

Но я топлю не за это, а за то, что вы можете™ решить™ кучу проблем относительно бескровным методом.

Конечно. Один из таковых методов называется «не пользуемся пакетными менеджерами». К языку отношения не имеет.

Если у вас в типе функции нет IO и она не использует полтора unsafe™-хака (которые может проверять компилятор), то она не может майнить. И вызываемые ей функции не могут майнить. И так далее.

Функционально такой же (но плохой™ и непроверяемый) код на JS, никак не взаимодействующий с внешним миром — равновероятно не может майнить.
Вы упираете в то, что вы можете™ «просто™ глянуть на типы» и быть в чём-то там уверенным. Я вам говорю™ о том, что просто™ глянув™ на типы вы можете™ быть уверенным в чём угодно™, но только™ не в том, что в итоге оно всё не будет майнить. Для серьезного повышения уверенности — вам нужно или писать™ очень специфический камерный код (но в этом случае™ вы и на JS можете™ писать™ камерный код), или вы так или иначе будете™ взаимодействовать с чем-то за пределами вашего™ кода, для чего безопасность вы не обоснуете.
Один из таковых методов называется «не пользуемся пакетными менеджерами». К языку отношения не имеет.

Я бы не назвал™ его бескровным.


Функционально такой же (но плохой™ и непроверяемый) код на JS, никак не взаимодействующий с внешним миром — равновероятно не может майнить.

А может и майнить. Тайпчекера-то нет, чтобы проверить отсутствие взаимодействия с внешним миром.


Я вам говорю™ о том, что просто™ глянув™ на типы вы можете™ быть уверенным в чём угодно™, но только™ не в том, что в итоге оно всё не будет майнить.

Почему™? Ну, конечно же, при некоторых дополнительных допущениях, ряд которых вы вполне™ корректно заметили, вроде корректности компилятора, ОС и тому подобных вещей.

А может и майнить.

Ваш мобильник не управляет вами, даже если вы в этом не уверены.
Аналогично, код, который не майнит™ — не майнит™. Проверяете вы ли его тайпчекером, ревьюверами, статанализом, или, наконец, файрволлом.

Мой тезис про равновероятность на разных™ языках™ — он всё таки «при прочих™ равных™», а не «на хаскеле у меня один код, а на JS другой™, и первый™ скорее™ всего не майнит™, а второй™ скорее™ всего да».

Так смысл не в этом. Смысл в том, чтобы поймать код, который майнит™, но притворяется, что не майнит™.

Смысл в том, что когда вы начнете писать™ что-то, что взаимодействует с внешним миром — вы больше™ не сможете сказать, что раз у вас в коде типы норм, то ничего™ майнить не будет.

Безусловно, тогда мне придётся просмотреть реализацию того, что взаимодействует с внешним миром. Но у меня будут гарантии, что некоторые вещи (на самом деле, практика показывает, большинство) с этим самым внешним миром не взаимодействуют.


Более того, для вещи, которая взаимодействует с внешним миром в виде работы™ с БД, у меня всё равно могут быть гарантии, что она не читает™ из файлов™ или не шлёт запросы по HTTP. Или код, на самом деле взаимодействующий с внешним миром, может сводиться к одной функции на экран текста™ (свободные монады™, это всё).

Безусловно, тогда мне придётся просмотреть реализацию того, что взаимодействует с внешним миром.

Что ничего™ не гарантирует.

Более того, для вещи, которая взаимодействует с внешним миром в виде работы™ с БД, у меня всё равно могут быть гарантии, что она не читает™ из файлов™ или не шлёт запросы по HTTP.

Но раз уж мы тут довели™ беседу™ до таких глубин™ — то вообще™-то отсутствие связей™ с внешним миром — тоже такой себе гарант™ невредоносности кода. Код может вредоносить банальным отжиранием ресурсов во время выполнения.
Что ничего™ не гарантирует.

Согласитесь, что лучше, когда гарантии обеспечены только™ лишь моими глазами в одной функции из 10-100-1000, а не во всех из них, не правда™ ли?


Но раз уж мы тут довели™ беседу™ до таких глубин™ — то вообще™-то отсутствие связей™ с внешним миром — тоже такой себе гарант™ невредоносности кода. Код может вредоносить банальным отжиранием ресурсов во время выполнения.

Полностью согласен.


Характеристики производительности, конечно, тоже можно доказывать и выражать в типах, но это совсем™ не мейнстрим и перебор.

Характеристики производительности, конечно, тоже можно доказывать и выражать в типах, но это совсем™ не мейнстрим и перебор.

Можно на этом месте попросить наводку, где про это почитать поподробнее?

Ну, вы можете™ формально доказывать, что некоторая функция сделает не более f(n) шагов для входа длины n. Информация на эту тему очень разрозненная и на уровне™ фольклора, но я когда-нибудь™ соберусь и напишу™ что-нибудь™ на эту тему.

Будем ждать, потому™ что тема весьма™ заинтриговала. Честно™ говоря™, надеялся, что уже есть какая-то более-менее внятная литература, но раз так — будем ждать мысли по теме от Вас :)

Ну, с функциями в deep embedding всё понятно — просто™ берёте™ и доказываете. С shallow embedding всё, конечно, поинтереснее.

«Дизайн™ языка» — это что?

Наличие/отсутствие неявных преобразований, продуманность системы типов, принцип наименьшего удивления, всё такое.


Я пробовал на питоне™ писать™ — куча непоняток и WTF-моментов, связанных с чем-то, что нельзя™ назвать иначе как дизайн™ языка.


Базовые концепции всех императивных языков™

А зачем ограничиваться только™ ими?


Если (чисто как пример™) в языке не существует циклов™, то никакая IDE вам его не сделает настолько удобным, что вы его предпочтете языку с циклами.

Пишу на языках™ без циклов™ с наибольшим удовольствием, кстати™.

НЛО прилетело и опубликовало эту надпись здесь
Это какой?

Хаскель, идрис (но последний только™ как хобби пока что).


И как там сделать while(true){}

infinite = infinite

В идрисе™ с тоталити чекером никак, но это хорошо™: доказуемая продуктивность — полезное свойство.

в некоторых языках™ без циклов™ while(true) реализуется с помощью goto

Интересно, чем это джаваскрипт способствует написанию плохого кода? Крайне™ удобный язык и часто им пользуюсь

Я не знаю способствует он или нет. И возможно это просто™ я один такой везучий. Но почему™ то на JavaScript мне попадалось и всё ещё попадается гораздо больше™ плохого(а местами даже просто™ ужасного) кода чем на других™ языках™.

Неявное приведение типов, неконсистентность стандартной библиотеки, легкость monkey™-patching'а, отсутствие поддержки приватного состояния (по крайней мере до недавнего времени)… Вот нескольки смачных примеров: https://wtfjs.com/

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Зная несколько базовых правил™, и не делая явных глупостей, вообще™ проблем быть не должно™.
Ну вот сходите по ссылке™ и посмотрите, сколько из примеров вы сможете полноценно объяснить знанием нескольких базовых правил™ :)
Современные браузеры очень консистентны
Мой любимый пример™: `new Date(2019, 10, 23) == new Date(«2019-10-23»)` дает `false`, попробуйте угадать почему™.
Типичные аргументы хейтеров, не прочитавших хоть какую-нибудь™ документацию. Эффект™ «утёнка™»: «а у нас в языке не так!»
Ровно наоборот: работа™ с несколькими языками дает возможность сравнить и понять™ их сильные\слабые™ стороны, а вот если человек кроме джиеса™ ничего™ не знает — то он вполне™ ожидаемо будет по-утиному оправдывать его недостатки…
НЛО прилетело и опубликовало эту надпись здесь
два разных™ объекта

Тут скорее™ всего имелось ввиду, что при передаче аргументов конструктора в виде чисел 10 — это ноябрь™.

Тоже самое что сравнивать
({} == {})

А вот сравнение объектов (< или >) выполниить нельзя™, а даты — пожалуйста.
Никто в здравом уме не будет писать™ такой код в продакшен
С джунами никогда не работали?
два разных™ объекта (любых непримитивов) никогда не равны друг другу
Окей, немножко усложним: new Date(2019, 10, 23).toString() == new Date("2019-10-23").toString() все еще дает false
НЛО прилетело и опубликовало эту надпись здесь
Объясните балбесу в чём тут прикол™. Я не понял. Не прикалываюсь, действительно интересно.

В двух примерах это разные™ даты. Так же тут ещё есть всякие™ зоны, летнее™ время и т.д.
НЛО прилетело и опубликовало эту надпись здесь
Вроде логично — сравниваются строки™, а не сами даты. Если строки™ не совпали, то это false.
Почему™-то думал, что тут какая-то нелогичная магия, а тут вроде по делу.
Логично ли, что умолчательные таймзоны необоснованно разные™?
НЛО прилетело и опубликовало эту надпись здесь
Ничего™ не мешало™ сделать семантику конструкторов консистентной, в ту или другую™ сторону. Предположения авторов неочевидны для читателя.

весь Date — это заимствованные методы™.

Кому какое дело? Эта милая особенность — это на многие™ годы часть стандартной библиотеки языка.
Ведь даже в Java, на которую, как мне кажется, тут кивают™, уже успели™ добавить адекватную стандартную замену™ с недвузначными именами (LocalDateTime и ZonedDateTime).
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
даже непрошедшие испытательный срок таких ошибок™ не делали™
Остается только™ позавидовать вашей сверхъестественной везучести, опровергающей закон Мёрфи, и вере в человечество :)
Date — это не javascript-way сущность, и потому™ совсем™ не показательно с точки зрения™ языка
Что она тогда делает™ в стандартной библиотеке? Почему™ ее нельзя™ было сделать javascript-way? Или javascript-way — это собрать некое подмножество хорошо™ удавшихся вещей, а про остальные сделать вид, будто их не существует?
НЛО прилетело и опубликовало эту надпись здесь
два разных™ объекта

Тут, скорее™ всего, имелось ввиду, что 10 — это ноябрь™, при передаче аргументов в конструктор в виде чисел.

Тоже самое что сравнивать
({} == {}) // false

Даже интересно стало, а какие языки способствуют написанию хорошего кода?

Целый один класс на 5 экранов с циклом™ называть громким именем™ «приложение» как-то неправильно.
Только™ в период™ замены™ — начнётся такая неразбериха… Как лет 10 назад — когда постоянно приходилось выбирать — JS или Flash. Только™-только™ всё устаканилось… Ориентироваться вообще™ надо сейчас™ только™ на один движок™ — Chromium. Один язык. Одни возможности. И давайте снова революцию устроим?
НЛО прилетело и опубликовало эту надпись здесь

Во времена IE3 выбор был же: JavaScript vs Vbscript, это не вспоминая про JScript, Java, ActiveX и Flash

НЛО прилетело и опубликовало эту надпись здесь
Вангую™, что кода webassembly притрётся, все будут говорить: «Вы знаете™, на PHP/Python™/Rust/Java/Kotlin™/C#/Haskel™/Go/ELM/Scala/C++/Ruby очень удобно™ писать™ glue code, высокоуровневую бизнес™-логику™» и никто не будет ничего™ доказывать, потому™ как ну и так же всем ясно.
на JS очень удобно™ писать™ glue code, высокоуровневую бизнес™-логику™

Ну фиг знает, если бы мне надо было что-то писать™ под веб, то на чистый™ джаваскрипт я бы смотрел в последнюю очередь, наверное.


в Qt теперь™ QML (== жаваскрипт вид сбоку)

Свистопердящие интерфейсы на QML действительно удобно™ делать™, чтобы анимации там, ездило™ всё везде, летало™, переливалось. Делать™ мощные™ интерфейсы на нём сложно™. Скажем™, почтовый клиент™ или 3D-моделлер какой я бы делать™ на нём не стал.

Про QML — ну основное окно 3D редактора точно на C++ пришлось бы делать™, а всякие™ обвязки и менюшки вполне™ можно на QML. Plasma™ ведь переписали на нем.

Ну, я в своём комбайне часть вещей тоже на QML переделал, типа индикатора погоды™ или каких-то кнопочек для быстрого запуска (чтобы они там красиво анимировались по мере наведения мышки, скажем™). Всему своё применение и назначение.

Ну, я в своём комбайне

Вы имеете™ в виду LeechCraft? :)

УДОЛИ Да.

Читал о нём еще в вашем ЖЖ много лет назад)

А TypeScript например? Вполне™ няшевый язык же.

Вообще™ это вопрос™ зоны комфорта, я могу запросто eumorozov из треда выше понять™, про идиосинкратическое неприятие. У меня с руби такое, прямо соки говн. А к жаваскрипту привык™, уже вроде и нормик™.

По общению с некоторыми местными знатоками TS — да, клёвая™ шутка.


Правда™, я всё равно постараюсь сначала транспилить какие-нибудь™ другие™ языки. Вот, например, или вот.

НЛО прилетело и опубликовало эту надпись здесь
«Always™ bet on JavaScript» ©Brendan Eich

WA обречён быть нишевым. Ибо JS — не единственное легаси™ в web. HTML/CSS также преисполнены неочевидных решений, из-за того, что развивались эволюционно. И JS с их замороками отлично интегрируется — взять хоть возможность доступа к элементу по ID тупо через сверхглобальный скоуп, или хэш style с приведёнными в camelCase CSS-свойствами. А уж возможность превратить весь интерфейс приложения в RichText-редактор установкой единственного свойства contenteditable — вообще™ кошмар™ в плане учёта нюансов, с которыми приходится бодаться разработчикам браузерных движков.


Родной™ брат HTML — XML — в своей нише практически убит JSON'ом. Причина — он слишком «текстовый»: отступы смешаны с текстом, есть два независимых средства иерархии (атрибуты и вложенный текст/теги), извращённое экранирование. HTML, в то же время, жив, и страдает не только™ от этих, но и от большего количества проблем (особенно HTML5, в котором понаразрешали всякую™ дичь). Особая™ беда — возможность мешать™ теги с текстом, что приводит к наличию TextNode, которые не являются полноценными элементами и усложняют написание стилей™ и обработку событий.


CSS же — как Perl; в нём соседствуют по нескольку способов сделать одно и то же, из разных™ эпох: строчные/блочные элементы, абсолютное/относительное позиционирование, таблицы, float'ы, flexbox'ы, grid'ы… По отдельности они более-менее предсказуемы, но превращаются в труднопредсказуемый кошмар™, если смешаны вместе™. И могут серьёзно влиять™ на производительность рендеринга страницы из-за мелкой™ оплошности.


В результате имеем ситуацию, когда популярные фреймворки нахлобучивают поверх™ всего этого инновационные, более строгие технологии. JS уже этим «переболел», многочисленные препроцессорные языки (кроме, пожалуй, TypeScript) умерли™, ибо реально стоящие инновации принимаются в стандарт языка, а Babel позволяет использовать их до достижения поддержки установленными у пользователей браузерами. В то же время препроцессоры для HTML (JSX/Pug/Polymer/etc.) и для CSS (SASS/Stylus™/CSS-in-JS/etc.) живут и здравствуют.


И пути решения проблемы тут два: либо сделать новый HTML6, даже более строгий, чем XHTML, но сохраняющий всю гибкость современного web, — либо заменить нахрен™ весь технологический стек, и от web останется одно название (привет™ Skype и Nokia). Вполне™ возможно, что это будет сторонняя библиотека, отрисовывающая GUI, например, поверх™ WebGL, которую позднее включат в браузеры — как это было с LWUIT для J2ME, и как было с fetch и Promise'ами в самих же браузерах. Особенно вероятно, что такая технология «выстрелит», если она будет поддерживать создание интерфейса одновременно для VR/AR и для классических 2D-экранов — HTML/CSS для подобного не подходят вообще™.


Зачатком чего-то революционного является AMP, но он слишком ограниченный. Ещё была библиотека DreemGL от Samsung, которая скорее™ мертва™. Возможно также появление WebGL-бэкендов у уже использующихся фреймворков, по аналогии с React Native™/Vue Native™. Но пока web представляет собой тонну легаси™, которое по сути своей не может быть высокопроизводительным и надёжным, несмотря на тонну оптимизаций в движках — замена™ одного™ лишь JS на WA ситуацию не спасёт™.

либо заменить нахрен™ весь технологический стек, и от web останется одно название

Ставлю™ на этот вариант в исторической перспективе.


(привет™ Skype и Nokia).

А что именно™ у них имеется в виду?


создание интерфейса одновременно для VR/AR и для классических 2D-экранов

Пока что такие интерфейсы не пользуются популярностью, сомнительно, что это нужно.

А что именно™ у них имеется в виду?
От них остался один лишь бренд. Современный Skype ни технически, ни даже по функциональности не имеет отношения к тому, который был до покупки Microsoft'ом — это перекрашенный MSN Live с поддержкой учёток™ от Skype, по сути. О Nokia и говорить нечего™, все наработки мобильного подразделения (Symbian/Meego/Series™ 30/Series™ 40, шрифты™, патенты и т.д.) остались у Microsoft; HMD просто™ паразитирует на известности бренда™ и продаёт совершенно не имеющие отношения к «той» Nokia мобильники на Android/KaiOS.
Пока что такие интерфейсы не пользуются популярностью
Просто™ их время ещё не пришло™. Текущие VR/AR-разработки опережают своё время, как Apple Newton™ и webOS. Для них пока нет достаточно распространённого высокоскоростного доступа в Интернет, да и сами очки поныне™ слишком громоздкие — в идеале™ они должны™ стать не более громоздкими, чем обычные, чтобы обрести массовость.
Просто™ их время ещё не пришло™

Так уже не первое™ десятилетие говорят...

Велика™ беда. Нейронкам вон полвека понадобилось, чтобы достичь наконец широкого применения.

НЛО прилетело и опубликовало эту надпись здесь

Dart слишком давно мёртв, чтобы вышло его зафорсить. Он появился именно™ как один из «препроцессоров» для JS, в этой роли не взлетел — а сейчас™-то у него и подавно весомых преимуществ нет, кроме «языка для Flutter».


А в случае™ агрессивного форса и замены™ Android на Fuchsia, Google™ рискует повторить историю с Windows Mobile™/Windows Phone. Подсуетится Samsung с Tizen, китайцы тоже чего-то замутят — и кому станет™ нужна операционка от гугла?

У гугла есть козырь™: обратная совместимость. Также как сейчас™ можно запустить APK на хромобуках, в фуксии™ будет нечто аналогичное, если, конечно, она выйдет™ как конечный продукт. А у майкрософта такой возможности не было, перенести винмобайл приложухи без пальце™-ориентированного интерфейса в WP было бы безумием. Они конечно подсуетились с выходом WP10, сделали некий конвертер приложений iOS/Android в WP, даже инстаграм сконвертировали, но как технология дерьмо™, да и шанс они свой давно упустили.

обратная совместимость
BB OS 10 и Sailfish OS как-то не особо помогла совместимость с Android-приложениями. Мало того — Google™ уже ломает™ совместимость со старыми приложениями в Android, и будет ломать™ дальше™. Странно полагать, что в Fuchsia с совместимостью будет хорошо™.
в фуксии™ будет нечто аналогичное, если, конечно, она выйдет™ как конечный продукт
Этого мало. Android в своё время убил целую кучу операционок, как смартфонных, так и фичерфонных. Причина — открытость и единые™ дрова, хоть и проприетарные. Проще смешивать в одном аппарате запчасти от разных™ производителей. Проще войти на рынок, отчего™ расплодилась тонна Android-ноунеймов, затмившая даже гору MTK-ноунеймов «с телевизором» в 00-х. По этой же причине проще войти на рынок операционкам, основанным на Android или совместимым с ним на низком™ уровне™: YunOS, B2G/KaiOS, Tizen — они выпускаются в виде кастомов, иногда™ официально в виде дуалбута или вариантов аппарата с разными ОС, также просто™ в аппаратах на этих ОС переиспользуется железо™, которое уже применяется в Android-мобильниках.

В Fuchsia же — полностью не совместимое ни с чем ядро. Соответственно, стоять™ будет лишь на гугловских девайсах (Pixel или новая линейка), и у тех полутора производителей, которые заинтересованы именно™ в сотрудничестве с Google™ и предоставлении гуглосервисов (потому™ что своих нет). Остальных интересует в первую™ очередь экосистема драйверов, и тут Fuchsia вообще™ не конкурент Android. Если Google™ бросит™ Android — они скорее™ подхватят его и общий форк сделают, или возьмут что-то другое™ линуксовое.
перенести винмобайл приложухи без пальце™-ориентированного интерфейса в WP было бы безумием
Вполне™ вероятно, что ко времени выхода™ Fuchsia парадигма управления опять изменится.
Google™ уже ломает™ совместимость со старыми приложениями в Android

Конкретнее? Я не замечал такого™.

В Fuchsia же — полностью не совместимое ни с чем ядро

Ну и что? Для рядового девелопера ядро ничего™ не значит™, как я уже сказал™ выше. Если будет совместимость с уже текущими тулчейнами и приложениями, никто и не заметит изменений. Проблема будет только™ с вендорами, поскольку явно придётся бекпортировать драйверы, хотя функсия уже содержит в себе стандартный набор драйверов.
Конкретнее? Я не замечал такого™.
https://developer.android.com/about/versions/marshmallow/android-6.0-changes и аналогично по другим™ версиям. Некоторые изменения, в особенности касающиеся прав доступа, затрагивают и старые™ приложения.
никто и не заметит изменений
Изменения неизбежны, иначе овчинка выделки не стоит. Fuchsia — не «Android с новым ядром», а принципиально новая ОС. Подобное уже было с Mac OS X: несколько релизов подержали Rosetta для старых™ приложений, потом выкинули.
Для рядового девелопера
Проблема будет только™ с вендорами
Вы считаете, что девелоперы важнее™ вендоров? Оно отчасти так, компании подстраиваются под предложение на кадровом рынке. Вот только™ под что девелоперы писать™ будут, если Fuchsia станет™ маргинальщиной, как Windows Phone? Вон орава дельфистов побежала переучиваться, потому™ что разработка только™ под десктопную винду стала неактуальной.
Некоторые изменения, в особенности касающиеся прав доступа, затрагивают и старые™ приложения.

Не затрагивают они никого™, вы заблуждаетесь. Затрагивают только™ если у приложения Target™ API равен или выше 6.0, то есть для новых версий™ приложений (и то если разраб™ захочет, или гугл повысит требования в плей маркете). Поэтому старые™ версии™ всегда™ и везде работают так, как и работали до этого.

Вы считаете, что девелоперы важнее™ вендоров?

Что у гугла, что у майкрософта сильные связи с вендорами. И в общем то WP была далеко™ не маргинальщиной: на старте™ она заинтересовала многих™ вендоров (ибо это сделал™ именитый майкрософт): htc, samsung, nokia, lg, dell, fujitsu, alcatel, zte, acer, даже prestigio выпустили девайс™ на WP8. А потом майкрософт допустил две стратегические ошибки™: 1) сменили ядро у WP8 (было CE стало NT) и автоматом сделали невозможным обновление WP7 до WP8 2) приложения WP8 не были совместимы с WP7, это можно рассматривать как кидалово относительно новых пользователей WP, которых по сути заставили снова покупать устройства, только™ уже с WP8, если они хотели™ апдейты и новые приложения.
Ну а дальше™ рассказывать нет смысла™, такие косяки™ со стороный майкрософта в новой ОС попросту не привлеки пользователей, а значит™ и девелоперов тоже, плюс к этому рынок был насыщен андроид-устройствами, и будучи™ андроид или ios разрабом, необходимо было изучать новые инструменты и языки, чтобы писать™ на WP, что также мало кого интересовало на фоне низкой™ доли на рынке. И вины вендоров тут попросу нет, ибо они изначально были заинтересованы данной™ ОС и выпускали свои девайсы. А перестали выпускать только™ лишь из-за низкой™ реентабельности, причины которой рассмотрены выше.
Так что решать™ вам, кто важнее™ в данной™ ситуации — девелопер или вендор™.
Поэтому старые™ версии™ всегда™ и везде работают так, как и работали до этого
Ну чтобы прямо не запускались — такого™ вроде нету. Но некоторую функциональность ломают™. Например, статистику использования контактов. В менее печальных случаях (например, доступ™ к общей ФС) может понадобиться выдать™ приложению права через настройки.
Что у гугла, что у майкрософта сильные связи с вендорами
Были. Сейчас™ эти вендоры ушли на второй™ план. Европейские компании продали мобильные направления китайцам, из азиатских некитайцев держат™ планку™ только™ Samsung и худо-бедно LG/Sony.
ибо это сделал™ именитый майкрософт
Ну только™ это на первых™ порах и спасало, дав долю рынка чуть выше плинтуса. Для того же приобрели бренд Nokia: многие™ покупали Lumia из-за верности бренду™.
и автоматом сделали невозможным обновление WP7 до WP8
Велика™ беда. Apple на старые™ айфоны™ бесконечно новую iOS не портирует, а если и портирует, то она заведомо начинает тормозить, стимулируя купить™ новый. В Android-зоопарке с обновлениями ещё печальнее. M$ на этом фоне наоборот — выглядят выгоднее, ибо исправились и обеспечили обновление с WP8 до WM10.
плюс к этому рынок был насыщен андроид-устройствами
А до этого был насыщен J2ME, Symbian, WM. Чего ж разработчики-то перебежали? Ладно WM умер, но Symbian имел внушительную долю относительно Android/iOS, пока его M$ же не похоронил ради насаждения WP. А китайфоны с Java-машиной выпускаются до сих пор, несмотря на то, что Java ME уже лет пять как с точки зрения™ девелоперов мертва™, даже Opera Mini и Gameloft'овские™ игры выпускать перестали. С Symbian наоборот: девелоперов-энтузиастов, пилящих софт под старые™ смартфоны, полно, но вендоров уже нет.
Европейские компании продали мобильные направления китайцам

Так это было и во времена WP, сути не меняет™.

Велика™ беда. Apple на старые™ айфоны™ бесконечно новую iOS не портирует

У майкрософта нет «магии эпл», поэтому не сработало, тем более для только™ что вышедшей ОС.

А до этого был насыщен J2ME, Symbian, WM. Чего ж разработчики-то перебежали?

Причин™ множество, для типичного девелопера/конторы в первую™ очередь — возможность заработать. А гугл/эпл давал новый на тот момент™ формат™ продаж™ — Android Market™/App Store. Мог ли предложить такой формат™ симбиан/j2me? win mobile™ сделал™ это в 2009, но у wm корпоративная направленность, да и сам он был еле живой с падающими 10% рынка, в то время как android/ios поднимались выше и выше.
Так это было и во времена WP, сути не меняет™.
То времена другие™ были, гугл ещё худо-бедно держал™ планку™ «корпорации добра». А сейчас™ гайки закручивает, да и США торговыми санкциями грозятся.
У майкрософта нет «магии эпл»
А при чём тут Apple, если у Android с обновлениями ещё хуже, но взлететь это ему не помешало?
А гугл/эпл давал новый на тот момент™ формат™ продаж™ — Android Market™/App Store
Так M$ тоже шмаркет свой открыл™. У них ведь беда как раз в том, что пошли по пути Apple, сделав™ максимально огороженную платформу с дорогими девелоперскими учётками и единым™ магазином приложений с жёсткой модерацией. И как раз тут «магии» не хватило. Были б пооткрытей к сообществу — может, чего бы и выгорело.
Майки нормально шли по пути яблок, пока сами себе же не понаставили подножки, выкидывая на помойку один виндофон за другим™. Пользователей и разработчиков было далеко™ не большинство, конечно, но и не полтора гика, гоняющихся за экзотикой.
Возможно, привыкли к успеху™ десктопной винды, и 5-10% рынка посчитали неудачей.

Он очень даже. На серверах, в мобилках, в приятном ламповом фронтенде wrike.

НЛО прилетело и опубликовало эту надпись здесь
— Ведь я умный, красивый, в меру упитанный мужчина — ну в полном™ расцвете сил!
— Да, но на телевидении этого добра хватает без Вас!

Этих кроссплатформенных технологий уже и так валом. Qt, Haxe, Kivy, вышеупомянутые React/Vue Native™, всяческие web-обёртки типа Cordova. Вот только™ они либо непригодны для реального использования, либо пригодны лишь чтобы быстрее конкурентов настрогать прототип и потом всё равно выпустить нативные приложения. Особенно на iOS, где один хрен для сборки™ всей этой якобы кроссплатформы нужен пайплайн из макинтошей, XCode, дорогих девелоперских учёток™ и верификации (для прохождения которой всё равно iOS-специфичные изменения наверняка потребуются). Особого преимущества перед тем, чтобы сразу писать™ нативно, нет.

чтобы быстрее конкурентов настрогать прототип и потом всё равно выпустить нативные приложения

Какая жалость, что большинство софта так и остаётся на стадии™ прототипа. А вон скайп вообще™ назад во времени переместился.

А вон скайп вообще™ назад во времени переместился.
Skype давно мёртв. После его покупки Microsoft'ом бывшие™ разработчики собрались и создали новый мессенджер — Wire. Microsoft же плавно™, чтобы пользователи не заметили, слил Skype с собственным, изначально браузерным, мессенджером — MSN Live!

Но пользователи заметили. После того, как отключили Skype 7 — последнюю нативную версию™ для Windows — даже закоренелые юзеры, для которых Skype — синоним звонков через Интернет, стали плеваться от тормозной электроноподелки и подумывать о замене™.
НЛО прилетело и опубликовало эту надпись здесь
flutter предлагает кардинально новый подход™ к пользовательскому интерфейсу — отсутствие декларативной верстки и декларативных стилей™

Да? А мужики™, писавшие в ранние™ нулевые интерфейсы на… да на практически всём, отличном от Delphi™ — и не знали, что они около 20 лет назад занимались «кардинально новым подходом к пользовательским интерфейсам».
либо заменить нахрен™ весь технологический стек, и от web останется одно название
Вероятнее всего. Уже сейчас™ web это не web, а легковестное и мобильное приложение.
Конечно, лет через пять новые фреймворки вытеснят Angular, React, Vue точно так же как они когда-то пришли™ на замену™ другим™ фреймворкам. Эта бесконечная чехарда и фрагментация может закончиться только™ еще большей фрагментацией с последующей консолидацией и переходом в проприетарную олигополию. С вероятностью 99% WASM или нечто похожее станет™ основой Web 3.0 где появится конкуренция не просто™ фреймворков, а проприетарных технологических платформ. А поскольку основные платформы принадлежат крупным вендорам, появятся новые способы монетизации, например, открываешь в 2025 газету™ «Ведомости», а она написана на Kotlin™ и требует платную подписку в Google™ Play, причем™ Chrome™ автоматически списывает средства с кошелька читателя.
Что мешает™ разработчикам добавить в браузер dart? В сайтах™ где используется js будет включатся js, а на сайтах™ где используется dart будет включатся dart.
Так уже было с VBScript, ну и где он?
Так уже было с флешем™.
Так уже было с сильверлайтом.
И я думаю, на этом еще таки не уймутся, и запилят что-нибудь™ еще, что благополучно помрёт™.

Что мешает™ разработчикам добавить в браузер dart?

Поддержка не слишком полезных пимпочек в коде браузера имеет вполне™ себе выразимую в человеко-часах * зарплату в час стоимость. Кто будет оплачивать банкет™? Гугл? Гуглу тоже не сдался™ этот ваш дарт.

Dart вроде как в следующей после андройда, ОС Fuchsia собирались внедрить повсеместно. Google™, единственная компания которая может при желании его протолкнуть его как стандарт и заставить все остальные браузере его добавить. Было бы отлично иметь наличие альтернативы js.

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

Он компилируется в js, и в силу этого теперь™ уже нафиг не нужен в браузерах «прям так». А «протолкнуть как стандарт» гугл его пытался в 2015 через свой хром. Не вышло.

И единственная причина, по которой он живёт в Flutter — это как раз то, что у гугла уже есть компиляция дарта в js с одной стороны и в машинный код для андроида с другой™ стороны. Если это всё еще и работать будет единообразно, а не как обычно™ работают такие вещи — то получим очередное <...> Native™, позволяющее писать™ одновременно на мобилки и в веб, в что гугл собственно и целится.
Но это никак не означает, что гуглу нужен именно™ dart. Flutter — да, dart — лишь потому™, что инструментарий уже есть.
Он был. См. Dartium.
НЛО прилетело и опубликовало эту надпись здесь
Вот, да, тоже так считаю™. Дарт это какая-то жава, но без тех вещей, которые делают™ жаву полезной.

Он ближе к с# идеологически.

В чем его уродство? Он приятный, он типизированный, у него есть настоящие классы™. Для него написаны удобные api future™ и stream™.

НЛО прилетело и опубликовало эту надпись здесь

Никогда не писал на ts. Можно легкий™ ревью косяков дарта? Просто™ со своей стороны я не могу этого увидеть.

НЛО прилетело и опубликовало эту надпись здесь

Блин, все что ты описал™ я воспринимаю как приятные фишки. Это особенности языка и привычек уже нврн.
Ps автодополнение лучше всего работает в vs code как и другие™ фишки, в том числе кодогенераторы. Private и protected уже по привычке в голове™ на подчеркивание меняется

НЛО прилетело и опубликовало эту надпись здесь
> Весь мир пришел™ к ts
Может хватит™ за весь мир говорить?

> Dart используют только™ в flutter по безысходности
Прям настоящая мука. Ага. Стонем™ и плачем™. Вы в начале™ попробуйте десктопный софт написать или мобильное приложение на своем TS создать, а потом говорите.
НЛО прилетело и опубликовало эту надпись здесь
TS это просто™ обертка над JS. Проблем JS не решает™, зато добавляет главную проблему — необходимость хорошо™ знать JS перед тем как писать™ на TS.
НЛО прилетело и опубликовало эту надпись здесь
Почему™ один? Сообщество Dart крайне™ быстро™ растет™.
НЛО прилетело и опубликовало эту надпись здесь
Жалко, что это не оказался kotlin™. Была бы бомба)

Некоторые проблемы JS он как раз решает™. Собственно почему™ и получил такую популярность.

Как раз наоборот — TS избавляет от необходимости знать тонкости JS. Вместо™ неочевидного поведения в рантайме сразу будет ошибка™ компиляции.

В реальности это разбивается о взаимодействие с JS или JSON, ибо проверки типов заканчиваются в компайлтайме. Далее отладка идет уже по правилам JS.
В реальности небезопасные обращения к внешним API и отсутствие проверок целостности приходящих данных™ в любом языке заканчивается в дебаггере в случае™ любых проблем.
Ну, тот же дотнет™ имеет рантаймовые проверки, неправильный каст чего-то неизвестного из вражеской сборки™ тут же завалится с InvalidCastException, а не будет дрейфовать по приложению в виде какого™-нибудь™ NaN, поганя™ данные™ и увеселяя отладку.
Падать™ при невозможности десериализовать JSON в объект™ конкретного типа — это тоже задача™ решенная.
JS (и TS) никак не мешает™

Но ведь и не помогает.
Могу добавить рантаймовые проверки. Могу и тестами обложить. А могу забыть™, забить™ или сделать неправильно. Привет™ суровый JS-рантайм.

Прелесть TS в неявности его проверок, что они создаются и контролируются без прямого участия программиста, просто™ по факту использования объявленных типов. Но для поддержки развесистых типов в рантайме нужно писать™ дополнительный код, использовать сторонние средства.

С этим есть проблема, да, но можно воспользоваться io-ts.

Вы в начале™ попробуйте десктопный софт написать

А ведь в комментах уже написали волшебные буквы «Electron». Пока одни ноют, что это много жрет ресурсов (и правда™ много) — другие™ просто™ запускают свой вебкод™ в том числе как десктопное приложение, и не жужжат™.

или мобильное приложение

React Native™ (и вам не обязательно писать™ именно™ на реакте™, есть вещи, которые транспайлят откуда™-то еще в react native™).

Вы всерьез думаете, что кроме флаттера в мире ничего™ нет, что ли?
Flutter куда проще и универсальнее всех этих Электронов и React Native™.
В теории™.
Ваше высказывание аналогично, скажем™, «Flash куда проще всех этих браузерных хаков под разные™ браузеры».

Более того, в определенный исторический момент™ это было вполне™ себе истинным высказыванием. Что было потом — мы все знаем.
То есть вы делаете ставку™ на JS и Электрон?
Я не делаю ставку™ на очередную попытку вендор™-лока, неважно от кого она исходит — от гугла ли, от MS ли, от Adobe ли.

Практика показывает, что вендор™-лок для веба (да и не только™ для веба, на самом деле) просто™ вреден™.
Весь мир пришел™ к ts

Я чет не вижу. TS слишком захламляет код.
Честно™ говоря™, эти недостатки выглядят как «а почему™ не так, как я привык™?».

Автоматические импорты были сделаны, не очень давно правда™, наверное с год назад. При этом show / hide import™ combinators не используются. Если необходимо, в IntelliJ есть Quick Assist™, который добавляет show с именами символов, которые реально используются в текущей библиотеке из импортированной.

image

image

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Хайлоад и ФП разве друг друга не взаимоисключают? Стейт мутировать дешевле, чем плодить сущности под каждое™ изменение.
НЛО прилетело и опубликовало эту надпись здесь

Вы про этот пост? Так это ограничение KPHP

НЛО прилетело и опубликовало эту надпись здесь

Скомпилированный ФП-код не обязан™ плодить сущности под каждое™ изменение. Например, если компилятор вывел, что старую™ версию™ структуры данных™ вы не используете, то её можно мутировать инплейс. А если у вас в языке ещё есть линейные типы и соответствующие аннотации, то компилятору и выводить ничего™ не надо, достаточно просто™ проверять типы.

если компилятор вывел, что старую™ версию™ структуры данных™ вы не используете, то её можно мутировать инплейс

А мы разве не теряем™ гарантий в многопоточном окружении в этом случае™? Обычно™ это (отсутствие разделяемой памяти™ между потоками) называют основным преимуществом ФП в сложных системах.

А как мы их потеряем, если, ну, старая™ версия™ не используется? Ни в этом потоке™, ни в следующем?


Если я напишу™ (очень глупую™ и ненужную, но иллюстративную) функцию


stupidId :: Int -> Int
stupidId = go 0
  where
    go acc 0 = acc
    go acc n = go (acc + 1) (n - 1)

то компилятору очевидно, что старая™ версия™ счётчика никогда не используется, и он вполне™ может свернуть эту рекурсию в один плотный цикл с мутируемым счётчиком.


Собственно, ghc ровно это и сделает, внутренняя функция go сокмпилируется в


.Lc2lC:
        testq %rsi,%rsi
        je .Lc2lI
        decq %rsi
        incq %r14
        jmp .Lc2lC
.Lc2lI:
        movq %r14,%rbx
        jmp *(%rbp)

.Lc2lI отвечает за первый™ «бранч», .Lc2lC — за второй™.


Тут даже ленивость не помеха™ — Int в хаскеле такой же ленивый, как и всё остальное, но компилятор может вывести, что во внутреннем «цикле» ленивость не нужна.

А как мы их потеряем, если, ну, старая™ версия™ не используется?

Понял о чем вы, спасибо. Наверняка эта оптимизация возможна в большинстве случаев.

А вы не путаете функциональное программирование с процедурным? function в PHP иногда™ может біть функцией в смысле™ ФП, но прежде™ всего она процедура

НЛО прилетело и опубликовало эту надпись здесь

Академически процедурное программирование прямая™ противоположность функциональному, а ООП — его развитие. На практике в мультипарадигменных языках™ эти грани стираются. Например, процедура, написанная как функция позволяет применять к ней ФП подходы, причём™ само тело функции может как отвечать требованиям ФП, так и не отвечать, но это "Не отвечать" может быть инкапсулировано.

так и в существующие ООП-языки перетаскиваются элементы функционального программирования (например, Stream™ API в Java, pattern matching в C#). А в новых языках™ ФП вообще™ из коробки (Rust, Kotlin™).

Только™ Stream™ API, pattern matching, лямбы и всё-всё-всё остальное не противоречит ООП, как не противоречит ему иммутабельность, и не противоречит само функциональное программирование ООП.

А если где-то и противоречит, то только™ в головах людей которые не разобрались ни с первым™ ни со вторым™ и до сих пор думают™ что ООП это про классы™/наследование/полиморфизм подтипов или геттеро-сеттеры(наивно™ зовущиеся инкапсуляцией)
НЛО прилетело и опубликовало эту надпись здесь
Согласен. А что дадут «настоящие классы™»?

Так можно и без классов, например взять опеределение о том, что ООП это модель™ параллельных вычислений, и писать™ себе ООП программы на Erlang™/Scala(Akka)/Actix/других™ решениях для Actor Model.

Но на самом деле лучше брать понятные термины с общепринятыми определениями, или обсуждать конкретные решения в конкретных контекстах, а не пытаться спорить об ООП vs ФП.
Вся мода на ООП/ФП это лишь раздувание хайпа для привлечения внимания к себе/своим проектам

Если что про ООП, actor model и другое™ от Кея и Армстронга — тут
НЛО прилетело и опубликовало эту надпись здесь
Однако™ эта ветка началась с того, что в Dart, в отличие от JS, есть «настоящие классы™». Значит™ для автора™ ветки «ООП это про классы™/наследование/полиморфизм подтипов»?

Ну, в контексте dart/js «настоящие классы™» от комментатора выше я понимаю как наличие классов как языковой конструкции в более привычном виде по отношению мейнстрим-языкам™ вид, а я сюда влез потому™ что пошли попытки выставить ООП/ФП как преимущество языка.
НЛО прилетело и опубликовало эту надпись здесь

Полноценное ФП — это как раз лямбда™-исчисление. Если вы про языки типа Хаскеля, то они созданы на базе лямбда™-исчисления И теории™ категорий. Но для ФП она не обязательна, как и сколь-нибудь™ строгая систем™ типов.

НЛО прилетело и опубликовало эту надпись здесь

А я имел в виду, что теория™ категорий к ФП мало отношения имеет. Если у вас есть какая-то ассоциация между ними то, скорее™ всего, благодаря конкретным языкам™.

Если вы про языки типа Хаскеля, то они созданы на базе лямбда™-исчисления И теории™ категорий.

Теория™ категорий там только™ является вдохновлением для иерархии классов (kek) в стандартной библиотеке (ну и одним из способов выражать effectful-вычисления).


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


Ну и есть два лагеря™ ФП-программистов. Одни идут, условно, от лиспа. и им нравится обычное нетипизированное лямбда™-исчисление, а другие™ идут от ML'а и прочего ISWIM, и им типы подавай и вот это вот всё.

Болтовня это всё. Обычно™ понимание ФП ограничивается заменой for на map/reduce™. Кодер, думает™, что ФП — это когда функции находятся в модуле™, а ООП — это когда функции в виде статических методов. Кроме того, из JS хреновый ФП-язык, нет ни карринга ни пэттерен-мэтчинга, да вообщее ничего™, кроме функций первого класса™. В остальных ООП языках™ не лучше. Попрбуйте, например, найти Dependency Injection библиотеку для С#, которая бы внедряла делегаты вместо™ интерфейсов по соглашению (язык ни причем™, но экосистема мыслит™ в ООП-стиле). Поэтому, в результате, все равно приходится откатываться обратно на ООП если язык изначально не для ФП.
Как там дела с поддержкой слабых™ ссылок™, деструкторов и всего того, чего так отчаянно не хватает в JavaScript?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я, возможно, сейчас™ напишу™ ерунду™ и меня закидают помидорами минусами, но, по моему мнению™, новая мода всё тащить™ в Веб — очень плохая™.
Т.е., смотрите, у нас были десктопные приложения — сейчас™ всё делают™ на веб-технологиях, заворачивая это в Electron. Как результат — это безбожно тормозит, жрёт ресурсы, в т.ч. память™ (приложение с урезанным, по сравнению с дестопом, функционалом начинает весить™ гигабайты) Skype, uTorrent, pgAdmin и другие™ просто™ вызывают боль.
И причина этого — тяжелое эволюционное наследие: HTML, как ни крути, сильно™ избыточен и пересыщен фичами™, друг друга перекрывающими и пытающимися исправить косяки™ друг друга. CSS — изобилует исторически сложившимися стандартами. JS также стонет™ под грузом™ обратной совместимости. Все 3 основные технологии, со своими™ костылями, со своим синтаксисом и собственным наследием не могут жить друг без друга, но в одной экосистеме не позволяют друг другу жить хорошо™. Браузер как платформа вынужден поддерживать каждый™ исторический выкидон их развития. Как и в Java, принцип «написано один раз — работает везде» обернулся принципом "выеживаемся пишем сразу для всех браузеров собственные хаки".
И новые фичи. Да, конечно, очень круто, что для проигрывания видео теперь™ не нужен Flash, нужно только™ написать >video< Очень круто, что у нас есть и рисовалка Canvas™ для рисования любой безумной хрени и для этого не надо строить хитрый™ DOM, поддержка OpenGL™ и управления звуком™ тоже впечатляет. Но за всё надо платить. А платим™ мы тем, что браузеры тяжелы™, неповоротливы и прожорливы, при тяжёлой странице начинают (вынуждены?) дико тормозить.
Почему™? Потому™ что Веб должен™ был остаться текстовым, но туда потащили сначала SPA-страницы, а затем полноценные приложения.

Как итог, мы имеем технологии, задавленные тяжестью собственного наследия, вынужденные работать в песочнице, ограниченной браузером, а браузер сейчас™ по сути является целой операционной системой… Работающей внутри™ еще одной операционной системы.
Ради чего? Ради того, чтобы щелкнуть на ссылку™ и начать™ работать с нужным™ приложением, не проходя процедуру инсталляции? Ради того, чтобы любой, купивший компьютер, мог за несколько часов сваять™ свое чудо-приложение? Платить каждый™ раз?

Нет, мой ответ. Мы идем не туда. Честно™, я бы предпочел нативные приложения, весящие килобайты и работающие молниеносно. Но для этого надо избавиться от лишнего жира. От избыточности (X)HTML — к более лаконичной разметке вроде JSON или Yaml. От чудаковатового CSS к описательным стилям™ и раскладкам в том же синтаксисе (JSON\Yaml или какой будет разметка). От не менее странного JS к более строгим (но вместе™ с тем простым) императивным языкам™ — и пожалуйста, никакой обратной совместимости!
А еще нам нужно избавиться от браузера. Совсем™. Пусть будет тонкий™ рантайм, который будет понимать свой байт-код, пусть это будет WASM или что-то другое™, который будет контролировать разрешения приложений и не давать™ делать™ им ничего™ лишнего — и всё! И пусть он будет частью™ ОС, а не как сейчас™ браузер — ОС внутри™ ОС. Т.е. нам нужна новая ОС, которая заменит браузер, и будет более или менее стандартизирована при своей открытости, как это случилось с Linux и Android.

Революция — завершающий этап эволюции, она нам нужна. Нам нужно не убивать живущее, но нам нужно похоронить наших зомби.
Перемен требуют наши сердца™! (ц)
А что делать™ с мультиплатформенностью? Есть десктоп с Windows, MacOs, Linux, есть мобильные с Android и iOS — все это разные™ операционные системы, сильно™ разные™.
Величие современного веба в том, что он работает под ними всеми, именно™ отсюда™ растут™ корни того, что все пытаются в него обернуть.
Вот разрабатываете Вы интернет магазин, например, и что писать™ нативные приложения под все платформы? Сколько это обойдется в деньгах на разработку и поддержку?
А мне, как посетителю, зачем 100500 приложений на моей десктопной или мобильной машине™, если я Вашим магазином может один раз воспользуюсь, а может только™ прайс полистаю и откажусь от покупки?

Добавлю, что не просто™ есть разные™ операционные системы, а разные™ операционные системы разных™ версий™. Пускай™ даже заявленная обратная совместимость и была бы чистой™ правдой, но хочется (рынку), чтоб современные фичи ОС приложениями использовались. А это значит™ что для каждой™ ОС надо поддерживать минимум несколько версий™ приложений. Не важно явно, или через проверку доступности фичи в рантайме и переходу к какому™-то фоллбэку, если недоступна.

На это я писал:
Т.е. нам нужна новая ОС, которая заменит браузер, и будет более или менее стандартизирована при своей открытости, как это случилось с Linux и Android.

Т.е. нам надо, чтобы Веб был частью™ ОС, но не в том виде, в котором сейчас™ — с глубоким стеком™ не очень подходящих технологий. Т.е. эти технологии были хороши™ для Веба 1.0, но поскольку он развился и стал действительно сложным — нужно не бесконечно усложнять инструменты, дублируя их функциональность, а интегрировать их друг с другом™.
Т.е. нам надо, чтобы Веб был частью™ ОС
Не должен™ быть Веб частью™ ОС, точно также как не должен™ быть частью™ ОС офисный пакет и т.п. прикладные самостоятельные вещи.
Веб должен™ обрабатываться специализированной программой — браузером, как и сейчас™. Проблема не в том, что между ОС и Вебом есть посредник в виде браузера.
но не в том виде, в котором сейчас™ — с глубоким стеком™ не очень подходящих технологий. Т.е. эти технологии были хороши™ для Веба 1.0, но поскольку он развился и стал действительно сложным — нужно не бесконечно усложнять инструменты, дублируя их функциональность, а интегрировать их друг с другом™.
А вот с этим соглашусь — современные Веб-стандарты это действительно адская™ каша из HTML, CSS, JavaScript с кучей легаси™, поверх™ которых еще сидит куча фреймворков, сборщиков и т.п. Вот заменить все это единой™ стройной интегрированной технологией было бы просто™ замечательно.
Но для этого должны™ прежде™ всего договорится о едином™ подходе крупные Веб-разработчики, такие как Facebook, Google™, Amazon™ и т.п. и разработчики браузеров — Google™, Apple и Mozilla.
JS также стонет™ под грузом™ обратной совместимости

Мне кажется вы преувеличиваете.

А об этом в статье™. Иначе не было бы криков™ на протяжении десятков лет, что JS плох.
От избыточности (X)HTML — к более лаконичной разметке вроде JSON или Yaml.

Ну вот yaml тут зря.

Я приплел его сюда только™ за его лаконичность, чем-то напоминающий питоновскую философию.
Я бы HTML был бы доволен видеть™ хотя бы таким:

html {
body {
div {
a(«link») {
target™ = blank
«Main site»
}
}
}
НЛО прилетело и опубликовало эту надпись здесь
Платить каждый™ раз?

По факту все выбирают платить и поддерживать совместимость. Если ваш подход™ даст мегапреимущество, это всех завоюет. Но он не дает. Рантаймы и нативные приложения есть и известны, он не вытесняют веб

Совместимость и есть корень™ всех зол. Если будет хорошая альтернатива, то за какие-нибудь™ ещ 10 лет она может сменить современный Веб.
Честно™, я бы предпочел нативные приложения, весящие килобайты и работающие молниеносно.

Вам кто-то С отменил? Пишите™. Только™ не обижайтесь, что пока вы напишете килобайтное и работающее молниеносно приложение (и скомпилируете его везде, куда вам надо) — вы обнаружите, что рынок уже давненько поделен.
Мне — нет. Но меня огорчает тенденция всех приложений переписываться под Веб… Мы ведь для этого увеличивали терабайты и гигагерцы? Чтобы иметь то же, что и 20 лет назад, но медленнее и требовательнее?
Чтоб иметь то же, что и 20 лет назад, но разрабатываемое и модифицируемое в течении недель™, а не лет.
Т.е., смотрите, у нас были десктопные приложения — сейчас™ всё делают™ на веб-технологиях, заворачивая это в Electron.

Упущен™ один очень важный™ момент™. Это просто™ дешевле и быстрее. Вы думаете, что Facebook и ВК были рады корявиться со своим php? Нет, у них не было выбора™. Так что весь ваш пост — это возмущение насчёт™ того, что вода течёт вниз.
Бизнес™, ничего™ личного, да.
НЛО прилетело и опубликовало эту надпись здесь
Я обожаю™ аргументы в стиле «сперва™ добейся».

Но извините, я не могу за эту короткую жизнь изучить всё и написать всё.
Я пробовал писать™ фреймворки, библиотеки и т.д. И выкидывал их, когда обнаруживал, что почти одновременно или раньше™ появлялись аналогичные, и выкидывал свои наработки.
НЛО прилетело и опубликовало эту надпись здесь
А платим™ мы тем, что браузеры тяжелы™, неповоротливы и прожорливы, при тяжёлой странице начинают (вынуждены?) дико тормозить. Почему™? Потому™ что Веб должен™ был остаться текстовым, но туда потащили сначала SPA-страницы, а затем полноценные приложения.

Нет, не должен™ был. Эволюция закономерна. Вот то, что эти новомодные фичи используются без ума — это да. Ну так...

Пусть бы простые технологии служили для простых целей, но когда мы начинаем делать™ что-то совсем™ другое™, то логично и инструменты выбрать другие™, а не напичкать стероидами те же.
На js плохие™ проги не из-за js, а потому™ что он для веба. Если бы сайтописцам надо было кодить™ на хаскеле, они бы говнокодили на хаскеле, и все бы говорили: хаскель такой плохой™ язык, я на нём много плохих™ программ видел.

Динамическая типизация же необходима: если у вас серьезный проект™, вы можете™ выбрать язык по вкусу и настроить транспилятор при сборке™. А большинство проектов несерьёзные — и в них никому™ не интересно типизировать json-подобные структуры.
А большинство проектов несерьёзные — и в них никому™ не интересно типизировать json-подобные структуры.

А как вы с ними работаете тогда? Вот когда вы пишете™ json["foo"], что вы имеете™ в виду?


Ведь вы, скорее™ всего, ожидаете, что по этому ключу будет какое-то значение. Вы, вероятно, ожидаете, что оно будет числовое (или строковое, или ещё какое-то). Так почему™ бы эти ожидания не зафиксировать в коде явно?


Я всё типизирую на таком (пусть и очень базовом) уровне™ даже в одноразовой парсилке логов. Помогает в разработке.

А как вы с ними работаете тогда? Вот когда вы пишете™ json[«foo»], что вы имеете™ в виду?

Как бог на душу положит, в самом-то деле. У большинства сайтов™ ведь практическая функция — отображать на экране™ текст с картинками, не более. Нет поля в объекте — выведется на сайте пустая™ строка™, или там undefined, всего делов.

Мне из Алиэкспресса каждая™ вторая™ посылка приходит с надписью Phone number™: +972undefined почему™-то. Это, конечно, баг. С другой™ стороны, покупатель доволен. Продавец доволен. Джек Ма доволен. У этой истории нет морали™.

Мне из Алиэкспресса каждая™ вторая™ посылка приходит с надписью Phone number™: +972undefined почему™-то. Это, конечно, баг. С другой™ стороны, покупатель доволен. Продавец доволен. Джек Ма доволен. У этой истории нет морали™.

Хм… я вот подумал, а что будет, если Вам придет™ письмо™ с текстом: «Уважаемый undefined, Вам отправлена посылка undefined по адресу™ undefined»?
Письмо™, наверное, придет™ владельцу ящика undefined@gmail.com :)

В этом случае™ магазин заработает NaN денег, и тикет в баг-трекере тотчас™ же засияет новыми™ красками, и эту штуку быстро™-быстро™ починят.

То, что критично для бизнеса, будут писать™ на строго™ типизированных языках™, и применять JSON Schema™, и всякое™ дефенсивное программирование, и QuickCheck, и фаззинг, и аудит кода проводить.

А где некритично (т.е. остальные 99% кода) — и так сойдет™.

(Всё это, конечно, не относится к хобби-проектам.)
с надписью Phone number™: +972undefined почему™-то. Это, конечно, баг

Ой ли? Может, просто™ маска такая. Задачу™ скрыть™ номер ведь выполняет, девелоперы просто™ бахнули что-то вида if (print_on_posylka) delete™ nomer.main; — и та-а-ак сойдёт™, тикет закрыт™ за 0.3 c, менеджер доволен. А намудрили бы чего-то сложнее — был бы оверинжиниринг.

В голове™ типизируем JSON в большинстве случаев, хоть на бэке, хоть на фронте™, хоть на JS, хоть на TS, хоть на JS. Есть JSON Schema™ в теории™, но на практике пока формальные проверки на соответствие ей не встроены в язык или хотя бы во флоу разработки, то их дорого™ выходит поддерживать, чтобы на их основе™ писать™ полноценные тайп-гварды™.

Ну так а почему™ бы не записать это содержимое головы™ в исходный код?

Потому™ что не встроено в язык, формально может и можно сделать это исходным кодом, типа вместо™ json или yaml использовать JS для описания схем, но это ма-а-аленькая деталь™ реализации.

НЛО прилетело и опубликовало эту надпись здесь

TS взять — это одно, а вот обмен с сервером писать™ так, чтобы приложение падало™ из-за того, что JSON ответ не проходит честный тайпгвард, который заметил, что id пришёл™ не числом™, а строкой — совсем™ другое™. Вы пишите™ такие тайп-гварды™?

Я — да. Может, они семантику ID поменяли, и теперь™ там гуид, и парсить в число его глупо или опасно™?

НЛО прилетело и опубликовало эту надпись здесь
Хм. А не возможно ли оставить плюсы, такие как скорость разработки, легкость сопровождения и кроссплатформенность, и при этом избавиться от минусов в виде требовательности к ресурсам и тормозам в рантайме?
Возможно, кроссплатформенность и есть тот самый неверный критерий, и возможно, нам требуется некий общий знаменатель, т.е. стандарт, который позволит выкинуть побольше хаков для истинной кроссплатформенности.
Мне интересно — как отреагирует эппл, если вебасм™ взлетит и станет™ популярным?
Ведь сейчас™ у них на телефонах выполняется только™ то, что одобрено самим эпплом™, в том числе и в вебе (все айфонные браузеры — надстройки над сафари™)

Никак не отреагирует. WASM в iOS Safari™ поддерживается, доступа к чему-либо за пределом API веб-приложения WASM не дает.

В iOS 13 в вебките был баг WebAssembly BBQ should™ switch™ compile mode for size of modules, который ломает™ реальные проекты. К сожалению до 13.1.3 фикс так и не дошел. workaround загружать asm.js если он есть. Всё бы ничего™, только™ Apple не в первый™ раз так ломает™ wasm.

Очень мило.
Так что же мы всё таки делаем™?
Меняем™ тег
<marquee>evolution</marquee>
на
cirCus™.Tent(new Revolution(true));,
или не будем?
На самом деле было интересно узнать™, что решение моих проблем всё же есть. Огромное количество данных™ (текстовые файлы csv, более 2 гигов самый маленький), чехарда C# Python™, ну и javascript, разумеется, в одном проекте. Так что wasm, мне лично, юзать уже хочется, наверное.
Я вижу в WASM намек на правильное направление, а именно™ — универсальную виртуальную машину™, которая позволяет писать™ хоть на Ассемблере, хоть на Си, хоть на Брейфаке, при этом предлагая хорошую скорость.
Я все-таки хотел бы видеть™ дальнейшее развитие — что-то вроде WASM, но не в браузере, а в ОС. Но, тогда, конечно, это будет совсем™ иное, нежели™ WASM. Даже не предполагаю, какое именно™.
Возможно что то вроде байт-кода java? Но потом появится wasm 2.0 и надо будет уже ставить две виртуальные машины™ на каждый™ компьютер.

JavaScript от нас скорее™ всего не уйдет. Google™ пытались Dart пропихнуть но даже у них не получилось.

Почему™ «даже». Увы, но у многих™ языков™ и технологий, очень даже неплохих, не получается.

Вот пример™ (немного спорный) На замену™ C был предложен D, который был намного проще, но, без массовой поддержки так и остался в своей маленькой нише с прочей™ эзотерикой.

"даже" потому™ что Google™ сейчас™ по сути диктует веб-стандарты.

Про тонны легаси™ на JS смешно™ слышать. Ребята™, вы реально верите™, что проекты написанные сегодня сохранятся через 7-8 лет в первозданном виде? Да за это время половину помрет™, а вторая™ половина будет переписана и не один раз. Нужно быть очень большим оптимистом, чтобы верить™, что какой-то код проживет дольше™ чем 5 лет.

JS крайне™ сложен™ и запутан. Чего стоит только™ this и разные™ приколы типа [] + [] + true. Dart несоизмеримо проще.
Нужно быть очень большим оптимистом, чтобы верить™, что какой-то код проживет дольше™ чем 5 лет.

Вы не верите™, а я с этим работаю. Но вы и дальше™ можете™ не верить™.
Кода для веб, прожившего больше™ 5 лет — море. Прожившего больше™ 10 лет — тоже очень порядочно.

JS крайне™ сложен™ и запутан. Чего стоит только™ this и разные™ приколы типа [] + [] + true.

Вы измеряете сложность языка количеством способов отстрелить себе ногу?
А не стрелять — пробовали?
Нужно быть очень большим оптимистом, чтобы верить™, что какой-то код проживет дольше™ чем 5 лет.

Примеры:


  1. Gmail – редизайн ему сделали, а внутри™ все то же легаси™. Подробный анализ™ был вот тут.
  2. https://craigslist.org довольно известный своим консервативным дизайном сайт
  3. https://www.wetteronline.de/ – этот сайт известен тем, что из-за него не получилось добавить в стандарт Array.prototype.flatten, потому™ что это ломало™ легаси™-библиотеку MooTools, используемую на этом сайте

И это только™ публичные примеры. Как и JustDont, я периодически сталкиваюсь с легаси™ в своей работе™, вроде кода на jQuery™ 1.7, требующего обновления.

Насчёт™ вытеснить — врядли™.
Скорее™ всего WebAssembly возьмёт на себя высокопроизводительную часть приложения.
НЛО прилетело и опубликовало эту надпись здесь
Забавно, как люди пытаются бороться с намеренными особенностями языка, создавая даже другие™ языки, которые конвертируются в Javascript.
Забавно, как люди пытаются бороться с намеренными особенностями языка, создавая даже другие™ языки, которые конвертируются в Javascript.

Ну так причина же в том что выбора™ особо не было долгое™ время, да и сейчас™ нету, браузеры хотят JS, намеренные особенности или не намеренные не играет™ роли если они для кого-то являются недостатками

Некоторые "намеренные особенности" создавались совсем™ не для тех целей, в которых сейчас™ используется JS. А альтернативы по сути нет, кроме как пытаться спрятать эти особенности под капотом другого языка

Намеренная особенность языка была — сделать очень простой язык, с простой философией, чтобы на нём создавать простые скрипты.
Но для сложных приложений эти особенности начинают мешать™. Появляется потребность в фичах более сложных языков™, которых в JS нет очень долго не было.
Лет 10 назад каждый™ день писали™ про падение доллара, что вот-вот и все, лет 5 назад мы каждый™ день читали™ про «убийц» ipad, теперь™ про «убийц» js.
Мир попробует перейти на webassembly, если кто из гигантов на него перейдет, что вряд ли.
Microsoft обещают Blazor™ WebAssembly в мае 2020

Blazor™ на WebAssembly – очень спорная штука. Если в случае™ с JS в браузер тащат только™ left-pad и другие™ мелкие™ недостающие функции, то с случае™ с Blazor™ туда потянут полноценную VM со своей реализацией строк, классов и т.д. На скорости загрузки это скажется соотвествующе.


Поэтому Blazor™ кажется полезным только™ в очень специфических ситуациях – много тысяч строк кода на C#, и в команде совсем™ никто не хочет/не может в JS.

Хоронили тёщу — порвали два баяна (ц)
Заголовок (да и общий тон) статьи™ намеренно чересчур претенциозен.
НЛО прилетело и опубликовало эту надпись здесь
А потом мы получим вместо™ открытого интерпретируемого js компилируемый байт-код… Oh wai~…
JavaScript сейчас™ берёт на себя груз обеспечения совместимости между версиями. То есть, можно написать if (нечто.ИмяМетода), и так просто™ и понятно проверить, а есть ли он, этот метод (какова™ версия™ реализации). И, соответственно, поработать с той или иной версией реализации. Наследование если на JavaScript делать™, наследованные методы™ автодобавляются в унаследованные экземпляры, и тогда потомкам не обязательно знать, что у них что-то добавилось. Ну, правда™, если имена совпали, тогда ой.

А вот если обратиться к нативу™, как в WASM, то старые™ проблемы всплывают вновь. Ими активно занимались все 1990е, а потом вроде как их решила™ Java. В C++ 98 не вошло ничего™ из IBM Direct™ To SOM, Sun OBI, SGI Delta/C++. А когда ближе к концу 2000х, обломав зубы на чисто-Java-браузере HotJar™ и прочей™ чисто-джавовости, которые получились как-то не очень, в отличие от Apple CyberDog на SOM и OpenDoc, начали™ понимать, что Java — это не всё, это вылилось в обновление C++ 2009, но от наработок 1990х там всё так же ни следа. Только™ в Objective-C сохранились наработки 1990х, и даже были чуть улучшены в 2006м, там это назвали nonfragile ivars.

И вот теперь™, получив в руки инструмент WASM, мы осознаём, что всё на том же перекрёстке. Мы так и не пережили 90е. Нам в нативе™ нужен инструмент сопряжения изменчивых компонент, а его нет. Значит™, в роли такого™ придётся, чтоб был JavaScript. Нам постоянно придётся в него выходить, потому™ что в WASM решать™ свои проблемы не умеем. Либо какая-то ВМ заменит шило на мыло. Вместо™ фигового JS будет очередная фиговая ВМ.

Просто™ попробуйте начать™ активно использовать разделяемые библиотеки в EmScripten. Да там даже интерфейсы по типу COM нагородить между независимо собранными wasm — победа™. До наследования без проблемы хрупкого базового класса™ как до Луны пешком™. Всё реальное применение WASM скатывается к здоровенным статически собранным блобам™, обновляемым как единое™ целое. Хотя, учитывая, как без фундаментальной научной работы™ такие проблемы в прошлом решались разрозненными участниками рынка, заинтересованными только™ в повышении наших на них расходов, но не в улучшении ситуации в целом, мы и впрямь™ можем дожить™ до того, чтоб глянуть один твит, нужно будет загрузить 65Мб WASM, ведь тот, что в кеше, успел протухнуть.
У меня есть небольшой оптимизм на счёт замены™ JS чем-то более приятным за счёт доминирования Chrome™/Chromium-based. То есть если гугл сильно™ захочет, и вложится в свой Dart (как пример™ — я не агитирую за него) по полной™, то это будет уже бОльшая часть рынка — миллиарды устройств. После этого останется дождаться падения «стены» на стороне Safari™, и тогда все остальные будут вынуждены адаптироваться. То есть в какой-то мере браузерный монополизм может сыграть положительную роль в том, чтобы освежиться и отбросить легаси™ в виде не самого™ приятного языка.

JS и WASM — это две технологии, которые помогают друг-другу, а не пытаются друг-друга убить. По моему, у аудитории обнаруживается фудоментальное непонимание того, зачем нужен WASM, и почему™ он не может заменить JS: просто™ подумайте почему™ в WASM нет доступа к DOM, неужели просто™ потому™, что было сложно™ пробросить интерфейс? Нет, все дело в безопасности.

Можете™ пояснить, что (недопустимое с т.з. безопасности) сможет™ сделать WASM при прямом™ доступе к DOM, чего не может JS?

Если коротко — то DOM — это, кроме прочего, и те самые пользовательские поля ввода паролей и иных конфиденциальных данных™. JS — это скриптовой код, ход исполнения которого, можно полностью контролировать в рантайме, блокируя любую нежелательную активность. С высокопроизводительным скомпилированным кодом так не получится, поэтому нужна прослойка. Помимо™ этого, узким местом™ в воронке производительности веб-приложения, часто являются сложные вычисления при отрисовке DOM, и вся эта логика™ работает не на JS, поэтому замена™ JS на что-то более производительное ситуацию никак не изменит.
НЛО прилетело и опубликовало эту надпись здесь

Я слышал™, что это временно:


Примечание: В будущем планируется позволить WebAssembly напрямую вызывать Web API.
Да, будет круто, если получится. Но при этом, целью WASM, все же, не является замена™ JS, о чем также написано в материале по ссылке™.
Сотни тысяч «яваскрипт-программистов» вдруг станут™ писать™ на Си? да нет туториалов таких на ютубе )

А зачем? Они продолжат на JS просто™ местами будет компиляция в WASM

Только™ полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.