从Java转向c ++

在过去的3年里,我一直在开发基于C#(。net)和Java(J2EE)的应用程序。

但是现在我觉得,Java,C#让你感到茫然(从学习的角度来看),你可以快速开发你的应用程序,但是你无法理解编程的基本底层概念。

所以,我正在尝试学习C ++,但由于指针,多重inheritance,一些约定以及Java中不存在的C ++的其他概念,我发现它有点“混乱”。 所以,你们有什么建议? 我该怎么想?

谢谢

PS:我是学生,所以世界上所有的时间都在转移。

在我看来,你应该首先学习C,以便正确理解构建C ++的基础。 拿起Kernighan和Ritchie的“C编程语言”副本,被广泛认为是该语言的最佳参考,并开始阅读它。 一旦你完全理解了C,你将拥有所需的低级基础。

C ++不再是任何其他现代编程语言的“基础和底层”。 它有一个计算机模型(一个平面内存地址空间),但操作系统和CPU只是模拟使用多层缓存和分页的模型,所以它不是“真实的”。 结果是,相同的操作有时可能比其他时间长1000倍。

现代C ++还有许多强大的抽象,与Java和C#中提供的抽象相比,与计算机的工作方式没有更直接的关系。 OP提到了多重inheritance – 显然没有其他OO语言中的inheritance元素。 从Java中省略的C ++的许多其他function是高级抽象(或允许您构建它们),因此在某些方面Java是更低级的语言。 在Java中,运算符符号的含义总是相同的,而在C ++中,简单的==可能会构建一个对象,该对象稍后将用于生成SQL表达式而不是在进程中执行。

JVM和CLR运行时(几乎可以肯定)是用C和/或C ++编写的,所以从这个意义上说,它们恰好形成了今天的层。 但是在C / C ++层,你仍然会在一个不是“机器如何工作”的抽象中工作,所以你真的只是在学习一组不同的抽象,而不是“现实”。 并且可以专门设计OS(或实际上是硬件芯片),以便JVM或CLR(如运行时)是系统的本机低级层; 在这样的系统上,C / C ++运行时需要“高级”(昂贵)仿真层才能工作。

所以可能不值得尝试学习如何在“现实”中编程。 这些天没人真的那么做; 这是浪费时间。 你最好学习编程抽象如何帮助你编写正确的程序。 如果一种语言让你的生活变得困难,那并不能certificate你在做“真实的事情”。 这只是意味着你选择了错误的语言来做你想做的事情。

我不同意你首先需要学习C语言或汇编语言的观点。 C ++和C在理论上可能相似,但在实际使用方面却非常不同。 通过仅使用C,人们对C ++惯用语几乎没有什么收获,虽然在多种语言中获得实践经验是好的,但在语言学习中指定先决条件是徒劳的。 我认为学习编程概念的最好方法是与熟悉它们的人坐下来谈谈,在StackOverflow上,在论坛中,或者,如果你幸运的话,亲自参与。

在一天结束时,我认为编程确实不是那么难,你可能需要有人一次解释它才能让所有内容都点击。 这就是为了构建复杂而美观的机器,一遍又一遍地重复相同的简单概念。

对于学习c ++,我推荐阅读Mark Allen Weiss为Java程序员编写的C ++。 从Java迁移到C ++时,它帮助了我很多,因为它非常擅长突出语言之间的差异。

但是,现在我觉得,Java,C#让你感到茫然(从学习的角度来看),你可以快速开发你的应用程序,但是你无法理解编程的基本底层概念。

如果您正在尝试学习编程的概念,而不是机器架构,那么学习C ++并没有太大的好处。 我建议一起使用与Java不同的东西。 也许是一个Lisp变种。

如何设计程序是一本非常好的书。

如果你想理解编程语言的基本概念,我会推荐一本书,如John Mitchell的编程语言概念。 通过为简单语言编写一些解析器/解释器来跟进此问题。 另一个很好的资源是SICP,它特定于Scheme(一种LISP方言),并在这里完整提供。 一旦你学会了几种语言,就不需要花太长时间来学习新语言的语法和语义(另一方面,核心库需要花费很长时间才能熟悉)。

如果你想了解今天的计算机是如何工作的,我建议学习C和阅读Tanenbaum的现代操作系统等书籍。 在这种情况下,C主要用于读取系统级代码。 实现(非常)简单的操作系统可以非常有教育意义。 然而,像实现基本shell(如bourne shell,简单除外)这样简单的事情可能是一个更好的起点。 我还建议学习网络如何具体工作,因为它是现代计算机系统中不可或缺的一部分。

C和C ++使一些基本的底层编程概念更加明显,但它们并非由上帝设计。 我的第二个建议是研究低级代码背后的实际低级系统:操作系统,编译器/运行时(尝试“编程语言的基础”)和机器架构。

PS一般来说,单独学习C ++可能会更好,而不是从C开始,但是出于你的特殊目的 – 在已经学习Java之后,与指针等低级,不安全的结构更加亲密 – 我认为它是最好从C(和K&R)开始,这些是前面和中心。

我建议先学习汇编语言。 这将为您提供一个非常坚实的基础,在低水平发生的事情。 这也有助于强化“一切都只是一个地址”的想法。

选择一门专注于汇编语言的课程是可取的,因为它会“强迫”你学习它(个人而言,我不认为ASM是/那个/有趣的,但我认为这是值得的[并且需要gradle]class级)。

知道汇编后,继续使用C和C ++。

玩得很开心!

这听起来像是在避免大多数人犯的第一个错误,即假设新语言与旧语言相同。 C ++是不同的,应该作为neww(-ish)语言学习。
我建议的参考文献是C ++ How to Program ,它在我的大学用于介绍C ++类。

之后,再看看你之前编写的Java软件,看看如何将它们翻译成C ++。 可以从CPlusPlus.com轻松引用语法。 在这样做时,重要的是要记住所有不同的语法代表什么,以及它如何改变软件中发生的事情(即两种语言之间的差异)。 这样做的另一个好处是可以让您了解如何为两种语言(以及一般的编程语言)表示底层架构。 我不知道一本好书如何解释编程语言如何在幕后工作,或者我建议这样做。

但是,如果您对学习编程的工作方式感兴趣,那么汇编语言将是一个很好的起点。 基于Intel的计算机的汇编语言是我用来学习汇编语言的,它非常有用。

汇编语言。

从Z-80开始。 然后添加’x86。 然后尝试68000.然后是TI 320系列DSP。 您可能还希望添加Z-8。 只是为了看看不同的机器是如何做到的。

如果您真的想了解更多有关低级编程的知识,我建议您学习C和汇编。 C ++比C复杂得多,但实际上并没有让您更深入地了解低级别的问题。 如果你想了解什么类型的概念和构造编程语言可以组成,可能会很有趣,因为C ++有很多。

还有一个较低级别的VM,您似乎还不知道,也可能想要探索哪个。 要了解Java的内部结构,我建议学习如何用(Java)汇编语言编写JVM。 Jasmin( http://jasmin.sourceforge.net/ )是这种编程的参考汇编程序/语法。 另一个很好的资源是Java语言规范( http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html ),其中包含许多Java内部。 学习C之后,您还可以使用JVM提供的一些较低级别的API( http://java.sun.com/javase/6/docs/technotes/guides/jvmti/ ),它们允许您检索有关a的低级信息。运行JVM并编写有趣的东西,如调试器。

如果你学习这些东西并自己做一些黑客攻击,你将学习JVM的工作原理以及编译器实际放入类文件的内容。 即使你认为你对它的一切都知之甚少,你也很可能会发现一些你以前不知道的Java编程语言的新东西。

您也可以在程序集中对.Net VM进行编程。

我认为你应该从C开始,但不是学习C ++的必要序言。 相反,为了学习C.换句话说,当你学习C时,你会努力学习语言,感受语言的哲学,并专注于让它啜饮你的皮肤。 成为一名优秀的C程序员,你将成为一名优秀的程序员。 不仅仅是一个优秀的C ++程序员 – 这与学习C无关 – 而是一个优秀的程序员。

首先学习C的另一个原因。 它比C ++更容易,比C ++容易得多,而且它与C ++很好地结合(与Java不同,Java不是在所有方面,而是在最肤浅的面向对象方面)。 我不是在谈论语法的相似之处:我在谈论低级编程。 我在谈论指针的概念,它们本身存在,并且在C ++中以迭代器的forms存在。 您可以在C中传递函数,并且可以在C ++中传递函数对象。 C学习起来很快,它会非常有效地温暖你。

学习C还将消除对一些纯粹的OO程序员倾向于拥有的自由函数的恐惧。 C ++是一种混合语言,C语言真正是C ++的一个子集,不仅仅是语法,还有哲学。

首先,让自己获得K&R书并通过饮用。 你不会后悔的。

无论你从什么开始,我的建议是抛弃完整的IDE。 使用优秀的文本编辑器(vim / emacs)

使用文本编辑器时学习曲线更好,因为一切都需要自己编写。 没有提示,也没有预先编写的代码。

无论如何,你有上面所有最好的答案。 🙂

  • 伊瓦尔

设置一个高性能的C ++编译环境,如Microsoft Visual C ++ 2008 Express,并浏览Bjarne Strousrup的C ++编程语言站点中的所有链接,从C ++ Style and Technique FAQ开始 。 如果您使用任何其他语言进行实验,则不需要更多:-)

同时学习C和C ++,我正在谈论这里的经验。 我经常遇到混合C和C ++的代码,因此最好知道它们和它们之间的差异。 拿起K&R for C(理解指针,头文件和手动内存分配和清理……这些都不是Java使用的!)和任何体面的C ++初学者书(我选择了Prata,但不管你感觉更舒服)。 练习以顺序方式执行C,C ++版本,面向对象(OO)方式,通用/模板方式等相同的示例.C ++拥有比C:模板,STL容器更大的标准库(不需要指针,但是你可以做指针微调编写自己的容器),线程(自C ++ 11以来)。 如果你没有选择(或Boost库),你总是可以使用C,任何C ++编译器都会允许它。

如果您来自Java,那么您应该已经了解了C ++的OO概念,也许还有C ++模板中的一些通用编程。 C ++被错误地视为OO语言,但它不止于此。 顺便说一句,对象是动态概念(运行时),而模板是静态的(编译时),因此学习语言CONCEPTS,而不仅仅是语法! 一旦你学习了这些概念,就会阅读Stroustrup的书(他创建了C ++)来学习他对C ++代码最佳设计规则的理念。

学习最新的C ++标准(C ++ 11),因为它为语言添加了许多新东西(auto,nullptr,threads,lambda函数,新容器等)。 最后但并非最不重要的是,请使用C / C ++中的Doxygen,就像使用Javadoc一样….无论您使用何种语言,都没有比未记录的,无法读取的代码更糟糕的了。

学习四。 它有更好的对象。 它是一个虚拟机。 除非你想要一台真机,否则请看Green Arrays或Sandpiper / John Rible。

免费的线程解释版本遍布’网络。 为了练习。 当您了解它时,请编写您自己的Direct Threaded版本。 或者参见Forth Inc并为您的机器购买一台或使用免费的Windows版本。

Java是一个Forth / C混合体,所以如果你想要使用Java,你将拥有一些东西。

教育:

从第四位开始 – 布罗迪思考 – 布罗迪

第二个是任何语言的优秀,因为它是关于我知道的因子的最好的书。 网上免费版本。

如果你想做一个硬件/ FPGA Forth Stack Machines:Koopman的The New Wave

以上所有书籍都是免费的。