一种有益的桌面端编程语言,值得学习,具有跨平台能力。

5
我先说一下,我是自学的,所有的知识都是从家庭中的程序员、自己的兴趣和试错中学到的。
我目前正在阅读Aaron Hillegass的《Cocoa Programming for Mac OS X》,但我无法保持兴趣。我认为我失去兴趣的主要原因是缺乏我喜欢Javascript和PHP的主要原因,即整体可移植性,这使得在任何平台上进行开发、托管和测试成为可能(我有Windows 7、Mac OS X和Linux)。当我能够在任何地方使用它时,想出一个项目 - 因此对语言保持兴趣 - 就容易得多。
话虽如此,我的问题就像请求有关跨平台语言(Java?C++?*)的信息一样简单,或者也许是一些建议,以便让我保持对一种语言的兴趣足够长的时间,以实际开始制作功能应用程序。
编辑
为了澄清,我正在寻找的是一种语言的总体知识,而不是特定的API或工具包。从那里,我可以随着进展学习工具包、外部库和其他东西。目前的主要问题是找到一种跨平台的语言,最好是Stack Overflow社区认可的(因此在这里发布这篇文章,因为这对我来说曾经是一个非常有价值的工具,在我过去的经验中,我喜欢在帮助他人时)。

Python相对于Java有哪些优势?我的印象是(虽然我不是专家),它更像是一种补充语言,而不是独立存在的语言。 - Robert
@Robert Python是一种非常多才多艺且有趣的编程语言。例如,它具有更加表达性的语法和鸭子类型(主观)。 - Anycorn
Python 可能被认为是一种脚本语言而不是编程语言,但这并不意味着你不能用它进行一些非常棒的编程。 - Jake Wilson
Python是一种可以独立使用的编程语言,但为了实现完全功能,它可能需要其他补充。例如,我能否只用Python创建一个具备完全功能的应用程序(包括图形用户界面、保存偏好设置等)? - Robert
2
@Jakobud:你一定是用“编程语言”来指代某些非标准的东西,因为所有脚本语言都是编程语言。它们通常不像传统编译语言那样快(我称之为“系统语言”,尽管这可能不是一个标准术语)。使用脚本语言没有任何问题;你只是在以一点程序效率换取了大量程序员效率。 :-) - Donal Fellows
9个回答

4
单词“桌面”(desktop)隐含地表明应用程序应该提供超出Web解决方案所能提供的用户体验水平。如果您的情况是这样,使用跨平台语言编写应用程序将不是一个好主意。跨平台工具往往会将功能降到它们支持的所有平台中可用的最低公共分母,因此您可能还是要编写基于Web的应用程序,并获得“免费”的跨平台功能。
编写桌面应用程序时,最好按照以下顺序做出决策:
1. Web-only解决方案是否可以支持应用程序的大部分功能?
2. 针对哪个桌面平台?
3. 该平台上GUI编程的最受支持的编程语言是什么?
当您有问题#2的答案时,问题#3的答案并不太困难。
- Windows - C#和WinForms - Mac OS X - Objective-C和Cocoa - Linux - C/C++和GTK+
如果您仍然坚持使用跨平台桌面GUI应用程序,则您最好的选择仍然是Java和Swing,或者可能是SWT。

2
我并不是特别想要构建图形或处理器密集型应用程序,但性能是一个因素,尽管是较小的因素之一。我仍然认为本地桌面应用程序比在Internet Explorer中设计得同样好的产品运行得更好,不是吗? - Robert
@Robert - 性能并不是某人想要使用“本地”GUI库(在此上下文中,指OS供应商或社区支持的最受支持的GUI库)的唯一原因。桌面集成是另一个功能。这在Mac OS X中可能更相关,因为用户倾向于期望桌面应用与操作系统有紧密集成。 - adib

3

我认为Ruby是一个好主意。它与Java非常不同,但并不是完全无法理解其概念。此外,这是一种易于学习的语言。一旦你学会了Ruby,你会一直思考它。


1
我现在正在下载Ruby,就像我为Python做的那样,浏览一些介绍页面。我怀疑对于许多建议,直到变得更加熟悉之前,我个人不会真正感受到便利性或可移植性的差异。Python似乎是一个流行的替代方案,那么Ruby与Python有什么区别呢? - Robert

2
如果你想快速从想法到运行软件,我推荐使用Python。它是跨平台的、成熟的,有强大的社区支持,有大量的教程,在各个行业都经过了测试,有无数的库,最重要的是,它是一门美丽的语言。
现在,如果你想理解计算机并开发较慢但编写杀手级跨平台应用程序,则唯一的答案是C。
如果你想要学习Haskell,那么祝你好运。(开玩笑——它实际上非常优雅、精致、聪明)
顺便说一下,实际上这一切都取决于你想做什么。C很棒,但它不会帮助你在合理的时间内制作网站。Python很美丽,但我不会在它上面进行大规模的数学计算。Haskell是我还没有攻克的难题。

2
我的答案基本上是Haskell,但其他语言也值得了解。 我了解许多语言及其不足之处。
对我来说,最重要的能力如下:
- 快速开发程序 - 编译成快速运行的程序 - 平台无关 - 能够轻松阅读和理解未经记录的源代码 - 函数名和类型足以作为文档 - 没有挫败感
对于我来说,Python(像大多数语言一样)不能满足第一个能力,因为我想要没有错误的程序!在大多数语言中,开发自动意味着测试程序多次的努力。在Haskell中,我只是尝试编译...只要它编译成功,我就很确定,每个测试都肯定会显示一个错误(如果存在错误)。这意味着:要么它立即崩溃,要么它显示设计上的明显错误,要么它是无错的。我至少从2002年开始就了解Haskell,并且从来没有写过测试用例。为了测试它,交互式解释器就足够了。使我的代码编译起来比测试它更花时间。
我最后遇到的错误(我记得的唯一一个错误),是在我用Haskell编写的Diploma-Thesis(=Master-Thesis)中的NFS-Proxy中。花了很多时间才找到它,它是一个线程,在更新全局变量为“没有运行的线程”值时自我杀死,这当然是由信号量保护的。(设法以这种方式将自己打在脚上,感觉像中了彩票一样,耶。)我已经正确设计了它,改变了一半的设计,并为自动自我杀死和重新启动机制感到自豪,直到编程后的前两三个月进行第一次测试。但修正后,它作为带有文件分发的NFS-客户端和NFS-服务器无bug地工作。
其他语言:
  • C:相对平台无关,但需要使用std-libs来管理大/小端和32/64位大小。它非常接近硬件,我只知道C--比汇编更接近硬件。库应至少通过C可访问,以便相对于语言不可知。
  • C++:绝对比Java好。如果不需要垃圾收集器,则不需要垃圾收集器。 C++具有比大多数语言更多的类型安全性和错误避免设计模式(请参见Scott Meyers的书籍,http://www.aristeia.com/books.html)。
  • Java:将C++与缓慢恢复的疾病结合起来,你就会得到Java。在不需要的地方强制使用垃圾回收器,半OOP,在C的预处理器makros(或仍在恢复)中比C的类型安全性低,而不是引用指针(称为引用,仍然可以是空指针,与c ++ -references相反),因此NULL-pointer-exceptions,在哪里都有OOP设计,没有“适当的尾调用”(Java字节码设计中的史诗级失败),因此堆栈溢出异常。挫败感极高。
  • CommonLisp / Scheme:是的,那很古老。它是约50年前设计的,以证明可以以这种抽象的方式编程,以至于您看不到下面的RAM机器及其汇编程序。 ProgramCode等于Data,Procedures是Commands列表,并且您可以操作Lists,因为它们本身就是数据结构。这是所有函数编程语言的基础。自那时起,命令式语言没有多大发展,它们仍然基于if + while + for(+ goto)和变量分配,这对于不针对嵌入式系统(如微控制器)的语言来说真的很差。无论如何,古老的Lisp并不是为了编程而开发的,因此看起来非常丑陋。仍然是最容易学习但不容易掌握的语言。
  • Erlang:不错的脚本语言,易于学习,易于编写多线程(但单处理器)服务器程序。它是解释性的,即使在程序运行时也可以交换程序代码!它是功能性的,与Python一样容易。
  • Python:一种脚本语言,在许多方面取代了BASH。由于其动态类型,无法真正编译。它受到许多功能性语言的影响,因此可以比C/C ++ / Java更好地处理函数。几十年前,动态类型是快速原型设计的解决方案:如果类型正确性是在运行时而不是编译时执行的,则需要编写较少的代码,因为您不需要在代码中指定类型。
  • ECMAScript(JavaScript,Adobe ActionScript等):它们不仅具有OOP,还具有Closures,因此可以用于函数式编程。好吧,实际上不是因为函数式编程迫使使用尾调用,而ECMAScript(如Java)根本没有适当的尾调用。由于没有浏览器支持具有无限堆栈空间的程序,因此它是那些堆栈溢出异常语言之一。将适当的尾调用包含在语言定义中的提议机会很小,因为使用该新功能需要对现有的解释器和jit编译器进行
    如果你想学习一些编程语言,我建议按照以下顺序学习任何Lisp/Scheme、Python、Prolog、OCaml,然后再次学习Lisp,每种语言不超过1-3天。这些语言非常不同,将塑造你的思维方式。 至少花1周时间阅读Bjarne Stroustrup和Scott Meyers的书籍学习C++,然后再用"The Craft of Functional Programming"学习Haskell约1个月。从那时起只需学习Haskell和C++。在学习Haskell并编写自己的有关单子的教程一年后,你可以称自己为初学者。 哦,最初请阅读这篇文章:Beating the Averages 它解释了为什么最常用的编程语言不是最好的,并告诉你如何变得富有。

1

首先,你最好在问题中区分语言API/工具包

  • 一方面,有像C这样的跨平台语言(它不仅是跨平台的;而且无处不在!),但这并不能转化为编写可以在许多系统上编译和运行的GUI应用程序的能力。
  • 另一方面,有跨平台GUI API/工具包,如wxWidgets,其绑定可用于C++、pythonperl

此外,请注意学习如何在语言中编码和学习如何使用API/工具包是两回事。即使你已经知道一种语言,学习如何使用一个工具包可能需要几个月的时间。如果你已经知道一个工具包,你基本上可以在一周内掌握一种新语言,并轻松地开始使用已知的工具包编写该新语言的程序。

如果你的主要目标是学习一门新语言,我认为编写GUI应用程序并不是一个特别好的方式。在我个人看来,学习使用工具包是一项更大的工作。

相反,编写一个操作文本文件的命令行程序。在那个层面上,每种语言基本上都是跨平台的;你可以在大多数平台上找到在线免费实现大多数语言的方法。

话虽如此,如果你想编写GUI应用程序,我建议使用C++的Qt工具包。它适用于大多数平台。Google Earth就是用它编写的。

如果你想要可移植性,Objective-C和Cocoa是一个糟糕的选择。


是的,我选择学习编程的主要原因是我和女友都使用iPhone,而且App Store似乎是独立开发者赚点小钱的好方法,尽管我不指望能靠此谋生。 - Robert
根据您最近的编辑,我会更新我的问题以进行澄清。 - Robert

1

我认为Tcl是一种用于跨平台编程的合理语言。你可以仅使用该语言就能做出一些非常棒的东西(例如,它自带非常强大的事件驱动编程和异步I/O支持,使得像编写网络代码这样的事情变得非常简单),而且还有一些很好的附加包可用于GUI(Tk与ttk小部件集在OSX和Windows上看起来非常好,而Tcl是其本地语言)、数据库(你知道SQLite最初是作为Tcl包启动的吗?)以及与老旧程序的交互(Tcl的Expect包是最初也是最好的)。更重要的是,Tcl还有一个真正强大的部署技术;通过将应用程序构建成starkit,你可以轻松地将其同时提供给多个平台,或者将其直接绑定到运行时并提供一个易于维护的单文件可执行解决方案。

我认为任何语言都需要注意文件处理。问题在于这是一个平台特定细节首先泄漏的领域;即使不考虑是 / 还是 \ 的问题,Windows、OSX 和传统 Unix 都倾向于以非常不同的方式安排其系统的关键部分。虽然我认为 Tcl 在这方面也做得很好(在过少和过多之间保持平衡),但这仍然是一个可能会出错的领域。

当然,公正起见,我还必须提到 Tcl 的值模型与大多数其他语言使用的模型相当不同。特别是,它侧重于使用不可变值,并使所有类型信息完全显式化;所有可变性都集中在修改变量内容上。(实现比这更有效率,进行引用共享、类型变异和就地更新,当它不影响官方语义时,或者在写时复制时进行。但这是一个实现细节;它需要关注你的唯一方式是当你意识到你的代码比你预期的要快时,这是好的。)


0

如果你正在寻找一个强大的跨平台桌面语言,我相信JAVA是答案。然而,我也愿意学习Python比Java更好的地方。


就像我一样,这甚至从未在我的脑海中出现过,所以如果有人对Python有更多的信息,那将是太棒了。 - Robert
2
http://wiki.python.org/moin/LanguageComparisons - Anycorn
@aaa carp:这是一篇非常好的文章(我读了vs.PHP)。相比于Yuji提到的Java和Qt等替代方案,你认为它如何? - Robert
@Rob 我对这些不是很熟悉,无法发表评论,但你可以使用Python编程QT。只需尝试一下Py并查看是否喜欢它:http://docs.python.org/tutorial/introduction.html - Anycorn

0
如何使用Silverlight的XAML:使用事件、数据绑定、样式等声明性UI(是的,由于其离线浏览功能,您可以使用它构建桌面应用程序)。它已经可以在Windows、Mac、Windows Phone 7上运行,并且Linux版本正在通过Moonlight项目开发中。作为语言,您可以使用C#或F#,两者都可以在Windows上运行,并且(通过Mono)可以在Mac和Linux上运行。

3
C#不是主要用于Windows吗?我知道它可以在其他操作系统上工作,但那感觉像是折衷的做法,就像给购物车装引擎一样让人感到不好。 - Robert
把引擎安装在购物车上听起来很棒啊,为什么会是个坏主意呢? - Sayed Ibrahim Hashimi
哈哈,我想如果你建造了像http://tinyurl.com/2cfrle6这样的东西,但在我的脑海中,我想象着有人穿过Safeway,失去控制并撞到老太太。 - Robert
1
请查看 http://www.mono-project.com,C#在Linux和Mac上运行良好,并没有与Windows特定相关的东西。顺带一提,stackoverflow.com本身就是用C#编写的:p。 - Édgar Sánchez Gordón
不是要反对C#作为一种选择,但“C#特别或仅限于Windows”这种说法并不完全正确。 - eglasius

0
请不要嘲笑我说“JavaScript”时。我是认真的。每个现代浏览器都支持它,而且它完全跨平台。

我已经相当熟悉JavaScript了,但我正在寻找一些可以在桌面上运行而不需要浏览器的东西。 - Robert
3
你可以单独安装 JavaScript 解释器而不依赖于浏览器。有很多种可选。 - OTZ
那么解释器会允许它作为桌面应用程序运行,包括 GUI 吗? - Robert
@Robert 是的。看一下 XULRunner 和 Cappuccino。 - adib
2
如果有JavaScript绑定,您可以使用JavaScript在浏览器上构建GUI应用程序,例如Firefox或Chrome。如果您不想走这条路,请坚持使用Python。实际上,您不能错过Python。 - OTZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接