什么被认为是在“现实世界”情境下编码的好习惯?

时间:2012-04-03 00:46:10

标签: assembly comments

我刚刚从大学转学到大学,似乎我所知道的关于正确编码技术的一切都是错误的。我学会使代码可读的方式是

  • 条件语句和循环体中的缩进代码
  • 赞成创建一个新函数而不是拥有大块代码
  • 注释掉用于调试的代码,或者将来可能会再次使用
  • 在运算符和参数之间放置空格,例如if(a< = b)func1(arg1,arg2, ARG3)

我失去了主要分数,因为

  • 在汇编代码中不应缩进,只应使用标签 用眼睛扫描来源
  • 如果可以在不定义新功能的情况下完成某些事情,请不要这样做
  • 不要保留旧代码和简短评论,以免他们遇到下一行
  • 不要在参数和运算符之间留空间

我搞砸的最后一件事是程序中的第一件事,它将寄存器初始化为0,因为使用的模拟器做了这个,但实际的板没有。这样做的缺点是浪费时间吗?我认为这有助于减少代码的错误......

5 个答案:

答案 0 :(得分:4)

您的规则(评论代码除外)通常仍被视为良好做法。但是,它们可能不像其他语言那样适用于装配。汇编编程是一种特定的野兽,因此可能有不同的风格规则/最佳实践。

话虽如此,您的原始规则仍适用于几乎任何其他编程语言。

另外,关于注释掉代码。这通常被认为是不好的做法,因为注释掉的代码经常被遗忘并使下一代开发人员感到困惑。通常,您的源代码管理系统可以轻松获取删除代码,因此您不应将其注释掉以保留它。

答案 1 :(得分:4)

正如许多人迄今指出的那样,在高级语言和低级语言之间做出区分是非常重要的。

高级语言实现了许多结构,这些结构使我们能够使人们尽可能地将我们的想法转化为尽可能接近原始的想法。我们有面向对象的设计,面向数据的设计,面向原型的设计......所有这些都是为了让人们以可读和可维护的方式描述事物。

几乎在所有情况下,这都会降低性能(与汇编语言相关,这只是一个远离机器代码的抽象层)。甚至一些被认为是面向对象设计的良好实践的东西迫使计算机做不必要的工作,这只会踩踏性能。这可能是程序员通过糟糕的数据建模来处理不必要的loadhitstores,缓存未命中(指令和数据)。吸气剂和制定者在常规OO设计中名列前茅。在他们之后是程序员,他们不考虑他们写的东西。

在较低的层面上,你的工作是安抚电脑,而不是你的审美观。你正在处理寄存器,内存地址,加载和写入数据。它需要是给定硬件架构喜欢它的方式。

我不同意您的老师关于良好实践的一些想法,特别是如果它们是以高级语言强制执行的。正如我所说的,如果它不妨碍性能,看起来美观可读,它就成了你完成任务的风格。在我看来,惩罚个性......嗯,让我们说不好。

最重要的是,你必须安抚老师。他们可能是一大堆要处理的事情。即使他们错了,你也必须接受并玩他们的游戏。试着争论你的一面,问你想要什么,你会没事的。

祝你好运!

答案 2 :(得分:2)

人们对高级语言与汇编语言的规则差异很大。

(当我提到一些明显的东西时,我的意思是另一个程序员,你的经验和你一样多,对一个随机的新闻学生来说不是很明显,或者其他什么)

总的来说,在任何情况下的良好做法:

  1. 只要变量/寄存器的用途不是很明显,就给予简短的评论
  2. 避免明显的评论(即说计数器计数有点多余)
  3. 在提交的作品中,删除所有不必要的评论
  4. 将行长限制为80个字符(保持代码整洁,易于阅读)
  5. 就具体语言而言,您现在似乎对正确的标准有了相当不错的把握。基本上将您的第一个列表应用于除汇编和汇编语言之外的所有内容,并将第二个列表应用于汇编。

    此外,您不需要初始化寄存器,因为它们在启动时具有默认的已知值。高级语言的初始化通常由教师强制执行,因为某些情况需要它,而某些情况则不需要,并且只需初始化所有内容就容易得多(而且更安全)。编辑:我假设您正在使用ARM或AVR板进行最后一段。我认为其他人也是一样,但我不是肯定的......

答案 3 :(得分:1)

听起来你是第一次学习用高级语言写作的好习惯。

您的新学校希望您使用低级语言进行编程。两者的最佳实践完全不同。您只需要知道哪种做法适用于哪种语言。

答案 4 :(得分:0)

我认为您的高级代码风格指南与通常教授的类似。然而,正如其他人所指出的那样,汇编是一种不同类型的节目。例如,通常最好将特定子例程写入(比方说)乘以6,而不是使用通用子例程来乘以任意数字。这是因为汇编程序通常用于时间或空间关键型应用程序,其中通用函数调用中固有的开销只会妨碍。这也导致重复代码稍作修改(例如乘以6,乘以10等),甚至重复指令(将寄存器递增3次通常比向其添加3更快,因为必须在累加器中完成加法,其当前值可能需要保留,清除,等等。)

它更奇怪:有时子程序会直接跳转到另一个子程序而不返回(“尾调用”);有时程序会在堆栈上推送一个地址,然后从子程序返回(即执行RET或RTS指令)而不先调用子程序:这可以让你分支到大量不同的例程,而无需先做很长的系列比较/分支语句。通常,汇编程序将日期与代码交错,使用跳转或分支指令来确保数据永远不会被执行(因为对于计算机,有效的操作码只是十六进制序列)。

这很困难而且经常令人沮丧,但是学习汇编语言编程的回报是巨大的:你将以其他人没有的方式准确理解计算机程序的作用(以及它是如何做到的)。祝你好运!