为什么不将JavaScript用于经典应用程序开发(编译软件)?[关闭]


14

在使用JavaScript进行Web开发的这些年中,我得出的结论是,它是一种不可思议的强大语言,您可以用它来做令人惊奇的事情。

它提供了丰富的功能,例如:

  • 动态打字
  • 一流的功能
  • 嵌套函数
  • 关闭
  • 作为方法起作用
  • 作为对象构造函数
  • 基于原型
  • 基于对象(几乎所有内容都是对象)
  • 正则表达式
  • 数组和对象文字

在我看来,使用这种语言几乎可以完成所有事情,您还可以模拟OO编程,因为它提供了极大的自由度并提供了许多不同的编码样式。

通过更多面向软件的自定义功能(I / O,文件系统,输入设备等),我认为使用它来开发应用程序将非常有用。

尽管据我所知,它仅在Web开发或现有软件中仅用作脚本语言。

直到最近,也许要感谢V8引擎,它已被更多地用于其他类型的任务(例如,请参见node.js)。

为什么到现在为止仅将其降级为仅用于Web开发?是什么使它远离软件开发?


8
如果Web开发不是(特例)软件的开发,它究竟是那么......?
彼得Török

@PéterTörök:我想您明白了。我的意思是,到目前为止,软件仅将其用作脚本语言来增强功能。从未真正使用它来为OS编写软件应用程序。
Jose Faeti

4
我认为动态类型是一个巨大的缺点,而且我也想摆脱空值。
乔纳斯(Jonas)

2
您的意思是“经典应用程序开发”,而不是“软件开发”,对吗?最好相应地更改标题。
布朗

2
记录窗口8的@JoseFaeti允许您在HTML5&JS中进行一些开发
Raynos

Answers:


14

最近,node.js推动了服务器端的发展。因此,现在可以编写JavaScript进行开发了。

确实如此。历史上,它没有被用作开发语言。但是,嘿,甚至在客户端环境(用户代理)中编写脚本也是一种发展。是不是

我在许多博客中听到和阅读的主要原因是,直到最近几年人们才知道它的功能和独特性。造成这种情况的原因可能是其他语言的工作做得恰到好处,却从未有人想到过并行制作某些东西。


一定是这样,我看起来现在实际上正在发生一些事情:)
Jose Faeti 2011年

15

这里

请注意,我将所有论据都基于实际用例。不能用真实,完整,有趣,有用的应用程序中的使用示例备份的反参数无效。我看过其他所有人都有的“语言演示”,也看过博客文章,详细介绍了原型和动态类型如何使一些琐碎的小例子比C#短几行,但是这些根本不相关您遇到的问题是编写真实 代码,而不是微型演示和玩具。所以这是我对JS的理解:

a)魔术“ this”。就是这样,除非是那样。JavaScript促使您在各处使用匿名函数,除非它们总是最终会丢失'this'变量的正确上下文,因此您最终会在各处使用诸如“ var _this = this”这样的愚蠢代码,然后再使用它在您的回调或其他函数中。有时候,我发誓我设法编写的不使用重命名的“ this”的函数的数量实际上少于使用的函数的数量。

b)1 +“ 1”-1 =10。此外,“ 1” + 0 =“ 10”。是的,这实际上对我们的应用程序造成了错误,由于另一个应用程序中的错误,本来应该是数字的数据从JSON文件作为字符串加载了,结果并不理想。我们所有的加载代码都必须进行更新,以在整个地方添加大量类型转换。当我需要某些东西作为数字时,我真的非常想让它成为数字,而不是字符串或对象或null或其他任何东西。Lua在大多数方面与JavaScript非常相似,它只是由于没有足够的延迟才能使用相同的运算符进行加法和字符串连接而解决了该问题。

c)默认情况下为全局变量。因此,即使您认为动态类型化只是“更轻松”,因为您不必考虑变量声明,JavaScript还是通过在整个位置将“ var”放在新标识符的前面,从而将该参数抛出了窗外。 。然后,如果您忘记了,它会默默地将您拧紧。

d)原型而不是类。很少有大型的现实世界JavaScript应用程序不插入自己的类系统来解决大型应用程序体系结构中原型固有的无用性。那些相同的应用程序很少使用原型来扩展基本的JavaScript类型,这仅仅是因为JS的设计如此糟糕,以至于它附带的两个有趣的内置类型都缺少您期望它们具有的一半功能。

e)无法创建按值传递类型。实际上,除了C ++ / D之外,几乎所有语言都经常出现此问题。对于那些使用JavaScript编写WebGL应用程序的人,请查看所有用于JavaScript的线性代数库。在3D应用程序中,向量几乎比标量更经常使用。想象一下,如果应用程序中的每个整数都是通过引用传递的,那么“ a = 1; b = a; b ++”使a和b都等于2。每三个成分向量都是一个完整的完整对象。它们是通过引用传递的(实际上,到目前为止,我们的WebGL游戏中几乎有一半的错误源)。它们大量存在,被堆分配并被垃圾回收,这给GC带来了巨大压力,即使在简单的WebGL游戏中,GC也会造成GC暂停,除非开发人员跳过非常复杂的圈,以避免在逻辑上创建新矢量的所有地方创建新矢量。您不能有运算符重载,因此您有非常大而丑陋的表达式来执行基本操作。访问单个组件很慢。这些对象不是本机打包的,因此将其压入顶点缓冲区的速度非常之慢,除非您将它们实现为Float32Array实例,否则会使当前V8和SpiderMonkey的优化器中的废话弄混。我是否提到它们已通过引用传递?访问单个组件很慢。这些对象不是本机打包的,因此将其压入顶点缓冲区的速度非常之慢,除非您将它们实现为Float32Array实例,否则会使当前V8和SpiderMonkey的优化器中的废话弄混。我是否提到它们已通过引用传递?访问单个组件很慢。这些对象不是本机打包的,因此将其压入顶点缓冲区的速度非常之慢,除非您将它们实现为Float32Array实例,否则会使当前V8和SpiderMonkey的优化器中的废话弄混。我是否提到它们已通过引用传递?

f)没有内置的包含或不需要功能。认真地,仍然。存在第三方库,但几乎所有第三方库都存在某种或多种错误,至少在Chrome中,这是一个令人困惑的缓存问题,这使得进行实际开发变得更加困难。

g)动态打字。是的,我愿意提出这一论点。您会在停止编写小型Web应用程序或网页并开始编写大型应用程序的那一刻开始注意到它,而实际上您的数据的持久性要比单击一次鼠标或请求/响应周期长:将错误的对象类型添加到数组,以便稍后处理,并通过与实际错误所在完全不同的代码段中的丢失方法或成员而导致崩溃。娱乐时间。是的,Java使静态类型看起来很邪恶。不,Java / C#/ C ++不是唯一的静态类型输入方法。类型推断,隐式接口绑定等为您提供了动态类型化的所有“易于处理且无需击键”的优点,而没有所有错误。实际上,第二流行的Web语言(ActionScript 3)是静态类型的,尽管与JS / ECMAScript相同。顺便说一句,我从Fedora桌面上的Python应用程序崩溃比从C / C ++应用程序得到的崩溃更多(实际上,考虑到现在,我的桌面崩溃的C / C ++应用程序都没有)。缺少成员例外==如此容易开发和维护应用程序,对吗?

h)速度。是的,大量超级坏蛋开发人员在语言运行时中付出了可笑的巨大努力,以使JS的速度几乎是一个大学三年级学生可以在少数几种语言中编写的低级C编译器的一半。几个月。而且,就基本语言限制而言,LuaJIT与JS在同一条船上,但是无论如何,它都比每个JavaScript实现都做得更好。不了解V8中的所有JS优化实际上是做什么的人就像声称JS可以在速度方面做得很棒,但是事实是,所有这些优化基本上只是“非常努力地分析代码以找出变量的类型,然后像稍微延迟的静态类型一样对其进行编译。语言的编译器会做到这一点。” 哦,这里有跟踪,但是跟踪也适用于静态类型的语言(由于生成的机器代码中不需要类型保护,因此跟踪效果更好)。实际上,JS并没有为JS发明过任何一种whizbang优化。大多数都来自研究型JVM(Java是邪恶的!)或经典的OOP语言(原型很棒!)。

i)甚至没有IntelliSense。是否想查看您在文本编辑器中foo.js的第187行上存在的变量上存在哪些方法?太糟糕了。遍历代码,直到弄清楚它的初始化位置,然后遍历代码以查找其原型所具有的内容。然后希望没有代码可以动态地改变背后的原型。实际上,只需在浏览器中运行它并设置断点,因为对于任何比JavaScript辩护者用来美化JavaScript的易用性的toy_web_app.html网站更大的代码库,基本上都不可能以其他任何方式找到有关该值的任何有用信息。一些代码编辑器确实努力地做得更好,并且在真正简单的情况下有时甚至几乎是一次成功。

j)没有优势。与其他动态类型的语言相比,JavaScript甚至都不是特别的。它根本无法执行Lua,Python,Ruby等也无法完成的任何有趣的事情。所有JS实现都不比LuaJIT或PyPy或其他动态的其他高级JIT-ing实现快语言。与其他常用语言相比,JS没有优势。哦,除了它在没有插件的Web浏览器中本机运行。这是世界上如此受欢迎的唯一原因。实际上,这是事件发生的唯一原因存在。如果10年前的某个人只是想:“哎呀,让我们在浏览器中放一个已有的设计良好和完善的语言,让其他人也去做,而不是让每个人都使用NetScape提出的这个愚蠢的小技巧。 ”,今天的网络看起来将有很大的不同(更好)。试想一下,如果Chrome将Python作为受支持的语言放到Chrome中,那么未来将会如何。或实际上,可以想象一下:Google将C / C ++作为受支持的语言放到Chrome中(http://code.google.com/p/nativeclient/)。


这是一个非常有趣的帖子。我很好奇看到他的用例构成了他的论点的基础。我不同意他的观点,但是近十年来我一直在开发公司规模的JS应用程序,并且没有经历过他提到的某些事情(特别是他关于“魔术”的第一点)。根据我自己的经验,反对javascript的论点(如本文中的论点)往往是由具有大量传统oop背景的人提出的……在这种情况下,我会理解他的困惑。
JavaScript先生2012年

有趣的是,在2016年,该语言的发展已完全淘汰了答案。
Stephan Bijzitter,

@先生。JavaScript嗨。您是否知道一系列专注于解决实际问题示例的教程,而不仅仅是探索JavaScript及其功能和机制?我对关键字搜索没有任何运气。例如,我没有查看详细的教程链接及其数百万个示例和功能,而是在其中找到有关如何制作GUI应用程序来管理某些保险系统,医生,学校或医疗机构运营部分的小型教程的资料库。超市?谢谢
约书亚

12

为什么?

JavaScript是最容易被误解的语言

我们当时处于黑暗时代,但仍然让一般开发社区都接受JavaScript是一种功能强大且用途广泛的语言。它根本不是主流。

最近的唯一进步是node.js变得流行起来,人们开始接受javascript还有其他用途。

我一直在关注Windows 8的JS&HTML5开发,.NET社区的反应是“亲爱的上帝,为什么?”。

事实很简单,大多数非Web开发人员仍然将JavaScript视为一种玩具语言,用于使这些内容在浏览器中滚动。

不可否认,JavaScript不符合“现代开发实践”。对我来说,JavaScript仍然是我用vim破解的一种黑客语言,而互联网是我的文档。没有IDE,没有开发工具,没有自动完成或“智能”,没有单击和拖动GUI。

在Java和.NET开发人员的世界中,他们被束缚在其GUI和IDE上,因此无法在vim中进行编程。


1
除了“没有IDE,没有开发工具,没有自动完成或“智能”,没有单击和拖动GUI之外”,我与您一样。实际上,您可以使用许多各种IDE获得所有功能,例如,我使用Visual Studio,这真是太好了。
Jose Faeti 2011年

1
@JoseFaeti对不起,Visual Studio不是javascript IDE。我在vim中比在VS2010中更快。这意味着VS2010是一个泄漏的JS IDE。
雷诺斯2011年

2
@Raynos,“我在vim中的速度要比VS2010快。这意味着VS2010是一个泄漏的JS IDE。” -也许这只是意味着您不了解VS和vim。
彼得Török

2
绝对不是,但我不会在Silverlight中构建RIA前端,因为我喜欢Resharper和LINQ或带有薄jQuery层的ASP.Net MVC应用程序,因为当手边有丰富的客户端Javascript语言时,它还是.Net友好的更适合这份工作。
2011年

1
只是在我的声音中加入了我的声音,说明存在JavaScript IDE。坦率地说是愚蠢的。您可能不喜欢IDE,它们可能并不完美,但是它们仍然是IDE。还是我在使用JS时就在想像VS的智能和代码完成功能?
伊恩·纽森

10

您的列表不包含任何有关将文件写入系统的内容,这是软件开发的重要组成部分。

人们不会考虑使用JS来构建应用程序,因为它实际上是Web的脚本语言,您将始终使用正确的工具来完成工作。

在Java / .NET / C / C ++中进行微不足道的操作时,为什么要写英亩的JS来写出文件?

话虽如此,正如其他人提到的那样,node.js及其库使服务器端操作变得微不足道,并且随着node.js的流行,学习它将成为CV的一项技能,因为您将能够维护/扩展/构建应用程序。


1
+1完全忘记了stdio库是多么重要。
雷诺斯2011年

1
正如您所说,对于文件系统,我们现在有本地存储API,尽管您不会指望它们具有很高的持久性。但是,不必直接写入文件系统,您的javascript可能会对服务器(以LOLCode或C或JS本身编写)进行静态调用,该服务器将写入某种形式的存储。
sa93 2011年

1
在服务器端。NodeJS文件API就像C一样琐碎... <-如果您在C中正确执行IO(非阻塞)。同样,使用任何理智的包装器的Ajax调用都可以是2-3行。MyLib.Ajax.post('/ persistence / Something',{data:blahObj})
sa93 2011年

@ sa93请不要将浏览器主机环境与JavaScript混淆。localStorage是浏览器中的主机API。ES5规范中未定义它。
雷诺斯2011年

1
@reinierpost Writing files to the file system has been replaced with HTTP POST.如果您正在编写用于处理帖子的API,则不会。
StuperUser 2015年

5

与JavaScript相比,大多数常用语言功能更强大,设计更好。您提到的所有功能均受其他动态语言(如Python或Ruby)支持,这些语言总体上设计得更好。而且您提到的某些功能无论如何都不一定是理想的-如果您可以选择的话,许多功能会认为使用类型推断的静态类型优于动态类型。

我不是说这是diss JavaScript。开发Web时,我非常喜欢使用JS。但客观地看,与其他语言相比,JS有许多缺点:

  • 众多无法修复的缺陷。最初开发JS时犯了许多错误。无需在这里枚举它们,它们有据可查。所有语言在初始设计中都有错误,这些错误随后得以修复。与JS的不同之处在于,该语言的开发和发布速度非常快,而且由于浏览器向后兼容的要求,这些错误永远无法修复。
  • 引入改进和新功能的过程非常缓慢。由于所有浏览器供应商都必须同意,甚至出于各种政治原因也可能希望减慢该语言的开发。看一下C#,它实际上是比JS更新的语言。当C#引入时,它没有例如。闭包或更高阶的函数(例如JS),但经过多次迭代后,它现在具有了所有这些功能,此外还具有Linq和异步语法等功能,JavaScript开发人员只能羡慕它。
  • 贫困的标准库。诸如Python,Ruby或任何基于Java或.net的现代语言都具有广泛的标准库,几乎可以满足您的所有需求。在JS中,没有第三方库甚至无法读取文件。您提到过正则表达式,但是所有现代语言都提供了正则表达式,还有上千种。
  • 其他语言已经赶上了JavaScript的一些优势。与十年前的Java这样笨拙的静态语言相比,闭包和一流函数之类的功能很强大,但是动态和功能性语言早就具有这些功能,甚至Java(一种相当保守的语言)也已在Java 8中添加了这些功能。

真正使JavaScript与其他现代语言不同的唯一功能是基于原型的继承(而不是基于类的继承),并且该模型的优点是可疑的,因为每个人无论如何都只是使用它来模仿基于类的继承。

如果您可以选择其他现代语言,则根本没有理由选择JavaScript。唯一的原因是,如果这是您唯一知道的语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.