САМЫЙ УЖАСНЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ. Или нет?

Поделиться
HTML-код
  • Опубликовано: 29 сен 2024
  • Телеграм - t.me/johenews
    Телеграм с покупками - t.me/aliexpres...
    Канал с клавиатурами - t.me/ergosplits

Комментарии • 102

  • @youtubeuser4684
    @youtubeuser4684 5 месяцев назад +25

    Это лучшая реклама, которую я видел! 🎉 Просто пушка

  • @АнжелкаИванова-ь6й
    @АнжелкаИванова-ь6й 5 месяцев назад +8

    Если нужно объяснять, почему шутка смешная, то шутка не удалась. Если 28 минут нужно объснять логику работы примитивных выражений ЯП из одного мемеса, то явно есть где то проблема. Никто не сомневается в том, что JS работает ровно так, как описано в документации к JS. Факт в том, что его синтаксис больше контринтуитивен, нежели чем-то полезен, и при разработке новых ЯП таких "нюансов" явно следует сторониться

    • @alurma
      @alurma 4 месяца назад

      Синтаксис ещё более-менее, а вот семантика местами адская.

  • @chokayes7830
    @chokayes7830 5 месяцев назад +11

    "скриншоты курсов, только от более умных людей" )) Стандарт IEEE 754 для арифметики чисел с плавающей запятой или точкой? ))) никто не отменял.

  • @denhax
    @denhax 5 месяцев назад +8

    не осуждайте блогера за рекламу, кому сейчас легко живется....

  • @ИмяФамилия-х4в1е
    @ИмяФамилия-х4в1е 5 месяцев назад +10

    Про вим оч смешно конечно

  • @KoichiHub
    @KoichiHub 2 месяца назад +2

    13:00 - Johe с невероятным усилием ввел текст кода. В таких моментах чувствуется мощь Vim по сравнению с другими редакторами
    В целом у него ушло 10 минут, на то чтобы ввести один и тот же код с некоторыми корректировками для разных ЯПов. Ну наверное отдав предпочтение Vim'у он сэкономил -5 минут, чтобы подышать
    Посмотрев его видосики по Vim'у я решил начать им пользоваться. Спустя наверное месяц настроил под себя плагины, темы, хоткеи, но скорость работы осталась на прежнем уровне (работы в самом Vim'е) ;(
    Когда ты молод, хочется верить в чудо. Хочется поверить, что можно обойтись без мыши и работать с ноутом на коленках не прикасаясь к тачпаду, но на деле ты случайно задеваешь клавишу, активируется хоткей и происходит какая-то ху*ня с Vim'ом как здесь 11:58

    • @beria_
      @beria_ 2 месяца назад +1

      Это мощь вима

  • @sermoz2362
    @sermoz2362 5 месяцев назад +4

    Вывод: Учите ассемблер проблем не будет, а остальное от Лукавого.

  • @post_post_meta_meta
    @post_post_meta_meta 5 месяцев назад +2

    несправедливо мало подписчиков у такого качественного контента

  • @kirill7494
    @kirill7494 5 месяцев назад +5

    ох уж этот автокомплит

  • @alurma
    @alurma 5 месяцев назад +3

    «0.(9)» и «1» это два способа записать одно и то же число

    • @johenews21
      @johenews21  5 месяцев назад

      Конечно же нет. 0.(9) не равно 1

    • @alurma
      @alurma 5 месяцев назад +2

      В русской и английской версиях википедии есть статьи про «0.(9)». Там приводятся доказательства того, что 0.(9) это другая запись для числа 1.
      Предлагаю вам ознакомиться :)

    • @johenews21
      @johenews21  5 месяцев назад +2

      Ознакомился. Вы действительно правы.

  • @СергейТ-т8э
    @СергейТ-т8э 5 месяцев назад +3

    typeof null === «object» - признанная ошибка

  • @MrZzzio
    @MrZzzio Месяц назад

    Смеются не над 0.1+0.2=0.3 == false, а над 0.5+0.1=0.6 == true. Ты 10 минут доказывал первое на си и расте, проверь второе и станет понятно почему смешно.

  • @AKhristenko
    @AKhristenko 5 месяцев назад +3

    Это к с++ то никаких претензий? Смешная шутка.
    js считают ужасным языком зе на их арифметкиу с флоатами, которая такая-же как у других языков
    а за динамический this, с которым легко написать код который упадет в рантайме
    за единый оператор конкатенации и сложения, который приводит к тому что 10+'1' становится '101', что опять же при отсутствии проверки типов приводит к ошибкам(а в других языках, даже с приведением типов обычно делают 2 разных оператора и таких проблем просто нет)
    за одновременно существующие undefined и null
    за очень куцую стандартную библиотеку
    за node_modules, огромных размеров, и длительное развертывание/сборку
    за несколько систем модульности, бандлеров

    • @johenews21
      @johenews21  5 месяцев назад +1

      Подожди, но this вообще можно не использовать, если он тебе не нравится, ну либо следить за контекстом
      единый оператор конкатенации это вроде тоже не проблема, ты ж должен следить за типами, ну или использовать typescript
      Не понял в чем проблема с undefined и null
      Раздутый node_modules это вообще не про js, а про реализацию npm
      Про несколько синтаксисов систем модулей я соглашусь, но тут же не в языке дело, а в том, что нода ушла в CommonJS. Язык ведь не несет ответственности за то, что кто-то может придти со своим видением.

    • @AKhristenko
      @AKhristenko 5 месяцев назад +4

      @@johenews21"следить на контекстом", "следить за типами", когда в других языках это не нужно. т.е. просто на пустом месте появляетс больше мест, где можно ошибится, при этом не получая от этого никакого профита.
      Про npm, рассматривать язык без экоситстемы тож как-то неправильно, т.к. ты его в отрыве использовать и не будешь.
      Вообще основаня проблема - язык был рожден довольно быстро, с довольно сомнительными решениями, т.к. из задач было просто добавить совсем чуть-чуть интерактивности. А потом, т.к. только он релизован во всех браузерах стал безальтернативным и на нем начали писать сложные приложения.

    • @johenews21
      @johenews21  5 месяцев назад

      "следить на контекстом", "следить за типами", когда в других языках это не нужно. Ну по факту и в других языках точно так же следишь за типами, только тебе их надо всегда самому определять. И даже если ты их определяешь, то тебе все равно нужно с ними париться. Например в том же го, ты не можешь сложить два числа с разными типами, тебе надо сначала свести их к одному. Так что в любых языках ты будешь с этим париться.
      Про npm, рассматривать язык без экоситстемы тож как-то неправильно. Правильно. JS существовал до npm десяток лет. Да и сейчас есть куча библиотек на js и ты их можешь юзать без npm. Ну и опять же, ну ок, у тебя дохуя всего в node_modules. Ну и что? У нас что какая-то серьезная проблема с памятью, что мы не можем позволить себе захламить там все?

    • @AKhristenko
      @AKhristenko 5 месяцев назад +1

      @@johenews21 Ладно, приведу пару реальных примеров на счет "следить за типами".
      Предположим мы написали скрипт, кторый делает какие-то расчеты и результат выводит пользователю.
      И где-то внутри у нас есть конструкция c = (a + b) * 3, с дальнейшим выводом c. a и b числа.
      После этого нам понадобилось чуть отрефакторить, например вместо константы в качестве b брать значение из файла/инпута.
      И мы сделали ошибку и забыли преобразовать эту строку в число. Как в итоге поведут себя программы:
      1) на языке со статической проверкой типов - мы получаем ошибку компиляции, исправляем, получаем рабочую программу
      2) на языке с динамиечской проверкой типов но без приведения типов - мы получаем ошибку в рантайме, исправляем, получаем рабочую программу
      3) на языке с динамической проверкой типов но разными операторами для сложения и контатенации - происходит сложение, мы получем рабочую программу с корректным реузльататом сразу.
      4) в JS - мы получаем РАБОЧУЮ программу которая выдает НЕКОРРЕКТРЫЙ результат.
      Т.е. конкретно в этом случае получается что в других языках мы можем особо не смотреть за типами, т.к. расхождение типов нам будет неважно, либо язык нам про это расхождение скажет(ко время компиляции или в рантайме)
      И только в js нам самим приходится сидеть и очень внимательно думать, как наши доработки/рефакторинг могут выстрелить.
      В итоге, имея один оператор для сложения/конкатенации мы получаем кучу головняка при этом не получая каких-то дополнительных профитов.
      Точно так-же с умножением где-то вместо числа получили строку от пользователя. 10 * '1,3' превратилось NaN и соответственно все остальные выражения, которые это использовали тоже стали NaN.
      И сиди ищи, где-же это выстрелило. Когда в других языках будет ошибка в месте, где проходит умножение на строку.

    • @johenews21
      @johenews21  5 месяцев назад +1

      Есть такой термин "Garbage in - garbage out"
      Как вы уже сказали, если вы подадите мусор на вход, то в любом языке у вас будут какого-либо рода проблемы
      Кстати, для решения таких во тпроблем программисты и пишут юнит тесты

  • @dimaacustic
    @dimaacustic 5 месяцев назад +2

    Конечно, без явного указания типа для 0.3 код будет не корректен, скорее всего.
    (0.3).toFloat, например, для Scala3 работает верно.

  • @terpiIa
    @terpiIa 5 месяцев назад +4

    В python None является типом NoneType, а не float

    • @johenews21
      @johenews21  5 месяцев назад +2

      Ты такой внимательный

    • @johenews21
      @johenews21  5 месяцев назад +10

      То, что речь не про None, а про NaN

    • @lizenox
      @lizenox 5 месяцев назад

      @@johenews21 В python есть NaN?)

    • @johenews21
      @johenews21  5 месяцев назад

      есть

    • @lizenox
      @lizenox 5 месяцев назад

      @@johenews21 Действительно, не знал :о

  • @doomer949
    @doomer949 5 месяцев назад +2

    Мемы это мемы, воспринимать их серьезно это странно. Тк js сейчас в тренде по этому и мемов много про него. Раньше про php такое было, питон вообще питухоном называют и тд

    • @alurma
      @alurma 5 месяцев назад

      Нет, любой мем можно подвергать критике, это нормально

  • @idclev
    @idclev Месяц назад

    Тут имхо шутка не над конкретным языком, а над слабой типизацией в целом

  • @4T0O
    @4T0O 5 месяцев назад +5

    16:30 - Нет, в математике это так не работает, 0,(3) это эквивалент 1/3, и при его умножении на 3 мы получим один. Да, можно записать 0,(9), но лучше не надо, принято просто один, потому что 0,(9)=1. Это доказанный математический факт, ничего ни к чему не стремится. Математика НЕ работает так, как ты описал, в ней НЕ получается каких-то несостыковок в настолько базовых вещах, и именно поэтому никого это не смущает

    • @princessmary5556
      @princessmary5556 5 месяцев назад +1

      Да, именно так. В математике 1/3 - это абсолютно точное значение.

    • @hsqlk
      @hsqlk 5 месяцев назад +2

      Это доказанный факт только для определенных аксиом о вещественных чисел. Изменив одну аксиому - измениться все

  • @立入禁止
    @立入禁止 5 месяцев назад +1

    с рекламы орнулось нормально)) собрание скриншотов...))

  • @АлексейКолядин-ж4о
    @АлексейКолядин-ж4о 5 месяцев назад +1

    Крутая футболка!!!

  • @linuxforbeginners5121
    @linuxforbeginners5121 5 месяцев назад +1

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

  • @WaldemarB-wj1nq
    @WaldemarB-wj1nq 5 месяцев назад +1

    0.1 + 0.2 ==0.3 ради прикола проверил в Python, консоль выдала false.

  • @zeroanyway
    @zeroanyway 5 месяцев назад +1

    Смысл столько времени тратить на плавающую точку и вообще про работу флоатов? Это очевидно как бы.
    Вот неявное преобразование типов как раз таки зло. попробуй поскладывать Bool в haskell, или неявно прийти из 999999999999 к BigInt в java,которое почему-то на единицу больше, что вообще не норма ни в каком виде.
    Ну или сравнивать несравнимое(0 и [], например), нормальные языки с четкой семантикой не должны позволять такое делать.

    • @alurma
      @alurma 4 месяца назад

      Не думаю, что IEEE 754 очевидно.

  • @yexela
    @yexela 5 месяцев назад +2

    Как страшно жить

  • @ВладимирГостюхин-ч1и
    @ВладимирГостюхин-ч1и 4 месяца назад

    какие же топовые очки

  • @maksdorozhkin
    @maksdorozhkin 3 месяца назад

    Хорошее видео

  • @СергейТкачев-г9у
    @СергейТкачев-г9у 5 месяцев назад +1

    Реклама зачетная!😂😂

  • @ArtJarocki
    @ArtJarocki 5 месяцев назад +1

    Дим, просто else в питоне.

  • @proletarian
    @proletarian 5 месяцев назад

    Только про жс такие картинки потому что большинство прахрамистов только жс понимают.
    А вообще я никогда на практике за 8 лет не сталкивался с вот этими приколами ни в каком языке, а тем более в жс, может быть я просто не шарю

  • @proletarian
    @proletarian 5 месяцев назад

    А вот один из настоящих косяков жс в том что когда ты попробуешь отсортировать массив чисел не передавая колбэк в метод сорт то он преобразует числа в строки и отсортирует, почему так мне не понятно, числа это же примитив, могу предположить что это из-за того что когда в массиве есть не только Инты тогда надо всё преобразовать в флота к примеру, а там опять же будут огрехи, потому если кто знает то скажите мне

  • @mcblack2010
    @mcblack2010 5 месяцев назад

    Оффтоп. Веселая у тебя оправа! Смотрится стильно! :) Видео тоже классное! После ассемблера ничего не кажется странным, в основном всё объяснимо. Типы данных - абстракция для людей, машинам они не нужны особо.

  • @alurma
    @alurma 5 месяцев назад

    Мне больше всего нравится мем 'ba' + + 'a'

  • @alex146
    @alex146 5 месяцев назад +2

    "Минус всегда вычитание, js умный и все знает..." Ну, это в js не бывает операции противоположной конкатенации, а, например, в груви можно из строки вычесть подстроку при помощи "-". А в js просто беда с типами, не понимаю, зачем пытаться это оправдать

    • @johenews21
      @johenews21  5 месяцев назад +2

      Так в чем заключается беда?

    • @0x255
      @0x255 5 месяцев назад +2

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

  • @diz1295
    @diz1295 5 месяцев назад

    скатился джохе, уже ролики ради рекламы делает

  • @dgvgfg
    @dgvgfg 5 месяцев назад

    смеятся в том что это смешно для человека не знакомого с языками программирования
    это как будто нарушает принцип последовательности. И да 0.5+0.1 == true, а 0.1+0.2 == false говорит о том, а если мы возьмём другие значения тру у нас будет или false? Это нельзя точно сказать.

    • @johenews21
      @johenews21  5 месяцев назад +1

      Три раза прочитал этот комментарий и ничего не понял. Вам надо идти в политику.

  • @alurma
    @alurma 5 месяцев назад

    В некоторых языках (Lua, Haskell) отдельный оператор («..», например) для конкатенации, чтобы проблем с 90 + '1' не было

    • @vadimgoncharov7466
      @vadimgoncharov7466 5 месяцев назад

      А в Perl кроме "." для конкатенации и тип определяется операцией, ">" сравнит как числа, "gt" как строки, вот динамическая типизация, сделанная правильно.

  • @alurma
    @alurma 5 месяцев назад

    В некоторых языках (Python) «арифметические» операторы над не численными типами кидают ошибку, а не выдают чепуху

    • @johenews21
      @johenews21  5 месяцев назад

      ну так и js не выдает чепухи

    • @alurma
      @alurma 5 месяцев назад +1

      Ваша мысль понятна. Я не думаю, что любое поведение языка является оправданным, даже если язык себя ведёт каким-то образом в соответствии со спецификацией. Я думаю, что динамические языки, которые по умолчанию кидают ошибки при попытке сложить объекты (Lua, Python), в данном случае более интуитивны для пользователей. Из этого не следует, что те языки лучше. Я комментирую конкретную особенность

    • @AKhristenko
      @AKhristenko 5 месяцев назад

      @@johenews21 (1+'10')*2 в питоне приведет к ошибке, в lua привете к результату 22, в js приведет к результату 220.

  • @etalko
    @etalko 5 месяцев назад +7

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

    • @sueta714
      @sueta714 5 месяцев назад +4

      🤡

    • @johenews21
      @johenews21  5 месяцев назад +7

      о, футболка работает

    • @SDXqq
      @SDXqq 5 месяцев назад +3

      А минусы будут?

    • @noname-kc7iv
      @noname-kc7iv 5 месяцев назад +3

      О нет, только не отписывайся! Что же автору без тебя делать?

    • @ihtoshy677
      @ihtoshy677 5 месяцев назад

      @@johenews21 Ты конь педальный. Работают HIMARS, ATACMS, дроны "Лютий".

  • @valeriy_konstantinovich
    @valeriy_konstantinovich 5 месяцев назад

    Так и не раскрыл тему, почему 0,1+0,2 не равно 0,3. Может кто-нибудь объяснит?

    • @princessmary5556
      @princessmary5556 5 месяцев назад

      Машины не умеют хранить десятичные дроби с абсолютной точностью. Например: математическое 1/3 - невозможно записать в виде конечной десятичной дроби. Дробные числа хранятся с некоторой погрешностью, и при манипуляциях с несколькими такими дробными числами, эта погрешность может расти.
      Следующий код на языке с++ наглядно показывает погрешности при сложении 0.1 + 0.2
      #include
      #include
      int main()
      {
      std::cout

    • @АнжелкаИванова-ь6й
      @АнжелкаИванова-ь6й 5 месяцев назад

      Потому что в цифровом мире числа храняться в памяти в 2-ичной системе счисления, в которой эти дробные числа имеют бесконечную запись. И есть 2 пути: либо использовать значительно больше памяти под каждое число (чтобы из набора битов можно было обратно восстановить исходное значение, см. типы Decimal), либо округлить (тогда исходное значение восстановить без погрешности не получиться, но выгрываем в скорости/объеме памяти)

    • @valeriy_konstantinovich
      @valeriy_konstantinovich 5 месяцев назад

      @@АнжелкаИванова-ь6й о, спасибо за разъяснение. Я правда ничего не понял, но я теперь знаю, что этому фокусу есть разумное объяснение, выходящее за грани моего понимания)

    • @alurma
      @alurma 4 месяца назад

      Потому что в IEEE 754 так сказано, грубо говоря

    • @valeriy_konstantinovich
      @valeriy_konstantinovich 4 месяца назад +1

      @@alurma Грубо говоря, надо в школе вместо математики изучать IEEE754)))

  • @skynowa2626
    @skynowa2626 5 месяцев назад

    В С/С++ так float-ы не сравниваются

    • @johenews21
      @johenews21  5 месяцев назад

      покажи как сравниваются

    • @skynowa2626
      @skynowa2626 5 месяцев назад

      @@johenews21
      #include
      #include
      bool compare_floats(float a, float b, float epsilon)
      {
      return fabs(a - b) < epsilon;
      }
      int main()
      {
      float num1 = 0.1;
      float num2 = 0.2;
      float sum = num1 + num2;
      float tolerance = 0.0001; // Define your tolerance level here
      if (compare_floats(sum, 0.3, tolerance)) {
      printf("true
      ");
      } else {
      printf("false
      ");
      }
      return 0;
      }

    • @skynowa2626
      @skynowa2626 5 месяцев назад

      + еще в С library есть стандартные функции специально для сравнения флоатов

    • @johenews21
      @johenews21  5 месяцев назад

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

    • @princessmary5556
      @princessmary5556 5 месяцев назад

      @@johenews21 Сами вы бредите. А человек выше привел вам пример сравнения дробных чисел в языке с++. Подобный код вы можете увидеть в фреймворке Google test, и ли например, в библиотеке nlohmann.
      // код взят из библиотеки nlohmann
      template
      inline bool is_same(T a, T b, T epsilon = std::numeric_limits::epsilon()) noexcept
      {
      return std::abs(a - b)

  • @viktor_borodin
    @viktor_borodin 15 дней назад

    en.wikipedia.org/wiki/0.999... по поводу того, что 0.(9) == 1