我是一名Web开发人员,主要从事Ruby和C#...
我想学习一门低级语言,所以我看起来不像我(计算机科学专家)老板面前的屁股 .
我听过很多纯粹的嗡嗡声,关于汇编语言是学习计算机实际工作方式的唯一方法,但另一方面,C语言可能更有用,而不仅仅是理论 .
所以我的问题是......
Would Learning C teach me enough computer science theory / low level programming to not look like a common dandy (complete tool)?
谢谢!
丹尼尔
多谢你们!
一些非常好的答案,
我想我会学习C只是为了掌握内存管理,但我认为你的权利,我会更好地学习更多我使用的语言!
10 回答
最后,它归结为操作码,寄存器和寻址模式,其中C绝对没有教你什么 . 但是,汇编程序与其平台紧密耦合;学习如何在x86上编写汇编程序对于使用Sparc或PA-RISC框时无济于事 .
C真的不会教你很多其他语言在理论上也不会 . 关于C的事情是它不提供除裸指针和字节流之外的许多工具或抽象 . 您必须滚动所有自己的容器(列表,堆栈,队列等),如果您希望它们是通用的,您必须弄清楚如何将需要进行类型识别的代码(赋值和比较)与一般算法 . 你必须管理自己的记忆 . 文本处理是一种痛苦(C甚至不提供专用的字符串类型) .
这对于了解日常工作或给老板留下深刻印象是否有用?也许 . 我不确定如何在C#或Ruby代码中应用这些知识,这些代码在虚拟机中运行(而不是从C生成的本机二进制文件) .
您希望通过计算机科学知识给您的老板留下深刻印象,阅读图灵机和马尔可夫算法 .
真正的编程不是关于特定的低级编程语言 . 要了解计算机的工作原理,了解一些CPU指令以及硬件如何处理这些指令并不错 .
要成为一名优秀的程序员,除了您想要编程硬件外,绝对没有必要知道硬件的工作原理 .
首先要学习实际的理论 . 如果你不能用它做任何有意义的事情,学习C的语法就没有任何意义 . 在您充分掌握算法和数据结构的工作原理之后,这些知识将适用于您可能会使用的大多数语言 .
如果您打算使用C#和Ruby,我认为只是为了这样做而学习汇编程序的重点 .
你可以很好地学习C,因为它是C.
只要你做得对,你就可以用任何语言进行“真正的编程” .
如果这是你老板不傻的标准,我不会担心在老板面前看起来像个傻瓜 .
如果你想学习计算机科学,C和汇编程序不是最好的语言 . 如你所知Ruby和C#我想你知道一些面向对象 .
“真正的编程”在每种语言中都是一样的,这就是你应该真正担心的 . 话虽如此,用C语言处理一些非常有用的练习/
学习C不一定会教你太多关于计算机是如何工作的,但它是一个很好的通道,考虑到它仍然是系统编程的首选语言 .
学习ASM当然也很有用,但如果你想将它应用到你的工作中,它可能是不必要的 . 它可能会教你一些有用的概念,或者至少可以帮助你更好地理解CLR是如何工作的(或者一般来说,字节码编译和字节码编译代码如何处理它们的东西) . 也许你可以尝试为更老/更简单的平台学习ASM;还有一个沉重的Atari 2600场景,由于平台的固有局限性,他们在游戏中挤出一些额外功能所做的一些黑客攻击非常棒 . 现代的x86_64架构非常复杂,有些毛茸茸,虽然这更像是个人观点而非实际情况 . 学习使用微控制器也可以完成工作,但要注意许多(大多数?)使用哈佛架构(即独立的程序和数据存储器),这与典型的通用CPU不同 .
学习C将为您提供所需的所有信息,并能够在合理的时间内完成任务 .
我建议你用C语言做一些有意义的项目,然后用汇编语言做一两个,可能用于微控制器或专攻SSE / MMX .
首先问你的老板,而不是他告诉你的,最后再次询问反馈和审查你将要做的练习 . 按指示行动 . 重复直到他说“你现在比我更了解” . 这是利用你有幸运的真正专家的专业知识的更有效方式,并将永远留下非常积极的印象 . 这将是在业余时间单独学习C或汇编程序一样困难 .
我不认为Assembler的知识会让你成为一个更好的Ruby / C#程序员 .
您可以使用磁化针写入磁盘的低级别,但如果您的程序不工作或不安全,您将无法获得任何东西 .
学习“新”语言的语法无助于您获得有关编程深度的更多知识 .
好吧,“Real Programming”并不是指特定语言或低级语言 . 在我看来,“真正的编程”是分析任务,决定解决它的最佳方法,将该方法放入一系列简单步骤,然后根据需要进行修改和编辑直到达到目标的过程 . 从那时起,语言并不重要,这一切都在思考过程中 . 此外,高级语言没有任何问题,我一直使用python并喜欢它 . 但是,学习低级语言确实可以帮助您开发理解程序和计算机 . 会建议c,因为它是c#和c源于的地方,并且将为理解这两种语言提供基础 .
您正在使用可以执行非托管指针操作的C#,而不是在C land中可以实现的目标 . 例如,游戏可以在C#中成功编程,但大多数游戏都是C语言 .
如果你不知道你在做什么,汇编程序基本上会移动一些内存,有时也会做坏事 . C / C编译器在下面创建了非常好的汇编代码,为什么你自己会这样做,除非你必须编写低级驱动程序软件 . 我们的2,000,000行混合C / C#代码中唯一的汇编程序是检测VMWare .
我不认为在这个现代时代,鉴于您对工作的描述,您需要了解可以在处理器上使用多少寄存器 . 通过各种方式学习C,但如前所述,学习语法与学习如何应用它不同 .
至少学习和理解模式(Gang of four),OO设计,了解不同测试方法的含义和好处以及所有这些对业务成本的影响 .