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

Sah*_*bov 11 c platform programming-languages

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

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

Bil*_*eal 35

任何Turing Complete语言,例如C,C++,Java或C#,都可以计算任何可计算的语言.

  • 去吧,脑子里! (22认同)
  • @Norman我并不感到惊讶.SO上的许多人都读过"图灵完全"或"早期优化是所有邪恶的根源"或"Jon Skeet"并自动点击upvote. (22认同)
  • 正如@Vuntic所说,这个答案是完全正确的,但并没有真正帮助.我们使用编程语言有很多东西,它们不是计算.例如,您不能使用只有I/O概念为stdin/stdout的语言编写设备驱动程序,而不是因为它缺少图灵功能,而是因为您无法以相关方式连接它. (20认同)
  • @Tom我喜欢它!从现在开始,我将找到在每个答案中包含魔术词"Jon Skeet"的方法...... (8认同)
  • @Amadan:像这样一个模糊的问题应该得到同样模糊的答案.我实际上并没有打算将这个答案变得有用,而且真的很惊讶很多人赞成它! (5认同)
  • 如果您要调用图灵完整性,您可以采取所有语言相同的立场,任何一种语言都与其他语言一样好.我也对赞成票的数量感到惊讶. (2认同)
  • @Tom:这个评论是试图证明吗? (2认同)

Nor*_*sey 29

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

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

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

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

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

(有些学校还继续教C,几乎所有学校提供的东西在C)为教学,爪哇对C的主要优点是:

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

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

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

  • 我不同意"不要因为完整性而分心"; 从根本上讲,任何图灵完整语言都可以做任何其他图灵完整语言,只要两者都编译成机器代码.剩下的只是对功能的争论.除非问题是关于功能的争论.... (7认同)
  • 内存管理在C++中并不难. (4认同)
  • 如果使用智能指针,则无需使用C++管理内存.如果您将RAII用于所有资源,内存与否,则无需管理任何资源. (2认同)

Dav*_*ite 7

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

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

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

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

  • "此外,使用C语言编写应用程序使用设计模式的能力可能会大大降低." 呸.面向对象!=有组织.你可以拥有一个没有另一个(两种方式). (9认同)

Chr*_*isW 6

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

是的,不是.

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

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


Car*_*rum 5

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

  • 好吧,C没有例外;) (8认同)
  • @nall,除非你写它们......我的意思是,OP提到的所有语言的编译器都是用C编写的,所以在*very*outside之外,你仍然可以编写一个支持异常的编译器然后用它.... (2认同)
  • @YeenFei:C++在语言级别有例外,Windows在操作系统级别有异常,你可以使用C的异常库(例如参见http://www.on-time.com/ddj0011.htm或http: //www.nicemice.net/cexcept/)但C语言本身并没有例外. (2认同)

mae*_*ics 5

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

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

  • 只是想补充一点,任何体面的学校都会使用多种编程语言教授课程.能够识别正确的工具是一项非常重要的技能,多种编程风格的经验可以帮助您以多种方式思考问题. (4认同)
  • 我认为这不是Java为主要教学语言的原因.Lisp,Perl和Python(以及其他)在Java出现之前就已经存在了很长时间. (2认同)