LINUX.ORG.RU

Накидайте критики жабоскрипта

 ,


6

2

Реквестирую ссылки на статьи и посты, в которых подробно разбирается, почему JavaScript - убогонький недоязычок уровня PHP, исполненный маразма и плохого дизайна. Мне для коллекции нужно.



Последнее исправление: ymn (всего исправлений: 2)

Бывшие верстальщик, начавшие считать себя фулстеком.

holuiitipun
()

долбаные хипстеры

читай блог jwz, Jamie Zawinski, автора Netscape Nafigator и инициатора проекта Mozilla. он напару с этим вашим Бренданом Эйхом и изобретал тот браузер на который вы, хипстота, все молитесь словно на свой винтажный молескин.

вон там полно таких перлов, далеко ходить не надо:

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

комменты тоже доставляют:

duskwuff says: 5 years ago at 4:03 pm

So, since I have to ask: What would we be stuck with if JS hadn't happened?

BrendanEich says: 5 years ago at 4:08 pm

Something like PHP only worse, which Netscape's VP Eng killed fast (in early July 1995, if memory serves; I did JS in early-mid-May) since it was «third» after Java and JS. Two new web programming languages were hard enough to justify...

/be

позвольте, но что же может быть хуже PHP? только JS! два победителя спецолимпиады...

он же:

If you appreciate this and it is accurate, consider that JavaScript (please, not «JScript») saved you from VBScript.

дабл фейспалм. ещё в браузере Viola был более вменяемый язык расширений... сложно придумать что-то ХУЖЕ JavaScript в качестве языка программирования...

Brian Mastenbrook says: 5 years ago at 5:30 pm

I don't begrudge you the lack of bignums; the state of bignum libraries back then was not terrific. What I don't get is the lack of proper tail calling. Once you understand it, it's not any harder than doing it wrong. How did that get missed?

BrendanEich says: 5 years ago at 7:26 pm

Ten days to implement the lexer, parser, bytecode emitter (which I folded into the parser; required some code buffering to reorder things like the for(;;) loop head parts and body), interpreter, built-in classes, and decompiler. I had help only for jsdate.c, from Ken Smith of Netscape (who, per our over-optimistic agreement, cloned java.util.Date — Y2K bugs and all! Gosling...).

Sorry, not enough time for me to analyze tail position (using an attribute grammar approach: http://wiki.ecmascript.org/doku.php?id=strawman:proper_tail_calls). Ten days without much sleep to build JS from scratch, «make it look like Java» (I made it look like C), and smuggle in its saving graces: first class functions (closures came later but were part of the plan), Self-ish prototypes (one per instance, not many as in Self).

I'll do better in the next life.

/be

по поводу нереализации хвостовой рекурсии он тоже лепит какие-то детские отмазки... вроде бы и схему за образец взял, и продолжения стянул оттуда, и прототипы из self — а получилось и продолжения/ООП система хуже чем в схеме, и прототипное ООП хуже чем в self..

Брендан Эйх, детишки, это автор JavaScript. он сам признаётся, что поспешил и делал своё поделие впопыхах, ну почти как Расмус Лердорф.

* там полно таких перлов у jwz, на самом деле — выбирай любой.

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

Проверил, работает вроде. Ну надо же, я и не знал. Что то странная фигня какая-то, непонятно зачем это нужно вообще.

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

а получилось и продолжения

В JS есть продолжения?

ООП система хуже чем в схеме

В схеме есть ООП

Может лучше все-таки за уроки? А то мама завтра ругаться будет.

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

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

-- это по сути означает, что этот ваш язык унылое, беспомощное говно, только лишь и всего.

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

и замыкания, и продолжения.

И учебник по биологии, и контрольная по математике.

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

тред не о чем

тред о Javascript

OH, SHI~ Javascript это ничего особенного, а не какой-то там язык программирования.

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

это еще не значит, что есть реальная *необходимость* так писать.

царь, вот ты в принципе не совсем безнадёжен. только поэтому, тебе домашка:

* понять, что такое замыкание (closure) и продолжение (continuation)

* понять, как можно реализовать объектную систему на замыканиях и асинхронные корутины на продолжениях

* найти в соответствующих местах фреймворков на асинхронном жабоскрипт как это реализовано.

* посмотреть до кучи, как там реализованы модули (и асинхронность).

* посмотреть аналогичные места в асинхронной схеме, например termit и gambit. до кучи, посмотреть как зачастую в схеме реализуется самопальная ООП система. сравнить с С++. понять и простить.

понять и простить. обнять и плакать. и забыть это УГ хипсторской подделки под язык программирования как страшный сон.

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

продолжение (continuation)

В JS нет продолжений.

понять, как можно реализовать объектную систему на замыканиях

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

newKingOfTheBlock
()

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

sup9999
()

Главный и фундаментальный недостаток js, то что ему нет замены в браузере. А ведь было время когда нам обещали поддержку Tcl...

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

Я читал однажды форум тиклеров, так вот, они говорят, что JS очень похож на тикль, для тиклера, если он настоящий, а не понторез, перейти на JS легко. Оба языка очень динамичны. Так что радоваться должен, что там не какая-нибудь жаба, или, в лучшем случае, схема, а полноценный, настоящий javascript.

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

Классы, lexical binding, block scoping - уже есть.

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

Даже новоприбывший WebAssembly по сути жабоскрипт.

Разве? Почему?

DarkEld3r ★★★★★
()

а visual basic script ещё жив?

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

Ну в чем-то возомжно и похож. Особенно тем что даже свой код через год не понятен. Но Tcl стройней, проще, аккуратнее и логичней.

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

В JS нет продолжений.

нет, есть

в си тоже есть

как применяются продолжения для корутин и асинхронщины, понятно? если нет, смотри из ссылки про node.js и асинхронный жабоскрипт

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

define «примитивную». на мой вкус, объектная система что в жабе, что в С++, что в C#/D/Vala одна и таже, корнями ещё из Simula-67.

и да, она примитивна. но замыкания тут не при чём — реализовано на таблице виртуальных функций класса + экземпляра. рантайм отображает таблицы и вычисляет динамический тип объекта. есть возможность вычислить таблицы частично CTFE, во время компиляции.

в C++/D/... этим занимается компилятор, в Vala — рантайм. потому что транслируется эта Vala в итоге в обычный Си. Впрочем в Vala GObject, он немного гибче чем объектная модель С++.

в итоге эта объектная модель С++ налагает требования:

* нужно заранее знать будет ли метод виртуальным, во всей иерархии классов. это не гибко

* возникает проблема хрупкости базового класса. отсюда все эти классы строк велосипедные в 10500 фреймворках на С++, например. или сложность расширить Object.toString . частично С# тут гибче за счёт extended methods, в D есть UFCS, но это всё трюки.

* всё это нужно знать заранее, до компиляции, чтобы комплиятор сумел осилить построение VMT во время CTFE.

* опять же, мультиметоды при такой системе костыльны (и не тыкай плз трупом страуса и его статьёй, это костыль)

как по мне, это негибкая ООП система. родовые функции и наиболее-специфичный-метод, мультидиспетчеризация, метаклассы и метаобъектный протокол — гораздо гибче.

да даже прототипное ООП более гибко, но у него есть свои проблемы.

вот в nim, например, есть и мультиметоды и родовые функции. для чего он во время компиляции строит dispatch trees, а не примитивную VMT.

вообще изначально намекалось на функциональные объекты: с чётко ограниченными побочными эффектами.

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

подумай немного, и поймёшь почему.

anonymous
()
<script charset="windows-1251" type="text/javascript">
anonymous
()
Ответ на: комментарий от newKingOfTheBlock

а разгадка проста: они оба, и js и тикль имеют одного предка — схему.

только калечную и неполноценную.

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

потому что «замыкание» из функциональщины и объект из ООП это, внезапно одно и то же.

Нет. Замыкание — это частный случай объекта. Это не одно и то же.

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

а разгадка проста: они оба, и js и тикль имеют одного предка — схему. только калечную и неполноценную.

JS унаследовал от схемы только лексические замыкания. Основной его предок — это self. Тикль вообще унаследовал от кучи языков, включая shell. И у обоих схема соснет, по одной простой причине: в ней мало динамики.

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

да даже прототипное ООП более гибко

Вот только писать на нём врагу не пожелаешь. К чёрту такая «гибкость».

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

Смотрите только на ЛОРе! Новый блокбастер «Дно — вершина эволюции»!

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

Приведу лишь два примера из убогих кривляний этого дебила

Вот это, по его мнению, работает неправильно

;["10", "10", "10"].map(parseInt)//[ 10, NaN, 2 ]

Ок. Тогда, по этой логике, вот это тоже неправильно

 parseInt("10", 0) // 10
 parseInt("10", 1) // NaN
 parseInt("10", 2) // 2

учитывая то, что map в качестве аргумента принимает 2 параметра, второй из которых — индекс. То есть, свою безграмотность, наш петросян выдает хомячью за фичу.

Другой пример. Это «создание» почему-то удивляется, что

fu=function(x){}
fu() // -->undefined
А что это ходячее недоразумение ожидало там увидеть? В js все ф-ции без явного ретурна возвращает undefined, а аргументы опциональны.

Давай исчо нам клоунов-критиков, поржем вместе.

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

map в качестве аргумента принимает 2 параметра

ф-цию с 2-мя параметрами

//fixed

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

а разгадка проста: они оба, и js и тикль имеют одного предка — схему

Вы тут упоролись все? В тикле _динамическая_ область видимости, там нет лексических замыканий вообще. Поэтому идиоматический код на тикле принципиально отличается - там всё в строках «замыкают» и манкипатчат стек вызовов.

anonymous
()

Г-спади, а с PHP-то что не так?

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

Я читал однажды форум тиклеров, так вот, они говорят, что JS очень похож на тикль

Ты бредишь. Он может показаться похожим только хрену с горы, увидевшему знакомые скобочки и какой-нибудь if в хелловорде. Настолько разные языки, что даже не смешно, анонiмус.

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

знакомые скобочки

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

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

Речь щшла не за полные аналоги, а за динамическое связывание

fu=function(){console.log(this.x)}

fu.call({x: 1}) // 1
fu.call({x: 2}) // 2

// и еще из той же оперы

fu=function(x){var a=1; console.log(eval(x))}

fu("a") // 1

аналогов upvar и uplevel конечно нет. Но в какой-то степени, функциональность их повторяет динамическая диспетчеризация по предкам-прототипам.

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

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

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

И вообще, если шире посмотреть: тикль - язычок почти без синтаксиса (всё - строка и несколько простых правил подстановки и группировки), зато хорошо умеющий эмулировать любой «традиционный» синтаксис. Жабаскрипт - очередная алголистая поделка с нулевой возможностью расширения синтаксиса, где люди годами ждут нового стандарта, который им подарит новые божественные кейворды. Ну совершенно разные подходы же.

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

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

Сейчас в JS появились прокси, поэтому можно менять велосипедить синтаксис, с некоторыми ограничениями.

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

в схеме и жысе ворочают калбяками

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

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

Вообще, влияние схемы на JS сильно преувеличено. Возможно, тут ключевую роль сыграл маразматик крокфорд. Основа языка — это все таки Ъ-ООП, на основе SELF. Схема намного более «алголиста», чем JS. Там, несмотря на всякого рода легенды, почти такой же B&D как в жабе.

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

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

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

из-за непонимания языка, в отличии от схемы.

принципы то одни и те же, потому и код похожий. только в js мутный синтаксис в духе «ехал function через function»

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