哪些语言具有更高的抽象级别,并且比C ++需要更少的手动内存管理?

时间:2008-09-14 03:49:07

标签: c++ programming-languages

我已经学习了一段时间的C ++,我发现它非常强大。但是,问题是抽象级别不是很多,我必须自己做内存管理。 我可以使用哪些语言使用更高级别的抽象。

26 个答案:

答案 0 :(得分:47)

Java,C#,Ruby,Python和JavaScript可能是你面前的重大选择。

JavaC#的语言差别不大。您可以从C ++中找到的最大区别是内存管理(即,当不再引用对象时,会自动释放对象)。如果您对桌面样式应用程序感兴趣,或者热衷于静态类型,您可以选择它们(您可能会根据您对Microsoft和Windows平台的感受来选择它们)。在这两种情况下,您都会发现比C ++更常用的标准库。

PythonRuby从静态类型转移到一个可以在任何对象上调用和处理的世界(如果不存在则在运行时失败)。这既是一个祝福(更少的样板代码)和一个诅咒(编译器不能再为你捕捉这些错误)。再一次,你会发现它们拥有更丰富的标准库,并且比Java / C#更高级。性能是主要的垮台,据我所知,Python比Ruby快一些。要在它们之间做出选择,如果您对Ruby on Rails框架社区的Web开发很感兴趣,那么您可能会选择Ruby,否则就选择Python。

JavaScript与C ++的区别在于它完全取消了类。简单地从其他对象克隆对象,并且可以在运行时向其添加方法和属性。非常灵活,但也很容易变成一团糟。如果您对在浏览器中运行应用程序感兴趣,那么JavaScript是唯一真正的选择,而浏览器实际上是作为一个平台进入自己的应用程序。如果你没有对浏览器做很多事情,你会发现可用的标准库相当有限,但是有很多好的框架填补了一些空白。

其他一些有趣的,但更多的利基选择

  • Smalltalk - 在Ruby和Python阵营中或多或少,并且我理解它的速度要快得多。小心虽然_我见过很多优秀的工程师学习Smalltalk并且永远不会回来;)
  • Objective-C - 当C面向对象时,C ++采用单向(静态类型),而Objective-C采用另一种方式(动态类型)。它非常受Smalltalk的启发,如果你在Mac / iPhone上,它有一个很好的标准库。在内存管理方面,与我列出的其他内容不同,它不是垃圾收集(虽然现在是Mac OS X 10.5的一个选项),但它确实有一个引用计数方案,这使得生活比手动管理内存简单得多。
  • Lisp - 我自己从来没有学过它,超出了我对小型Emacs黑客的需求。据我所知,这些图书馆在他们的日子里很不错,但是虽然这种语言仍然非常优雅,但它们却落后于时代。
  • Haskel - 如果你想完全打破对象和类,Haskel和它的功能方法是一种有趣的方式(或者如上所述,或者F#如果你在.Net土地)。基本上,你放弃循环和变量,而不是递归地做所有事情。花点时间思考一下,对大多数现实世界的应用程序来说可能并不实用,但这是一个很好的学习方法。
  • Eiffel - 我喜欢它 - 非常干净的语法,专为严肃的工程类型系统而设计。静态类型如C#和Java,以及较弱的标准库,但它会让你真正考虑语言和类库设计。
  • ActionScriptFlex - Flash的编程接口,它基于似乎是静态类型的JavaScript版本。我已经玩了一下,如果你对开发基于媒体的应用程序感兴趣,那就很光滑了。您还可以使用Flex超越浏览器并进入Air平台以构建真正的桌面应用程序。

答案 1 :(得分:26)

我想从你的问题中说你可能还没有完成对C ++的学习。如果你还在做自己的记忆管理,那么你还有很长的路要走我的朋友!

查看auto_ptr和shared_ptr - 查看Boost库。

与抽象类似 - 你有什么特别抱怨的? AFAIK对于其他强类型语言中存在的C ++并不是很多。

我知道这不能回答你的问题 - 你想要向前迈进,但C ++是你从未真正停止学习的事情之一。如果你觉得无聊,可以短暂地进行模板和模板元编程......

答案 2 :(得分:18)

到目前为止,我看到了很多很棒的建议。但是,我认为缺少了一些东西,汇编程序。

为什么要学习汇编语言?

  • 这并不像你想象的那么困难。汇编语言的范围远远小于许多现代语言,你需要了解一些技巧才能理解它,但它并不复杂。
  • 它拓宽了您的知识基础。了解基本知识几乎总是有益的,即使在高水平工作时也是如此。
  • 调试时非常有用。特别是在没有源代码的情况下调试本机代码,从学习汇编程序中获得的知识可以增强您在这些情况下实现跨越式调试的能力。
  • 它为您提供了更多选择。当需要汇编代码的罕见情况出现时,您将不会无助。
  • 这对你的简历很有帮助。它表明你学到的只是保持现有工作所需的最低限度,它表现出对基础知识的好奇心,它会让你进入另一类程序员,这个班级往往更有经验,更有能力。
  • 这很酷。

一些汇编语言资源:

答案 3 :(得分:5)

尝试像Haskell这样非常陌生的东西会让你以不同的方式思考。它还可以帮助您递归思考。 C ++有递归,但它渗透到函数式语言的更多部分。

答案 4 :(得分:4)

ditto Lisp,..或scheme

即使你没有使用它,它也很方便。在学习之后,我只是真的得到了模板编程。

另一个是序言。它让你处于一种非顺序的心态。

答案 5 :(得分:3)

如果您在Microsoft生态系统中,请使用C#。

Python和Ruby似乎在Linux / Unix / etc空间中具有最大的吸引力。

ObjectiveC在Macintosh和iPhone上占主导地位。最新的MacOS为框架的一个子集实现了垃圾收集,但是要使用其余部分,您必须自己进行资源管理。

您可以学习Java,因为它也可以进行垃圾收集,但是您需要熟悉的框架数量才能成为高效的Java开发人员,这是令人生畏的。

答案 6 :(得分:3)

如果您对C ++语法和样式感到满意,您可能会发现D是一种有趣的语言。或者如果你想分支出来,Python,C#,Java,Ruby中的任何一个都是很好的选择。

答案 7 :(得分:2)

好吧,如果你正在寻找一个非常高水平的抽象和内存管理,那么我会说lisp将是一个理想的候选人。我现在慢慢地learning,这是我用新语言最有趣的。

说过Python或Ruby可能是表达性和流行度之间更好的折衷方案。如果您正在寻找Web应用程序,Python的Django框架是更好的RAD框架之一。

答案 8 :(得分:2)

方案。

The Little SchemerStructure and Interpretation of Computer Program会以奇怪而奇妙的方式扩展你的思维。

DrScheme对于初学者来说是一个很好的IDE。 The Scheme Programming Language提供了一个很好的免费参考。

答案 9 :(得分:2)

我会说这取决于你想要尝试的编程类型。如果你想留在OOP方面,学习PythonRuby,两种语言都提供了一种简单的方法来创建绑定以使用脚本中的C ++代码(出于效率原因)。

如果你需要另一种编程方法,可以学习像Lisp或Haskell这样的“功能”语言。

如果您需要在C ++应用程序中包含快速且小巧的脚本语言,请尝试Lua

最后但并非最不重要的是,如果您了解Java并且讨厌它,您可以尝试Scala,这是一种可以将Java类与Scala代码混合的语言,非常有趣。

答案 10 :(得分:1)

如果你想抽象内存管理,我会立即想到Java。

答案 11 :(得分:1)

为什么不学习 Qt ?它是一个伟大的应用程序开发框架,可在所有平台甚至移动设备上使用!

答案 12 :(得分:1)

Qt

答案 13 :(得分:1)

我认为学习编程语言没有预定义的路线。您可以根据自己的工作需要,学术研究,娱乐等方式学习下一个课程。有很多选择。

在C ++中感觉很舒服,你可以去学习一些程序集。这是一个黑暗的艺术,但是当你遇到一些艰难的调试会话时,你会很高兴。

就更多抽象而言,Smalltalk非常有趣,OOP纯和100%动态(调试是一件令人愉快的事情,而不是静态类型的语言)。 Dolphin Smalltalk是Windows的一个很好的实现,即使是免费的社区版本也可以提供足够的功能。在多平台Smalltalk VM中,请选择Visualworks或Squeak。 Visualworks非常稳定,并附带大量文档。

今天,许多领域都在使用Python。除了基本的语法和语义之外,我对Python一无所知,但是今天它对于许多工作都是必需的。

Java,是Java。有趣的是Java从来没有抓住我。您可能会对Java感兴趣。在这里询问使用C ++或其他OOP语言的优势。

对于Web开发,请使用Javascript,特别是考虑到AJAX wave。那些日子越来越有趣了。我们已经谈到了Smalltalk,好吧,Seaside是一个令人惊叹的Web开发框架。它起作用(至少我试过)Squeak / Visualworks ......它是美丽的。

嗯,还有很多东西可以让你动手:Scheme,LISP,Ruby,Lua,Bash(!),Perl(呃),Haskell ......试一试,玩得开心!

答案 14 :(得分:1)

我建议学习数据库设计和查询语言,如SQL。

您可以从Microsoft Access等桌面工具开始,也可以使用免费的SQL Server Express或Postgre或MySQL。

答案 15 :(得分:1)

尝试c#多:)

答案 16 :(得分:0)

这取决于你想做什么。如果您有一些您有兴趣完成的特定任务,那么请查看最适合这些类型任务的语言。学习语言的最佳方法是实际使用它。

答案 17 :(得分:0)

我建议您选择提供以下4种功能的语言,而不是建议使用特定语言:

  1. 自动内存管理
  2. 反射/反思
  3. 声明/功能构造(例如lambda函数)
  4. 鸭子打字
  5. 这里的想法是扩展您的编程视角,以包含C ++语言不能为您提供的概念。

答案 18 :(得分:0)

我会说开始使用Python。它具有更高的抽象级别,它教你缩进和制作“漂亮”代码的重要性。并不是说“漂亮”非常重要,但它会让代码的未来维护者更加快乐:)

那里有很多示例代码,如果你进入Linux,那里有各种各样的发行版,他们拥有基于语言的所有(或大多数)工具。如果您喜欢深入研究如何管理操作系统(大多数程序员都这样做),那么这是一个良好的开端。在我得到火焰之前,我说管理,而不是实际内核的东西,你最需要C,你应该覆盖。

另一方面,深入了解C方面,忽略OO的东西并学习函数式编程可能会很好。如果你沿着这条路前进,我还建议从基本的汇编语言开始,就像上面提到的一个帖子一样。也许HLA(Randall Hyde的高级大会,他写了一本名为Art of Assembly Language Programming的好书)是一个好的开始。你要么学会热爱记忆管理,要么为你的余生而讨厌。很高兴知道如果你想开始编程事业:)

但是如果你想从编程中找到工作,那么如果你知道自己在做什么,那么Java和J2EE就是一个简单的赚钱机器。恕我直言,它很快就很无聊。

答案 19 :(得分:0)

我推荐python,因为它不仅是一种性感的语言,而且使用非常广泛,并且很容易通过Boost.Python与C ++集成。

但正如Thomi所说,在C ++中有很多值得探索的东西,在Boost库的帮助下,它的开发变得非常容易。

答案 20 :(得分:0)

由于您已经进入C ++,下一步将通过managed C++或C ++的托管扩展来学习.Net。这将使您在.Net框架的大世界中迈出一步。一旦您理解该框架使学习C#,VB.Net等其他.Net语言变得更加舒适。

MC ++擅长的领域之一,在.NET语言中实际上是独一无二的,是能够使用现有的非托管(C ++)应用程序,使用/ clr开关重新编译它,拥有它生成MSIL然后在CLR下运行。这个非凡的壮举恰如其分地被称为“It Just Works(IJW)!”有一些限制,但在大多数情况下,应用程序将运行。 C ++代码可以包含老式的printf语句,MFC,ATL甚至模板!

答案 21 :(得分:0)

就个人而言,我一直用Java,Python,C / ++编程,我最喜欢的是python。虽然C ++可以完成Python可以做的所有事情,但是我编写了一个包含大约10行的Python程序,在C ++中大约需要50行。所以,故事的道德,使用python。

答案 22 :(得分:0)

如果您还没有,请尝试使用脚本语言。它应该改变你的工作方式和认为。希望,以一种很好的方式:)

答案 23 :(得分:0)

我必须为Perl单独回答。虽然Python在功能上大致相当,并且被认为更加干净和现代,但Perl拥有自己的优雅 - 纯粹实用主义的优雅。它还拥有真正伟大的图书馆支持。看看Perl,将你的大脑扩展到与Haskel相反的方向:)(尽管Perl的爱好者声称它可以用于函数式编程)。

答案 24 :(得分:0)

Clojure非常值得探索,因为它符合您的两个标准:

  • 它非常注重使用更高级别的抽象编程。见例如此视频:Clojure: The Art of Abstraction
  • 它具有自动内存管理/垃圾收集功能(通过JVM,它具有一些世界上最好的GC实现)

我将仅使用一个抽象给出一些示例:在Clojure中,您可以通过sequence abstraction操纵几乎任何数据结构。

;; treat a vector as a sequence and reverse it
(reverse [1 2 3 4 5])
=> (5 4 3 2 1)

;; Take 10 items from a infinite sequence
(take 10 (range))
=> (0 1 2 3 4 5 6 7 8 9)

;; Treat a String as a sequence of characters, calculate the frequencies
(frequencies "abracadabra")
=> {\a 5, \b 2, \r 2, \c 1, \d 1}

;; Define an infinite lazy sequence of fibonacci numbers, take the first 10
(def fibs (concat [0 1] (lazy-seq (map + fibs (rest fibs)))))
(take 10 fibs)
=> (0 1 1 2 3 5 8 13 21 34)

答案 25 :(得分:0)

Rust

  • 在语法上类似于 C++
  • 专为性能和安全而设计,尤其是安全并发