汇编作为第一门编程语言?[关闭]


12

您认为教人们将汇编语言(某种变体)作为第一门编程语言有多么出色的主意?与学习Java或Python相比,这将花费更多的精力,但是从“第一天编程”(至少与许多高级语言相比)开始,人们或多或少会对机器有很好的了解。你怎么看?至少对于那些愿意付出额外努力的人来说,这是一个现实的想法吗?的优点和缺点?

注意:我不是老师,只是好奇


5
我认为它更适合于学习计算机科学而不是软件工程/开发的人们
Imran Omar Bukhsh 2011年

1
@Imran我原则上同意,但是我能想到的每个大学课程都具有计算机科学学位,这些学位主要由从事软件工程工作的人获得。(我假设这个问题是关于编程职业的重要基础,而不是例如高中调查课程)
G__11年

7
@Imran-我发现这有点令人惊讶。计算机科学当然更倾向于数学和理论吗?对集合,抽象代数和渐近符号更感兴趣,而不是像位摆弄和编写无休止的重复。
Steve314 2011年

2
计算机科学当然有抽象主题,但在某些方面也非常“接近硬件”。我曾经参加过计算机科学会议LICS。我记得那里有关于各种排序算法的数据局部性的论文,我想这些论文为研究算法的实际效率提供了理论基础。对于组装,我个人觉得它有一些相似之处一些理论计算模型(图灵机,柜台机...)
荷兰Joh

1
IMO,每个程序员至少应阅读有关组装工作原理的信息。它给了我很多见识,并且我通常会尽可能地接近铬。杰夫·邓特曼(Jeff Duntemann)的《汇编语言分步指南》对初学者来说很有趣。
Erik Reppen 2013年

Answers:


14

用汇编代码激发新的程序员是很困难的。动态的问候,用户网站更轻松,更轻松。我并不是说基本课程是相同的,但是入门课程将具有大量鼓舞人心的内容,否则将没有第二门课程。

我记得我早期的编程课程是用Scheme讲授的,而令我沮丧的是,我不能轻易地编译成.exe并“运行”程序(我认为MS Visual Basic就是编程的全部)。直到几年后,我才真正掌握了自己一直在使用的强大工具。我认为,如果我首先有一些较实际的东西的早期经验,那我会更欣赏它,并将这些课程更好地掌握。


20
我见过很多学生,他们惊讶地使LED闪烁和电机移动。
whatsisname 2011年

1
@Whatsisname +1,只要做得到而不会陷入电子领域,这将是一个不错的演示。当然,如果“驱动程序”是教师提供的黑匣子,也可以使用高级语言(即Roomba黑客)来完成。
G__

1
VIC20,C = 64和类似机器上的组装启发了许多新程序员。
Gaius 2012年

2
@Gaius一开始不是!您打开这些机器,就可以使用基本的解释器。大会经过大量的经验并达到了基本功能的极限……
G__12年

1
@whatsisname,但您可以使用Arduino之类的东西来闪烁LED并移动电机,而无需学习组装
Ken Liu

12

我认为对于软件工程专业和CS学生来说,这都是一个糟糕的主意,一般来说,对编程而不是电子学感兴趣的任何人。

可以做,但它并不意味着它应该做。过去,用家用计算机做一些非常酷的事情的方法是首先学习组装。那是因为早期的硬件限制-高级语言还不够强大和不够快。如今,您可以使用更高级的语言在更短的时间内完成更酷的工作。

听起来更有趣的是,为一个简单的游戏编写一个快速的原型,玩弄算法上的变化,或者在寄存器和低级内容中苦苦挣扎?


3
作为一名钢琴演奏家,我当然会发现直接听一些歌曲会更有趣,但是要变得像样,您需要练习琶音,音阶等。然后再做一些开创性的工作(玩“准备好的钢琴”和等等),您需要从内而外了解钢琴的工作方式。您想知道自己的工艺水平有多好。
约翰

10
@John at CashCommons:比喻不好。从装配工开始就像启动锤子,键盘,重锤和阻尼器。然后进入音乐理论(五分之一圈)来解释黑键,白键业务。然后在演奏音阶之前,继续学习更多的音乐理论。
S.Lott

3
@ S.Lott:嗯...不太买。我可以在汇编中编写“ hello world”类型的程序,而不必担心晶体管。不需要成为芯片设计师就可以成为程序员。您正在谈论的知识将是制造或修理钢琴的基础,这与弹奏钢琴只存在毛刺的关系。
约翰

3
CashCommons的@John:“建造或修理钢琴”。那就是汇编程序的类比。可以编写汇编器中的琐碎“ hello world” ,但这只是OS API调用-实际上忽略了汇编器的所有令人恐惧的细节。为了编写I / O驱动程序,汇编程序必不可少。锤子和阻尼器的建造和维护方法相同,而不是性能。
S.Lott

1
@ S.Lott:嗯……我想特定的指令集确实取决于芯片,不是吗?好点子。
约翰,

7

我认为这不是一个糟糕的主意,但是您要给这些学生做一个程序有多复杂?组装需要做很多工作。一旦他们对在较低层次上的工作有所赞赏,就可以从最基础的内容开始,然后将它们转移到更容易使用的地方。初学者有时会在脑海中产生想法,他们将编写下一个Halo,MS Office或AutoCAD或类似的东西,而当他们看到用一种简单的汇编语言进行的工作量很大时,他们可能会被吓跑,所以要弄清楚有比组装更好的东西,一旦他们看到了概念,就将它们转移到那。您也可以尝试与C之类的东西同时进行assemlby教学。

另外,哪种汇编语言?我有点回想起MIPS相对容易使用,并且我认为它可以在仿真器中运行,因此没有危险,即使实际工具可能比现在的机器还好,也不会对实际机器造成问题。

如果操作正确,这可能会很好工作。请注意...


+1为问题事物的复杂性。我的投票是将一些汇编程序实现与高级语言实现进行对比。也许在仿真器中而不是x86中使用例如68000汇编程序-我不知道x86 / amd64汇编程序是如何发展的,但是68000比8086回溯到那时更整洁和易于使用。也许也值得考虑-LLVM这样的虚拟机汇编程序。与真正的汇编程序不同,但是它具有许多相似的原理,并且可能更相关。
Steve314 2011年

与C同时进行ASM的教学听起来是个好主意
Anto

@ Steve314:我不起来x86汇编,但它看起来像它得到比8086更复杂
大卫·索恩利

@David-我希望如此,但是在某些方面可能会变得更简单。在8086天内,可用的地址模式范围取决于您所使用的特定寄存器以及指令。在68000上,有(对于大多数用途而言)数据寄存器和地址寄存器,每种类型的使用都非常统一,没有任何索引或基址指针或其他麻烦。随着时间的流逝,也许情况发生了变化?68000还具有更多的寄存器,从而节省了一些移入和移出的内存。无论如何,您无需学习SIMD知识即可了解基本的汇编程序原理。
Steve314 2011年

@David-我简直不敢忘了我忘记了(分段)寻址。用高级语言来说,这已经够糟糕了。现在又有分段寻址,但是与虚拟内存等有关的是另一回事,应用程序级的程序员不必担心。
Steve314 2011年

7

汇编是我们在1900年代电子学校学习的第一门语言,这似乎是很自然的选择。从分立组件到电阻器晶体管逻辑,逻辑门,集成电路,处理器,再到组装编程,我们逐步完成了课程。这些班上的许多学生以前从未编程过任何语言,因此他们马上就开始学习。

所以组装可以是一个很好的选择。第一种语言如果有合适的奠定基础的学生。但是,对于以应用程序或Web开发人员为目标的任何人,我都认为汇编程序的起点可能太低。


7

可以肯定的是,如果人们首先学习汇编,他们就会成为了不起的程序员。

这让我想起了我学会了如何驾驶。我妈妈坚持

在无人驾驶汽车上学习之前,除非您获得信心,然后您才能驾驶我们的手动汽车。

她的理由是她不希望我一次又一次地分心。

将其应用到学习如何编程的过程中,是否有必要一次将所有东西都扔给学习者?他们了解变量是什么,同时了解可以在哪种寄存器中存储多少数据?

超过一半我的课我们失败装配类,这是一组谁,在那个时候,曾经认为自己有知识的编程2年以上的人。

我个人的喜好是,如果我不得不再次学习所有内容,那就是从一种对我尽可能多的语言开始。然后,据我所知,向后过渡到较低级别的语言。


1
我认为这是很好的建议。在某些时候,了解位和字节以及处理器对它们的作用很重要,但是从它们开始是一项非常浪费的工作,因为我们拥有像ruby和python这样的语言,非常适合初学者,并鼓励优秀的软件工程原理。
davidk01 2011年

1
您是否考虑过讲师在教授汇编语言课上做得不太出色的可能性?
John R. Strohm

我认为他做得很棒。
CrazyPenguin 2011年

3

至少对于那些愿意付出额外努力的人来说,这是一个现实的想法吗?

没有

但人们会对机器有很好的了解

为什么这样有利?您能否提供示例或提示,以证明这可能有什么价值?

的优点和缺点?

优点:无。

缺点:

  • 关于标志,状态和寄存器以及复杂的内存寻址方案,I / O设备和DMA,中断,时钟周期和填充物的混乱琐事。这些都无法帮助您理解现代的基于VM的语言和计算。

  • 与实际应用计算机的实际问题解决方法脱节。

  • 与最终用户的离婚以及他们需要解决的实际数据和处理问题。

  • 对机器和虚拟机,编译器和解释器以及构成整个世界的整个乌龟堆的不必要的解释。

  • 他们最终到达的高级语言中有许多详细的“这是'对象'的物理实现”。

  • 它们最终到达的高级语言中有许多详细的“这就是方法函数的分配方式”。

  • 很多“这不适用于80386,但确实适用于80586芯片组”的解释。

  • 许多使ASM程序执行的低级OS API调用看起来似乎可以被某人使用。

第一种编程语言的目的不是掌握芯片组。

第一种编程语言的重点是

  1. 了解如何考虑计算。

  2. 了解如何进行有用的数据处理。

  3. 了解如何完成工作。设计-代码-测试。


1
@ S.Lott-当然,这不是我最初提出的问题的重点,但是在使用高级语言之前拥有这些可能会有所帮助。不要误会我的意思,您的观点是正确的。
安托

3
-1很多缺点我都认为优点。在从上方使用它之前,最好了解一下它的工作原理。基础很重要。
2011年

1
汇编程序作为一种编程语言,比高级语言为您提供更好的数据结构,逻辑和更底层的基础。两者都有自己的位置,只要您没有尝试实现任何过于复杂的语言,汇编程序都可能比高级语言更易于理解。人们一开始不应该尝试做复杂的事情。
2011年

4
汇编程序的优点是它演示了真实计算机的工作方式。你懂。一切实际运行的东西。
保罗·内森

1
@ S.Lott-不,但这意味着您可以很好地利用您收集的大多数旧知识,并随着时间的推移添加新知识。看起来,诸如Python之类的高级语言会随着时间的推移提供新版本,但是旧知识仍然可用(实际上,Python打破了与v3的向后兼容性)
Anto

3

如果要负责设计课程,则在第一学期我将同时运行两门课程:asm +基本计算机组织/架构,以及在Scheme中创建的基于SICP的课程。第二学期将围绕Scheme中的数据结构和基本算法进行。

第二年将是为期一年的项目,使用Delphi,C ++或C#中的一个,专注于现代软件设计(OO设计,某些功能设计,软件工程,版本控制等)。

效果应该是在抽象和实践两方面打下坚实的基础,并在第三和第四年进行深入的课程学习。


3

我曾经参加过计算机科学入门课程,但我认为这是一个坏主意。

  1. 汇编既使用逻辑(如果使用该方法),又使用概念和数字之间非常困难的转换。CS入门课程的学生常常只为逻辑而苦恼(循环,if / else,布尔表达式),并且在他们还担心哪些数字意味着什么逻辑表达式之前,确实需要处理这一问题。对于以前没有任何理由思考的学生,使用高级语言可以抽象出这种逻辑。
  2. 初级CS入门课程不一定只由CS专业的学生修读,他们将继续学习CS。通常,它们也被其他工程专业和非专业的学生所采用,他们只是“巡回”选修课的一个有趣主题。汇编程序非常适合作为坚决而又坚定的CS学生的基础,但是对于要考虑专业或从未修过专业但想要介绍该领域的学生,编程并不能很好地概述什么是编程; 在大多数领域,它本身也不是非常有用。
  3. 高级语言使实际编程工作的核心更加透明。汇编涉及一些关键的基础主题-基本的内存概念,基本的性能概念等-但实际上并没有涉及创建可维护的,易读的设计,而IMO如今已变得尤为重要。早期的学生似乎常常有过时的“真正的程序员编写代码,其他人都无法处理”的想法,而教授一门高级语言可以帮助教授编码是一项协作任务,而不仅仅是出色。

话虽如此,我确实认为汇编/计算机硬件应该是非常早期的课程-理想情况下,应该是专业的第一季度。让学生掌握一种高级语言,然后立即进入低级硬件领域,然后再转向数据结构-理想情况下,这是一种需要内存管理的语言。


说得很好-我同意。第一个课程必须讲到重点,展示所学技能的端到端实用性,并激发想象力:“天哪!我可以编程?现在我可以用这项新技能做什么……”还同意使用汇编语言的最佳时间是在使用一种高级语言之后。这激发了人们“深入了解”计算机实际上是如何理解更高层次的知识的。眼看汇编语言的高级语言叶另一个强大的打击后的第一次:学生遇到电子,芯片,传感器等
阿萨德易卜拉欣

3

大会是我的第二语言,仅次于BASIC。但是,当我学习的时候却是另一回事。我的Commodore 64提供了其他语言,但是如果您希望任何事情看起来很快,或者想一次完成一件以上的事情,则需要学习汇编语言以及如何使用中断。为Commodore提供了窗口系统的图形环境操作系统(GEOS)也全部组装在一起。总的来说,这是我见过的最好的汇编API。这也是我使用的唯一可用来设置代码样式的平台。没错,您可以使用斜体和不同的字体大小-事实证明对阅读注释有用。

我从Commodore的工作原理中学到了很多,但是Motorolla芯片的操作码非常简单。保持少于255个操作码彼此分离并不是很困难。我无法将我在Motorolla 6510芯片上的经验与对Intel 8086的编程相提并论。这些芯片和系统体系结构太不同了。我想我在升级到Amiga的Motorolla 68000芯片时也会遇到同样的麻烦。

简而言之,我必须全心不同意任何人说汇编应该是一种很好的母语。原因如下:

  • 您没有固有的结构,也没有分解应用程序功能的通用方法。这正是使高级语言如此有用的原因。
  • 您必须了解无用的东西,例如如何正确调用库中的方法。当库由C创建时,这意味着要操纵堆栈(最好按正确的顺序获取所有内容),但是用另一种语言,这可能意味着设置寄存器。这些都是由编译器或解释器处理的,您无法对其进行优化。
  • 您的代码不能在其他芯片上使用,并且很可能会在其他硬件平台上中断。

如今,汇编语言用于加速某些有限的操作,在这些有限的操作中,手工汇编比编译器生成的汇编要快。应用程序的主要结构是使用C,C ++等高级语言完成的。当然,如果您开始编写编译器,则汇编编程将变得非常重要。我们当中有多少人这样做?


1

高中时我参加了集会。我已经用Java,Pascal,C和C ++上过课,对这些都不熟练,我真的很讨厌Assembly-是社区学院唯一一个参加远程学习计划的人,带我去了一两个月之前,甚至没有人可以让编译器为我工作。

我认为没有必要先学习汇编语言,也不是明智之举,但是在汇编的最初几周里学习他们教给您的知识,处理器的工作原理和一些调试技巧是很明智的。作为新手,我发现这些东西非常有趣并且很有启发性。


0

我不明白为什么无法做到这一点,尽管这个主意的好坏完全取决于您也会教它的人群。最终目标是成为一名Web开发人员的人可能会感到无聊,并且可能会辞职,因为这并不能使他们立即满意创建Python,Ruby等的东西。如果他们想最终从事硬件或其他低级项目,那么我认为这是一个不错的开始(前提是您提供足够的计算机体系结构背景,使之有意义)。我认为这可能会帮助人们将来编写更好的代码,尽管我认为这比学习其他语言更困难。


0

我认为汇编语言只有在您专注于以下方面时才有意义:

  • 内存管理技术
  • 硬件IO(尤其是与时间和性能相关的挑战)
  • CPU功能-特别是安全功能

如果没有对此领域的关注,这只是一种简单的语言,往往会教会不良的组织习惯。工具包中的机器级编码是很好的工具,它可以了解事物的工作原理,但这不是一种很好的第一语言。

我会引起对高级语言感兴趣的人。然后教C ++;然后进行汇编,重点介绍C ++编译器如何生成汇编代码。理解v表和其他高级语言功能将大大帮助开发人员思考语言的真正工作方式,而不仅仅是在“魔术”下提交信息。

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.