作为程序员学习计算机体系结构


12

我通常会在SO和其他地方(教师,书籍作者等)碰到大师,他们会说一些类似的话"This will cause alignment issues"或其他低级技巧。

我想了解所有relevant与编程有关的花絮。现在通常当我看到低级书籍(例如计算机体系结构书籍)时,它们太低级了,并且适合那些主要关注计算机体系结构而不是软件设计的人们。

您是否对与程序员相关的入门书籍有一些建议?


4
您想要“通过低级知识的书”,但又不想太“低级”的书?对于某些程序员而言,学习体系结构可能会非常有利。类似于Web开发人员了解TCP / IP堆栈。除非您真正需要它,否则它永远不会有用。\
克里斯

1
@Chris:我的意思是“对程序员来说是低级的” ...从技术上讲,我们可以进行全面的CPU架构研究,毫无疑问,这将是有用的一天,但是考虑到我们所有人的时间有限,这本书讲授所有程序员都应该知道的低级知识将是完美的。
Samaursa 2011年

在这种情况下,任何入门书籍都会带您正确的方向,之后再根据需要或欲望来选择。
克里斯(Chris

驾驶自动变速器的汽车的人会从驾驶过程中了解汽车的本质及其工作原理中受益。我相信通过学习至少一点点的汇编语言编程,您会成为更好的程序员,就像我认为学习“驾驶杆”时成为更好的驱动程序一样。
沃伦·P

Answers:


16

兰德尔·海德(Randall Hyde)的“写伟大的代码”系列(第1 卷,第2卷)提供了一组不错的书:从您需要知道的高级语言编写高效代码的角度出发,明确地描述机器体系结构。 。


这将适用于哪些高级语言?例如,这包括Python,JavaScript,C#,Scala吗?
Job

@Job-我还没有读过这些书,但是我想说这将适用于那些将/能够利用多线程和64位处理之类的东西。运行您提到的语言可能会使该知识有用(尤其是如果您也是服务器管理员,或者在Web环境之外运行这些语言时)。
莎娜

海德(Hyde)是一名汇编语言专家,因此对他来说“高级”主要是C。字符串,过程调用等在硬件级别上实际上并没有什么不同,无论它们是用C还是用Python声明的。
Kilian Foth

我认为任何也允许使用一些汇编语言的本机编译语言(C,C ++,Pascal,Objective-C)都将从本书中受益最多。但是,使用Python并用C编写扩展的人,甚至是使用Java并且根本不使用任何本机方法的人,都可以多考虑​​一些事情的代价,并且如何在他们使用的平台内有效地完成工作。
沃伦·P

尽管我还没有读过这些书,但是我会根据书的评论/摘要选择正确的答案。
Samaursa

6

可悲的是,我不知道现代的等同于微处理器:R。Dewar的程序员观点。我所知道的最接近的是《计算机组织与设计》,第四版:David A. Patterson和John L. Hennessy撰写的《硬件/软件接口》,但我不确定您是否认为它不会太低?您一定会为他们的其他作品《计算机体系结构》(一种定量方法)做到这一点。

在网上,此http://www-uxsup.csx.cam.ac.uk/courses/Architecture/course.pdf可能会为您提供所需的内容。


pdf链接已失效。
2015年


3

我发现Hennessy和Patterson的“计算机体系结构:一种定量方法”(亚马逊链接)是一种非常强大而可靠的计算机体系结构方法,其中有许多与编程直接相关的案例研究。

在美国,许多本科和研究生CS建筑课程都在不同程度上使用了它。

不久前,在Ars Technica上也获得了不错的评价


1
虽然我喜欢这本书-我拥有这四个版本-但它是作为计算机架构师而不是程序员来指导的。
AProgrammer

3

这就是我现在在我的计算机系统课程中所使用的计算机系统:程序员的观点(第二版),尽管该课程刚刚开始,但我一直在研究并非常喜欢它。

这是这本书的描述:

很少有计算机科学或计算机工程专业的学生有机会构建计算机系统。另一方面,大多数学生将被要求每天使用和编程计算机。计算机系统:程序员的观点通过显示这些思想如何影响应用程序的正确性,性能和实用性,介绍了计算机系统基础的重要而持久的概念。本书的动手方法(包括一套全面的实验)可以帮助学生了解现代计算机系统的“幕后”操作,并为以后的系统主题(如编译器,计算机体系结构,操作系统,和网络。


那是一本很棒的书!
阿曼多

2

这是很多工作,但是编程语言实用程序可能正是您想要的。该书从理论上讲主要是关于解析和编译(这对于那些想真正学习编程的人来说是必不可少的知识),在此过程中,您将学习语言概念如何转化为低级内容。更好的是,您将同时学习多种语言,并且可以智能地比较和对比不同语言的实际工作方式。

我不建议您这样做,除非您可以花几个月的时间来实际学习这些材料。这不是您只是浏览而突然被启发的那种东西。但是,如果您是认真的人,那么我强烈建议您这样做。


2

在生物学上可能是错误的,但在计算机科学中,“本体论概括了系统发育”。自第一批计算机以来,对计算机体系结构的历史回顾是从程序员的角度理解计算机体系结构主题的一种好方法。计算机设计几乎是早期设计的全部改进。

也就是说,我建议您学习完整的,较旧的系统设计,并使用在计算机科学中为您提供的理论性“计算机体系结构”书籍。真正了解系统设计,并在编写软件方面做得非常出色。直观地掌握计算机系统的体系结构需要精通许多概念。我认为,如果您从计算机体系结构的大小和范围更易于管理的角度出发,那么您可能会怀着实现更好的代码的目标。

(顺便说一下,(另一个人提到的那本“编写出色的代码””书系列看起来很棒,而且我已经编辑了我的问题,以消除我以前在“从书本学习中学习”所带来的任何麻烦,因为它看起来很棒! )

可以很好地教会计算机体系结构的一些事情:

  1. 我喜欢从1980年代开始选择机器作为向人们解释和演示事物的起点,因为那是我开始使用计算机的时候。我使用了commodore 64程序员的参考指南,向人们展示了编程知识和计算机体系结构知识相互融合的起点。有了这样的书,或者也许是在PC上运行的Commodore 64仿真器,您就可以尝试一些东西,您将了解如何真正构建1980年代经典计算机体系结构中的计算机系统。在我看来,一个具体的例子是一个更好的起点,而不是十几个缺少使事情起作用的现实世界细节的理论模型。如果您知道什么是寄存器,什么是ALU,什么是总线,什么是时钟,以及在1980年代的旧设计中使用了哪种信号系统,将为您提供了解最新知识(例如英特尔的“桑迪桥架构”)所需的基础知识。从历史上看,回头看原始内容,例如在Wikipedia上查找“冯·诺依曼”架构。

  2. 从我的第一点开始前进;了解原始的IBM PC体系结构,8086汇编语言和ISA总线。从此及其局限性,可以更自然地理解“ Intel COre i7” CPU包含的内容,PCI和PCI-e总线的功能以及为什么需要它们。如今的PC体系结构与原始IBM PC设计相比仍有一些“遗漏”。在2011年PC上进行初始程序(操作系统)加载(启动)的方式仍然很大程度上归因于原始IBM PC及其ROM BIOS的遗产,以及原始PC中的CMOS设置。

  3. 使用和修改可在某些嵌入式非PC设备上运行的Linux的预配置版本,您将学到很多关于嵌入式计算机体系结构的知识,不仅是技术体系结构,而且还包括其中为什么有些功能。TS-7200是一个便宜的好例子,它具有不错的PC-104(与原始PC相同的ISA总线)。PC-104(与IBM PC / AT 80286时代的PC引脚兼容的嵌入式16位ISA总线)计算机是非板级设计人员构建嵌入式系统的好方法,因为这些模块是可堆叠的。是否需要一些额外的IO或外围设备?只需堆叠几个模块。TS-7200具有非x86内核(ARM9 cpu),能够运行big-endian或little-endian。如果您还没有在体系结构学习过程中遇到“字节序”问题,那么这是一个遇到它的好地方。


0

大多数有关汇编语言的书籍都会讨论相关的体系结构功能,但通常仅针对本书所针对的体系结构。因此,您将获得有关缓存溢出和MMU页面映射技术的信息,但可能没有有关字节顺序的任何信息。

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.