Hey guys, we are using JavaScript for the scripting system in Overgrowth. Unfortunately, every time we bring it up, we get a lot of flak about the language. Here are a few common misconceptions and my response to each of them.
Myth 1: JavaScript is just a clowny version of Java
JavaScript is actually totally independent of Java. The only thing it shares is slightly similar syntax. The reason why it has Java in its name is due to marketing reasons. According to Wikipedia, "The language's name is the result of a co-marketing deal between Netscape and Sun, in exchange for Netscape bundling Sun's Java runtime with their then-dominant browser." JavaScript is a brand new language that shares much more with functional languages like Lisp or even Scheme than with Java.
Myth 2: JavaScript is loosely defined and unpredictable
JavaScript is very specifically defined. Google's V8 Engine adheres to ECMA-262, 3rd Edition which has no room for misinterpretation. V8 and other JavaScript engines have literally thousands of test cases to verify that they stick *exactly* to the specification. When people say that JavaScript has a lot of inconsistency, they are probably confusing JavaScript with DOM APIs* which are notoriously fickle between browsers -- namely older versions of Internet Explorer.
*DOM APIs are basically an API for JavaScript to interact with the browser, for example, adding new text to a webpage, or calling a function when the user clicks on a button.
Myth 3: JavaScript is very slow
JavaScript is actually quite fast. It is very optimized and keeps getting more and more so -- look into Google's V8 (which we are using), TraceMonkey, Squirrelfish Extreme, etc. A ton of companies have HUGE vested interest in optimizing JavaScript and JavaScript performance increases all the time. Browsers live and die by their JS execution performance so there is a lot of original research in this area.
Granted, it is not as fast as a compiled language like C, but we don't need it to be. Our scripting engine is not the bottleneck in Overgrowth, which basically means that even if the V8 JavaScript Engine got a 200x performance boost overnight, your Overgrowth FPS would not be increased.
Myth 4: JavaScript is a crappy language and only suited for small browser tricks
JavaScript is actually an awesome dynamic language that can definitely stand tall. JavaScript features prototypal inheritance which is hard for a lot of people trained in classical inheritance to wrap their heads around. This often leads to claims that JavaScript is not object oriented, doesn't support complex programs, etc.
Well, actually JavaScript does support classical inheritance as well, and with a few coding patterns, people trained in languages like C++ or Java should be ok.
JavaScript is a dynamic language and this lends itself to a lot of cool behavior. Here is a demonstration of how you can take advantage of higher order functions from my friend, Chris Pennello, CTO of Redux. This is an implementation of Python's functools.partial:
code: function partial() {
var f = arguments[0];
var a = Array.prototype.slice.call(arguments,1);
return function() {
return f.apply(this,
a.concat(Array.prototype.slice.call(arguments)));
};
}
This will take a function as its first parameter (a function is simply an object in JavaScript) and return a new function that calls the original function with the remaining arguments.
This is just the tip of the iceberg. This site has all sorts of functional programming niceties that Python programmers are familiar with: map, reduce, zip, select, etc.
Post your questions or comments about JavaScript below and I'd be happy to answer them.
That is rather nifty, I though it was mostly just a website code thing.
Always happy to spread the word :)
All I know is that any thing I've ever used it for turned out pretty bad.
That also could be blamed on the fact that I just suck at coding though.
hmmm, intresting!
Yeah, yeah, but you should've used LUA instead. ;)
Lua has a really stupid syntax, JavaScript is much more intuitive to a C++ programmer.
Very much agree.
Seems pretty great to me! I know a bit of Java and C++ so I hope that'll help me when I'm gonna mod OG. :-)
Just need to remember some differences and exclusive functions for each language.
Anything else like if-then or loop stuff and math is pretty much the same.
I've studied Pascal and C++ as student.
Now I've learned Lua myself without any books and stuff. Just by looking at other's code.
All id say is use the languages your comfortable with. If you can do the things you need to do with them I cant see a reason not to use them.
I have to say I'm still not convinced.. examples please?
A good article, and I agree that for c++ and java guys like me it is much easier to adapt to javascript than, say, lua.
Lua is almost same thing as C++
Maybe if you squint your eyes really hard. ;)
Just some notes before "down-vote" happens again.
Cloning objects is not inheritance. There is not "classical inheritance" ( what exists is single or multiple inheritance ). Inheritance is a hierarchical construct while cloning is a single operation ( it clones an object namely it's dictionaries ). Not that cloning is bad ( it allows to mess with objects in Python in neat and interesting ways ) but it's not an inheritance equivalence. The two work different and have different properties.
And a dynamic language is not a requirement for implementing functional programming ( aka continuation ). It is implemented also in non-dynamic languages.
Can you give an example of what you mean by JavaScript can't do classical inheritance? As I mentioned, this shows how JavaScript can do that: Javascript.crockford.com I'm curious to hear your use case so I can concretely explain how to do what you're asking instead of just linking to Crockford.
I'm curious which languages you are referring to that have higher order functions but are not dynamic languages.
D is a statically-typed language with higher-order functions. So yes, you can do currying and whatnot. See: Hans-eric.com
Which is really cool, since it means you can write programs which freely mix imperative and functional styles and compile them to native code... all in a language which will feel very familiar to C++ and Java programmers, albeit friendlier and more expressive respectively. :-)
Did I mention that D totally rocks? It totally rocks.
I must admit I felt JS sucked before frameworks like JQUERY showed me how powerful it can be.
Admittably this was because I was using JS for HTML manipulation which (as pointed out in this article) is a nightmare due to differences in interpretation between browsers.
jQuery is amazing. :) We include it in Overgrowth so modders can use it.
jQuery is what bought me back to Javascript, but now I love the language regardless of jQuery. I've been writing some pretty serious OOJS lately and am now interested in getting into some server-side javascript.
This would surly be very intresting if i knew anything about programming. But im a stupid artist so ill crawl back to 3dsmax now....
Javascript is really interesting, and MANY companies are focusing soley on the power of Javascript such as Google. What really blows my mind is how they treat functions as first class citizens. You can do some crazy stuff with the delegates in Javascript if I remember correctly.
I wish i could learn programming on my own. I have tried to understand it for too many years. Thanks for spreading the word of java.
As a web developer I agree wholeheartedly. The problems people face with JS most frequently are DOM-related issues which are irrelevant to applications of JS that are not in the context of a web browser.
For non-web developers: DOM (Document Object Model) is the way that the browser translates both the content of the current page and certain browser-defined elements like the properties of the browser window itself, titlebar, etc. into an object to be referenced by Javascript. While there is a DOM standard supported by the World Wide Web Consortium (the main standards-and-protocols setting body for web technologies), no browser that I am aware of implements it perfectly; as with just about every standard, most browsers (Firefox, Safari, Opera, etc.) are very close to the standard with a handful of unique bugs or oddities each, most of which rarely matter, while Internet Explorer is miles from the spec. IE's implementation of Javascript itself is non-standard, too, which is the source of some of the notorious 'IE bugs' in web development; technically, IE does not implement Javascript but rather JScript, a proprietary Microsoft dialect that is nearly identical to standard Javascript, but not quite. A lot of the perceived clutter and inefficiency in Javascript code is due to the fact that most 'real' Javascript code has to include browser detection tricks (DOMs don't identify themselves; you have to snoop around for known differences to figure out what browser you're dealing with) and other messy workarounds to deal with the oddities of web scripting. Until you start writing mods designed to run on both Overgrowth and a multitude of clones which make lots of minor, poorly documented changes to the game and scripting engines, most of the headaches of web development won't apply :)
Thanks for educating the ignorant.