学习C对计算机科学必不可少吗?[关闭]


15

我是一个前端开发人员,几乎看不到带有.h.c扩展名的文件。我知道基本的C语法,我在Unreality中学习了它,但是对这种低级编程从来没有兴趣,因为它对于简单的事情来说设置太多了。

我对学习计算机科学的各个方面都非常感兴趣,但是我想相信,为了理解计算机科学中的大多数概念,我真的不需要了解特定的语言。但是,当我开始阅读有关计算机科学基本概念(例如数据结构和算法设计)的书籍和文章时,似乎必须学习C,因为所有示例甚至课程都使用C(有时甚至是Java)编写。

我的问题是,C是计算机科学必不可少的编程语言,还是我们刚巧用CS编写了所有CS资源?不学习C就能学习计算机科学吗?


4
这是乔尔· 斯波斯基(Joel Spolsky)的看法:joelonsoftware.com/articles/CollegeAdvice.html 这是可以讨论的,但我认为他有他的观点。
布朗

2
纯粹主义者会认为计算机科学与计算机无关,这使得编程语言变得不必要。
Blrfl 2013年

1
您所说的“计算机科学”是什么意思?我认为您所描述的大部分是计算机科学的软件工程部分。另外,我看不到如何用C编写所有资源。我已经阅读了很多关于算法/数据结构的书,而没有使用C。几乎所有书都使用了某种伪代码语言,每个人都可以轻松理解(嗯,除了使用集会的TAOCP ...但这是另一个故事)
Bakuriu

不真实吗?是应该是大学自动校正的怪癖还是黑魔法学校?我知道那所看不见的大学:[
迪尔·亨特

Answers:


31

我将与这里的流程相反,说是的,您必须学习C。我实际上同意许多其他答案中的要点,但是您做出非常有力的声明:

我对学习计算机科学的各个方面非常感兴趣,但是我想相信,为了理解计算机科学中的大多数概念,我真的不需要了解特定的语言。

(强调我的)

好吧,操作系统和网络堆栈是计算机科学的两个重要方面,所有主要的操作系统和网络堆栈都主要用C编写。如果您想了解这些内容,则应该学习C。是的,有些学校确实设法教他们的Java操作系统类,但是就像用英语阅读Homer一样。

此外,C语言不是那么大。如果您真的想学习计算机科学的所有方面,则应该耸耸肩说“ meh”,“还有一种语言?”


我一般都同意这一点,尽管对我而言,“学习” C意味着我基本上能说流利的语言,无需帮助就可以用它编写简单的程序。我不确定这种了解是否是操作系统和网络编程的先决条件。
Telastyn

3
@Telastyn:这意味着您足够熟练地理解和修改操作系统代码和网络代码-C所使用的域,仅此而已。这并不意味着您需要知道如何用C编写游戏,使用C制作精美的UI和制图应用程序,使用C编写图形或机器智能引擎。因为对于CS的每个其他域,还有其他语言选择。
rwong

12

在很长一段时间内,在计算机科学作为一门科学而不是一种职业的高度发展期间,对于在所有不同大学使用的所有系统上运行的语言,只有很少的选择。

到目前为止,大学倾向于使用Unix系统。方便地,它是用C编写的。可以从在任何计算机上学习C开始,最后进入C的Unix源代码。在家里,学生可以使用C编译器,例如Windows 上的Borland Turbo C或Windows 上的MPW。 Mac-它无处不在。

Pascal是另一种选择,但是在程序设计的某个时刻,往往会出现这样的问题:仅仅用一种语言来完成您真正需要做的事情是不够的(用Pascal编程OS会很痛苦)。

一些较老的学校学习了Fortran,但同样,它在许多情况下还不够强大,无法教授更高级别的CS课(fortran中的AI理论?可行,但痛苦)。

因此,很长一段时间以来,C是首选。

这不是唯一的选择,现在有许多大学使用其他语言进行教学,以掩盖某些内部知识并学习更高级的概念,而不必处理内存管理等方面的丑陋问题。有些人认为这很好,有些人认为这不好


因此,不,学习C对于学习计算机科学不是必不可少的。您可以找到许多其他书籍,这些书籍从Java或Python讲授计算机科学。长期以来,C一直是人们的选择,学术书籍发展缓慢。


根据记录,AI训练通常是在70年代和80年代由C的蛋头同伴LISP进行的,但是答案却在头上。
jwrush

与当时的其他语言相比,@ jwrush的回答更多地是可以使用C进行AI学习(不是LISP,我在90年代参加了Lisp的AI课程)。诚然,麻省理工学院(当时的卵子之乡)当时在LISP教授了许多他们的课程-这当然是另一种选择,但在其他领域却不那么实用。在教学中,在每个班级使用相同的基础进行工作很重要,这样一来,不必花一两个星期的时间就可以教给学生另一种专门针对该班级的语言。

12

我承认,人们可以得到一个良好的高薪工作,是无需接触Ç生产,但我强烈建议学习下任何人谁是严重的大约有扎实的了解计算机科学。

尽管计算机科学是关于概念的,无论使用任何特定的编程语言都可以学习这些概念,但是通过学习C或使用C来学习该领域,可能会更好地理解这些领域。

  • 算法和数据结构。标准C几乎没有这些功能-已经以语言或在其标准库中实现了这些功能,这对于学生来说往往是无益的:“ 为什么要打扰立即可用的功能呢?“查看一段C代码,您会立即看到它的算法成本,因为C中的所有内容都只能编译为几条机器指令。高级语言(例如Perl或Python)通常在轻量级语法的框架下使用高级数据结构。代码听起来很轻松,但事实并非如此,您已经需要大量知识来正确推理这些代码段的算法复杂性,因此这些语言不适合学习算法和数据结构,并且许多程序员始终活着。在高级语言中,当遇到性能问题时,它们往往无能为力。

  • 操作系统。大多数操作系统都是用C编写的。您如何不需调用就能理解进程的创建fork?Java VM的抽象层在这里没有帮助。而仅仅谈论它而不创建过程就更糟了……您如何编写像Eclipse这样的软件,该软件可以将标准输出重定向到其窗口之一?您需要了解操作系统级别的概念,并且只能直接在C中接触这些概念。

  • 间接 如果不处理指针,就无法执行C。指针迫使您在两个层次上进行思考,这扩展了您的抽象技能。

C知识也有一些技术优势:

  • 跨语言互操作性。您想将一个出色的Ruby模块集成到您的Python项目中(在这里替换两种任意语言)。这样做的唯一方法就是通过C,因为两种语言都有C的外部接口。

  • 编写性能关键软件。一个人不能忽略去做低水平的事情。


我并不是说每个程序都应该用C编写。但是C可以帮助您了解知识,无论您使用哪种编程语言,它都非常有用。


指针算法对于理解操作系统至关重要,因为这会导致原因。例如,为什么堆和栈不同,为什么虚拟内存执行好或不好,为什么有的回路的工作比别人快,等等
迈克尔Shopsin

6

在这里,我也将与事实背道而驰,尝试为C做一个(稍微幽默的)美学案例。尽管有些人可能出于不同的原因将其称为“丑陋的”,例如缺少诸如类或类之类的高级构造。它的指针上的依赖,我觉得这是不适合的情况下

TL; DR:在我看来,C很简单,好的C是可读的,并且在敲击中会发现一定的乐趣。

C很简单

标准C仅定义了一些基本类型和机制来创建函数,指针和数组。最重要的是,有少量的组合构造可从基元中生成更复杂的类型(例如结构和联合)。请注意,我是如何用两个句子描述大多数语言的。这意味着您在编码时不必头脑中保留太多的语法规则和形式。

简单就是美丽

C不是奥术

与许多高级语言不同,在C语言中很难找到很多奇怪的,难以理解的符号。在C语言世界中,抽象和“语法压缩”的主要功能是函数-语义上非常简单且不言自明的构造。良好的C风格会激发出诗意的可读性。为了说明这一点,让我们尝试从Linux内核中读取以下代码段。即使不了解底层的数据结构和实现细节,我们也可以从以下几个方面入手:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

该功能的中间显示为“万一电流冻结,请问冰箱是否确实发生了冻结”。苏斯博士再好不过了。

可读是美丽的

C是透明的

除非C语句包含函数调用,否则通常可以很好地了解其运行时成本和副作用。C赋予程序员控制权,并最终信任他或她做正确的事。我们可以了解一下strlen()在GNU C库的实现中运行此片段(针对SE重新格式化)时所发生的情况,因为每个运算符都有明确定义的语义。C中没有重载。

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

出于“可优化性”的目的,此属性很棒。可以说,某些高级语言使高级算法的简洁表达更容易(例如带有类和重载的C ++),但出于C的目的-作为便携式汇编程序的目的,C是理想的。有时,成功执行低级代码后,程序员可能会在某种意义上对机器感到满意(或为零-这是实现细节)。这并不是说其他​​语言不好,不够“禅”或类似的愚蠢之举,只是因为许多有效的原因,IMO C可能以许多其他语言都没有选择的方式变得有趣。

在我看来,以上三点使创建复杂但高效的系统(在Linux上体现在我的脑海中)易于管理。我发现这个世界吸引了我的审美意识,我建议任何考虑将C作为他或她的下一个目标的人都考虑这些点。我认为通过明确说明它们可以更好地支持有关操作系统及其他方面的争论,因为一个人当然不需要了解内核就可以成为一名成功的程序员,但是人们可能会发现这些领域在主观上令人信服。


3

您用来讨论计算科学的编程语言与学习计算方法和科学的任务无关。

关于计算机科学的开创性工作(计算机编程的艺术)没有使用任何现有的语言来告知主题。取而代之的是,Donald Knuth选择定义一种虚构的计算机和一种虚构的机器语言(以及相关的汇编语言)来讨论所有主题。

关于该主题的另一篇备受推崇的著作《计算机程序的结构和解释》也采用了类似的方法,设计了LISP编程语言的简化方言以充当其自身的环境。这种语言就是我们现在所称的Scheme。

关于计算机科学的另一项非常出色的著作,《计算系统的元素》(实际上是计算机工程和计算机科学的组成部分,非常简短),采用了更基本的方法来教授数字逻辑,从而从中构建机器,工具,以及语言,然后再教授基础计算机科学。

因此,不,C对于理解计算机科学不是必需的。重要的是您对算法及其应用的核心概念的理解。


2

我通过从随附的软盘附带的手册中学习vb3开始了编程生涯。我学习了一些Java语言,并能够生成一些受人尊敬的程序,但是直到我在大学学习C语言后,我才真正意识到“幕后”发生了什么。我现在只使用.net,从不真正担心指针,无效地址或溢出-但是我了解它们,这可以作为我每天所做决定的依据,并且一些旧派知识仍然存在于现代解释语言,旗帜下,按位运算,布尔逻辑,所有强大的工具且非常高效。

学习C。它将使您站稳脚跟。我保留了多年的C程序员手册,并从头到尾阅读了Kernighan和Ritchie。最终使用理解C所用的语言都无济于事。


1

不学习C就能学习计算机科学吗?

答案是肯定的。我拥有CS学位,不需要学习C,而是需要Java。至少在我的学校里,重点是学习面向对象的程序设计,以及有关汇编语言,数据结构和数据库设计的一些教学。


7
您确定您的学位涵盖CS的“ 各个方面”吗?
SK-logic

我会说所有必要的方面。没有学位涵盖学位课程的所有方面。再加上“全部”是主观的。
PhillyNJ 2013年

1
您如何定义“必要”?全部就是全部 -涵盖了所有可能的CS应用程序。它不是“主观的”,而是可以量化的。
SK-logic

在CS涵盖了对计算和计算机技术,硬件和软件的研究而不是任何特定语言的前提下,我定义了“必要”一词,它回答了原始问题。
PhillyNJ 2013年

好的,您将如何在没有底层语言的情况下覆盖硬件?如果没有这样的关键语言,您将如何涵盖编程语言的历史(这是“所有” CS的极其重要的一部分)?如果没有至少一种具有指针算术的语言,您将如何覆盖编程语言的语义?任何全面的CS课程中都必须使用一种或另一种方式,但是必须使用类似于C的语言。
SK-logic

0

这实际上取决于您想对所学内容做什么。的确,用C或它的后代给出了很多算法。但是,多年来,我看到了更多的C ++,C#和Java示例。CS所要教的是对计算的一般理解,因此就是如何选择或创建适合手头任务的语言。

但是,仍然有很多人的第一语言和最后一门语言是C或Java的某种变体,并且并非所有人都会接受训练以理解CS学位提供的任何给定语言。甚至一些CS毕业生在编程方面都遇到麻烦。因此,您可能需要对这些语言有足够的了解,以便您根据自己的职业道路与之交流。如果您打算坚持学习,那么您将遇到更多的语言障碍,尤其是在跨学科领域(人们使用Prolog,Lisp,Haskell,Mathematica等)时,


-1

如果您真的要学习“计算机科学的各个方面”(雄心勃勃的计划!),则必须处理几种不同的汇编语言和至少一种HDL(并在其中的网表级别练习编码)。

作为接近这些真正基本事物的更高层次的步骤,您必须选择C或Pascal之类的东西,这是不可避免的。跳过抽象阶梯会适得其反。

无论如何,我怀疑这个问题甚至值得提出。毕竟,C只是一种很小的语言。与浪费思考是否必须学习C相比,您可以在更短的时间内了解它的基础知识。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.