我可以用C ++和C#以及Java做的所有事情吗?

时间:2010-06-02 23:36:52

标签: c programming-languages platform

是否可以使用其他语言(如Java,C#或C ++)以C编程语言编写所有内容。如果是这样的话,为什么现在学校不教C而不是Java?

好的,我要问的主要原因是因为我不想绑定到单一的编程语言和平台(.NET和C#或Obj-C和Cocoa)。也许我把编程语言与框架混淆了?如果有人能为我澄清这一切,我肯定会投票给你答案。

15 个答案:

答案 0 :(得分:35)

任何Turing Complete的语言,例如C,C ++,Java或C#可以计算任何可计算的东西。

答案 1 :(得分:28)

  

是否可以使用其他语言(如Java,C#或C ++)以C编程语言编写所有内容。

主要是。(不要被图灵的完整性分散注意力;这是一个红色的鲱鱼。)C中有两组难以做到的事情:

  • 管理记忆。在Java和C#中,您只需分配对象,系统会在不再需要它们时计算出来,并且内存会被回收。在C和C ++中,您必须担心自己管理内存。 (您可以选择Hans Boehm的libgc垃圾收集器,但许多C程序员不愿意承诺,并且有些人报告难以使其工作。)

  • 以类型安全的方式通过继承和多态重用代码。您可以通过明智地使用void *指针和函数指针强制在C中重用,但是您将失去编译时类型检查的好处。您只是无法获得与C ++模板或Java泛型相同的保证。这是编译时保证,而不是运行时保证,图灵完整性与此参数无关。

  

为什么现在学校不教C而不是Java?

(有些学校继续教授C,几乎所有学校都在C中提供某些东西。)对于教学,Java相对于C的主要优点是

  • 您永远不必担心内存管理。这很重要,因为对于大多数学生来说,理解堆分配的数据以及何时调用free是非常困难的。 (对,很多毕业生很难。)

  • 使用泛型编写多态代码更容易,很多; C缺少与Java类型检查泛型相当的东西。通过多态性重用是编程中非常重要的概念。

摘要:所有相关语言都是图灵完备的。但是,Java也提供了无法在C中提供的编译时保证,并且确实如果你不能用Java编写任何可计算的函数而不是任何其他语言,在Java中,编写没有大量内存泄漏的代码要容易得多。 (由于图灵的完整性假设是一台无限的机器,它不必担心内存泄漏。但在现实世界中,在这里用完演出并在那里演出,你可能会遇到麻烦。我的学生会这样做。)

答案 2 :(得分:7)

在开发应用程序时,您可能只使用C语言“实现”相同的功能,但与更现代的面向对象语言相比,所需的工作量可能要高得多。一切最终都会编译成机器语言。此外,使用C语言可能会大大减少使用设计模式编写应用程序的能力。

在决定使用哪种语言时,互联网上现代语言社区的丰富性也是一个巨大的增值。开源软件项目,致力于改善开发人员生活和应用程序质量的论坛和网站在现代语言中非常活跃。

这也没有真正说明各种现代语言的运行时间带来的巨大价值,使开发人员的生活更轻松。

这些只是我可以指出的几点。

答案 3 :(得分:6)

  

是否可以使用其他语言(如Java,C#或C ++)以C编程语言编写所有内容。

是和否。

是的,理论上:因为使用C,你可以编写Java,C#和C ++编译器和运行时环境(然后编写你可以用Java,C#和C ++编写的任何东西)

不,在实践中:因为Java,C#和C ++已经有了不存在的运行时库,并且不容易从C调用;并且因为Java,C#和C ++提供了许多高级功能(例如用于内存管理和OOP),这使得编程更容易......如果你的编程能力极限,那么一种使编程更容易的语言意味着你可以用它来做你不能做的事情。

答案 4 :(得分:5)

是。你可以用你想要的任何语言做任何你想要的事情(好吧,差不多)。有时,使您的生活更轻松的框架更容易使用一种语言或另一种语言,但计算机肯定不关心您编写它的语言。当然,总有例外。

答案 5 :(得分:5)

一般来说,是的,您可以用几乎任何编程语言制作类似的程序(假设它有适合您的目的的库,例如窗口等)。

然而,每种语言都有自己的优点和缺点,这正是Java成为主流教学语言的原因。 Java比C更高级,因此它使开发人员不必执行可自动执行的困难任务(例如内存管理),从而使他能够专注于其他事情,例如算法,这可能是教学常见的原因。然而,有了这个优势就会产生惩罚,例如性能和内存消耗,这些都是C非常高效的领域。

答案 6 :(得分:3)

我们主要使用语言来提供它们的抽象。在这种情况下,不,有许多抽象在C中根本不可用。

答案 7 :(得分:3)

根据您的需求,您实际上可以在C中执行比在C#或Java中更多的操作,因为您可以更接近硬件级别。汇编代码也是如此:你可以在汇编中编写特定于架构的代码,这在高级语言中是很难或不可能实现的。

C和汇编比C#或Java更具体,更宽松,但完成它们的工作更多。例如,比较C#中的字符串值就像使用==运算符一样简单;在C和汇编中,您需要使用特定的例程(如果您有stdlib实现),或者编写自己的例程(如果您没有stdlib)。

因此,你可以在C和汇编中做些事情,你无法在C#或Java中真正做到(比如计算你的一个函数将运行多少个CPU时钟周期,或者将你的代码放入嵌入式设备中)只有4k的内存),你可以用C#和Java做一些你无法在C或汇编中真正做到的事情(比如用几行代码编写一个Web服务,只需几分钟)。您可以自行决定手头问题所需的工具。

编辑:我忘了提及C ++。您可以将其视为两个世界之间的妥协,但如果可能的话,我个人会远离它。如果不小心使用它会很难看。大多数问题最好由直接C或更友好的东西(如Python或C#)提供。

答案 8 :(得分:3)

是的,理论上,您可以,除非特殊限制排除它(祝您在C中编写J2EE Web应用程序好运)。

但是,语言选择比特定语言可能更多。还有它使 easy 以及它为你做的事情。以垃圾收集为例。存在用于C和C ++的垃圾收集器(例如Boehm),但是Java和C#提供了一个运行时间并且围绕它可用。在某些情况下,您不需要垃圾收集器,但对于大多数应用程序而言,良好的垃圾收集意味着程序员不再需要担心一大堆问题。这意味着他们更多的宝贵关注和时间可以用来解决手头的真正问题。

此外,字符串处理和依赖它的东西(例如I / O)。可以在C中安全地进行字符串处理。但是,在Java或C#(或C ++,如果使用适当的字符串类)中更容易,并且需要更少的冗余代码(更多的冗余代码意味着有更多的地方可以使用误差)。

因此,虽然你可以用C语言做很多事情,但有充分的理由不这样做,学生可以从编写有用的程序中受益,而不必担心手动内存管理的细节。当然,他们应该在他们的教育中做一些C,这样他们就能更好地理解他们的Java或C#程序在幕后做什么(因此可以更好地预测和理解它的性能等),但是很容易做很多事情在高级语言中,它们对教学和实践都有很大的好处。

答案 9 :(得分:2)

  

“如果没有一个好的库,大多数有趣的任务在C ++中很难做到;   但鉴于一个好的图书馆,几乎任何任务都可以轻松完成。“ - Bjarne Stroustrup,引自POCO

我认为对于大多数语言来说,可用于这些语言的库/框架更重要的是做任何实际工作。现在的语言往往具有组织和内聚的库和框架,使它们更容易使用。它更多的是关于你做事的容易程度,而不是那些语言can do本身。

答案 10 :(得分:2)

我喜欢你作为学生提出的问题。

Is it possible to write in C programming language everything that
     

你可以用其他语言写作   例如Java,C#或C ++。如果那是   这几天为什么不上学呢?   教C而不是Java?

有一些好的答案已经深入到这里的事情。我将以我在Uni的首次演讲中回答这个问题。这是在Meyer的书出版并且OO处于初期阶段的时候。

当时我看到程序世界中我认为“最佳实践”与OO为我们所做的事情之间存在显着的相似性。我的前提是,虽然OO强烈鼓励我们以优雅和明智的方式做一些事情,但在C等程序语言中,如果我们只知道如何以良好的方式使用事物,我们可以选择同等优雅。

在接下来的几年里,我意识到开发环境引导开发人员以正确的方式做事的重要性。这样做的原因并不是你遇到的每一个人都有同样的眼光,就像你,我和许多其他经常光顾这个论坛的好人一样。

当然另一件事是,虽然你可以,实际上,使用任何语言/框架完成任何(商业)结果,但有些提供了显着的生产力优势。仅仅因为你可以做到这一点,并不一定意味着如果你不得不花费额外的一个月来编写你可以在另一个环境中调用的框架代码,那么你就不会想要这样做。

Ok the main reason why I am asking is because I don't want to tie down to
     

单一的编程语言和   平台(.NET和C#或Obj-C和   可可)。也许我很困惑   用框架编程语言?   如果有人能澄清这一切   我,我当然会为你投票   答案。

再次,你有很多关于这里的事情的信息。我将尝试向您提供一些信息,我认为这些信息将在您的脑海中解决这个根本问题。

你需要学习很多语言,还是只需要在商业世界中学到很多语言?

同样的问题可以应用于框架。

我的钱有两个答案。

首先,我将从你的技能发展的角度来解决它。

我相信你会深入学习你所选择的语言和框架。深入解决问题的方法通常是解决问题并将语言的所有工具用于工作,有时甚至可以突破界限。我相信这种经验可以帮助您解决问题,并能够识别如何在将来遇到的不熟悉的语言和框架中快速应用相同或类似的技术。

有了这样的说法,是的,它肯定是一个广泛的优势 - 了解不同语言和框架的优点和缺点,并学习评估哪种更适合不同类型的问题空间。这也是您开发的重要部分。

根据您在当天的兴趣和动机,您可以开车去探索广度或深度。但我确实建议密切注意两者,即使只是稍微分解并保持新鲜感。

其次,我会从你的职业发展角度来解决它。

根据我的经验,这真的归结为你想要做的事情。你在另一篇文章中说过,你对金融工作很感兴趣。这使答案变得简单,因为您知道自己想要做什么。这只是一个问题,即所有工作在哪里,也在看你看到行业的发展方向。

评估哪里有最好的机会。通常情况下,特定行业中特定技术组合占主导(或新兴)的原因也会发生。

从一个人到另一个人,你会得到不同的观点 - 有时在动机上松散地“虔诚”。我鼓励在最适合你的地方展望。

我想你已经知道我现在花了哪些工具,但是我总是关注其他阵营的进展情况。如果这个行业有一个常数,那就是事情会发生变化......通常在你不看的时候:o

最后,我要说OO比程序有许多优点,毫无疑问哪种方式更适合我。但是不要忘记功能性 - 这种编程风格现在变得越来越重要,并且经过长时间的研究后才开始进入商业领域。查看Anders最近的一些讨论和演示。您将了解它将如何“适应”而不是“替换”命令式编程语言。

答案 11 :(得分:1)

编程语言只是我们用来与机器通信的工具。

就像艺术家会使用工具(画笔和锤子和相机)来创作不同的艺术作品(绘画,雕塑,框架图片)。这很大程度上取决于艺术家。看看我们的经典艺术作品,有许多新的画笔和尺寸,纹理和各种STUFF,但leonardo di vinci是否需要它们来创作杰作?

一个优秀的程序员可以利用他所拥有的力量和弱点塑造和塑造他的艺术作品。

有平台专用工具,就像雕塑家使用锤子而不是刷子一样。但我想说的是,它们都是工具。它的艺术很重要。

答案 12 :(得分:1)

将编程语言视为人类语言。如果你用英语写一篇关于某个主题的文章,它也可以用西班牙语,法语,德语或梵语写成。这篇文章仍然会传达与论文写作相同的中心思想。编程语言也是如此。

如果您可以学习多种[编程]语言,它对您肯定有利。掌握至少其中几个。然后,您可以轻松阅读用不同语言编写的代码,并且仍然可以获得它的要点。

答案 13 :(得分:1)

我猜大学和学校教授业内最流行的语言,这样当你完成后,你就会发现自己有资格获得最多的招聘广告。但如果你发现C对你的工作方式更有吸引力,你应该自己学习。

任何体面的学校或大学都应该对教授算法和数据结构感兴趣,这些算法和数据结构将成为任何非平凡软件的基本构建块。他们用编程语言来做这件事。如果你发现你的学校对语言的重视程度超过了表达方式(程序和软件)的基础,那么你应该让自己成为阅读数据结构和算法的好书。

当我学习面向对象分析和设计时,我可以选择C ++,Java,C#,Python或大学计算机上可用的任何其他面向对象编程语言。这样我就可以显示我的代码干净地编译并根据需要工作。

答案 14 :(得分:1)

不,至少不是从任何实际的角度来看。考虑一个例子 - Web服务器上的Java。

理论上,您可以使用C语言编写的CGI代码执行相同的操作,这通常在使用Java的服务器上完成。实际上,即使您可以编写它们,许多ISP也不会让您使用它们,并且您必须(至少)重新编译它们以便在不同平台上使用。更糟糕的是,如果你使用Java,你可以很容易地找到框架来处理许多相当困难的任务(例如,cookie和持久性)至少相当合理,但是使用C你几乎肯定必须自己实现所有这些。

充其量,你做了很多额外的工作几乎没有任何好处。在最坏的情况下,它们根本不起作用,因为你的ISP甚至不会让你安装它们。