低级编程-对我有什么用?[关闭]


32

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

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

我的位置

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

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

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

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

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

我的问题

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

我的结论

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


6
@TheLQ:我的问题不是为什么要使用它,而是我可以从中学到什么
back2dos

1
示例:回到基础
rwong 2011年

Answers:


9

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

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

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


1
我认为我真的会追求“限制使事情变得有趣”。在这里提到的所有事情中,这可能是最好的。回到学校后,我一直在用32kB内存和8Mhz CPU的计算器上编程游戏。这很有趣,但是我没有学到很多可以从中受益的东西。
back2dos

唐纳德·沃特,请说为什么?

29

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

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

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

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

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


15
+1是为了表达对在硬件中拨弄的热爱,以及看到什么抽搐-真是怪胎
Gary Rowe 2010年

2
如果需要,您可以自己用C#编写sort函数。如果需要,您也可以使用库函数在C中进行排序:gnu.org/s/libc/manual/html_node/Array-Sort-Function.html。我什至会说,通过使用较旧的语言,您自己必须减少工作量。因为大多数问题已经解决。但这并不能阻止人们重新控制轮子:
back2dos

15

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

建议目标:

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

8

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

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

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


6
C几乎可以工作。大多数C概念很容易翻译成机器语言。学习C语言并快速看一下汇编器,您的状态很好。
David Thornley 2010年

我正要发布一个类似的答案。我认为C还可以使人对计算机的工作方式有所了解,尤其是在管理内存方面。另外,许多抽象机器复杂性的语言都是用C语言编写的。至少,该人员将真正了解它们是如何被宠爱的:)
Tim Post

1
@Jorg:很有趣。与Intel x86或6502s相比,这些CPU中有多少处于商用状态?
史蒂文·A·洛

1
@Jörg,您在哪里找到这些CPU的?

1
@Thor:这里不是速度的问题,教育是问题。
Steven A. Lowe 2010年

8

每种编程语言都会改变您对编程的总体看法。我可以举一个具体的例子,当我开始学习haskell时,突然之间javascript,ruby和python的功能位变得更加有意义。之前,我从未在任何代码中使用过foldl,但是在haskell之后,我几乎在任何看到数组的地方都可以看到它。因此,如果您学习一些C,您将有更多的机会了解您喜欢的语言中各种结构的相对性能特征。几分钟前,我在听有关编写快速且经过优化的javascript的演讲,而演讲者说:“如果用C语言很难做到,那么使用javascript真的会很慢。” 他的意图是javascript是一种解释语言,而解释器是用C或C ++编写的。


2
+1表示每种语言如何改变您的思维方式。
肖恩

7

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


1
+1极客乐趣。尽管我必须说,但我并不是一个极客。而且我讨厌硬件:)
back2dos

1
速度差通常无关紧要。对于Web应用程序尤其如此,在Web应用程序中,服务器端处理通常不是瓶颈。
David Thornley 2010年

大卫:我完全同意普通的网络应用程序。在其他领域,差异可能非常相关。
user281377

1
@ back2dos,如果靠近硬件编程的想法对您没有吸引力,那么我会说不要理会它。这就像强迫自己学习拉丁语,只是因为它是许多后来的罗曼语系的基础。
tcrosley

2
给予足够的内存Java是一样快或比C快

5

出于好奇,万岁!

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

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

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

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


+1,因为这是提到指针的唯一答案。我认为那将是#1并被接受的答案。
Erik 2010年

4

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

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


4
实际上,您在汇编器中看不到CPU内部发生的很多事情。CPU自动执行乱序执行,超线程和内存缓存之类的操作。您总是可以再降低一步,直到达到物质的基本粒子。还是仅仅是能量?
凯文·潘科

通过使用晶体管和逻辑芯片构建自己的CPU,可以避免任何类似的秘密:D(我最喜欢的技术幻想之一!)无论如何+1是一个很好的答案。
DarenW,2010年

有道理!虽然当我最后实际使用汇编超线程可能是更通常理解为参照速缝制,而不是CPU的...
丹奥

2

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

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

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

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

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


1

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


1
我不确定是否还有许多高性能领域。游戏当然不需要低级语言。对于游戏,通常使用引擎,或者至少从OpenGL或其他东西开始。对于科学来说,并行化非常重要,而且正确。我想您最好使用OCaml之类的东西。对性能至关重要的领域不再是处理大量问题的领域,而是极为频繁使用的领域,例如内核,驱动程序,存储引擎等。我猜只有不到1%的开发人员真正接触过这些开发人员。
back2dos

4
@ back2dos,游戏引擎不会无所不在-有人必须编写它们。您认为OpenGL是用什么编写的?不是C#。如今,大多数应用程序都不需要使用低级语言了……但是很多人在需要它的其他领域工作。
GrandmasterB 2010年

1

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

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

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

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

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

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


2
了解C以了解事物在低水平是如何工作的,可以帮助您理解泄漏抽象时事物为何出错。
迈克尔·肖

1

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

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

指标:

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

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

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

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

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

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.