Случайные статьи:
Успех понятие растяжимое. Для Кстати, а почему "тня", Но она не шлюшка. Да, но у него ПРОЛОГ Джек Винтерс долгое время    ммдяМасса чёрной дыры, согласно    мне вот кажется, что если тебе   

JavaScript is the programming language that Pablo Picasso would have invented. "Broken" is the single word, describing JavaScript. 1. Broken behavior across competing implementations: it is virtually impossible to use JS to do anything robust on the client side. JQuery tries to amend this, but inconsistency is still there. 2. Broken type system: it is weak and its automatic coercion astonishes: "1"+"2"=="12" and "1"+1=='12', but "1"-2==-1, "2"*"3"==6, and (x="1", ++x)==2; 0==-0, but 1/0!=1/-0; [123]==123, but [123][0]!=123[0]. Even worse: [0]==false, but ([0]?true:false)==true, so (a=[0], a==a && a==!a)==true; Following statements are also true: []==![], Math.min()>Math.max(), " \t\r\n"==0, ", , , "==Array((null, 'cool', false, NaN, 4)), new Array([], null, undefined, null)==", , , ", Array()==false, ''!='0', 0=='', 0=='0', false!='false', false=='0', false!=undefined, false!=null, null==undefined, NaN!=NaN, []+[]=="", []+{}=="[object Object]", {}+[]==0, {}+{}==NaN, despite (typeof NaN)=="number", so ("S"-1=="S"-1)==false. Given function f(n) {return n&&+n|0||0;}, we have f("1")==1, f("1.2")==1, f("-1.2")==-1, f(1.2)==1, f(0)==0, f("0")==0, f(NaN)==0, f(1/0)==0. No numerical tower or even obvious integer types: the only numeric type supported is an IEEE754 double-precision float, allowing for 9999999999999999==9999999999999999+1. Hacks like (x+y)|0 are employed to strip rational part. 3. Broken default value: whereas most languages have one universal singular value (null/nil/Void/whatever), JavaScript has four: "false", "null", "void" and "undefined", producing confusing and irregular semantics. Then undefined is not actually a reserved keyword, so undefined="broken" easily breaks code, although void 0 can be used instead of undefined; jQuery uses kludge like (function (undefined) {...}()) to ensure that undefined is undefined. Other redefinable symbols are NaN, Infinity, and the constructors for the built-in types. 4. Broken lexical scoping: unlike C/C++/Java/C#/etc, where variables introduced in an anonymous block within a function are only valid within that block; in JavaScript such variables are valid for the entire function. JavaScript employs unintuitive process called declaration hoisting, in which all function and variable declarations are moved to the top of their containing scope. If a variable is declared and assigned in one statement then the statement is split into two, with only the declaration getting hoisted. This produces a lot of subtle bugs, like for example non-obvious hiding of outer variables or f in var f = function() {…} being present as undefined, while function f() {…} would always be defined. Every script is executed in a single global namespace that is accessible in browsers with the window object. 5. Broken syntax: semicolons are optional, but it only makes life harder, because newline can accidentally take place of a semicolon, in effect return{a: "hello"}; and return\n{a: "hello"}; (where '\n' is newline) mean completely different things: '\n' gets parsed as ';', resulting into just "return;" Finally, crippled syntax impedes functional programming: )}();)}();)}();)}(); 6. Broken standard library: most built-in functions, given an invalid input, don't produce error or exception, but silently return some default, like new Date('garbage'), or even produce undefined behavior: parseInt("07")==7, but parseInt("08")==0 or parseInt("08")==8, because "the implementation may, at its discretion, interpret the number either as being octal or as being decimal". Even worse, parseInt('fuck') gives NaN, but parseInt('fuck', 16)==15 and parseInt(null, 34)==939407 7. Broken arrays: new Array() produces empty array; new Array(2, 3) produces array with 2 and 5 as its elements; new Array(5) does not produce array with 5 as its single element; instead, it returns a 5-element array. In JavaScript an array with 2 elements can have length of 7, while an array with 7 elements can have length 2, because length property always returns the last numeric index, plus one. JavaScript has no out of bounds error: you can freely retrieve an element at any index and no error will be produced, even if element is undefined. JavaScript provides no reliable way to iterate array by index, instead for(var X in Xs) gives elements in completely undefined order.



Понимаете, вас всех готовили в космонавты. Должны были появиться десятки, сотни миллионов космонавтов – все, кто мечтал об этом. Вы ведь не думаете, что дети сами решали, что они хотят быть космонавтами? Трехлетний ребенок не может проснуться утром и придумать, что он хочет летать в космос. Детям объяснили, о чем они должны мечтать. Это было частью подготовки. Какая-то грандиозная операция – колонизация дальнего космоса, геноцид инопланетян. Не помню, что именно. В любом случае – сплошная маниловщина. Потом, конечно, пришел кто-то умный, планы поменялись, вы оказались не нужны. Сначала вас хотели ликвидировать – Третья мировая, Дарт Рейган, забриски мертвого человека. Но снова появился кто-то умный и предложил оставить про запас. Переподготовкой, конечно, никто не стал заниматься – лишние расходы. Кто выживет, тот выживет. Это как в фильмах про киборгов, которых вырастили безумные ученые и оставили маяться, когда Пентагон перестал финансировать программу. Они бродят по огромным парковкам возле моллов и что-то ищут в небе. Вы пытаетесь понять, почему все так нелепо и нескладно, почему хочется футбол и лететь с балкона, ломая ветки тополей. Просто вас готовили совсем к другому. У вас отняли способность любить, оставив только инстинкт размножения, – когда долгие месяцы несколько десятков человек заперты вместе в корабле, лишние конфликты ни к чему. Вам нужны перегрузки, жесткое излучение, вода из мочи – вот почему вы так старательно травите себя. Земля – слишком уютная для вас планета. Вы тыкаетесь во все углы этого мира, обдирая в кровь лицо и коленки, и пытаетесь по запаху найти для себя место. Навигаторы стали программистами, пилоты гоняют в тонированных «девятках», специалисты по негуманоидному разуму пишут в живой журнал. И ничего уже нельзя сделать – вмешательство было на уровне ДНК. Ваши дети будут космонавтами. Ваши внуки будут космонавтами. Вы пишете книжки о космонавтах и для космонавтов, и все картины, все фильмы, вся музыка – это разные истории о Гагарине, который проспал 12 апреля. Глухой Циолковский и мертвый Гагарин – вот кто правит вашим миром. Странно, что вы еще живы. То есть вы молодцы, конечно, но вас очень жалко. Так брезгливо и трогательно.


Отче наш, Иже если на небесах! Да святится имя Твое, да придет Царствие Твое, да будет воля Твоя, яко на небеси и на земли. Хлеб наш насущный даждь нам днесь; и остави нам долги наша, якоже и мы оставляем должником нашим; и не введи нас во искушение, но избави нас от лукавого. Отче наш, сущий на небесах! да святится имя Твое; да приидет Царствие Твое; да будет воля Твоя и на земле, как на небе; хлеб наш насущный дай нам на сей день; и прости нам долги наши, как и мы прощаем должникам нашим; и не введи нас в искушение, но избавь нас от лукавого. Ибо Твое есть Царство и сила и слава во веки. Аминь.


Что мешает подключать библиотеки в объект приложения? Разве множественное наследование сделано не как альтернатива подключению библиотек? Ибо Lisp синоним безумия. У нас же все интернет сумасшедшие - лисперы. Даже - и тот лиспер. define "эмоции" Няша, я всю жизнь в четырех стенах просидел. Мне не привыкать. Я её и в /rf/ искал. В доброчановском /rf/ меня забанили. Как я буду квартиру снимать, если я безработный? У тебя любой баг - фича? Именно. Многие про него вообще не знают. Ничего уже не исправишь.


Их нельзя выучить. Там надо походу решение задачи читать доки к фреймвокам. Руби не очень хороший язык, и вот почему: - Ruby, like most other badly designed languages, does not require variables to be declared, as (let (x 123) ...) in Lisp or int x = 123 in C/C++. If you want a variable private to a block, you need to pick an unique variable name, holding the entire symbol table in your head. Ruby introduces new variables by just parsing their assignments, meaning "a = a" or "a = 1 if false; a" wont raise an error. Ruby can't detect even a trivial typo - it will produce a program, which will continue working for hours until it reaches the typo. Local and global scopes are unintuitive. Certain operations (like regular expression operator) create implicit local variables for even more confusion. - Ruby indulges obfuscation: Ruby has no keyword/optional arguments, so you'll have to use hash parameters as a substitute. This is an idiom that comes from Perl. Ugly, Perl-looking code, like proc {|obj, *args| obj.send(self, *args)} or (0..127).each { |n| p n.chr }, considered beautiful. Another confusing Perl borrowing are postfix if and while (line = file.readline while line != "needle" if valid line) and quirky variable names (partially due to naive environment design): @instance_var, @@class_var, CONSTANT_VAR, $global_var, :sym, &proc, $~[1], $!, $>, $@, $&, $+, $0, $~, $’, $, $:, $., $* and $?. If A is [1, 2, 3] and B is [10, 20, 30], then A+B is [1, 2, 3, 10, 20, 30], when you probably wanted [11, 22, 33]. If a and b are undefined, then "a = b" produces error, but "a = a" gives nil`. - Faulty syntax. Ruby cant distinguishing a method call from an operator: "a +b" can be both "a(+b)" and "a + b" - remove the space to the left of "+" or add a space to the right of "+", and it will be parsed as an addition. Same with "puts s *10", which is parsed as puts(s(*10)). Ruby's expressions terminate by a newline and you have to implicitly state that the expression is not over, using trailing + or \. That makes it easy to make a dumb syntactic mistake by forgetting to continue line. It also encourages putting everything onto a single line, producing messy looking code. A good amount of your code will consist of "begin end begin begin end end..." noise. - Slow: JIT-compiling implementations exist, but they're still slow and incomplete, due to Ruby's complexity and bad design, which make Ruby difficult to optimize compared to other dynamic languages, like Lisp. For example, Ruby has to accommodate for somebody in another thread changing the definition of a class spontaneously, forcing compiler to be very conservative. Compiler hints, like int X from C/C++ or declare (int X) from Lisp, arent possible either. - Ruby's GC is a naive mark-and-sweep implementation, which stores the mark bit directly inside objects, a GC cycle will thus result in all objects being written to, making their memory pages dirty and Ruby's speed proportional to the number of allocated objects. Ruby simply was not designed to support hundred thousand objects allocation per second. Unfortunately, that’s exactly what frameworks like Ruby on Rails do. The more objects you allocate, the more time you "lose" at code execution. For instance something as simple as 100.times{ ‘foo’ } allocates 100 string objects, because strings are mutable and therefore each version requires its own copy. A simple Ruby on Rails 'hello world' already uses around 332000 objects. - OOP: Matz had a bit too much of the "OOP is the light and the way" philosophy in him, in effect Ruby doesn't have stand-alone functions and Ruby's blocks can't be used in exactly the same way as usual closures. Even high-order functions are attached to objects and produce verbose code: "names.map { |name| name.upcase }", instead of simple "map upcase names". - Non-othogonal: {|bar| bar.foo}, proc {|bar| bar.foo}, lambda {|bar| bar.foo}, def baz(bar) bar.foo end - all copy the same functionality, where Lisp gets along with only lambda. Some Ruby's features duplicate each other: print "Hello", puts "Hello", $stdout<<"Hello", printf "Hello", p "Hello", write "Hello" and putc "Hello" -- all output text to stdout; there is also sprintf, which duplicates functionality of printf and string splicing. begin/do/then/end, {} and : also play role in bloating syntax, however, in some cases, precedence issues cause do/end and {} to act differently ({} binds more tightly than a do/end). More bloat comes from || and or, which serve the same purpose. - Ruby as a language supports continuations via callcc keyword. Ruby's callcc is incredibly slow, implemented via stack copying. JRuby and IronRuby don't have continuations at all, and it's quite unlikely they will ever get them. There were also support breaches in mainline Ruby, where Ruby 1.9 has not supported continuations for a while. If you want your code to be portable, I'd suggest not using Ruby. - Ruby was created "because there was no good scripting language that could handle Japanese text". Today it's mostly Rails hype and no outstanding feature, that makes the language, like the brevity of APL or simplicity and macros of Lisp. "There is some truth in the claim that Ruby doesn’t really give us anything that wasn’t there long ago in Lisp and Smalltalk, but they weren’t bad languages." -- Matthew Huntbach


←  Назад [0] [1] Вперед  →
←  извиняюсь за грамматику и смайлы. | Йоу! Предыдущий тред: Приветствую вас  →
Copyright © 2019 hikky.ru