大会仍然有意义吗?[关闭]


18

在编码和/或管理项目方面,汇编语言和高级语言之间是否有主要区别?显然,与大多数其他语言相比,用汇编语言执行特定的操作要花费更多的语句,但是是否存在差异会影响基于目标汇编语言(特别是x86 / x64汇编语言)运行项目(或应该)运行项目的方式?

就汇编语言和其他语言之间的差异而言,可以合理地猜测,其中至少有一些是其他语言的优势。谁能指出汇编语言的特定缺点以及减轻这些缺点的方法吗?

一个具体的例子是人员的可用性。是否有人在寻找经验丰富的汇编语言程序员时遇到麻烦,如果可以,可以采取哪些步骤来减轻此问题?


为什么今天有人会只用汇编语言编写一个完整的项目?还是您在询问一种混合语言环境,即当今通常如何使用汇编语言?
Martin Vilcans 2011年

6
请注意,在某些non-[PC|web|enterprise]程序设计领域中,汇编语言占主导地位或非常流行。我说的是微控制器,工业自动化或机器人技术。当然,这些领域也有高级语言,但是您会看到很多汇编语言。
Mchl 2011年

1
@Mchl:这些项目不是用C(甚至C ++)进行的,还是可能是汇编的吗?我会猜想,专门使用汇编非常罕见。
马丁·维尔坎斯

1
实际上,在工业自动化中,您可以遇到该领域之外根本不存在的一整套语言。部分原因是硬件上的差异(我们习惯了哈佛架构而不是冯·诺依曼架构)。以及过去使这些控制器可供电工使用的历史,电工曾经使用它们来处理开关和继电器。LD(en.wikipedia.org/wiki/Ladder_logic)就是这样存在的,它实际上是汇编的图形化解释。有关自动化中使用的更多语言,请参见链接的文章。
Mchl 2011年

2
我有一个小型安装程序,现在可以安装了。在汇编中(使用Windows API)与其他任何东西一样容易编写,为什么不呢?我也有一个汇编编写的信用卡刷卡器界面。从高级语言开始,但要使其工作起来却遇到了许多困难,以至于我重写了汇编程序以更好地控制所有流动的点...
Brian Knoblauch 2014年

Answers:


25

是的-但不是经常。

从某种意义上说,汇编实际上只是机器语言的代理,因此,当然,您可以使用高级语言进行汇编中的任何事情。

并非总是如此。例如,几年前,我在一个ARM CPU上工作,它具有一些时髦的操作码,用于更改只能在内核模式下使用的图形状态。它们在高级语言中没有直接的等效项,并且我确定Linux内核驱动程序中用于更改这些状态​​的函数包括一些程序集。

在80年代到90年代中期的微处理器上,如果您需要一些代码才能真正快速地运行,那么您通常会将它们编写为汇编语言,因为与大多数C语言相比,熟练的人员可以轻松地编写出更优化的汇编语言编译器可以生成。一些早期的Mac程序是完全用汇编语言编写的,并且在当时这个时代令人惊讶地快。即使不使用汇编语言编写整个程序,我也肯定会通过嵌入式汇编在C语言中优化内部循环。

但是情况在1990年代中期开始发生变化。CPU开始包括流水线和分支预测之类的功能,因此最有效的指令排序对人类而言并不总是显而易见的。更糟糕的是,最有效的排序在同一系列的CPU中有所不同。例如,PowerPC编译器通常为G3,G4和G5系列提供目标开关。相同的目标代码将在所有这些代码上运行,但将更有效地在这些系列之一上运行。

从那时起,指令排序变得越来越复杂,尤其是在架构更复杂的CPU(例如x86,PowerPC和SPARC)上。(我相信ARM仍然很简单。)代码大小是一个很大的附加因素-使用更多CPU周期但可以保留在CPU缓存中的代码通常比使用较少CPU周期但触发缓慢的内存提取的代码运行得快得多。 。现代的主流编译器在人类CPU上优化代码方面所做的工作要好得多。

我至少有15年没有找到编写汇编的充分理由。我认为在2011年,组装的主要用途是:

  • 要在调试时阅读反汇编转储,即使在今天我也偶尔这样做。
  • 处理非标准的CPU功能,例如时髦的图形模式。
  • 编译器编写-提供一种中间的,人类可读的格式,可以将高级语言翻译成该格式。

1
甚至您的#3理由也开始以针对高级编译器框架(如LLVM,nanojit或libjit)或诸如JVM,CIL,Parrot,Rubinius或Neko字节码之类的编译器消失。
约尔格W¯¯米塔格

有时仍需要在图形/视频工作中做一些SSE2。虽然首先以TBB / OMP为基准!
马丁·贝克特

@马丁:OMP与SSE2正交。(假设有良好的数据布局习惯)
rwong 2011年

@rwong-但是过程仍然是1,发现它太慢了。2,希望OMP / TBB足够快。3,求助于手写SSE2版本!(按疼痛顺序排列)
马丁·贝克特

2
例如,整个过山车大亨都是用汇编编写的(减去在c中完成的图形),并且在当时非常强大。当大多数游戏都具有几个16x16像素的sprite进行预定义的动作时,数百个单独的AI独立,几乎无缝地独立运行。我一直喜欢用它来展示汇编的力量。
Ampt

19

尝试为“小型嵌入式”微控制器编程-无需使用组件即可安装汽车警报器遥控器,电话电池监视器,键盘控制器,风扇速度调节器。

边界移动时,总有组装的空间。

15年前,您的自行车里程表是机械的,微波炉是在模拟电路中,电视遥控器是在数字电路中,Sat电视调谐器是在汇编中编写的,电话固件是在C语言中,而计算机小程序是在Java中。

7年前,微波炉在数字电路中,电视遥控器是用汇编语言编写的,电视机顶盒是用C语言编写的,您的手机运行基于Java的UI。

如今,自行车里程表已在数字电路中,微波炉已在安装固件,电视机遥控器已在C固件,电视机顶盒运行Java,您的手机已安装Linux。

想打赌未来7年吗?随着越来越多的技术获得更高级的控制语言,汇编获得了新的发展,并且将不断获得发展。看看今天用机械或模拟电路做什么。您可以在几年后在那里下注。你的电灯开关?你的水龙头?你的水壶?你的牙刷?

总会有一个新的设备,器具,玩具,普通物品在装配时进行编程。


3
好答案。有多少人宁愿因为使用Java或某物作为开发平台而为电池能使用一半的时间支付两倍的费用?看一下groupon以及人们希望省钱的所有其他方式,看绿色运动可以节省资源。为什么要增加成本并在所有嵌入式产品上加电只是为了避免组装?
old_timer 2012年

1
您忘记添加了,现在计算机运行Javascript(Chromebooks)。对我来说,进步是很可悲的,但却是事实。
霍肯

截至2017年,CIA进入运行Linux的电视,可以欺骗运行在车钥匙上的Java信号,任何人都可以通过WIFI连接到假阳具的 C ++固件,牙刷在2013年得到了远程利用,但幸运的是仍然有耳机组装工作中产生的噪音消除。尽管程序集失去了作为任何事物的顶级控制器的位置,但改为转移到子组件中。您的百​​叶窗已经运行Java,但是该Java控制板与以装配方式运行的百叶窗电机控制器进行了对话。
SF。

8

我主要基于我曾经使用过的汇编器-主要是MASM,NASM和(在较小程度上)TASM。TASM的某些更高版本具有(具有?)某些功能来支持OO,但是我并没有太多使用它们,因此我不打算对此发表评论。

首先:大多数语言都已经转向至少有点像树的结构。无论是面向对象,基于对象还是完全基于对象,都对系统不同部分之间的关​​系进行了很多定义。还有很多可以“保护”系统的一部分,以防止意外的“干预”,但可以保护其他部分(即使您愿意,通常可以绕过保护)。相比之下,汇编语言是相对“扁平”的-系统不同部分中的代码(和数据)之间的大多数关系主要是通过文档建立的,而在较小程度上则是使用命名约定。

其结果是,比理想的情况更紧密地耦合代码通常要容易得多。促使人们开始选择汇编语言的要求(更高的性能,更小的尺寸等)通常也会得到奖励-通过绕过批准的接口,这样您通常可以获得更小,更快的代码(尽管通常不会很多)在任何方面都更好)。语言和工具本身所做的事情对限制您所做的事情(好是坏)的作用要小得多,这给管理人员预防问题带来了更大的负担。我不会说它在质量上有所不同,但从数量上讲是不一样的-即,管理人员必须以任何一种方式来预防问题,但是就汇编语言而言,它通常需要更多(而且通常是更严格的)关于什么是或不是的指导原则。不能接受。

缓解此问题很大程度上取决于更仔细的指南,经验丰富的人员提供的更多指南以及更具体,更严格执行的命名约定。

人员配备是一个问题。但是,我遇到的问题主要不是我所期望的。找到一个乐于助人的家伙,很乐意跳进汇编语言代码。尽管几乎完全缺乏使用汇编语言的经验,但大多数人的工作还是相当合理的。

我遇到的困难是寻找更多的高级人员,他们可以使项目至少处于某种控制之下,并且不完全习惯于会提供(并在很大程度上执行)合理保留代码必要准则的语言。可维护和可理解的。

回顾过去,我可能已经/在这方面引起了一些最大的问题。我可以看到两个问题来源。首先,在我考虑的项目开发阶段,我已经主要使用高级语言进行了一段时间的编码,并且使用汇编语言作为最后的手段。因此,当我确实使用它时,几乎每一种可能的提高性能的技巧不仅是公平的游戏,而且是期望的。其次,当我在使用某些完全(或主要)用汇编语言编写的系统上工作时,它是由一些颇为铁腕的项目经理管理的。那时我还比较年轻,并且很坦率地对他们的办事方式表示不满,所以倾向于做相反的事情。回想起来,他们所做的事情确实很重要,而不仅仅是因为他们年纪大而且不灵活(我很确定那是我当时的看法)而完成的。


我对TASM和Orca / M汇编程序有着美好的回忆=)
Patrick Hughes

0

在我看来,作为开发平台的组装可能与日常使用无关。这种观点的主要原因可能是因为从给定过程中删除的计算能力与优化同一给定过程所需的开发时间通常不值得花费时间和精力(对此有一个特定术语..听起来像是人/小时或其他东西。.如果您知道我所说的,请编辑..)上面提到了明显的例外,但就主流编程而言,汇编并不常用。

这就是说。汇编在软件工程研究背景下学习编程时仍然很重要,它教会了低级编程语言的外观和行为。我将继续讲这些天我们在课堂上使用的例子。我们使用Stanley Warford(美国美国佩珀迪因大学)开发的pep / 8程序集及其开放源代码软件(此处提供)。主要是因为它虚拟化了cpu并在运行时逐步执行代码时显示了内存内容(对于学习,调试非常有用)。

因此,根据您的使用情况,我认为组装可能无关或无关紧要。


0

我想您是在问“卡车是否还有相关性?”。我的意思是,装配具有广泛的应用范围,但不像高级编程那样广泛,就像卡车比汽车少得多。

在算法优化等领域,您可以直接使用处理器寄存器来改善图像/视频处理算法。

在诸如密码学之类的领域中,您可以以相同的方式使用它。

在具有新架构的新处理器中(请记住何时发布Cell微处理器),请确保它们必须在组装时编写引导加载程序等(并且对于旧处理器也是如此),但是长时间使用的处理器具有非常稳定的基础,并且难以改进它)。

还会提供更多示例,因此这取决于您公司所关注的领域,如果您的公司致力于Web /移动开发,很可能不需要它,但是如果您公司专注于微控制器,嵌入式系统等很有可能需要它。

和人员的可用性,取决于,我想如果您在英特尔,高通公司问...他们必须有一个大型汇编程序员的清单(就像您是否在工作场所问“这里有多少卡车司机?”想的不多,但这并不意味着没有其他地方。如果您问“附近有多少汽车驾驶员,会发生什么?”。


-3

如果您真的想知道为什么学习汇编是最好的选择。原因如下。

  1. 如果您要在Visual Basic和MS上进行编程,则无需学习汇编。
  2. 如果您不必制造严肃的微控制器小工具,则无需学习汇编。
  3. 如果您在使用微控制器时拥有可用的内存空间,则无需学习汇编程序(当内存与微控制器接口时,上帝会为您提供帮助)
  4. 如果您不希望像微控制器/微处理器那样的电源供电,则无需学习组装。
  5. 不了解大会就像了解冰山。您可以看到自己的25%的能力以及您的微型能力,以及75%的您永远不会知道或不了解
  6. 尝试运行完全用Assembly编写的Kolibris OS!您是否看到一个操作系统在不到5秒的时间内启动,并且在单击鼠标1秒钟后便开始运行应用程序。
  7. 现代编译器在后端具有通用功能,因此与Assembly相比,生成的最终代码将很繁琐。

大会就像《复仇者联盟》的娜塔莎·罗曼诺夫。这是一种魅力和魔力。首先,它会咬你,但请相信我,您将永远不会忘记味道。


1
这似乎并没有提供任何实质性的制作上分和5分之前解释的答案
蚊蚋
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.