LINUX.ORG.RU
ФорумTalks

/d/искуссии о javascript и node.js

 ,


1

2

Не раз замечал как местные эксперты ненавидят это, называя js игрушкой, несуществующим языком, и.т.п. Очевидно, что npm ниочень, но жить можно, то есть это не фатально. Больше интересует сам язык. Что там нынче счтитают эталоном динамически типизированного скриптового ЯП, python? Будьте добры, расскажите пожалуйста, почему же так ужасно спроектировн жс и какие вы видите фатальные недостатки языка. Честное слово, при огромном количестве хейтерства на ЛОРе ни разу не видел хоть сколько-нибудь вменяемого обоснования.

Перемещено tailgunner из development

Ответ на: комментарий от dexpl

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

Zaskard
() автор топика
Ответ на: комментарий от dexpl

https://www.linux.org.ru/forum/talks/11708196?cid=11708460 (комментарий)

Я тоже не люблю javascript, но судя по

пофиксить флоат (0.1+0.2 должен == 0.3)

тот пост писало днище, которое не знает даже что такое флоат и почему он работает именно так (0.1 + 0.2 не равно 0.3).

Deleted
()

stevejobs не слушай, он вечно ж под веществами, да и JS наверное палочкой сбоку тыкал. Все там окей, и никакие классы не нужны, просто нужно понять идеологию прототипов/событий/etc. А вообще - выбирай инструмент под задачу, а не наоборот.

znenyegvkby
()

Что там нынче счтитают эталоном динамически типизированного скриптового ЯП

Лиспы.

Deleted
()
Ответ на: комментарий от Deleted

которое не знает даже что такое флоат

Справедливости ради нужно отметить, что флоат не обязан быть двоичным, он может быть и десятичным.

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

Я тоже не люблю javascript, но судя по

пофиксить флоат (0.1+0.2 должен == 0.3)

тот пост писало днище, которое не знает даже что такое флоат и почему он работает именно так (0.1 + 0.2 не равно 0.3).

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

theNamelessOne ★★★★★
()
Ответ на: комментарий от Deleted

Ну-ну конечно. Неудобно, ненужно. Единственное что мне было на нем сделать ощутимо удобнее чем на чем-то другом это какой-то алгоритм на графе (столет назад было), может я быдло которое не умеет в 'think functionally', но скорее всего функциональщики просто упороты. Да и неважно все это, там наверное либ нет или удручающего качества.

Zaskard
() автор топика

/d/искуссии о javascript и node.js
/d/искуссии

В talks

Aswed ★★★★★
()

Неадекватный ==, чуть в меньшей степени, но всё ещё неадекватный ===.

1.5 структуры данных, только к ES6 ситуацию решили немного поправить.

Неадекватная стандартная библиотека что приводит к необходимости пользоваться всякими lodash.

Комьюнити в котором «двигайся быстро и ломай вещи» — общепринятая норма.

PolarFox ★★★★★
()

Не знаю, насколько этот недостаток фатален, но семантика сравнения и приведения к булеву, вроде бы призванная удобно решать главные кейсы, наоборот преращает код в === и производное гуано. Я лично вообще не воспринимаю языки, которые сами додумывают, какой вариант сравнения/приведения мне нужен, среди них как минимум жс и пых. Если в к-н перле есть хотя бы четкое правило, привязанное к оператору, то тут просто таблица с рандомными вариантами от левой пятки «лангдизайнера» и порядка типов. Получается вроде бы у тебя язык общего назначения, но типы всегда перемазаны клеем уровня баша. В остальном динамика как динамика, скопинг странный только при встраивании (любой эмбеддер понимает, почему в одном случае значение попадает в document, а в другом в глобконтекст, и чем они отличаются, но у нубов, которым язык кажется магией, могут быть с этим проблемы). Замыкания есть, прототипирование есть, на этом можно построить почти что угодно. Нет континуаций/л-тредов, но похоже жсникам невпадлу строить свои лесенки, так что не аргумент. Окружений тоже вроде бы нет, видимо document тупо прибивается гвоздями. По факту, если бы не веб и вложения в оптимизацию говноблоатваре, жс болтался бы где-то среди нонейм-маргинальщины.

arturpub ★★
()
Ответ на: комментарий от i-rinat

Справедливости ради нужно отметить, что флоат не обязан быть двоичным, он может быть и десятичным.

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

Deleted
()

Кастуй стрелка. Он эксперт по ненависти к яваскрипту.

Vit ★★★★★
()
Ответ на: комментарий от arturpub

любой эмбеддер понимает, почему в одном случае значение попадает в document
Окружений тоже вроде бы нет, видимо document тупо прибивается гвоздями.

Вы так говорите, будто бы за пределами браузера у JS и жизни нет. Тут если что еще и тэг node.js стоит.

znenyegvkby
()
Ответ на: комментарий от anonymous

Почему это 0,1 + 0,2 != 0,3?

Результаты операций над float вообще глупо сравнивать на равенство, JS или нет.

tailgunner ★★★★★
()

Scala.js
Писать же на js можно только если пишешь постоянно на нем, и исключительно на нем, иначе придется постоянно сидеть в дебагере.

anon1984
()
Ответ на: комментарий от Deleted

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

Ну да, а разве там шла об этом речь? Там же не было «исправить всё», человек очертил свою проблему. Её решает десятичные числа с плавающей точкой. Хотя ему и фиксированная тоже подойдёт.

И с переводом из одной системы счисления в другую.

Разве это часто нужная операция? Переводы из двоичной в десятичную делаются для отображения. Обратно — для вычислений. Если всё считать в десятичной, зачем переводить?

i-rinat ★★★★★
()
Ответ на: комментарий от arturpub

континуаций/л-тредов

Они пошли по питоновскому пути. В ES6 добавили генераторы, в ES7 планируют на их основе сделать async/await.

PolarFox ★★★★★
()
Ответ на: комментарий от anonymous

Пардон, а в чем подвох? Почему это 0,1 + 0,2 != 0,3?

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

Второй подвох является следствием первого: из-за того, что не все числа можно представить в виде float фиксированного размера, результат вычислений с величинами отличающимися на порядки, может получиться очень неожиданным:

>>> a = 99999999999999999.0
>>> '%f' % a
'100000000000000000.000000'
>>> a = a + 1.0
>>> '%f' % a
'100000000000000000.000000'

Deleted
()
Ответ на: комментарий от i-rinat

Её решает десятичные числа с плавающей точкой.

Пока размер дробной части фиксирован - не решают.

Deleted
()
Ответ на: комментарий от Deleted

Похоже, я наступил на какую-то твою больную мозоль.

Всех проблем не решить. Даже если чудом сделать числа произвольной точности, которые могут сохранить любое конечное значение в ограниченном объеме памяти, завтра прилетит Глюк с планеты Плюк, где исповедуют двенадцатиричную систему счисления, и заявит, что у него всё равно всё плохо.

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

тот пост писало днище, которое не знает даже что такое флоат и почему он работает именно так (0.1 + 0.2 не равно 0.3).

+1.

Кстати, пример с `Math.round((0.95 - 0.9) * 10)` — лучше =).

ChALkeR ★★★★★
()
Ответ на: комментарий от PolarFox

Комьюнити в котором «двигайся быстро и ломай вещи» — общепринятая норма

Разработчики ядра, например.

Gvidon ★★★★
()
Ответ на: комментарий от anonymous

Пардон, а в чем подвох? Почему это 0,1 + 0,2 != 0,3?

Ошибки округления/погрешность вычисления. После поимки нескольких весёлых багов отпадает желание сравнивать float'ы напрямую. Если очень нужно сравнить, то можно делать так:

abs(0,1 + 0,2 - 0,3) < EPS

Deleted
()
Ответ на: комментарий от Deleted

Если очень нужно сравнить, то можно делать так:

Особенно, если понимать, какое должно быть EPS в общем случае. (например, http://rsdn.ru/forum/cpp/2640596.1 )

Deleted
()
Ответ на: комментарий от ChALkeR

Stable API Nonsense.png

Stable API Nonsense имеет смысл когда у нас макроядро и внешние модули — исключение, а не норма.

А в ноде и вообще в js внешние модули не просто норма, а суровая необходимость.

PolarFox ★★★★★
()

google://wtfjs

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

buddhist ★★★★★
()
Ответ на: комментарий от Deleted

Вообще-то, float на то и float, что 0.3 * 10^0 == 3 * 10^-1. Более того, традиционно те же советские калькуляторы выводили float числа в таком виде, чтобы мантисса была больше единицы, но меньше десяти.

1        -1
2        -1
3        -1
Так что, если не пытаться приводить числа к двоичному виду до вычислений, то оно вполне может работать. Другой вопрос, что если всё-таки приводить, сохранять а потом сравнивать именно двоичные представления, то могут вылазить погрешности, да.

saahriktu ★★★★★
()
Ответ на: комментарий от Gvidon

Миша два процента. В смысле Линус один процент.

buddhist ★★★★★
()
Ответ на: комментарий от Deleted

Нет, это ты не знаешь, что такое float и путаешь его с IEEE-754 float.

buddhist ★★★★★
()
Ответ на: комментарий от saahriktu
#include <stdio.h>

int main(){
        float a, b;
        int f;
        a = 0.1 + 0.2;
        b = 0.3;
        if (a == b) f = 1;
        else f = 0;
        printf("%f, %d\n", a, f);
        return 0;
}
0.300000, 1
saahriktu ★★★★★
()

Что там нынче счтитают эталоном динамически типизированного скриптового ЯП

Про scala.js уже писали?

shahid ★★★★★
()
Ответ на: комментарий от PolarFox

Вообще-то, Node.js очень неохотно ломает совместимость.

Как минимум, это гарантирует инкремент старшего номера в версии. Это может быть нарушено только для исправлений безопасности (может быть такое, что исправление безопасности строго говоря ломает совместимость), но для таких случаев введён специальный флаг запуска --security-revert={номер}, который отменяет изменение и позволяет получить старое поведение.

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

Обычно процесс такой:

  • Посмотреть, сколько вообще модулей в npm использует отламываемое API. Хорошо подумать, обсудить и взвесить всё.
  • Не ранее чем в следующей старшей версии — задепрекейтить только в документации.
  • Через некоторое время — посмотреть, сколько модулей в npm до сих пор это использует. Подумать и обсудить.
  • Не ранее чем в следующей старшей версии — задепрекейтить в коде, с варнингом при первом использовании. Но оно всё равно остаётся рабочим!
  • Через некоторое время — посмотреть, сколько модулей в npm до сих пор это использует. Подумать и обсудить.
  • Не ранее чем в следующей старшей версии — убрать API вообще.

Там, где написано «не ранее чем в следующей старшей версии» — вполне может таких версий поместиться четыре. Или десять. Тот же fs.existsSync был задепрекейчен в документации к версии 1.0, емнип, и до сих пор в таком состоянии — его очень много модулей используют. Поэтому в обозримом будущем с ним не случится даже хард-депрекейта (с варингом).

ChALkeR ★★★★★
()
Ответ на: комментарий от tailgunner

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

Gvidon ★★★★
()

Хм, а какие у тебя ники на лоре до этого были? :)

true_admin ★★★★★
()
Ответ на: комментарий от Gvidon

скрипты, завязанные на /sys, и быть уверенным, что после очередного обновления ядра у тебя ничего не сломается?

Вообще, да :). Это оффицальный курс Линуса — не ломать юзерленд. Часто это выходит боком т.к. внесённые косяки уже не исправить. Но, емнип, Линус говорил «покажите мне какое приложение у вас сломалось за последние N лет». Так вот, хотя такие приложения и были, причины их поломки Линус сказал считать регрессиями в ядре.

true_admin ★★★★★
()
Ответ на: комментарий от ChALkeR

Я не про саму ноду, у них с совместимостью всё хорошо.

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

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

PolarFox ★★★★★
()

у ЖС ужасно сделана область видимости. где for i in. мап где? я не могу понять почему очевидные вещи типа 2 + «2» могут быть. хэш и обжект. Такое ощущение, что жз это некий франкенштейн в который пихали все, что надо вот сейчас, а думать не думали. Когда пишешь на нем постоянно думаешь как ногу не прострелить. Хуже только C#

dmxrand
()
Ответ на: комментарий от true_admin

Навскидку из последнего могу вспомнить efivars, который был полностью переделан в ядре 3.что-то, в связи с чем все пути в /sys/firmware/efi/ поехали.

Gvidon ★★★★
()
Ответ на: комментарий от PolarFox

Это все ерунда. Вот пройдет лет 10 и понадобится тебе развернуть приложение написанное 10 лет назад. ох повеселишся

dmxrand
()
Ответ на: комментарий от Gvidon

Навскидку из последнего могу вспомнить efivars

Ты уверен что эта фича была в статусе «релиз» пока они это делали? Если да то, значит, решили что это интерфейс для системного софта для узкого применения и обычным программам туда лазить не нужно. Я думаю, скоро cgroups перехреначат (если не уже). Видимо, на этот счёт тоже найдутся отмазки :).

Ломают, конечно, некоторые вещи. Но, обычно, очень узкоспециализированные. У меня тоже были непонятки, например, perf_event_open при обновлении ядра в арчике.

true_admin ★★★★★
()

Что там нынче счтитают эталоном динамически типизированного скриптового ЯП

Groovy.

почему же так ужасно спроектировн жс

Мне больше всего бросались в глаза неинтуитивные правила сравнения и преобразования объектов. Ещё путаница из-за null, NaN, undefined и тому подобного. Из-за этого-то и появилась тьма npm-модулей-однострочников. Ну и слышал, что одна и та же функция может по-разному работать в различных браузерах.

CARS ★★★★
()
Ответ на: комментарий от dmxrand

где for i in

Что такое i ?

Операторы for и in на месте

я не могу понять почему очевидные вещи типа 2 + «2» могут быть.

будет «22», что непонятно?

uin ★★★
()

Это там, где недавно полнодомира грохнулось из-за функции паддинга строки? Не фатально, да :}

Deleted
()
Ответ на: комментарий от Gvidon

Разработчики ядра, например.

Это случай так называемого вранья.

Т.е. ты можешь взять модуль [...]

Т.е. продукт, разрабов ядра - ядро; интерфейс ядра - сисколлы и sysfs. Когда последний раз их ломали?

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.