我学习 C++ 已经有一段时间了,我觉得它非常强大。但是,问题是抽象级别不多,我必须自己做内存管理。我可以使用哪些语言使用更高级别的抽象。
26 回答
Java、C#、Ruby、Python 和 JavaScript 可能是摆在您面前的重大选择。
Java和C#并不是完全不同的语言。您会发现与 C++ 的最大区别在于内存管理(即对象在不再被引用时会自动释放)。如果您对桌面风格的应用程序感兴趣或热衷于静态类型,您会选择这些(您可能会根据您对 Microsoft 和 Windows 平台的感觉在它们之间进行选择)。在这两种情况下,您都会发现比您在 C++ 中习惯的要丰富得多的标准库。
Python和Ruby从静态类型化迈出了一步,进入了一个可以在任何对象上调用和方法的世界(如果不存在,则在运行时失败)。这既是一种祝福(少得多的样板代码)也是一种诅咒(编译器无法再为您捕获这些错误)。再一次,您会发现它们拥有更丰富的标准库,并且比 Java / C# 更高级别。性能是主要的缺点,据我了解,Python 比 Ruby 快一些。要在它们之间进行选择,如果您对 Ruby on Rails 框架社区的 Web 开发感兴趣,您可能会选择 Ruby,否则选择 Python。
JavaScript与 C++ 的更多不同之处在于它完全取消了类。对象只是从其他对象中克隆出来的,并且可以在运行时向它们添加方法和属性。非常灵活,但也很容易弄得一团糟。如果您对在浏览器中运行应用程序感兴趣,那么 JavaScript 是唯一真正的选择,浏览器实际上已经成为一个平台。如果您不经常使用浏览器,您会发现可用的标准库相当有限,但是有很多好的框架可以填补一些空白。
其他一些有趣的,虽然更多的利基选择是
- Smalltalk - 或多或少属于 Ruby 和 Python 阵营,据我所知,速度要快得多。不过要小心 _ 我已经看到很多优秀的工程师学习了 Smalltalk 并且再也没有回来;)
- Objective-C - 当 C 转向面向对象时,C++ 采用一种方式(静态类型),而 Objective-C 采用另一种方式(动态类型)。如果您在 Mac / iPhone 领域,它非常受 Smalltalk 启发,并且有一个很好的标准库。在内存管理方面,与我列出的所有其他内容不同,它不是垃圾收集(尽管现在这是 Mac OS X 10.5 上的一个选项),但它确实有一个引用计数方案,这使得生活比手动管理内存要简单得多。
- Lisp - 我从来没有自己学过它,超出了我对小型 Emacs 黑客的需要。据我了解,图书馆在当时很不错,但尽管语言仍然非常优雅,但它们已经落后于时代了。
- Haskel - 如果你想完全摆脱对象和类,Haskel 和它的函数式方法是一个有趣的方法(或者上面的 Lisp,或者F#,如果你在 .Net 领域)。基本上,你放弃了循环和变量,转而支持递归地做所有事情。需要一些时间来思考,并且对于大多数现实世界的应用程序可能不实用,但它是一个很好的学习方法。
- Eiffel - 我喜欢它 - 非常干净的语法,专为严肃的工程类型系统而设计。像 C# 和 Java 这样的静态类型,以及较弱的标准库,但它会让你真正考虑语言和类库设计。
- ActionScript和Flex - Flash 的编程接口,它基于似乎是静态类型的 JavaScript 版本。我已经玩过它了,如果您对开发基于媒体的应用程序感兴趣,它会非常巧妙。您还可以使用 Flex 超越浏览器并进入Air平台,以构建真正的桌面应用程序。
我想说,从你的问题来看,你可能还没有完成对 C++ 的学习。如果你还在做自己的内存管理,那么你还有很长的路要走,我的朋友!
查看 auto_ptr 和 shared_ptr - 查看 Boost 库。
抽象也是如此——你具体抱怨什么?AFAIK 对于其他强类型语言中存在的 C++,没有什么不能做的。
我知道这并不能回答你的问题——你想继续前进,但 C++ 是你永远不会真正停止学习的东西之一。如果您觉得无聊,不妨试一试模板和模板元编程……
到目前为止,我看到了很多很棒的建议。但是,我认为缺少一些东西,汇编程序。
为什么要学习汇编语言?
- 这并不像你想象的那么难。汇编语言的范围比许多现代语言小得多,您需要了解一些技巧才能使其有意义,但并不那么复杂。
- 它拓宽了你的知识基础。了解基本原理几乎总是有益的,即使在高水平工作时也是如此。
- 它在调试时非常有用。尤其是在没有源代码的情况下调试本机代码,您从学习汇编程序中获得的知识将大大提高您在这些情况下进行调试的能力。
- 它为您提供了更多选择。当出现需要汇编代码的罕见情况时,您将不会束手无策。
- 对你的简历有好处。它表明你学到的不仅仅是保持当前工作所需的最低限度的知识,它表现出对基础知识的好奇心,它让你进入了一个不同的程序员类别,而且这个类别往往更有经验,更有能力。
- 这简直太酷了。
一些汇编语言资源:
- Sandpile.org(汇编语言/处理器架构参考)
- Gavin's Guide to 80x86 Assembly(一个不错的在线教程)
- 基于 Intel 的计算机的汇编语言 (5e)(一本不错的 x86 汇编教科书)
尝试像 Haskell 这样真正陌生的东西会让你以不同的方式思考。它还可以帮助您进行递归思考。C++ 具有递归,但它渗透到函数式语言的更多部分。
同上 Lisp,.. 或方案
即使你从不使用它,它也很方便。我是在学习模板编程后才真正得到模板编程的。
另一个是序言。它使您处于非顺序的心态。
如果您对 C++ 语法和风格感到满意,您可能会发现D是一种有趣的语言。或者,如果你想扩展,Python、C#、Java、Ruby 中的任何一个都是很好的选择。
如果您在 Microsoft 生态系统中,请使用 C#。
Python 和 Ruby 似乎在 Linux/Unix/etc 领域具有最大的吸引力。
ObjectiveC 在 Macintosh 和 iPhone 上占主导地位。最新的 MacOS 为框架的子集实现了垃圾收集,但要使用其余部分,您必须自己进行资源管理。
您可以学习 Java,因为它也可以进行垃圾收集,但是要成为一名高效的 Java 开发人员,您需要熟悉的框架数量令人望而生畏。
好吧,如果您正在寻找非常高级别的抽象和内存管理,那么我会说 lisp 将是一个理想的候选人。我现在正在慢慢地学习它,这是我用一门新语言获得的最大乐趣。
话虽如此,Python 或 Ruby 可能是表现力和流行度之间更好的折衷方案。如果您正在寻找 Web 应用程序的东西,Python 的 Django 框架是更好的 RAD 框架之一。
I suggest learning database design and a query language such as SQL.
You can start with a desktop tool like Microsoft Access or use the free SQL Server Express or Postgre or MySQL.
多尝试 C# :)
Clojure 非常值得探索,因为它符合您的两个标准:
- 它非常强调具有更高级别抽象的编程。例如看这个视频:Clojure:抽象的艺术
- 它具有自动内存管理/垃圾收集(通过 JVM,它拥有一些世界上最好的 GC 实现)
我将仅使用一种抽象来给出一些示例:在 Clojure 中,您可以通过序列抽象来操作几乎任何数据结构。
;; 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)
如果您想抽象内存管理,Java 会立即出现在我的脑海中。
好吧,我认为学习编程语言没有预定义的路线。你可以根据你的工作需求、学术研究、只是为了好玩等来学习你的下一个语言。有很多选择。
如果您对 C++ 感到满意,您可以继续学习一些汇编。这是一门黑暗的艺术,但当你遇到一些困难的调试会话时你会很高兴。
就更抽象而言,Smalltalk 非常有趣,纯 OOP 且 100% 动态(调试是一件令人愉快的事情,这不是静态类型语言)。Dolphin Smalltalk 是 Windows 的一个很好的实现,即使是免费的社区版也足够玩。在多平台 Smalltalk VM 中,选择 Visualworks 或 Squeak。Visualworks 非常稳定,并附带大量文档。
今天,Python 被用于许多领域。除了基本的语法和语义外,我对 Python 一无所知,但今天许多工作都需要它。
Java 它是,Java。有趣的是,Java 从未追上我。不过,您可能会对 Java 感兴趣。在这里询问使用它相对于 C++ 或其他 OOP 语言的优势。
对于 Web 开发,请使用 Javascript,特别是考虑 AJAX 浪潮。那些日子越来越有趣了。我们已经讨论过 Smalltalk,好吧,Seaside 是一个了不起的 Web 开发框架。它有效(至少我试过)Squeak / Visualworks ......它很漂亮。
好吧,还有很多东西可以让您上手:Scheme、LISP、Ruby、Lua、Bash(!)、Perl(呃)、Haskell ......全部尝试一下,玩得开心!
为什么不学习Qt?它是一个伟大的应用程序开发框架,可用于所有平台甚至移动设备!
由于您已经进入 C++,下一步将是通过托管 C++或 C++ 的托管扩展来学习 .Net。这将使您在 .Net 框架的广阔世界中迈出一步。一旦您了解了该框架,它就会变得更轻松学习其他 .Net 语言,如 C#、VB.Net 等。
MC++ 擅长的领域之一,事实上在 .NET 语言中是独一无二的,它能够获取现有的非托管 (C++) 应用程序,使用 /clr 开关重新编译它,让它生成 MSIL,然后在CLR。这一非凡的壮举被恰当地称为“It Just Works (IJW)!” 有一些限制,但在大多数情况下,应用程序只会运行。C++ 代码可以由老式的 printf 语句、MFC、ATL 甚至模板组成!
我推荐 python,因为它不仅是一门性感的语言,而且使用非常广泛,并且很容易通过Boost.Python与 C++ 集成。
但正如 Thomi 所说,在 C++ 中有很多东西需要探索,并且在 Boost 库的帮助下,它变得非常容易开发。
我会说开始使用 Python。它具有更高的抽象级别,它教会您缩进和制作“漂亮”代码的重要性。并不是说“漂亮”很重要,但它会让你的代码的未来维护者更快乐:)
那里有很多示例代码,如果您使用 Linux,那么那里有各种发行版,它们拥有所有(或大部分)基于该语言的工具。如果您喜欢深入了解管理操作系统的工作原理(大多数程序员都会这样做),那么这是一个好的开始。在我发火之前,我说的是管理,而不是你最需要 C 的实际内核内容,你应该把它涵盖在内。
另一方面,深入研究 C 方面的东西,忽略 OO 的东西并学习函数式编程可能会很好。如果您沿着这条路走下去,我还建议您从基本的汇编语言开始,就像上面的一篇文章所建议的那样。也许 HLA(Randall Hyde 的 High-Level Assembly,他写了一本名为 Art of Assembly Language Programming 的好书)是一个好的开始。你要么学会爱内存管理,要么在你的余生中讨厌它。如果您想开始编程生涯,很高兴知道:)
但是,如果您想通过编程找到一份工作,如果您知道自己在做什么,那么 Java 和 J2EE 是一个容易赚钱的工具。恕我直言,它很快就会变得无聊。
我建议您选择提供以下 4 个功能的任何一种或多种语言,而不是建议一种特定的语言:
- 自动内存管理
- 反思/内省
- 声明式/函数式构造(例如 lambda 函数)
- 鸭打字
这里的想法是扩展您的编程视角,以包含 C++ 语言不为您提供开箱即用的概念。
这取决于你想做什么。如果您有一些您有兴趣完成的特定任务,请查看最适合这些类型任务的语言。学习一门语言的最好方法是实际使用它。
如果您还没有,请尝试使用脚本语言。它应该改变你的工作和思考方式。希望以一种好的方式:)
就个人而言,我一直在使用 Java、Python、C/++ 进行编程,而我最喜欢的必须是 python。尽管 C++ 可以做 Python 可以做的所有事情,甚至更多,但我编写了一个 Python 程序,它有大约 10 行代码,在 C++ 中大约需要 50 行。所以,故事的寓意,使用python。
我必须为 Perl 提供一个单独的答案。虽然 Python 在功能上大致相当,并且被认为更简洁和现代,但 Perl 有它自己的优雅——纯粹实用主义的优雅。它还拥有真正出色的库支持。看看 Perl,以与 Haskel 相反的方向扩展您的大脑 :)(尽管 Perl 爱好者声称它可以用于函数式编程)。
- 语法类似于 C++
- 专为性能和安全而设计,尤其是安全并发