Perché JavaScript non è utilizzato per lo sviluppo di applicazioni classiche (software compilato)? [chiuso]

14

Durante i miei anni di sviluppo web con JavaScript, sono giunto alla conclusione che si tratta di un linguaggio incredibilmente potente e puoi fare cose incredibili con esso.

Offre un ricco set di funzioni, come:

  • Digitazione dinamica
  •   
  • Funzioni di prima classe
  •   
  • Funzioni annidate
  •   
  • Chiusure
  •   
  • Funziona come metodo
  •   
  • Funziona come costruttore di oggetti
  •   
  • Prototype-based
  •   
  • Basato sugli oggetti (quasi tutto è un oggetto)
  •   
  • Regex
  •   
  • Matrici di tipo Array e Object

Mi sembra che quasi tutto possa essere realizzato con questo tipo di linguaggio, puoi anche emulare la programmazione OO, poiché offre una grande libertà e molti stili di codifica diversi.

Con più funzionalità personalizzate orientate al software (I / O, FileSystem, dispositivi di input, ecc.) Penso che sarà fantastico sviluppare applicazioni con.

Però, per quanto ne so, è usato solo nello sviluppo web o nei software esistenti solo come linguaggio di scripting.

Solo di recente, forse grazie al motore V8, è stato usato di più per altri tipi di attività (vedi node.js per esempio).

Perché fino ad ora è stato relegato solo allo sviluppo web? Cosa lo trattiene dallo sviluppo del software?

    
posta Jose Faeti 30.08.2011 - 10:52
fonte

5 risposte

14

Recentemente node.js ha portato avanti lo sviluppo sul lato server. Quindi, è ora possibile scrivere JavaScript, per lo sviluppo.

È vero. Nella storia, non è stato usato come linguaggio di sviluppo. Ma, hey, anche lo scripting in ambiente client (User Agent) è un tipo di sviluppo. Non è vero?

La ragione principale per cui ho sentito e letto in molti blog è che, le persone non conoscevano il suo potere e la sua unicità fino agli ultimi anni . Ciò che ha fatto accadere questo, è che forse altre lingue stavano facendo il loro lavoro abbastanza bene, e nessuno ha mai pensato di creare qualcosa di parallelo.

    
risposta data 30.08.2011 - 10:59
fonte
15

Da qui :

Note that I am basing all my arguments on real-world use cases. Counter-arguments that can't be backed up with an example of use in a real, complete, interesting, useful applications are invalid. I've seen the little "language demos" everyone else has, I've seen the blog posts detailing how prototypes and dynamic typing make some trivial little example a few lines shorter than it would be in C#, but those simply aren't relevant to the problems you run into writing real code rather than micro-demos and toys. So here's my gripes with JS:

a) Magic 'this'. This is this, except when this is that. JavaScript pushes you to use anonymous functions all over the place, except they always end up losing the proper context for the 'this' variable, so you end up having goofy code like "var _this = this" all over the place and then using that inside your callbacks or other functions. Some days I swear that the number of functions I manage to write that don't use a renamed 'this' are actually smaller than the number that do.

b) 1 + "1" - 1 = 10. Also, "1" + 0 = "10". Yes, this actually has caused bugs for our applications, where data that's expected to be a number was loaded from a JSON file as a string due to a bug in another application, and the result was not good. All our loading code had to be updated to add a ton of type conversions all over the place. When I need something to be a number I really freaking absolutely want it to be a number, not a string or an object or null or anything else. Lua, which is very similar to JavaScript in most respects, fixed this problem by just not being retarded enough to use the same operator for addition and string concatenation.

c) Global by default variables. So even if you take the argument that dynamic typing is just "easier" because you don't have to think about variable declarations, JavaScript throws that argument out the window by making you put 'var' in front of new identifiers all over the place. And then it silently screws you if you forget to.

d) Prototypes instead of classes. There are very few large-scale real-world JavaScript applications in existence that don't plug in their own class system to work around the inherent uselessness of prototypes in large application architecture. Those same apps make minimal use of prototypes to extend the base JavaScript types, and only because JS was so poorly designed that even the two interesting built-in types it comes with are lacking half the features you'd expect them to have.

e) Inability to create pass-by-value types. This is a frequent problem in just about every language aside from C++/D, actually. For those using JavaScript to write WebGL apps, take a look at all the linear algebra libraries for JavaScript. In 3D apps, you almost use vectors more often than you do scalars. Imagine if every integer in your app was passed by reference, so that "a = 1; b = a; b++" made both a and b equal to 2. Every little three component vector is a complete full object. They are passed by reference (the source of almost a half of the bugs in our WebGL game so far, in fact). They exist in great quantity, are heap-allocated, and are garbage-collected, which puts an intense amount of pressure on the GC which can and does result in GC pauses in even simple WebGL games, unless the developer jump through ridiculously complicated hoops to avoid creating new vectors in all the places where it's logical to create new vectors. You can't have operator overloading, so you have very large and ugly expressions to do basic operations. Accessing individual components is slow. The objects aren't natively packed and hence are incredibly slow to push into a vertex buffer, unless you implement them as a Float32Array instances, which confuses the crap out of the optimizers of both V8 and SpiderMonkey currently. Did I mention they're passed by reference?

f) No built-in include or require functionality. Seriously, still. Third-party libraries exist but almost all of them have some kind of bug or another, not least of which is a confusing caching problem in at least Chrome making doing actual development a pain in the butt.

g) Dynamic typing. Yes, I'm willing to start that argument. You start noticing it the most the second you stop writing little Web apps or Web pages and start writing large apps where you actually have data that persists for longer than a single mouse click or request/response cycle: add the wrong kind of object to an array to process later and get a crash later from a missing method or member in a completely different bit of code than where the actual mistake was. Fun times. Yes, Java makes static typing seem evil. No, Java/C#/C++ are not the one and only way to do static typing. Type inference, implicit interface binding, etc. give you all the "easy to deal with and not a lot of keystrokes" advantages of dynamic typing without all the bugs. The second most popular Web language -- ActionScript 3 -- is statically typed, in fact, despite otherwise being identical to JS/ECMAScript. As an aside, I get more crashes from the Python apps on my Fedora desktop than I do from the C/C++ apps (actually, none of the C/C++ apps on my desktop crash, now that I think about it). Missing member exceptions == so much easier to develop and maintain apps, right?

h) Speed. Yes, there has been some ridiculously immense amounts of effort by a large number of super bad-ass developers put into the language runtimes to make JS almost half as fast as a low-grade C compiler that a single college Junior could write in a few months. And LuaJIT is in the same boat as JS in terms of fundamental language limitations but manages to do better than every JavaScript implementation anyway. People who don't understand what all the JS optimizations in V8 or such actually do like to claim the JS can do amazing things speed-wise, but the reality is that all those optimizations are basically just "try very very hard to analyze the code to figure out types for variables and then compile it like a slightly retarded statically-typed language's compiler would do it." Oh, and there's tracing, but then tracing also works on statically typed languages (and works better due to a lack of need for type guards in the generated machine code). Not a single one of those whizbang optimizations was invented by or for JS, in fact; most were taken from research JVMs (Java is evil!) or classical OOP languages (prototypes are awesome!).

i) No IntelliSense even possible. Want to see what methods exist on that variable you've got there on line 187 of foo.js in your text editor? Too bad. Go trace through the code until you figure out where it was initialized, then go trace through the code to find out what its prototype has on it. And then hope there's no code dynamically changing the prototype behind your back. In fact, just run it in a browser and set breakpoints, because finding out anything useful about the value any other way is basically impossible for any codebase larger than the toy_web_app.html sites that JavaScript apologists use to glorify the ease and simplicity of JavaScript. Some code editors try really hard to do better, and almost kinda sorta succeed for the really simple cases, sometimes, once.

j) No advantage. JavaScript isn't even special compared to other dynamically typed language. It is not capable of doing anything interesting at all all that can't also be done by Lua, Python, Ruby, etc. None of the JS implementations are any faster than LuaJIT or PyPy or various other advanced JIT-ing implementations of other dynamic languages. JS has no plus sides to it compared to other commonly available languages. Oh, except it runs natively in a Web browser without a plugin. Which is the only reason in the world why it's so popular. In fact, it's the only reason it event exists. If someone 10 years ago had just thought, "heck, let's drop an existing well-designed and well-established language into our browser and get the other guys to do the same instead of making everyone use this goofy little hackjob that NetScape came up with," the Web would look a lot different (better) today. Just imagine the future if Chrome dropped Python into Chrome as a supported language. Or actually, imagine this: Google drops C/C++ into Chrome as a supported language (http://code.google.com/p/nativeclient/).

    
risposta data 30.03.2012 - 16:18
fonte
12

Perché?

JavaScript il linguaggio più incompreso

Siamo stati nell'era oscura e siamo ancora nella comunità di sviluppo generale ad accettare che JavaScript sia un linguaggio potente e versatile. Semplicemente non è mainstream.

L'unico recente progresso è che node.js è diventato buzz-wordy e la gente sta iniziando ad accettare che javascript ha altri usi ..

Ho tenuto d'occhio JS & Lo sviluppo HTML5 per Windows 8 e la reazione della comunità .NET era "caro dio perché?".

È semplicemente un dato di fatto che la maggior parte degli sviluppatori non web vede ancora JavaScript come quella lingua giocattolo che usi per scorrere i menu nei tuoi browser.

È vero che JavaScript non è allineato con "pratiche di sviluppo moderne". Per me JavaScript è ancora un linguaggio di hacking che creo con vim & internet è la mia documentazione. Non c'è IDE, non ci sono strumenti di sviluppo, non c'è auto-completamento o "intellisense", non ci sono clic e trascina GUI.

Nel mondo degli sviluppatori Java e .NET sono collegati alle loro GUI e amp; IDE e non sarebbe in grado di programmare in vim.

    
risposta data 30.08.2011 - 11:24
fonte
10

La tua lista non contiene nulla riguardo alla scrittura di file nel sistema, che è una parte importante dello sviluppo del software.

Le persone non penserebbero di usare JS per creare un'applicazione perché è il linguaggio di scripting di fatto per il web e useresti sempre lo strumento giusto per il lavoro.

Perché scrivere acri di JS per scrivere un file quando è un'operazione banale in Java / .NET / C / C ++?

Detto questo, come altri hanno menzionato, node.js e le sue librerie hanno reso banali le operazioni lato server e con node.js diventato popolare, imparando che diventerà una competenza per un CV, dato che sarai in grado di mantenere / estendi / costruisci applicazioni con esso.

    
risposta data 30.08.2011 - 11:31
fonte
5

La maggior parte delle lingue di uso comune sono più potenti e meglio progettate di JavaScript. Tutte le funzionalità che menzioni sono supportate da altri linguaggi dinamici come Python o Ruby, che sono in generale progettati in modo migliore. E alcune delle funzioni che menzioni non sono necessariamente comunque desiderabili - molti potrebbero considerare la tipizzazione statica con l'inferenza di tipo preferibile alla digitazione dinamica, se hai la possibilità.

Non sto dicendo questo a diss JavaScript. Mi piace molto lavorare con JS nello sviluppo del web. Ma guardandolo oggettivamente, JS ha un numero di inconvenienti rispetto ad altre lingue:

  • Numerosi difetti non risolvibili. Sono stati commessi molti errori nello sviluppo iniziale di JS. Non c'è bisogno di enumerarli qui, sono ben documentati. Tutte le lingue hanno errori nella progettazione iniziale che verranno successivamente risolti. La differenza con JS è che il linguaggio è stato sviluppato e rilasciato molto rapidamente e questi errori non possono essere risolti a causa della necessità di compatibilità con i browser precedenti.
  • Processo estremamente lento per l'introduzione di miglioramenti e nuove funzionalità. Dal momento che tutti i produttori di browser devono essere d'accordo e potrebbero anche per vari motivi politici voler rallentare lo sviluppo della lingua. Guarda C #, che in realtà è una lingua più nuova di JS. Quando è stato introdotto C # non ha avuto eg. chiusure o funzioni di ordine superiore come JS, ma dopo più iterazioni ora ha tutto questo e inoltre funzionalità come la sintassi Linq e asincrono che gli sviluppatori JavaScript possono solo invidiare.
  • Libreria standard impoverita. Linguaggi moderni come Python, Ruby o qualsiasi cosa basata su Java o .net hanno ampie librerie standard per quasi tutto ciò di cui potresti aver bisogno. In JS non puoi nemmeno leggere un file senza librerie di terze parti. Lei parla di Regex, ma tutti i linguaggi moderni hanno questo e mille cose in più.
  • Altre lingue hanno catturato i pochi vantaggi JavaScript. Funzionalità come le chiusure e le funzioni di prima classe erano potenti rispetto a goffi linguaggi statici come Java dieci anni fa, ma linguaggi dinamici e funzionali hanno avuto a lungo queste caratteristiche, e anche Java, un linguaggio piuttosto conservatore, ha aggiunto questo in Java 8.

L'unica caratteristica che distingue veramente JavaScript dagli altri linguaggi moderni è l'ereditarietà basata sul prototipo (rispetto a quella basata su classi), e il vantaggio di questo modello è dubbio poiché tutti lo usano per emulare comunque l'ereditarietà basata sulla classe.

Semplicemente non c'è motivo di scegliere JavaScript se hai la possibilità di scegliere un'altra lingua moderna. L'unica ragione sarebbe se fosse l'unica lingua che conosci.

    
risposta data 26.06.2015 - 11:42
fonte