English 中文(简体)
作为一个Java开发者,C或C++?[已关闭]
原标题:
  • 时间:2009-01-21 00:02:05
  •  标签:

我过去5年已经专业地使用Java编写程序。最近,我不得不深入了解JNI,以调用一些特定于Windows的功能。

这次经历突显出我对C(或C++)的掌握非常不好。我仅仅接触了一本高中时候读过的简要“白痴指南”书籍。

我知道在那段时间里两种语言都有所进步,尤其是C ++和标准库。

我学习C或C++是否合适?哪些书最好呢?

各位还有没有关于Windows编程的建议?我可以很好地阅读MSDN来弄清楚某些API调用,但我感觉在"大局"方面可能还有遗漏。

谢谢 (Xièxiè)

问题回答

好问题。表面上看,推荐C ++似乎显而易见,因为“它像Java一样是面向对象的”。唯一的问题是,这并不完全正确... C ++允许OOP,但它只是C ++支持的几种范例之一。像OOP语言一样处理C ++(尤其是像Java一样处理它)只会导致挫败感。

The problem is that Java and C++ don t actually have much in common. Java programmers often believe that Java was inspired by C++, but that s only true if by C++ you mean the very earliest versions of C++, which might more appropriately be called "C with classes". Since then, C++ has transformed completely into its own language with its own way of doing things. It has probably changed far more since then than Java has. A Java programmer back then would still be able to make sense of today s Java code. Not so for C++. So I d argue that C is actually closer to Java than "modern C++" is. C is what you get if you take Java and strip away the GC and the concept of classes and a few other abstractions. To arrive at C++, you have to add a similar number of features to our hypothetical stripped-down Java as well.

此外,C++ 是一种相当复杂的语言,要学好它需要很长时间。如果你学不好它,你将一次又一次地自己给自己制造麻烦。

Finally, it depends on your objectives. C++ is a much more modern language than C, and once you learn it, very expressive and powerful and, surprisingly, it can even be very elegant and concise. But the learning curve is nasty. So for native programming in the long term, I d recommend C++ over C.

但如果您的目标主要是与Win32 API(或其他本地API)进行接口,您就不需要使用C ++。Win32和大多数其他API都是用C编写的,而不是C ++,而且您在任何情况下都不太可能需要非常复杂的代码来在Java和API之间进行接口。

关于学习Win32,你是正确的,你所需的所有细节都在MSDN上。如果你想获得全貌,《Petzold》是该主题上的一本标杆之书(原文链接)

我猜这取决于你的目标。

如果您想更接近机器,那么就是C。

如果你想要增加你关于在C上方的OO Java样式层的知识,那么C++是一个好选择。

《加速学习 C++》(经过消毒的亚马逊链接)是一本非常好的书,从 C++ 的角度来学习 C++,而不仅仅是带有其他附加功能的 C。

而且K n R C(已消毒 Amazon 链接)在我看来仍然是学习C的最佳选择!

顺便提一句,对于C ++,跟随Scott Meyers在Effective C ++书籍中的智慧进行后续工作!还有他的Effective STL书。

HTH: 希望这有所帮助。

干杯 (gān bēi)

罗布

学习足够的C ++,以将其用作“更好的C”。 您不必尝试将所有内容映射到您对Java的理解上。 您只需要能够将C ++对象用作抽象数据类型,新建和删除等即可。 如果STL跟着一起来,那就更好了。

真正的问题是:你为什么认为JNI是绝对必要的?Windows调用会破坏保持应用程序可移植性的任何想法。我坐在一个必须深入研究使用JNI的Java应用程序的人旁边。它随机导致服务器出现SEG FAULT。他的假设是堆填满了,JNI调用被调用来在堆上分配空间的例程。它不可用,例程没有检查返回的指针是否为null,将其释放,服务器就崩溃了。他仍在试图在本地复制错误,因为它需要在GC启动之前精确调用JJNI方法的时间。

100%肯定它们是必需的吗?只是问问……

如果你对Java有很好的理解,我建议从C语言开始学习,如果你直接学习C++,它与Java之间有很多差异,你可能会不喜欢。

如果您认真学习这两种语言,我会推荐《C++编程语言》(Bjarne Stroustrup)和《C编程语言》(Dennis Ritchie)。

我认为C++比C更容易让你熟练掌握。

如果你一直在使用Java,你很难放弃像类、异常、引用类型、动态绑定等便利,并当然,还有不错的库。

然而,你应该先学习C语言,以确保你真正理解底层代码,并且能够体验指针及其用法以及在"没有保护装备"的情况下工作的感觉。

一旦你掌握了这个,学习C++的继承机制以及它与Java的区别(例如多重继承)。

这取决于你的优势和劣势。如果你真的喜欢设计模式,那我建议使用C++,但如果你只需要在JNI中实现一些简单的方法,那我建议使用C。在学习C++之前学习C应该会让你更好地了解内存管理,而无需担心一些C++的复杂性(构造函数调用顺序、析构函数和C++与Java之间的其他差异)。

我建议学习C语言的权威手册是由Kernighan和Ritchie编写的《C程序设计语言》。 http://www.amazon.com/Programming-Language-Dennis-M-Richie/dp/0876925964

如果您在*nix系统上,不同函数的manpages中有充足的文档。例如,

bash$ man malloc:bash$手册malloc

如果您想要一本关于 C 语言的优秀资源,《C 程序设计语言》(The C Programming Language) 由 Dennis Ritchie 所著的书是值得阅读的。

如果你的意图是继续编写JNI代码,那我一定会推荐C ++。

特别是,JNI接口需要您获取(并随后释放)对Java对象的引用。使用C ++自动变量,您可以使用RAII(资源分配是初始化)技术获得这些引用,这使得内存管理变得更加简单。

100% sure they re required? Just asking....

不幸的是,是的。

谢谢大家的回答。

为了回答一些后续问题,我并不是要在职业上转向C或C++。我只是想学习基础知识,这样当我需要写一些代码时,我就不会感到手足无措了。

In particular, the JNI interface requires you to acquire (and subsequently release) references to Java objects. Using C++ auto variables you can get these references using RAII (Resource Allocation is Initialisation) techniques which makes memory management far simpler.

谢谢,这很有帮助。其中一个让我感到越来越担心的领域是处理与JNI对象相关联的内存的手动管理。

如果您在这里的“主要目标”是做Windows编程,我会建议您选择C#而不是C或C ++。然而,我认为地球上的每个程序员,以及在轨道低处的人,都应该知道C。不知道C ++是可以接受的,尽管您可能不会被邀请参加一些聚会:)但C是一种经过考验的流程,位于应用程序(高级)程序员和库(低级)程序员之间。





相关问题
热门标签