【问题标题】:Shall i learn Assembly Language or C, to Understand how "real programming" works?我应该学习汇编语言还是 C,以了解“真正的编程”是如何工作的?
【发布时间】:2011-06-01 12:00:54
【问题描述】:

我是一名 Web 开发人员,主要使用 Ruby 和 C#..

我想学习一门低级语言,这样我就不会在我的(计算机科学专家)老板面前像个混蛋。

我听过很多关于汇编语言是如何成为了解计算机实际工作方式的唯一方法的纯粹主义者的嗡嗡声,但另一方面,C 作为一种语言可能更有用,而不仅仅是理论。

所以我的问题是..

学习 C 能教会我足够多的计算机科学理论/低级编程,让我看起来不像一个普通的花花公子(完整的工具)吗?

谢谢!

丹尼尔


谢谢大家!

一些非常棒的答案,

我想我会学习 C 只是为了掌握内存管理,但我认为你是对的,我最好还是学习更多我使用的语言!

【问题讨论】:

  • “计算机科学”和“计算机如何工作”是两种截然不同的野兽。
  • 我建议你像 Real 那样用机器代码编写程序 程序员在没有编译器、链接器或汇编器的帮助下使用二进制代码编写机器代码。 真正的程序员关心的不是生产力,而是如何使用最少的指令最好地利用机器的特性! ;-)
  • 为了给你的老板留下深刻印象,只需在截止日期前完成任务,并确保它们稳健且正确(产生正确的结果)并记录在案,这样你就不必为过去的工作咨询。
  • @Thomas Matthews 好声音!我宁愿成为一个可靠的开发者,也不愿成为一个纯粹的书呆子!

标签: c assembly computer-science theory low-level


【解决方案1】:

首先学习实际的理论。如果你不能用它做任何有意义的事情,那么学习 C 的语法就没有任何意义。在您牢牢掌握算法和数据结构的工作原理后,这些知识将适用于您可能会使用的大多数语言。

如果您打算使用 C# 和 Ruby,我认为学习汇编程序没有意义。

只要学习 C 就可以了,因为它是 C。

只要你做得对,你就可以用任何语言进行“真正的编程”。

【讨论】:

  • +1 用于在此处提及算法和数据结构作为共同点。我建议 OP 在进入内存管理之前先写一本关于该主题的书。尤其是他正在使用 gc。
【解决方案2】:

学习 C 能教给我足够的东西吗 计算机科学理论/低级 编程看起来不像普通的 花花公子(完整的工具)?

您正在使用可以执行非托管指针操作的 C#,与您在 C++ 领域中可以实现的目标相差不远。例如,游戏可以用 C# 成功编程,尽管大多数游戏都是 C++。

Assembler 基本上是在移动一些内存,如果你不知道自己在做什么,有时它也会做得很糟糕。 C++/C 编译器在底层创建了非常好的汇编代码,那么除非您必须编写低级驱动程序软件,否则您为什么要自己做呢。在我们的 2,000,000 行 C++/C# 混合代码中,唯一的汇编程序就是检测 VMWare。

我不认为在这个现代时代,鉴于您对工作的描述,您不需要知道您可以在处理器上使用多少个寄存器。无论如何都要学习 C++,但如前所述,学习语法并不等同于学习如何应用它。

至少学习和理解模式 (Gang of four)、OO 设计、了解不同测试方法的含义和好处以及所有这些对业务成本的影响。

【讨论】:

  • 哦,别忘了数据库理论!
  • 我同意,学习语法根本不意味着您知道如何使用它并很好地使用它。
【解决方案3】:

学习 C 将为您提供所需的所有信息,并能够在合理的时间内完成任务。

我建议你用 C 语言做一些有意义的项目,然后用汇编语言做一两个项目,可能是为了微控制器或专门研究 SSE/MMX。

【讨论】:

    【解决方案4】:

    归根结底,这一切都归结为操作码、寄存器和寻址模式,而 C 完全没有教给你任何东西。然而,汇编器与其平台紧密耦合。当您在 Sparc 或 PA-RISC 机器上工作时,学习如何在 x86 上编写汇编程序对您没有多大帮助。

    C 真的不会教你很多其他语言在理论上不会教你的东西。关于 C 语言的问题在于,除了裸指针和字节流之外,它没有提供许多工具或抽象。您必须滚动所有自己的容器(列表、堆栈、队列等),如果您希望它们是通用的,您必须弄清楚如何将需要类型感知的代码(分配和比较)与通用算法。你必须管理自己的记忆。文本处理很麻烦(C 甚至不提供专用的字符串类型)。

    了解这些内容对您的日常工作或打动您的老板有用吗?可能是。我不确定您将如何在 C# 或 Ruby 代码中应用这些知识,这些代码在虚拟机中运行(与从 C 生成的本机二进制文件相反)。

    您想用计算机科学知识打动您的老板,阅读图灵机和马尔可夫算法。

    【讨论】:

      【解决方案5】:

      我认为汇编程序的知识不会让你成为更好的 Ruby/C# 程序员。

      您可以像使用磁化针写入磁盘一样低级,但如果您的程序无法运行或不安全,您将不会从中获得任何收益。

      学习“新”语言的语法不会帮助您获得更多关于编程深度的知识。

      【讨论】:

      • 我不同意你的看法。了解汇编,至少了解一点,会有很大帮助,因为即使您从未编写过任何一行代码,您也能清楚地知道发生了什么。
      • @BlackBear:如何有帮助吗?你会在 C# 或 Ruby 代码中应用这些知识吗?
      • 通过汇编(而不是汇编本身)获得的知识可以帮助您编写高效的代码。试试 Randall Hyde 的书“编写出色的代码第 2 卷”
      【解决方案6】:

      真正的编程与特定的低级编程语言无关。要了解计算机的工作原理,了解一些 CPU 指令以及硬件如何处理它们是不错的。

      要成为一名优秀的程序员,绝对不需要知道硬件是如何工作的,除非你想对硬件进行编程。

      【讨论】:

        【解决方案7】:

        如果这是你老板不傻的标准,我不会担心在那个老板面前看起来像个傻瓜。

        如果您想学习计算机科学,C 和汇编程序并不是最好的语言。你知道 Ruby 和 C#,我猜你知道一些面向对象。

        【讨论】:

          【解决方案8】:

          “真正的编程”在每种语言中的作用都是一样的,这才是你真正应该担心的。话虽如此,在 C 中处理一些东西是一个非常有用的练习/

          学习 C 不一定会教你太多关于计算机如何工作的知识,但考虑到它仍然是系统编程的首选语言,它是一个很好的途径。

          学习 ASM 当然也很有用,但如果您想将其应用到您的工作中,则可能没有必要这样做。不过,它可能会教给您一些有用的概念,或者至少可以帮助您更好地理解 CLR 的工作原理(或者总的来说,字节码编译和字节码编译的代码是如何工作的)。也许您可以尝试为较旧/较简单的平台学习 ASM;周围仍然有大量的 Atari 2600 场景,并且由于平台的固有限制,他们为在游戏中挤压一些额外功能所做的一些黑客行为非常棒。现代 x86_64 架构相当复杂,而且有些毛茸茸,尽管这更多的是个人观点,而不是实际情况。学习使用微控制器也可以完成工作,但请注意,许多(大多数?)使用与典型通用 CPU 不同的哈佛架构(即独立的程序和数据存储器)。

          【讨论】:

            【解决方案9】:

            先问问你的老板,而不是照他说的做,最后再征求反馈意见,并对你将要做的练习进行审查。按指示行动。重复直到他说“你现在知道的比我多”。 这是利用您有幸拥有的真正专家的专业知识的更有效方式,并将永远留下非常积极的印象。 这就像在业余时间单独学习 C 或汇编程序一样困难。

            【讨论】:

              【解决方案10】:

              我想学习一门低级语言,这样我就不会在我的(计算机科学专家)老板面前像个混蛋。

              这在很多方面都是如此,我学习c++和haskell也是出于类似的原因,我不后悔,因为他们教会了我很多东西,但我理解同龄人的压力。

              这是一个有 6 年历史的问题,有趣的是,没有人提到一本涵盖计算机科学基础的好的编程教科书。

              如果您想学习“真正的编程”,请尝试解决 《计算机程序的结构与解释》 麻省理工学院出版社在您的空闲时间。无论您的水平如何,它都应该涵盖您对编程的大部分(如果不是全部)好奇心。

              还有 Donald Knuth 的“计算机编程艺术”。 Knuth 尤其精通机器语言和其他低级的东西。


              请注意,尽管这两个作品都非常密集。

              这是我关于如何接近他们的两分钱。首先,它们不是为您的技能涂上糖衣的“教程”,它们以适当的方式介绍了一门科学学科,因此“我将如何处理它?我该如何使用它? "应该替换为“这是如何工作的?这是做什么的?为什么要这样做?”。

              尝试做书中包含的练习,但不要太勉强自己。如果做不到,没关系,传到下一个。 但是,如果你没有做任何一节中给出的练习,你应该花时间阅读本章,并修改它,以便你至少可以完成该节中包含的几个练习。

              只要坚持下去,你很快就会赶上你的老板/同事。如果您愿意,某些章节/练习甚至可能成为讨论的主题。他甚至可能喜欢你正在获得新技能的事实,或者没有,不要相信我的话,我做编程不是为了与人打交道。

              【讨论】:

                【解决方案11】:

                嗯,“真正的编程”并不是指特定的语言或低级语言。在我看来,“真正的编程”是分析一项任务,决定解决它的最佳方法,并将该方法放入一组简单的步骤中,然后根据需要进行修改和编辑,直到实现目标的过程。因此,语言并不重要,一切都在思考过程中。此外,高级语言并没有错,我一直使用 python 并且喜欢它。但是,学习低级语言确实可以帮助您总体上理解程序和计算机。会建议使用 c,因为它是 c# 和 c++ 的起源,并且会为理解这两种语言提供基础。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-09-21
                  • 1970-01-01
                  • 2010-10-04
                  • 2021-10-28
                  • 1970-01-01
                  • 2019-05-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多