it-swarm.cn

低级编程-对我有什么用?

多年以来,我一直在考虑深入研究“低级”语言。对我来说,这意味着C语言和汇编语言。但是,我还没有时间这样做,也从来没有必要。

现在,因为我看不到任何必要,所以我觉得我应该只是安排某个时间点来学习该主题,或者永远放弃该计划。

我的位置

在过去的四年中,我一直专注于可能会发生变化的“ Web技术”,而我是一名应用程序开发人员,这不太可能发生变化。

在应用程序开发中,我认为可用性是最重要的。您编写的应用程序将被用户“消耗”。这些应用程序越有用,您产生的价值就越大。

为了获得良好的可用性,我相信以下是可行的

  • 良好的设计:可通过深思熟虑的用户界面访问深思熟虑的功能。
  • 正确性:如果没有正确实施,最好的设计是不值得的。
  • 灵活性:应用程序A应该不断发展,这样它的用户就不必切换到具有可以实现的新功能的其他应用程序B。解决同一问题的应用程序的功能不应有差异,而应具有不同的理念。
  • 性能:性能有助于获得良好的用户体验。理想情况下,应用程序始终具有响应能力,并且可以相当快地执行其任务(基于其频率)。性能优化的价值超出了用户可察觉的范围,这值得怀疑。

我认为除了性能之外,低级编程不会对我有所帮助。但是,出于性能考虑,以低级语言编写整个应用程序对我来说还为时过早。

我的问题

低级编程可以教给我什么,其他语言不能教给我什么?我是否缺少某些东西,或者仅仅是一项技能,而这对于应用程序开发几乎没有用?请理解,我并不是在质疑C和Assembly的价值。只是,在我的日常生活中,我为那个世界的所有错综复杂的东西被我抽象化和管理(大部分是用C/C++和Assembly自己编写的层)为自己感到高兴。我只是看不到任何新概念,对我来说只是细节。那对我有什么用呢?

我的结论

感谢大家的回答。我必须说,没有人真的让我感到惊讶,但是至少现在我可以确定,我会放弃这一感兴趣的领域,直到需要它为止。
据我所知,这些天为当今的CPU使用的处理器编写程序集不仅不必要地复杂,而且有可能导致运行时性能比C语言差。由于OOE的原因,手工优化几乎是不可能的,尽管您没有获得编译器可以自动进行的各种优化。而且,该代码是可移植的,因为它使用了一小部分可用命令,或者经过了优化,但是它可能仅在一种体系结构上工作。
C不再像以前那样需要。如果要用C编写应用程序,我将尽可能使用经过测试和建立的库和框架,这将使我免于实现字符串复制例程,排序算法和其他在大学中用作练习的东西。我自己的代码将以类型安全为代价更快地执行。我既不希望在常规应用程序开发过程中重新发明轮子,也不希望通过查看核心转储来进行调试:D
我目前正在尝试语言和解释器,因此,如果有什么我想发布的东西,我想我会把一个可行的概念移植到C上,尽管C++也可以做到。
再次感谢大家的回答和见解。

32
back2dos

低级编程适用于在普通台式计算机上没有立即提出要求的特殊情况。这可能是速度瓶颈,也可能是内存瓶颈,或者是完全不同的东西,通常非常有趣的是,看看在这些要求下可以做什么。

可以将其视为Haikus或Limericks,其中的限制使它变得有趣。

为了让您了解在当今似乎不可能的情况下可能发生的事情,这是有史以来最伟大的黑客之一。 1中的象棋Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/

9
user1249

我最近只是在想这个。我目前认为自己是C#开发人员,这对我的职业生涯来说是非常好的。

但是,每隔一段时间我就会错过一些真正的底层东西(本质上是通过用C语言进行汇编或设备驱动程序来“弄脏我的手”)。我只是想念编程。我不希望这对我的职业生涯有很大帮助。如果您要使用设备驱动程序或嵌入式系统,那么它将很有帮助。

我使用抽象语言编写的程序越多,我就越想念最初把我带入计算机的原因:在计算机周围闲逛,看看有什么花招。汇编器和C非常适合戳:)

通过使用较旧的语言,我认为您不得不自己做几乎所有事情。在C#中,我可以执行myArray.SortBy(x=>x.Name)之类的操作。我无法用C做到这一点。我接受该语言将为我做最好的排序。如果我要用C语言来做,那么我可以回到大学模块时代,并修改不同的排序和搜索算法。

因此,我认为较低级的语言将帮助您修改所有已被抽象掉的,长期以来被遗忘的位。与职业发展相比,个人挑战更多。

29
Jonathon

我的建议是作为好奇心与C一起玩。不要花大量时间进行投资,因为这样做不值得。

建议目标:

  • 刷新有关基本数据结构和算法的内存。
    • 知道这是一件好事,例如代数和几何。
    • 尝试用C做一些大学教科书练习或程序难题。
  • 从CPU缓存到跨洋网络等待时间,对内存(带宽)层次结构的更好理解。这将在所有级别上帮助您提高应用程序开发技能。
    • 最重要的是,了解a 高层代码的不明显重新排列可能会导致戏剧性速度提高
      • 有时,原因只能在内存层次结构的上下文中的低级实现中理解。
      • 不了解这种可能性的自然原因会导致无知恐惧,并最终导致拒绝,认为高级开发人员无法利用这种优化。实际上,这没有错。
  • 欣赏基于组件的软件系统的美感,它使C/C++/Assembly中开发的低级组件可以被高级系统使用。
    • 美观与软件可用性完全相同:
      • 好的设计(功能强大,易于使用,经过深思熟虑)
      • 正确性
      • 灵活性(通过组成现有零件的扩展和新行为,每个零件都有明确的目的)
      • 性能(不增加可用性)
    • 尽管您可能不设计自己的低级组件,但是您的理解将帮助您评估和选择要在高级别项目中使用的好的组件。
  • 最后,请理解低级组件在实现上几乎总是更复杂,仅通过查看接口就难以理解。
    • 低级别总是很复杂。一个好的库可以隐藏复杂性而不降低其功能。
    • 学习阅读由组件开发人员编写的“技术说明”,这些建议是为上级组件用户提供的有关如何最佳利用组件的建议。
15
rwong

如果您想了解machine的工作原理,而不仅仅是了解高级语言所依赖的虚拟机,那么Assembly会教您这一点

如果您没有理由在意-并且大多数程序员如今确实不在意-那么不必担心。

它会改善您的基础,但可能不会改善您的网络应用

8
Steven A. Lowe

每种编程语言都会改变您对编程的总体看法。我可以提供的一个具体示例是,当我开始学习haskell时,突然之间javascript,Ruby和python)的功能点变得更加有意义。我从未使用过在haskell之前和之后的任何代码中都可以使用foldl,在数组中我几乎可以看到它,因此,如果您学习C语言,您很有可能会更加了解自己喜欢的语言中各种结构的相对性能特征。几分钟前,我在听有关编写快速且经过优化的javascript的演讲,而发言者说:“如果很难用C做,那么javascript的确会变慢。”他的意图是javascript是一种解释型语言,而解释器是用C或C++编写的,这使我很头疼,因为我很少有C的经验,也不知道C的难点或难点。

8
davidk01

如果您不只是为了好玩而做,因为极客真的喜欢完全控制自己的硬件,那么您可能至少会更好地感觉到,用C而不是Java编写程序时,程序可以变得更快。您可能还学会了真正欣赏高级语言的功能,例如垃圾回收。

7
user281377

出于好奇,万岁!

即使在逻辑上无需知道某人的日常职责,也要对复杂系统最低层的实际情况有所了解,这非常好。到目前为止,最好的方法是构建自己的CPU。您必须考虑机器语言级的操作码,了解为什么正交指令集如此好,中断处理的复杂性,复杂电路与微码之间的折衷(例如,以乘法为单位),还有很多其他的乐趣!

但这显然需要电子专业知识,而且很耗时,因此,最好的选择是古董样式的8位CPU。像8051这样的微控制器仍在广泛使用,并且可供业余爱好者使用。这仍然需要一些专门知识来使电子设备成群,并使LED发光而不吸烟,如果您还不具备电子设备的成本,则需要花费$$。

之后的第二件事是:在CPU模拟器中模拟玩具(模拟器?我把这些术语弄混了)- Z80、6502、8086 ...所有旧的8位元代码都存在。对于不知道要固定烙铁哪一端的应用程序程序员来说,这可能是最有教育性和乐趣的(尽管很快就会知道:)文本如何写入视频存储器,汇编代码技巧如何提高性能。 ..有很多有趣的东西可以探索。

我不太了解将C作为另一种语言来学习,而没有对CPU内部工作的初步了解。知道如何在CPU寄存器之间发送位以及如何访问内存,对于真正获取指针和其他C语言概念很有帮助。

5
DarenW

总之,很有趣。当我过去玩汇编程序(从VB转换为C++,C等)开始工作))时,将数据从处理器的一部分移到另一部分真是太棒了。感觉要知道完全 CPU内部正在发生什么,而不必担心您不知道的底层发生了什么,再加上极大的自由感-您可以做任何事情,因为在高级语言中没有内置的限制。

另外,能够与任何以其他任何语言编程的人交流,然后“好吧,如果您不够顽固……”那是幼稚,幼稚的乐趣。

4
Dan O

是否有充分的理由学习/练习低级编程。根据上下文,我有各种答案。

首先,我在教C编程(还包括OCaml和Java),激励学生从困难的地方学习编程可能是这项任务中最难的部分。到目前为止,我发现的最好的论据是“理解”:高级语言隐藏了很多底层机制,有时不是很好,即使在一些低级技巧确实有用的情况下,它们也会促使您停留在较高级别(大部分时间都是为了提高性能。)了解您所使用的内容确实可以帮助更好地使用它。我的教学经验向我证明,学习过较低级别编程(以及其他非面向用户的编译器)的学生更具适应性,并且可以更快地学习新的较高级别的概念或工具。

其次,正如您所说,性能是用户体验的一部分。在大多数情况下,性能被视为编写复杂且接近机器代码的问题。情况并非总是如此,性能更多地取决于算法和数据结构,还涉及算法与数据之间的交互。我在这个主题上使用了一个特殊的项目,基本上这是一个简单的路径查找,但是真正的问题是数据的大小:图形是无限的。实现下降性能并适合内存的唯一方法是编写专用的内存分配器(实际上是两个,一个池分配器和一个循环分配器。)这是您在大多数高级语言中无法做到的。实际上,大多数垃圾收集语言都会有性能和内存问题。

可能还有更多的论据,例如较低级语言相对于“炒作”语言的稳定性(从历史和长寿的意义上讲)(被认为是将来编程的语言可能在几年内消失的事实是一个长期的事实)。故事,人们无法预言新事物的寿命,但是这种观点在较旧的语言中仍然适用...),当然,还有一个问题,或者事实是,大多数高级语言都可以做到这一点用较低级的语言完成,但不是相反(但考虑到这一点,我们应该只在Assembly中进行编码...)

我自己陷入了两个世界(完全不同),我花了几年时间研究理论编程概念,类型系统设计和证明,因此我只使用和学习非常高级的语言(大多数是功能性语言,但也纯最近,我回到了另一端(主要是系统和内核编程),发现自己在这个领域很轻松,我很开心!对我而言,下一步是找到结合点:面向较低级别编程的高级语言功能!因此,到目前为止,还没有语言可以使用(也许是谷歌进行用户级系统编程),我正在考虑构建自己的语言的想法,但这是另外一回事了。

2
Marwan Burelle

我想说的是,您的领域没有太多理由,但是,如果您要进行高性能计算(例如游戏,科学等),这是合理的。

1
Darknight

我认为如今低级和高级编程可以完全分开。基本上,这意味着您可以在不了解C和汇编程序的情况下毫无困难地度过所有职业。也就是说,从编程和设计的角度来看,C编程语言无法教给您很多知识。

出于好奇,您可以了解事物在较低层次上是如何工作的。例如,当我上大学时,我很喜欢使用gcc从C++生成汇编代码。理解多态主义和例外是如何实施的很有用。但是除此之外,您现在可以从C中学到的唯一东西是:

1)脏记忆的把戏。 C是了解程序员的疯狂无底的最佳方法:)

2)GOTO实际上用于(并且非常有用)回滚错误

3)更好地了解内存分配的工作方式(任何人在堆和栈之间的区别?)。

所以基本上我的论点是:如果您已经完成了大学并且仍然不需要C,那就不要学习它了:)

1
Emiliano

您不需要了解低级语言,但是您应该了解所选高级语言的内幕。使用低级语言可以教会您这一点,但这不是唯一的方法。

这是一些可能影响高级语言的低级概念示例。

指标:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

字串:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

清单:

什么时候使用列表和链表? (如果不了解列表的工作原理,几乎不可能知道这一点)

-

有必要知道所有这些东西吗?不,但是会产生影响,如果您想精通高级语言,则需要对内部工作有一个很好的了解。

1
Alistair

低级编程可以教给我什么,其他语言不能教给我什么?

最值得注意的是,它将教您计算机的实际工作方式。除了通过低级编程,没有别的学习方法。无论您编写哪种应用程序,这都将始终有帮助。您将真正了解所有这些Web内容的底层内容。而且,如果您使用Windows,则整个API都是用C编写的,因此,只要需要使用当前语言及其库所缺少的功能,了解该语言就可以直接与OS进行通信。

当然,低级编程将使您能够处理完全不同的事情,例如嵌入式编程和实时编程,其中必须使用asm/C/C++。如果您对这类应用程序不感兴趣,那么确实不需要学习asm/C/C++。

此外,您还将学习位和字节。位操作,十六进制等。即使在进行Web /桌面编程时,您可能也会遇到这些问题。加密算法就是使用这种算法的一个例子。

1
user29079