- 豆豆staR
-
前一段时间看了CSAPP,我觉得吧,这本书主要就是在说计算机的基本组成,而且相比之下我觉得《计算机组织与结构》会更好懂一些,望采纳啊!
相关推荐
csapp是哪本书
《深入理解计算机系统》CSAPP是一本书,全称Computer Systems A Programmer"s perspective,国内通常的书名翻译是《深入理解计算机系统》你看它都讲了些什么:信息的表示和处理,整数表示和运算,浮点数程序的机器级表示,即在汇编层面是怎么实现C语言中的if,else, while, 函数调用的。处理器体系结构,讲述基本的组合和时序逻辑元素,展示这些元素如何在数据通路中实现IA32指令集的一个子集,已经进入了硬件层面。C语言程序是如何链接的,存储器的层次结构,虚拟存储器程序的优化。如果你是做系统级软件开发的,比如Linux内核,数据库,Web服务器等,没什么可说的,这本书必看。但是对于应用软件开发的程序员来说,这本书的用处在哪儿? 不接触这些知识也能完成这些日常的CRUD,完全没有问题。但是,CRUD做了两年以后,你会发现这本书中的内容早晚都会遇到,想逃都逃不掉。2023-07-08 17:38:051
csapp适合什么人阅读
对计算机感兴趣的人。CSAPP是一本非常有意思的书,中文译为深入理解计算机系统,是一本我觉得学了非常有意义的书,虽然当时每个周五上午困得不行就听不懂学得十分绝望。这本书不管你是刚刚开始学,还是学过了相关的课程再来过一遍知识体系,都还是很有收获的。这本书中文和英文我都看了,个人觉得英文版读着更加顺畅一些,不过中文版翻译的也不算太差劲还是可以看的。阅读是一种主动的过程,是由阅读者根据不同的目的加以调节控制的,陶冶人们的情操,提升自我修养。阅读是一种理解、领悟、吸收、鉴赏、评价和探究文章的思维过程。阅读可以改变思想、获取知识,从而可能改变命运。2023-07-08 17:38:291
CSAPP-2-信息的表示和处理
本文是深入理解计算机系统的第二篇文章,接着上一篇我们讲解的计算机系统开篇- 《计算机系统漫游》 ,本篇文章继续深入,一起来学习 信息的表示和处理 。 本篇文章一共分为四部分, 信息存储 、 整数的表示 , 整数的运算 和 浮点数 。 程序将内存视为一个非常大的字节数组,称为 虚拟内存 。内存中的每一个字节都由一个唯一的数字来标识,称为它的 地址 ,地址的集合就称为 虚拟地址空间 。 对于我们日常程序中的对象,它们在内存中往往是多字节的,那么我们必须知道两个规则: 这个对象的地址是什么? 以及 内存中如何排列这些字节? 在几乎所有的机器上,字节都是被连续存储的,对象的地址为所使用字节中最小的地址。例如,一个int类型的变量x的地址为0x100,也就是地址表达式&x 的值为0x100,x的四个字节存储在内存0x100、0x101、0x102、0x103位置。 排列表示一个对象的字节,有两个通用的规则: 对于我们程序员来说,机器使用的字节顺序对我们是不可见的,无论哪种字节顺序的机器,我们的程序编译后得到的结果都是一样的,不过有时候字节顺序也会成为问题,这里不再详述什么情况下会产生问题,只作学习验证机器的字节顺序不同产生的不同结果。 运行上面的c语言程序,得到的结果如下: 39300000 00e44046 a8e7a4c2ff7f0000 参数12345的十六进制表示为0x00000393,结合上面的结果 39300000 说明我的linux64是一个小端法机器。下面在放一张在各个机器测试的不同结果,更加全面的对比图: 上图指针 值完全不相同的原因是不同的操作系统使用不同的存储分配规则,不过需要注意的是Linux64使用的是8字节地址。 C语言的字符串:一个以null(值为0)字符结尾的字符数组 如字符串"12345"编码为 61 62 63 64 65 使用ASCII编码。 linux系统可以使用 man ascii 命令查看ASCII编码表。 二进制是计算机编码、存储和操作信息的核心。 将逻辑值 TRUE 和 FALSE 编码为1和0,能够设计一种代数,用来研究逻辑推理的基本原则。 布尔运算: 以下是一些对char数据类型表达式求值的例子: 正如示例说明的那样,确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制。 移位运算右移分为:逻辑右移和算术右移。 C语言中,几乎所有的编译器都对有符号数使用算术右移,无符号数使用逻辑右移。 Java中有明确定义,x>>k 表示算术右移k个位置,而x>>>k 会对x做逻辑右移。 这里说明一个移位运算有关的操作符优先级问题: 表达式 1<<2+3<<4 ,本意是(1<<2)+(3<<4),你可能也会犯这样的错误,其实前面的表达式等价于:1<<(2+3)<<4,因为 加法(减法)的优先级比移位运算要高 。 下面的数据术语用来精确定义和描述计算机如何编码和操作整数。 假设一个整数有w位,每个位的取值即0非1。 原理:无符号数编码的定义 对向量 用一个函数来表示: 计算规则: 上面介绍的是无符号编码的表示形式,但是我们应用中,还是希望表示负数值。最常见的有符号数计算机表示方式就是补码。 原理:补码编码的定义 对向量: 最高有效位即 也称为符号位。符号位等于1时,表示值为负,等于0时,值为非负,下面来看实际的计算示例: 这里让我们一起来考虑下补码所能表示的值的范围,最小值为: . 最大值为: 例如以长度为4为例, , 而 补码编码也是取值范围内每个数字都有唯一的w位补码编码。 原理:补码转换为无符号数 对满足 的 x 有: 比如, ,同时 u200b 。 原理:无符号数转换为补码 对满足 的 u 有: 在我们刚刚学习计算机时,大家有没有经历过,两个正数相加会得出一个负数,而比较表达式 x<y 和 x-y<0 会产生不同的结果呢?带着这些问题一起往下看吧。 原理:无符号加法,对满足 的 x 和 y有: 比如:x=9,y=12 的位表示分别为[1001] 和 [1100]。它们的和是21,表示为5位的[10101],产生溢出,丢弃最高位。 原理: 检测无符号数加法中的溢出 对在范围 ,s=x+y,若s < x 或者等价的 s < y时,发生了溢出。 原理: 无符号数求反 对满足 ,的任意x,其w位的无符号逆元 表达式如下: 原理: 补码加法 对满足 的整数x,y,有: 原理: 检测补码加法中的溢出 对满足 的x 和 y,令 s = x + y。当且仅当x>0,y>0,但s<=0时,计算s发生了正溢出。当且仅当 x<0,y<0,但s>=0时,计算发生了负溢出。 在大多数机器上,整数乘法指令相当慢,需要10个或者更多的时钟周期,然而 加法、减法、位运算、移位操作只需要一个时钟周期 。 因此,编译器使用了移位和加法运算的组合代替乘以常数因子的乘法。 原理: 乘以2的幂 例如:x*14,利用14 = ,编译器会将乘法重写为 ,将乘法替换为三个移位和一个加法。 在大多数机器上,整数除法比乘法更慢,需要30个左右的时钟周期。 所以除法,也可以采用移位运算,相对于乘法这里采用的是右移,而不是左移。 十进制数转换描述定义: 例如:12.34 = 二进制数转换描述定义: 例如, 增加二进制表示的长度可以提高表示的精度: IEEE浮点标准用 的形式来表示一个数: 如下图: 在单精度格式(float),s,exp 和 frac 字段分别为 s=1,k=8, n = 23,得到一个32位的表示。 在双精度浮点格式(double)中,s=1、k=11、n=52位,得到一个64位的表示。 u200b2023-07-08 17:38:361
CSAPP第三版和第二版有哪些差别
第二版是主讲IA32,兼容x86-64。 第三版主讲x86-64,所有习题均换成了64位 CMU和PKU联合建设的相关ICS课程,今年所有lab和slides都换成了新版本。推荐新版本。IA32毕竟已经是过去式了。2023-07-08 17:38:581
C语言中csapp.h 是什么意思?
csapp.h其实就是一堆头文件的打包 我们也可以用啊!!csapp.hcsapp.c//csapp.h/* $begin csapp.h */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <ctype.h>#include <setjmp.h>#include <signal.h>#include <sys/time.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/mman.h>#include <errno.h>#include <math.h>#include <pthread.h>#include <semaphore.h>#include <sys/socket.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>/* Simplifies calls to bind(), connect(), and accept() *//* $begin sockaddrdef */typedef struct sockaddr SA;/* $end sockaddrdef *///csapp.c/* $begin csapp.c */#include "csapp.h"/************************** * Error-handling functions**************************//* $begin errorfuns *//* $begin unixerror */void unix_error(char *msg) /* unix-style error */{fprintf(stderr, "%s: %s ", msg, strerror(errno));exit(0);}2023-07-08 17:39:073
关于计算机的书籍有哪些好看的?
计算机科学是一个庞大的学科体系,在学习的过程中要对这个体系的知识都有一定的了解,好看以及推荐一些书籍清单。数学,算法和数据结构作为计算机科学的底层学科对于深入了解计算机运作模式等是必不可少的,深入理解计算机系统(CSAPP),名称上来看这本书讲的是对系统的深入挖掘,然而本书非常适合作为一个入门读物,在了解计算机前开始阅读,可以对计算机相关概念有一个简要的了解。计算机程序的构造和解释(SICP),本书讲的是从数据抽象、过程抽象、迭代、高阶函数等编程和控制系统复杂性的思想,到数据结构和算法,到编译器/解释器、编程语言设计。算法导论,MIT 的经典算法教材,虽然可能其中的伪代码表示法不适合所有的人轻松阅读,但是对于算法描述的地位依然非常靠前。具体数学》,本书介绍了计算机的数学基础,内容涉及求和、取整函数、数论、二项式系数、特殊数、母函数(发生函数)、离散概率、渐近等,面向从事计算机科学、计算数学、计算技术诸方面。2023-07-08 17:39:231
深入理解计算机系统 (csapp)有个二进制炸弹实验,大概在那一页呢
书上没有这个的,但网上有下载的,复旦大学软件学院用的是这个教材吧,这个实验是在CSAPP的第三章安排的,信息的表示和处理,程序的机器表示这两章看完就可以做这个实验了,不过貌似不简单2023-07-08 17:39:422
为什么有人说弄懂了《算法导论》的90%,就超越了90%的程序员?
其实计算机程序底层核心就是各种数学算法,剩下就是怎么用代码去实现数学,世界上有名的计算机程序大牛几乎都跟数学权威方面的专家有关。 从另一个角度回答,因为就算看懂百分百,也很难超越另外的百分之十 很多程序员没读过算法导论 其实不管是对于在校生来说还是已经工作的程序员,一般很少都会接触算法。 学生的话也只有计算机相关专业的开设了数据结构和算法相关课程的才需要用到,但如果只是对付期末考试的话也没啥难度。 但是如果在大学期间接触到算法竞赛就不一样了,需要花费比较多的精力。 的确在工资上任何公司都是10%的算法大佬拿的工资比其他90%的业务开发程序员或者其他的程序员都要高,不过就凭只懂《算法导论》这本书的话还是不太行的,算法离不开业务的。就算超越也是超越那10%的算法工程师里的90%,如果能达到这个境界别说BAT了,微软谷歌都是可以考虑的。 说这个话在我看来他可能是想卖课,卖完再慢慢告诉你,“学到90%也没有那么容易”,或者“在刷我这套题这件事上超越90%的程序员 并不等于收入上超越90%的程序员”。 你多去拼多多参加几个活动,在文字 游戏 和预期管理上你应该就懂了;要是还不懂,大概你也不是那么适合做这一行以及算法导论。 公式:弄懂+一本名著+百分比+超越+百分比+你的群体。 例句: 弄懂sicp的67.9%,你就超越了95%的程序员。 弄懂本草纲目的72%,你就超越了93.7%的中医。 弄懂冰箱说明书的83%,你就超越了99.9%的冰箱使用者(这也许是最真实的,虽然冰箱说明书不是名著……) 至于为什么这么说……个人觉得就是对xx东西的一种崇拜,很大程度上是人云亦云。 算法导论是本不会动的书,不同人读效果不一样的。不要神化某一本书,参差多态乃幸福本源。不看算法导论你也可以会算法,你也可以会数据结构,你也可以进大厂。没有算法导论的时候也依然有研究算法的科学家。你能通过他学会知识很好,但你觉得它晦涩,搞不懂,没有c的代码让你学的不舒服,那就不看他。 人生中见书,书中见人生。读书有时候不一定是为了学东西,可能更多的是一种享受。就像你没学看过csapp之前,通过各种课程,学了零零碎碎的知识。忽然有一天你看了csapp,你觉得好过瘾啊,好爽啊。你觉得你学习的第一天就看csapp能有这种效果吗? 好书不会变少只会变多,更何况帮到你的也未必需要是好书。也许一本书只是很普通的书,不严谨,还都是大白话,但未必就帮不到你。 学东西莫要搞崇拜。很多程序员学习的时候都不是通过算法导论这本书学的,可他们依然很杰出。 程序员来回答一下: 1.《算法导论》这本书理论来说90%程序员也没弄懂,所以你弄懂了就超过了90%。 2.其实程序员是一个大的行业,IT也是一个大的行业,门外人看着都是一群写程序的,修电脑的,更有人认为是装电脑系统的,你被别人交过去装过系统吗? 3.程序员架构上来说,嵌入式 协议栈 应用 网络 服务器 工具 系统 等等等! 4.有一些行业是不需要看算法导论的,更有一些转行过来的,应该更不太了解算法导论。 这本书在美国的大学被称为clrs, 是标准的本科高年级和研究生入门的算法课课本。优点是比较全面的讲解了常用和基本的算法,习题质量不错。问题是动态规划讲的不好,篇幅原因一些近代的算法没有概括。总的来说是本不错的算法入门教科书。 算法是计算机科学的核心。计算理论偏数学,编译原理和操作系统偏硬件,真正计算机科学的核心就是算法。无论做研究还是搞工程,都是必不可少的。 程序是给人看的,不是给机器。写给机器的程序谁都可以写出来,但不是每个程序员都能写出别人看懂的东西 程序是什么,程序就是数据结构和算法,弄懂了超90%的程序员不是很正常嘛 看懂2%就超过了80%,没必要看那么多 因为这本书翻译的很枯燥、也很理解,这种情况下你还理解了90%,说明你有耐心,有恒心,耐得住寂寞。我相信不只是做程序员,做其它行业也会很优秀。2023-07-08 17:39:481
excel hyperlink 公式 下拉复制 怎么让单元格递增
修改为=HYPERLINK("#csapp!"&A1,"@") 解析:1、Hyperlink,超链接函数,hyperlink(地址,显示文字)2、""引号中的数据为文本,是无法递增的,修改为&A1,A1为单元格地址,下拉可递增!2023-07-08 17:39:563
什么决定CPU寄存器和总线的数据宽度
CPU中包含的整数寄存器的宽度与浮点数寄存器的宽度一样,是错误的详细可看 csapp 第三章 浮点代码,我这里做个简单的陈述。理论依据x86-64,浮点寄存器 YMM 寄存器一共有 16 个,YMM 寄存器大小为 256 位。对 float double 这类浮点数操作占用低 128 位的 XMM。现实依据这几行代码应该看的懂,gcc -c -Og 编译后,用 objdump -d 看一下看到这一行 subsd %xmm1, %xmm0正如 csapp 所言,double 用的是低 128 位的 XMM,入参按顺序使用寄存器,0 号寄存器作为返回值。2023-07-08 17:40:041
非科班出身程序员比较容易缺乏哪些技能?用什么方法弥补比较好?
非科班出身程序员,相比较科班出身程序员,最大的区别就是,没有在学校接受系统的计算机知识。但是没有系统学习过计算机科学知识的程序员,往往是通过自己的兴趣,实现自学。如果你能意识到,自己和科班程序员在计算机知识上的缺乏。通过后天弥补,也不是不可以。只要有兴趣,你可以自学大量的书籍,可以阅读这方面的知识,知识是一定可以补上来的。如果说在编程这方面,科班出生的程序员,对编程一无所知,始终摸不到门道的话,那你和非科班出生的程序员并没有什么区别。俗话说师傅领进门,修行在个人。科班出身的程序员,只是相比较来说,有老师指导,有系统化基础知识的学习,但是,作为程序员来说,我认为非科班也并不比科班缺少什么技能?技能都是可以自己学习的。这和你是否上过大学没有什么关系。可能非科班出身的程序员,缺的更多的是一种理念,就是他们对整个计算机系统,互联网有一个整体的认识和把握。在这方面来说,可能系统知识学习的欠缺,会造成这方面比较弱一点。所以我觉得非科班出身的程序员,不要自怨自艾,不要因为自己的水平比较低感觉到自卑。其实反过来想一想,非科班出生的人员,反而会对某一项研究比较深入的钻研下去,在这方面可能要比科班出身的人员更优秀。2023-07-08 17:40:111
本科211考研去哈工大深圳校区专硕,真的会当炮灰吗,我还是跨考计算机,本科信科,哈工大真的很卷吗?
这种顶级高校是看你的学习硬实力的,你的本科有211也不差了,拼命考高分,复试多准备准备,只要你够强,就不用怕卷,你就能考研上岸。这两年专业课因为改csapp后分数有所下降,但是专业课内容太多,复习压力也挺大,公共课准备好的话没有那么难考,总分往400分准备比较稳,看看自己差在哪儿。黑龙江英语政治阅卷比较松,政治英语数学考好了之后专业课拉跨也不怕,如果你数学差,专业课也搞不明白,就算了,难搞。别想调剂的事儿,要么二战,要么上岸。如果准备以后找开发岗,更建议软院,科软南软这种,整两段实习经历秋招直接乱杀,还不用被科研分散精力,不需要躲着导师偷偷去实习,难度你自己去了解下吧,按道理来说会容易点。其他事件:由于今年哈工深有部分硕博被要求搬宿舍,有一些人怨气很大,直接劝退学弟妹(这些学校是哈工深研究生的生源学校),你知道人生气时会添油加醋说的各种可能并不存在事的坏话或有意夸大,这个影响可能比较大,可能不少人看到这个消息放弃了报考就没关注这个学校了。以上内容参考:百度百科-哈尔滨工业大学(深圳)2023-07-08 17:41:161
硬盘的秘密
Hola,我是 yes。 硬盘这东西想必我们都相当的熟悉,它存放了我们很多 学习资料 ,还经常因为访问速度慢而被诸多文章拿出来“鞭挞”。 我找了个网站(文末贴链接),这个网站展示了从 1990 开始到 2020 不同介质数据访问的延迟时间,我翻了一遍介质自身速度的数量级没有变化,内存访问延迟从 207ns 到 100ns,硬盘从 19ms 到了 2ms,但是介质之间的访问速度还是差了几个数量级。 不过上述我圈出来的是随机访问,顺序访问的话不会差这么多,想要知道为什么,那就需要了解下硬盘的构造。 当然, 我今天提到的硬盘指的是机械硬盘 ,固态硬盘本文暂不涉及。 之所以写这篇文章是因为我之前一直对磁道、柱面、扇区等一些东西存在疑惑,比如: 所以今儿咱们来理一理,按照我的习惯我们还是先简单的看下历史。 1956 年 9 月 14 号,世界第一台磁盘存储设备 IBM 305 RAMAC 诞生,这个设备用盘片来存储数据,用磁头来读写数据,不过碍于当时的技术,这体积确实有点大,大约有两个冰箱那么大,来看下图就知道了。 中间的历史我看了看对我们没啥用,咱们就快进到 1973 年,那年 IBM 推出了一个代号称为 「温切斯特」的硬盘。 这种硬盘的特点就是磁头和磁片装在一个密闭空间里,当磁片高速自传之后磁头会因为空气动力而悬浮起来,然后磁头臂会操作磁头沿着盘片划圆弧状移动。 咱们现在的机械硬盘就是这样运行的,这么多年过去了,还是典型的“温切斯特”结构,也称为温盘。 至于为什么取这个代号,是因为当时研究出来的那个硬盘拥有两个 30MB 的存储单元,而「温切斯特来福枪」的口径和装药也刚好都是 30 ,所以代号就为 「温切斯特」。 历史咱们就了解到这一步差不多了,接下来看看硬盘的内部结构。 先来看看硬盘的真实样子,我就标注了一些重点部位。 我先简述一下硬盘是怎么运行的。 通电之后主轴带动盘片开始旋转,到达一定转速之后磁头就会悬浮在盘片上方,然后磁头臂就可以控制磁头做圆弧形的移动,通过盘片的旋转和磁头的移动就可能访问到盘片上任意地方的数据。 首先磁头和盘片触碰的话就会有摩擦,摩擦久了之后肯定会有磨损,磨损了之后数据不就没了? 其次有摩擦力之后转速肯定就慢了,那磁盘的访问速度也就慢了。 所以悬浮很关键,而磁头悬浮的高度比头发丝还细,约 0.1微米,如果有灰尘进去可能会导致磁头和盘片磨损,这也是硬盘需要密封的原因。 是的,你说的没错,所以人们就想了个法子,也就是磁头停靠点,也就是上面图中画的地方。 当通电之后等达到一定转速磁头才会移动到盘片上,等断电之后靠着电容剩余的电量会把磁头移到停靠处,这样每次启动就不会磨损啦! 还有一种停靠方式是在盘片内圈搞了个不存数据的地方,材质都不一样,专门给磁头停靠。 为了在公众号插入视频,我还在腾讯视频上传了个视频,来自维基百科的硬盘运行视频,这个视频硬盘的停靠应该就是第二种方式。 来看下这个视频 https://v.qq.com/x/page/w3222s68yv5.html 大致清晰硬盘是如何运行之后,我们再来深入一下。 这里我本来想自己画图的,但是个人画画水平有限,人家画的太好了...所以就搬来了,哈哈哈。 先来看下盘面。 A 就是磁道,盘面就是由磁道这样的一组同心圆构成,注意是标红部位,是个环,有横截面的,有些参考书标记到线上去了.... B 是扇面,C 就是扇区,每个磁道都会被划分成一组扇区,每个扇区包含相等数量的数据位,一般为 512 字节,是硬盘存储数据最基本的单位。 D 是簇,即多个扇区组成的,像 DOS 就是以簇为单位为文件分配磁盘空间的。 从图中看,扇区好像是连续着的,其实不然,扇区之间其实有间隙,这些间隙是用来标识扇区的格式化位的,不会存储数据。 不知看到这大家是否有点疑惑,每个扇区包含相等的数据位,那 明显距离圆心更近的同心圆扇区看起来能存的数据比最外围的扇区小很多 ,那岂不是外围的数据位要迁就最内部的? 是的。为了让每个磁道都有相等的扇区数,外圈磁道的扇区之间间隔很大,不过以前硬盘的数据存储密度很低,所以还能接受。 而随着硬盘存储密度的上升这样就造成了极大的浪费,因此就搞了个 zoned-bit recording 技术,目的就是在外圈磁道上放置比内圈磁道更多的扇区,看下这个图就明白了。 具体怎么实现我就不展开了,这不重要。 重要的是解惑, 并不是像有些书上说的,死板的按照最内圈的扇区数来确定所有磁道的扇区数 。 硬盘通常由一个或者多个盘片组成。 例如下图就有三个盘片,每个盘片有上下两个盘面,对应的会有六个磁头。 磁头号从上到下以 0 开始计数,由磁头臂带领着磁头做圆弧形运动。每个盘面的磁道也由 0 开始计数,相同编号的磁道组成的区域称之为柱面,发挥下想象力应该可以 get 到,我再贴个图助力一下。 因为几个磁头其实都是依靠同一个磁头臂运动的,所以要转就一起转,并且都是一个角度。 因此想要数据读取的快,那么数据就应该在统一柱面上顺序存储,比如最上面的盘面的第 1 个磁道上写不下了,那继续写到背部的第二个盘面上,这样磁头臂只要寻道一次即可,读数据的时候也只要寻道一次即可。 从这里我们也可以知道如果 一个硬盘的盘片越多,速度就越快 。 从上文我们已经知道硬盘是以扇区为基本单位的,所以硬盘的访问就是要找到对应的扇区。 盘片的表面是磁性的,盘片随着主轴旋转而转动,当要访问某个扇区的时候首先要转动磁头臂找到对应的磁道,这叫 寻道时间 。 这时盘片还是在旋转中的,磁头可以感知到下方数据位上的值,等旋转到目标扇区的时候就晓得该读/写数据了,这个时间称为 旋转时间 ,所以我们买硬盘的时候会看到 7200RPM、15000RPM 啥的,转的越快磁盘找到扇区的时间就越短。 最后就是读取数据的 传送时间了 。 所以硬盘数据访问延迟就是这三个时间相加,而最慢的就是寻道时间,我给下 CSAPP 提供的数据: 当然不同的硬盘总延时肯定不一样,反正知道寻道时间最慢就行了。 从上述的物理结构我们已经知道需要找到盘面,再找到磁道,最后找到扇区才能读取数据,有点复杂。 没必要把这么不友好的访问姿势暴露给操作系统,所以就搞了个逻辑磁盘块,屏蔽了底层访问的细节,提供编号 0 、1、2.....n 这样的逻辑块序列来对应具体的物理块。 这样操作系统要访问磁盘就很舒服了,不过最终还是要找到对应的扇区的,而 磁盘控制器 就维护了逻辑块和实际物理扇区的映射关系。 磁盘控制器属于硬盘里面的一个硬件,它会将逻辑块翻译成:盘面、磁道、扇区这么一个三元组 。 至此平时我们说的逻辑块与硬盘的物理访问也对应上了。 身为普通程序员我觉得对硬盘的了解到这个地步就差不多了,该知道的都知道了。 如果有什么纰漏指出欢迎指正! 我是 yes,从一点点到亿点点,欢迎在看、转发、留言,我们下篇见。 https://colin-scott.github.io/personal_website/research/interactive_latency.html (各介质延迟的网站) https://en.wikipedia.org/wiki/Zone_bit_recording https://en.wikipedia.org/wiki/Hard_disk_drive https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98 《深入理解计算机系统》2023-07-08 17:41:281
tmin4为多少
CSAPP的图示和问题中,我们很小心的把32(TMin32)位有符号最小值写作-2147483647-1,为什么我们不直接写成-2147483648或0x80000000呢?不妨先打开limits.h头文件看看吧,你会发现它们也是用类似的诡异形式 ISO90: Decimal: int | long | unsigned | long long Hexadecimal: int | unsigned | long | unsigned long ISO99: Decimal: int | long | long long Hexadecimal: int | unsigned | long | unsigned long | long long | unsigned long long 上面的表格是整形常量的数据类型表示,根据语言版本和格式(10进制和16进制),常量的数据类型会从上面表格里选择第一个最合适的类型。 因此,根据上述标准的话,我们可以得到如下结论: ISO90: ISO 99: 常量表达式 -2147483648 0x80000000 -2147483648 0x80000000 32位 unsigned unsigned longlong unsigned 64位 long unsigned long unsigned 上面的表格是TMin32的数据类型表示。根据语言版本和格式,我们获得了这两种表达式的三种不同的数据类型,注意里面包括非负值值 因此定义signed int的最大值和最小值,采用如下方式 #defineINT_MAX 2147483647 #defineINT_MIN -INT_MAX-1 很不幸的因为二进制补码的数值表示不对称性,我们不得不在C语言中如此怪异地定义TMin,尽管要理解这点我们必须挖掘C预言标准中最阴暗的角落之一,这也有助于让我们更好的鉴识整形的数据类型和表示方法。 假如我们直接将TMin定义为-2147483648,那么在32位机器上编译这样的代码,编译器遇到型如-X的数值,它首先会确定X的数据类型,然后取X的负数。而2147483648对于int类型是在太大了,编译器就会再次尝试一种类型可以正确的表示此值。然后它就会按照第一个表格的顺序往下继续尝试类型,再假设编译器采用的标准是ISOC90,int的下一个类型是long,再下一个是unsigned,然后就发现unsigned是第一个合适的数据类型。正如我们知道的,21473648和-2147483648在32位数值上拥有同样的内存表示,这也导致此常量的数据类型是unsigned且值为2147483648。而ISOC99的情况则是按照上述规则数据类型为long long才能容纳2147483648。64位的情况因为2147483648与-2147483648可以表达为不同的内存表示,所以仍然按照规矩来此常量的数据类型为longlong值为-2147483648。 对于十六进制的的情况,常量0x80000000在32位机器上,编译器仍然是遵照类似的规则。无论是ISOC90还是ISOC99,都首先和TMax32(即0x7FFFFFFF)比较,发现较大后,得知int无法容纳本常量,接下去照着表格1就是UMax32(即0xFFFFFFFF),发现较小,就选择了unsigned作为本常量的数据类型,因此,常量0x80000000的数据类型是unsigned的,且值为0x80000000(或者说与2147483648相同)。 事情在64位机器上稍微有些不同,无论哪个语言版本,十进制表示的TMin都是数据类型long(64位长),值为-21473648,而十六进制表示的TMin则是数据类型unsigned,值为0x80000000(与2147483648相同)。 经过上述分析后,我们就可以得到表格2了,当数据类型为long或long long的时候,常量是负的,但它也就成了64位长。而当数据类型为unsigned时,此常量时正的32位长。用下面的代码就可以表示 intdcmp = (-2147483648 < 0); inthcmp = (0x80000000 < 0); 上面代码尝试测试十进制和十六进制表示的TMin常量是否小于0。二者取决于编译器采用的语言版本以及字长,我们发现dcomp的值有时为0有时为1,也就是十进制表示的TMin有时候为正的有时候为负的,而hcomp的值一直是0,也就是十六进制表示的TMin永远为正的。这个简单写32位有符号最小值常量的任务比我们想象中要困难的多。(据我个人测试,VC2008在32位机器上,十进制的TMin会被认为是unsigned,而gcc在64位机器上,无论是C90还是C99都认为是long,而十六进制的TMin无论字长还是编译器都一致认为是unsigned) 问题1: 考虑如下代码: intdtmin = -2147483648; intdcomp2 = (dtmin < 0); inthtmin = 0x80000000; inthcomp2 = (htmin < 0); 无论我们在32位还是64位机器,语言版本是C90还是C99,始终dcomp2和hcomp2都为1,进一步直接将dtmin以及htmin和TMin比较都是相等的,解释这为何没有像之前一样对常量有微妙的区别。 2.启示 对于大多数程序,因为字长和语言版本的不同导致的歧义并不会影响程序行为。不过我们现在已经可以了解为何将TMin32写成-2147483647-1可以获得更想要的结果了。因为TMax32的值2147483647本来就可以表示成int,所以没必要对其做类似的改写。 问题2: 假如我们把TMin32写成-0x7FFFFFFF-1,那么对于不同的字长和不同的语言版本,编译器是否会对TMin都确定同样的int数据类型呢?并尝试解释。 问题3: 你相要写一个有效的TMinW表达式,W是数值的long int类型的位数。因为数据类型在不同的机器上大小也不相同,你决定使用sizeof操作符,那么只要W是8的倍数,TMinW的表达式就呼之欲出,同时你还想来点小花招,你知道乘以8和左移3位是等效的。 你最先是这些尝试的: /*警告,下面的代码有bug*/ /*讲1左移8*sizeof(long)-1位*/ 1L<< sizeof(long) << 3 -1; 你把这段代码在32位机器上测试,发现结果为64 A.解释这是为什么 B.同样的代码在64位机器上结果是多少 C.做尽可能少的修改让其正确运作如果懒得看我就简短说一下大意,为什么要特意把32位int的最小值常量写成-2147483647-1而不是-2147483648是因为编译器遇到-X这样的常量是先获得X的值与类型,然后再对其取负,而对于32位以上机器的所有int类型都容不下2147483648这么大,所以会再寻找更合适的数据类型来表示,而寻找合适类型这步在不同的C语言版本,不同的平台,不同的表示格式都有不同的适配顺序,这就导致了如果直接写-2147483648可能会是unsigned的,可能会是long还可能会是long long型的,故用-2147483647-1的形式来消弭此歧义。问题的解答也没什么好说的,第一个其实就是最后来了步隐式转换,不管常量是什么类型,转化为int后那始终是-2147483648的字面值。第二题的原理就是-2147483647-1一样,自然是正确的。第三题只要改写成1L<< (sizeof(long) << 3 )-1; 即可,运算符优先级的问题。发现自己正在走职业道路的下坡路,没有别的取巧方法,还是得从基础下手,提高关注度,从bit级别认识程序。文章知识点与官方知识档案匹配C技能树首页概览111722 人正在系统学习中点击阅读全文 打开CSDN,阅读体验更佳TM4C1294主振荡器验证失效(MOSC失效)_text_in的博客TM4C1294NCPDT微控制器提供了一个主振荡器校验电路。如果振荡器运行得太快或太慢,该电路会产生一个错误条件。如果主振荡器校验电路被启用并产生一个错误,此时会产生一个上电复位并将控制权交给 NMI处理程序,或产生中断。MOSCCTL寄存器...C语言中补码的整数运算特性_RMSnow的博客证明:假设B2T ([11···1]) 共有w位,则其值为-2^(w-1) + 2^(w-2) + ··· + 2^0. 根据等比数列求和公式,易证该值为-1. 定理2 对于w位的补码B2T来说,其边界值Tmax与Tmin分别为: ...C语言中TMin的写法 在看《深入理解计算机系统》第二版中文版时(Computer Systems A Programmer"s Perspective Second Edititon),看到48页第二章网络旁注中提到:C语言中,将TMin32(32位有符号整数的最小值)写成 -2147483647-1。为什么不简单地写成 -2147483648 或者 0x80000000 ? 书中提到是由于补码表示的不对称性和C...继续访问TM4C129X CRC校验功能使用问题以前在嵌入式开发中进行CRC校验一般通过软件算法实现,TM4C1294自带CRC校验单元,但坑比较多,发出来供使用时参考 CRC单元只有一个寄存器,7个字段需要配置 INIT:初始值; SIZE: 选择校验数据是8位还是32位; RESINV:输出按位取反; OBR:输出字节反转,例如B0[7:0]-->B0[0:7] BR:输入字节反转,例如B0[7:0]-->B0[0:...继续访问深入理解计算机系统实验二datalab_super__cool的博客tmin - return minimum two"s complement integer Legal ops: ! ~ & ^ | + << >> Max ops: 4 Rating: 1 */ 思路: 补码的最最小值为100……0后面全是0 代码: inttmin(void){//最小的二进制数return1<<31;} ...CSAPP:DataLab_吃着油条唱歌的博客x = x | (x >> 4); x = x | (x >> 2); x = x | (x >> 1); return ~x & 0x1; } tmin(void): 返回int最小值,我的答案是0x80000000,参考答案为:0x1<<31C语言中基本数据类型细节期中计组考完后,虽然成绩惨不忍睹,但暴露了一些一直以来不懂但又没暴露出来的问题,在此总结。 补码Select the two"s complement negation of the following binary value: 00110011: 从以下选项选择00110011的two"s complement negation(不知咋翻) (a) 11001100 (b) 110011继续访问【计算机系统学习-信息表示和处理】【二、整数表示】整数的表示和运算。继续访问CMU CSAPP datalab_StaRS in EyeS的博客tmin 注意到最小的整数特征是最高位为1其余为0 inttmin(void){return1<<31;} 3.tmax 因为没有办法用位运算,所以想到往tmin的特殊性上靠 tmin 和 0 是仅有的取反运算之后还是本身的值 ...CSAPP Lab1_Nava9的博客~ & ^ | + << >> * 最多运算符数量: 4 * 分值: 1 */ int tmin(void) { return 1 << 31; } 1 2 3 4 5 6 7 8 9 10 u200b 补码最小值为0x80000000,由于我们只能用到0xFF以下的格式,故将0x01向左移位31个...最新发布 TMin - TMin是否产生溢出而TMin的负仍为TMin,因此我认为TMin - TMin应该等同于TMin+TMin,所以自然算是产生了溢出。总结,出现这种纠结,还是对于溢出的定义理解不够深入,时,OF^SF和SF都被置为0。后,结果是:OF^SF被置为1,SF被置为0,即。)之后,OF=1,SF=0,则。的结果应该是1,所以得到了悖论。来进行判断的,因此我认为,...继续访问c语言 in他long,CSAPP 读书笔记:C语言中TMin的写法【转】1.情景在CSAPP的图示和问题中,我们很小心的把32(TMin32)位有符号最小值写作-2147483647-1,为什么我们不直接写成-2147483648或0x80000000呢?不妨先打开limits.h头文件看看吧,你会发现它们也是用类似的诡异形式ISO90:Decimal: int | long | unsigned | long longHexadecimal: int | u...继续访问c语言中TMin的写法在《CSAPP》中提到: #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX -1) INT_MIN这样写的原因是: 虽然-2147483648 这个数值能够用int类型来表示,但在C语言中却没法写出对应这个数值的int类型常量。 因为按照c语言的类型推导,-2147483648被写成常量形式的时候,...继续访问c语言里面TMin不能写成-2147483648的原因C语言中TMin的写法继续访问C TMin阅读深入理解计算机系统一书的2.2.5一节, 作者提到了TMin的写法是:-2147483647-1,而不是-2147483648 并没有说原因,网上查了下,其中一篇文章说的比较详细,并且引入了权威解释的链接。 https://www.cnblogs.com/Jack47/archive/2013/01/06/TMin32-in-c.html 拷贝下重点就是:-2147483648这个常量...继续访问计算机系统实验--DataLab湖南大学信息科学与工程学院计算机系统Lab2继续访问c语言 tm结构,C语言中tm时间结构体struct tm{int tm_sec; /* Seconds. [0-60] (1 leap second) */int tm_min; /* Minutes. [0-59] */int tm_hour; /* Hours. [0-23] */int tm_md...继续访问在c语言中写TMin1.情景 在CSAPP的图示和问题中,我们很小心的把32(TMin32)位有符号最小值写作-2147483647-1,为什么我们不直接写成-2147483648或0x80000000呢? 不妨先打开limits.h头文件看看吧,你会发现它们也是用类似的诡异形式 ISO90: Decimal: int | long | unsigned | long long Hexade继续访问解决Nginx配置http2不生效,谷歌浏览器仍然采用http1.1协议问题昨天一个网友通过QQ联系我,说按照我博客之前分享的http2配置教程不能生效,想请我帮忙看看。 经过测试,使用谷歌浏览器访问他的测试站点,确实没有开启http2,但他的配置和编译参数都正确的,这有点奇怪了。 不过昨天太忙就没有继续帮他分析,他只好将服务器账号和密码都留言给了我。今天中午我抽空在他服务器重新编译测试了一把,才发现原来是这么一个梗! 他在编译Nginx之前,使用的是yum安装继续访问基于模糊测试的分布式数据库安全研究(三)——afl-cmin、afl-tmin前言 本次主要解决上次的问题三。为了引入更好的测试用例进行模糊测试,afl提供了两个工具afl-cmin、afl-tmin来进行语料库蒸馏。本文将对这两个工具进行介绍。 一、构建语料库 我们需要先构建一个该项目测试所需的语料库 第一个testcase里面放的是我自己瞎写的一个字符串, 把它多复制几份,每份都对里面进行一些修改,这7个测试样例就构成了我们本次实验的“语料库”了。 AFL功能纵使强大,也需要一个高效的执行速度。如果是普通的语料库作为测试用例,会出现很多无意义的测试,例如多个测试用例执行了同样的代继续访问curl使用curl_easy_perform导致线程或者进程卡死解决办法描述:curl提供的curl_easy_perform调用方式是阻塞的,如果没有收到回复,则会导致线程或者进程一直阻塞,除非外界干预。 解决办法:curl提供了CURLOPT_LOW_SPEED_LIMIT CURLOPT_LOW_SPEED_TIME option,主要思想为:如果在指定时间传输速率超过设置的最低值,则会自动断开该链接。 举例: cu...继续访问ebtables官方文档翻译官方文档:http://ebtables.netfilter.org/misc/ebtables-man.html 非权威翻译,大家辩证查阅。 描述: ebtables是一个创建和维护内核 嗅探Ethernet frame规则表格的应用程序,它类似iptables,但是没有它复杂,因为Ethernet协议相比ip协议更简单一点 CHAINS Linux内核内置了三种ebtables 表。这些表用来区分不同的功能规则,每一种规则的集合就叫做一个chain,每一个chain都是一个用来匹配Ethern继续访问热门推荐 datalab 数据表示实验一直都想每天写博客,然后又经常拖,还有这个是作业,用的时间比较久,然后自己又是脑子不灵活的那种,所以写出来的东西可能会有很多错误,欢迎大家指出来交流交流,互相进步。下次实验室bomb,拆炸弹,不知道能不能坚持把它做完,加油~ 1、根据bits.c中的要求补全以下的函数: int bitXor(int x, int y); int tmin(void); int isTmax(int x);继续访问linux按位运算datalab-handout进入bits.c ,根据bits.c中的具体要求补全以下13个函数: u2022intbitXor(intx, int y); u2022inttmin(void); u2022intisTmax(intx); u2022ntallOddBits(intx); u2022intnegate(int x); u2022intisAsciiDigit(intx); u2022intconditional(int x, inty, int z)继续访问int 为什么是2147483647_为什么宏INT_MIN要写成-2147483647-1《深入理解计算机系统》在P105页,作者给出了INT_MIN在标准头文件limits.h中的定义#define INT_MAX 2147483647#define INT_MIN (-INT_MAX - 1)文中说,-2147483648是一个常量表达式,而不是一个常量。所以-2147483648被理解为一个“-”号和一个常量值2147483648。对于“-”,是对原值补码进行“取反加1”操作。对...2023-07-08 17:41:351
哪些术语的翻译让你觉得十分别扭?
因为自己就是这方面专业的,所以说这个问题很敏感,我想起了一开始接触的术语“脚本”!SQL是脚本,js是也是,Python也是?批处理也是?所以,当时一听别人擅长写脚本语言就觉得对方好牛逼啊,居然会那么多语言。。。再捎带来一句:“这个简单,写个脚本就行了”瞬间就觉得,“大神,带我飞吧!”不过是上面的,还有一个也是计算机方面的,基本这专业的都很熟悉了,寄存器文件 (Register File). File 一般是指操作系统对存储设备上的数据和程序的抽象。但是这里的 File 是指在 CPU 中寄存器的集合。这两天在读 CSAPP 时,对比中文版,这两个 File 都被翻译成了文件。在现代汉语词典中,「文件」一词有以下定义:文件①公文、信件等。②指有关政治理论、时事政策、学术研究等方面的文章。实际上,如果去 Google 上搜索,会发现,在日常生活的语境里,File 指代的东西是这些:件强调纸质文档本身,而 file 强调收纳整理纸质文档的实体。说完了计算机方面的,也稍微说下其他的,有些翻译不能从文字上看出其中的大致内涵,比较容易令人摸不到头脑,比如格式塔心理学。有些名词过于抽象,根本不适合翻译过来,比如表征有些名词不能覆盖原文所有含义,容易造成误解,比如内含适应性,个人认为翻译成广义适应度更好。不过我们也不要太过挑剔了,毕竟有些翻译成我们自己的语言确实有些难度的!2023-07-08 17:41:432
深入理解计算机系统的目录1
1 A Tour of Computer Systems1.1 Information is Bits + Context1.2 Programs Are Translated by Other Programs into Different Forms1.3 It Pays to Understand How Compilation Systems Work1.4 Processors Read and Interpret Instructions Stored in Memory1.5 Caches Matter1.6 Storage Devices Form a Hierarchy1.7 The Operating System Manages the Hardware1.8 Systems CommunicateWith Other Systems Using Networks1.9 The Next Step1.10 SummaryBibliographics NotesPart I Program Structure and Execution2 Representing and Manipulating Information2.1 Information Storage2.2 Integer Representations2.3 Integer Arithmetic2.4 Floating Point2.5 SummaryBibliographic NotesHomework ProblemsSolution to Practice Problems3 Machine-Level Representation of Programs3.1 A Historical Perspective3.2 Program Encodings3.3 Data Formats3.4 Accessing Information3.5 Arithmetic and Logical Operations3.6 Control3.7 Procedures3.8 Array Allocation and Access3.9 Heterogeneous Data Structures3.10 Alignment3.11 Putting it Together: Understanding Pointers3.12 Life in the RealWorld: Using the GDB Debugger3.13 Out-of-Bounds Memory References and Buffer Over3.14 *Floating-Point Code3.15 *Embedding Assembly Code in C Programs3.16 SummaryBibliographic NotesHomework ProblemsSolutions to Practice Problems4 Processor Architecture5 Optimizing Program Performance6 The Memory HierarchyPart Ⅱ Running Programs on a System7 Linking8 Exceptional Control Flow9 Measuring Program Execution Time10 Virtual MemoryPart Ⅲ Interaction and Communication Between Programs11 System-Level I/O12 Network Programming13 Concurrent ProgrammingA HCL Descriptions of Processor Control LogicB Error HandlingBibliographyIndex目录:第1章 计算机系统漫游1.1 信息就是比特+上下文1.2 程序被其他程序翻译成不同的格式1.3 了解编译系统如何工作是大有益处的1.4 处理器读并解释储存在存储器中的指令1.4.1 系统的硬件组成1.4.2 执行hello程序1.5 高速缓存1.6 形成层次结构的存储设备1.7 操作系统管理硬件1.7.1 进程1.7.2 线程1.7.3 虚拟存储器1.7.4 文件1.8 利用网络系统和其他系统通信1.9 下一步1.10 小结参考文献说明第2章 信息的表示和处理2.1 信息存储2.2 整数表示2.3 整数运算2.4 浮点2.5 小结参考文献说明家庭作业练习题答案第3章 程序的机器级表示3.1 历史观点3.2 程序编码3.3 数据格式3.4 访问信息3.5 算术和逻辑操作3.6 控制3.7 过程3.8 数组分配和访问3.9 异类的数据结构3.10 对齐(alignment)3.11 综合:理解指针3.12 现实生活:使用GDB调试器3.13 存储器的越界引用和缓冲区溢出3.14 *浮点代码3.15 *在C程序中嵌入汇编代码3.16 小结第4章 处理器体系结构4.1 Y86指令集体系结构4.2 逻辑设计和硬件控制语言HCL 2714.3 Y86的顺序(sequential)实现4.4 流水线的通用原理4.5 Y86的流水线实现4.6 小结第5章 优化程序性能5.1 优化编译器的能力和局限性5.2 表示程序性能5.3 程序示例5.4 消除循环的低效率5.5 减少过程调用5.6 消除不必要的存储器引用5.7 理解现代处理器5.8 降低循环开销5.9 转换到指针代码5.10 提高并行性5.11 综合:优化合并代码的效果小结5.12 分支预测和预测错误处罚5.13 理解存储器性能5.14 现实生活:性能提高技术5.15 确认和消除性能瓶颈5.16 小结第6章 存储器层次结构6.1 存储技术6.2 局部性6.3 存储器层次结构6.4 高速缓冲存储器6.5 编写高速缓存友好的代码6.6 综合:高速缓存对程序性能的影响6.7 综合:利用你程序中的局部性6.8 小结参考文献说明家庭作业练习题答案第7章 链接7.1 编译器驱动程序7.2 静态链接7.3 目标文件7.4 可重定位目标文件7.5 符号和符号表7.6 符号解析7.7 重定7.8 可执行目标文件7.9 加载可执行目标文件7.10 动态链接共享库7.11 从应用程序中加载和链接共享库7.12 *与位置无关的代码(PIC)7.13 处理目标文件的工具7.14 小结第8章 异常控制流8.1 异常8.2 进程8.3 系统调用和错误处理8.4 进程控制8.5 信号8.6 非本地跳转8.7 操作进程的工具8.8 小结第9章 测量程序执行时间9.1 计算机系统上的时间流9.2 通过间隔计数(interval counting)来测量时间9.3 周期计数器9.4 用周期计数器来测量程序执行时间9.5 于gettimeofday函数的测量9.6 综合:一个实验协议9.7 展望未来9.8 现实生活:K次最优测量方法9.9 得到的经验教训9.10 小结第10章 虚拟存储器10.1 物理和虚拟寻址10.2 地址空间10.3 VM作为缓存的工具10.4 VM作为存储器管理的工具10.5 VM作为存储器保护的工具10.6 地址翻译10.7 案例研究:Pentium/Linux存储器系统10.8 存储器映射10.9 动态存储器分配10.10 垃圾收集10.11 C程序中常见的与存储器有关的错误10.12扼要重述一些有关虚拟存储器的关键概念10.13 小结第11章 系统级I/O11.1 Unix I/O11.2 打开和关闭文件11.3 读和写文件11.4 用RIO包进行健壮地读和写11.5 读取文件元数据11.6 共享文件11.7 I/O重定向11.8 标准I/O11.9 综合:我该使用哪些I/O函数?11.10 小结第12章 网络编程12.1 客户端-服务器编程模型12.2 网络12.3 全球IP因特网12.4 套接字接口12.5 Web服务器12.6 综合:TINY Web服务器12.7 小结第13章 并 发 编 程13.1 基于进程的并发编程13.2 基于I/O 多路复用的并发编程13.3 基于线程的并发编程13.4 多线程程序中的共享变量13.5 用信号量同步线程13.6 综合:基于预线程化的并发服务器13.7 其他并发性问题13.8 小结参考文献说明家庭作业习题练习题答案附录A 处理器控制逻辑的 HCL描述A.1 HCL参考手册A.2 SEQA.3 SEQ+A.4 PIPE附录B 错 误 处 理B.1 Unix系统中的错误处理B.2 错误处理包装函数B.3 csapp.h头文件B.4 csapp.c源文件2023-07-08 17:42:532
深入理解计算机系统 读后感
[深入理解计算机系统 读后感] 从程序员的视角,看计算机系统!本书适用于那些想要写出更快、更可靠程序的程序员,深入理解计算机系统 读后感。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互连时,本书描述了并发服务器如何能有效地处理来自多个客户端的请求。本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如,Linux)上执行C程序。虽然书中包括了一些帮助读者将Java转化成C的提示,但是还是要求读者对C或者C++有一定的了解。您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料,包括实验和作业,授课笔记和代码示例,读后感《深入理解计算机系统 读后感》。本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。作者RandalE.Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。 本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。 本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。 〔深入理解计算机系统 读后感〕随文赠言:【这世上的一切都借希望而完成,农夫不会剥下一粒玉米,如果他不曾希望它长成种粒;单身汉不会娶妻,如果他不曾希望有孩子;商人也不会去工作,如果他不曾希望因此而有收益。】2023-07-08 17:43:201
论文中常出现that is, it...;it...; 用于描述一个东西的各项属性、作用等。如何分析其语法、句子结构?
像 that is, 这种直接视为独立成分即可,和句子其他成分没有语法逻辑上的关系。2023-07-08 17:43:302
求编程菜鸟自学书籍!
同志你好: 没基础也可以学,每个人都是没基础过来的,大学学C语言的连英语基础都没有也行。 还有,编程你得有个方向啊!!是单片机编程,还是应用软件编程啊!!! 单片机就学汇编入手,然后学C!那样了解了单片机低级语言,学高级语言思路更明确!! 软件编程,普通点就用VB 所见即所得,好学!!然后C C++ 或者JAVA等! 但是任何编程,如果你想精通,必须有深厚的数学基础,如果数学不好的话,估计你可能就只能在门口徘徊啊!! 我就是一个例子我学计算机,并不是电子系,电子是我的爱好,曾经我的电子导师就跟我说过,如果不在实践中继续看书学习的话,那电子永远就是你的爱好兴趣了!!!软件编程我也会,单片机C51 凌阳61 我都有,自己也做过很多东西!但是到现在为止,我依然只能是门口徘徊!业余爱好了!!!因为人是要吃饭的!!! 什么是幸福? 幸福就是做自己喜欢做的事,还得有饭吃。(白吃饭,还得不受气!) 努力吧!!! vb程序设计,C程序设计第二版,c++程序设计,如果你学单片机的话,你还得学汇编。这些都算是比较入门级别的了!!!重要的是学会基础知识,培养编程思路!入门了,这些书籍就不能满足你的需要了!!2023-07-08 17:43:395
初学者怎样学编程?
在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏?iOS或者Android应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。不要浮躁Badprogrammingiseasy.EvenDummiescanlearnitin21days.Goodprogrammingrequiresthought,buteveryonecandoitandeveryonecanexperiencetheextremesatisfactionthatcomeswithit.不管是在线下还是线上的书店,满目都是《21天学通Java》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。MatthiasFelleisen在他的著作HowtoDesignPrograms,SecondEdition一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。所谓的「捷径」或者说「银弹」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。培养兴趣Mostgoodprogrammersdoprogrammingnotbecausetheyexpecttogetpaidorgetadulationbythepublic,butbecauseitisfuntoprogram._LinusTorvalds沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。在这里对于初学者有两个大坑:如果初学者们只与预先构建好的「发动机和组件」接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。第二个坑没有第一个那么明显:幼稚的「整体论」方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来「补足基础」会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。但也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为「大厨」,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。总之,编程是连接理论与实践的纽带,是计算机科学与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。作为初学者,应以后者为主,前者为辅。启蒙「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?编程知识的金字塔底部有三个关键的部分:算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个maxSoFar变量,之后对于每个数语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。系统基础:为什么while(1)时线程永远无法结束?为什么int*foo(){intx=0;return&x;}是不可行的?启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用Python作为学习的第一门语言,虽然Python对初学者很友好,但这并不意味着它只是一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉Python后,学习C语言是便是一个不错的选择了:学习C语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理,如果你只想成为一个普通(平庸)的开发者你可以不学习它。下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。完成Codecademy的Python部分。这只是热身部分,尽快完成它,因为你永远只是在浏览器里,你不会学到如何搭建开发环境。在Codecademy这类的编程学习网站学到的那点儿东西,哪怕你只想做一个小的不能再小的项目,你都不知道该从哪儿开始。完成MIT6.00.1x(中文化)(如果你英语不过关,完成麻省理工学院公开课:计算机科学及编程导论。MOOC是学习编程的一个有效途径。虽然该课程的教学语言为Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,python编程语言,一些简单的数据结构与算法,测试与调试。支线任务:完成Python核心编程完成HarvardCS50(如果你英语不过关:完成哈佛大学公开课:计算机科学cs50。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及C,PHP,JavaScript+SQL,HTML+CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《编码的奥秘》完成《C语言编程》[可选]如果你的目标是成为一名Hacker:阅读Hacker"sDelightPS:如果教育对象还是一个孩子,以下的资源会很有帮助:5-8岁:TurtleAcademy8-12岁:PythonforKids12岁以上:MITScratch或KhanAcademy入门结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如Web开发,Android开发,iOS开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。设想:X=用于思考解决方案的时间,即「解决问题」部分Y=用于实现代码的时间,即「利用计算机」部分」编程能力=F(X,Y)(X>Y)要想提高编程能力,就得优化X,Y与函数F(X,Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——StructureandInterpretationofComputerPrograms(SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。在阅读SICP之前,你也许能通过调用几个函数解决一个简单问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP的教学语言为Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。PeterNorvig曾经写过一篇非常精彩的SICP书评,其中有这样一段:Touseananalogy,ifSICPwereaboutautomobiles,itwouldbeforthepersonwhowantstoknowhowcarswork,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,reliablevehiclesforthe21stcentury.ThepeoplewhohateSICParetheoneswhojustwanttoknowhowtodrivetheircaronthehighway,justlikeeveryoneelse.如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:UdacityCS212DesignofComputerProgram):由上文提到的Google研究主管PeterNorvig主讲,教学语言为Python,内容有一定难度。HowtoDesignPrograms,SecondEdition:HtDP的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读HtDP。UCBerkeleySICP授课视频以及SICP的两位作者给Hewlett-Packard公司员工培训时的录像(中文化项目)ComposingPrograms:一个继承了SICP思想但使用Python作为教学语言的编程导论(其中包含了一些小项目)SICP解题集:对于书后的习题,作为初学者应尽力并量力完成。完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,MegaProjectList中选取项目。总之,务必在这时拿下你项目实践的第一滴血。与此同时,别忘了继续打好根基。为了将来的厚积薄发,在下面这几个方面你还要继续做足功课(注意:下面的内容没有绝对意义上的先后顺序):计算机系统基础有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统》ComputerSystemsAProgrammer"sPerspective。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是CMU的「计算机系统导论」的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。如果你看书觉得有些枯燥的话,可以跟一门Coursera上的MOOC:TheHardware/SoftwareInterface,这门课的内容是CSAPP的一个子集,但是最经典的实验部分都移植过来了。同时,可以看看TheCProgrammingLanguage,回顾一下C语言的知识。完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络->内存->缓存->CPU的流向。此外,也是时候去接触UNIX哲学了:KISS-KeepitSimple,Stupid.在实践中,这意味着你要开始熟悉命令行界面,配置文件。并且在开发中逐渐脱离之前使用的IDE,学会使用Vim或Emacs(或者最好两者都去尝试)。阅读《UNIX编程环境》阅读《UNIX编程艺术》折腾你的UN*X系统数据结构与算法基础如今,很多人认为编程(特别是做web开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构和算法,你要去搜它主要拿来干嘛的,使用场景是什么。供你参考的学习资源:《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是IntroductiontoAlgorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数据结构与算法分析》CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;英语没过关的:麻省理工学院公开课:算法导论入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践》编程语言基础Differentlanguagessolvethesameproblemsindifferentways.Bylearningseveraldifferentapproaches,youcanhelpbroadenyourthinkingandavoidgettingstuckinarut.Additionally,learningmanylanguagesisfareasiernow,thankstothewealthoffreelyavailablesoftwareontheInternet-ThePragmaticProgrammer此外还要知道,学习第n门编程语言的难度是第(n-1)门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干净」的脚本语言Python,传统的命令式语言C,以及浪漫的函数式语言Scheme/Racket三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的Ruby小姑娘,Hindley-Milner语言家族的掌中宝Haskell都是不错的选择。但有这么一位你躲不开的,必须得认识的大伙伴—C++,你得做好与他深交的准备:入门:C++Primer[可选]进阶:高效使用:EffectiveC++深入了解:《深度探索C++对象模型》;C++Templates研究反思:TheDesignandEvolutionofC++;对于C++这个NecessaryEvil,看这本书可以让你选择是成为守夜人还是守日人。现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。供你参考的学习资源:《程序设计语言-实践之路》:CMU编程语言原理的教材,程序语言入门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。Coursera编程语言MOOC:课堂上你能接触到极端FP(函数式)的SML,中性偏FP的Racket,以及极端OOP(面向对象)的Ruby,并学会问题的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻松并写出更好的程序。UdacityCS262ProgrammingLanguage:热热身,教你写一个简单的浏览器——其实就是一个javascript和html的解释器,完成后的成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项目:用Python写一个SchemeInterpreter其他编程入门阶段比较容易忽视的几点:学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。此外英语的重要性更体现在沟通交流上,LinusTorvalds一个芬兰人,一口流利的英语一直是他招募开发者为Linux干活的的法宝,这是你的榜样。学会提问:学习中肯定会遇到问题,首先应该学会搜索引擎的「高级搜索」,当单靠检索无法解决问题时,去StackOverflow或知乎提问,提问前读读这篇文章:Whathaveyoutried?不要做一匹独狼:尝试搭建一个像这样简单的个人网站,不要只是一个孤零零的About页面,去学习Markdown与LaTeX,试着在Blog上记录自己的想法,并订阅自己喜欢的编程类博客。推荐几个供你参考:JoelonSoftware,PeterNorvig,CodingHorror小结以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试「费曼」技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。此外不要局限与上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。ThePragmaticProgrammer就是这样一本程序员入门书,终极书。有人称这本书为代码小全:从DRY到KISS,从做人到做程序员,这本书教给了你一切,你所需的只是遵循书上的指导。后记如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些「复杂」的API,更不会畏惧学习具体的技术,甚至感觉很容易。当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和csdn的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。首先要想学编程,选一门合适的计算机语言就十分重要了,怎么去选择就显得尤为重要了,这要根据自己的兴趣爱好及每个语言的特性来选择,比如说PHP适合做web开发,易学习,易上手,非常流行的一门计算机语言了,我个人比较推荐php语言。java可以做web开发,做安卓app开发也用的是java,在学习程度上上可能比php稍微难上手一点,不过也是没问题的,如果对java感兴趣可以尝试一下。python是目前比较火的一门语言了,比较适合做人工智能领域,另外写网络爬虫类的程序,用python也是非常合适的了,看个人兴趣来选择了。c,c++,c#这些语言就不推荐给了,特别是c#,已经是比较过时的一门语言了,即使学习好了,也不太适合去找工作,c与c++并不是十分适合初学者来学习,因此也是没必要进行考虑了,还有一些更小众的语言,更是没有必要去考虑,因此关于语言的学习就从上面3种语言去选择一门自己所感兴趣的吧!研发搭建环境如果选择好计算机语言,那么接下来就是研发环境的搭建了,因为只有研发环境搭建好了,才可以进行后续的编程工作,比如说PHP,那么就从百度上搜一下如何安装PHP环境,能搜出一些简单的教程,初学者按照教程一步一步来,顶多半天时间就可以把研发环境装好了,如果是java,就需要先安装jdk,进行环境变量的配置等,网上也有相关的教程,也是十分容易的,相信大家只要按照教程来做,都可以很轻易的把研发环境搭建起来的选好视频和书籍,辅助学习。既然是零基础学习,就需要进行系统的学习,而不是到处百度零基础的知识点进行学习。代码练习跟随教程一个一个章节的进行学习,需要注意的一点就是不能只是去看,那样不行,要对每一个章节的知识点要亲自用代码敲一遍,运行一下试试效果才行,这样才能提高自己的动手能力,才开始会觉得有一点生疏,慢慢的就会熟练起来,逐渐会增加编程的兴趣。这个过程就是需要反复的进行练习,大量的代码练习才行。这个过程是5步中最关键的阶段了,重在代码亲自练习,对编程中有的章节不明白的地方,千万不要放过去,可以在网上找一些相关的编程交流群,参加进去,在线上咨询一些过来人,也许就可以轻松帮你解决疑问了,对你的学习十分帮助,并且整个过程也都是免费的。项目实战如果说基础教程都按部就班的都实践过一遍了,那么你就有一定的编程的基本功了,那么自己就可以尝试着做一些小项目,把学到的知识给串起来,进入项目实战阶段,比如说自己设计一个学生管理系统,并把它完成,如果不了解怎么设计,可以去网上搜索。慢慢就有思路了。我也在学习这方面,视频书籍看过不少,最推荐的还是北京尚学堂的学习资料,Java.300集,Python400集,都是很经典的入门基础教程,而且是结合项目学习的,很有意思,干货满满,还都是免费的,推荐你可以去看看,相信可以带你走进变成的世界。从零开始学编程,第一关就是要选择你所要学习的编程语言。面对着琳琅满目的编程语言,初学者常常一筹莫展,拿不定主意,不知该选哪2023-07-08 17:44:006
学习操作系统的知识,看哪本书好
合实际一起看,效果会好的多。书籍上讲的多是理论,可以自己再去找个开源的嵌入式OS,一起看着代码实现,就会好的多了。比如FreeRTOS,可以也买本书,学会编译,并在电脑里当成个应用跑起来,学会自己创建进程、协程后,进入对应的API实现看看。内核的调度、优先级、内存管理、资源管理、抢占式任务切换等等。选择嵌入式OS是因为足够小,毕竟要为这个事情读Linux源码就是个大坑。FreeRTOS拥有大部分现代OS的各种核心功能,用来学习真是个好的例子。我也是学了FreeRTOS后,才逐渐让数年前操作系统的知识变得灵活起来了。举几个例子,在FreeRTOS中的实现:1. 线程管理:给每个线程建立个私有的堆栈,每次在线程里调用任何的函数,所需的参数传递、本地变量等都是放在线程私有堆栈里的。这样各个线程之间不会发生混乱。该堆栈的建立一般还有个最大长度值,以免浪费内存过多,同时也限制了递归过深的情况。需要OS应用一开始就进行一个估算,调用栈会有多深。2. 内存管理:一般是先从物理内存里申请一大块内存,建立针对这块内存的分配表,每当有申请内存就记录一条,释放内存就选择时机将剩余内存合并。分配策略有多种,比如按照顺序,或者优先选择符合条件的最小空闲段。每个线程都建立自己的堆,有助于提高内存分配效率。3. 进程/线程切换:使用系统硬件上的定时器,每隔一定时间就发生一次硬件中断,此时当前进程/线程被停止,所有寄存器被保存到进程私有栈里。两次中断之间实际执行任务代码的部分,就叫做一个时间片。然后调用中断处理函数。这个中断处理函数就是OS内核里的任务切换功能,会重新选择处于就绪(ready)状态的各个任务中优先级最高的那个来运行。所以,理解并实现这个中断处理函数,就是理解任务切换的关键。放心代码不长。4. OS内核调用:现代的CPU,包括一些嵌入式MCU,都会严格区分user space和kernel space。两者的各种资源相对独立,甚至堆栈都不同。当user application需要调用内核提供的服务时,往往是将自己要调用的内核调用符号、参数、返回值放到内存中指定位置,然后触发一个软件中断。比如Cortex-M系列的SVCall,或者DOS的80中断。此时就切换到了kernel mode。此模式下的中断处理函数会根据系统调用内容分发调用请求,执行结束后,再根据返回地址跳转回去。我推荐 6.828 / Fall 2014,往年的视频也很容易找到。这门课会接触到两个小的操作系统: xv6 和 jOS。课堂上主要讲xv6, 一个小的unix操作系统;而课程Lab分6~7个阶段让你填写jOS的关键代码。这门课的好处就是理论加实践,而且课程节奏很好。比如讲完系统调用,你就可以试着给xv6加个timer调用;讲完threads,你就可以试着给xv6加个系统调用,然后让这个系统支持线程...Lab实现的jOS和xv6有很多设计决策不同,对比它们你可以更好的理解什么是操作系统;当然能自己亲手写一些代码感觉会很不一样(理论怎么转换到实践)几点体会:homework也许比Lab更有启发性(我是这么认为的);如果看过CSAPP就最好了,汇编都不用学了,shell也会写了,memory也了解了。6.828有个作业提交系统,只要邮箱就能注册了,然后可以互评Lab...有了一些自己的体验后,然后结合书看也许就完全不一样了。2023-07-08 17:44:171
学习IT技术要从什么方面入手
学习IT技术要从以下几个方面入手:1.多看书看书不是一扫而过, 编程需要大量实践, 练习也得慢慢过, 别人看技术书快,是因为人家都是科班出身,或者从业很多年。你是从零学, 只能恶补基础,恶补基础的意思是, 你得像科班一样花费大量时间, 而不是跟看小说一样速战速决,那样没用的。人家给你推荐的CSAPP那些书, 对于科班的人当课外书看还得看个1个月, 你如果跟着学,每本书都至少半年。2.多逛IT相关的论坛和社区有些技术是靠经验堆积的,比如整个框架的设计,设计模式的运用。我倒觉得这个能力只要你平时留心,掌握它们只是个时间的问题。而有些技术,是要去实打实钻研的,不看透几本英文原版书,不逛遍几个论坛,你永远不能明白。越是难的东西,越能拉开你跟别人的距离。3.多看大V的文章大V都是过来人,很多你没听说过的问题或者不能解决的难题,他们可能早就遇到过了。现在人人手机不离手,不过有的人是用来学习,有的人却是用来打游戏或者刷剧!4.多上课或者多进社群现在网上的课有很多很多关于IT技术的,只要你想学,总是会找到相关的课程来学习的。关键就在于你是怎么想的,仅仅是为了业余爱好学习还是为了找一份工作。在社群中除了能学习一些知识以外,还可以跟一些志同道合的朋友相互交流。以上这些经验足以让你入门,如果想系统地学习,是需要专门去培训机构学习的,不然你的个人实力还不足以支撑你直接去就业、找工作,你可以去知乎课工场看一下!2023-07-08 17:44:271
退学自学计算机科学,有哪些好的建议?
引言:如今,计算机已经成为各行各业广泛使用的基本工具。掌握以计算机为核心的信息技术基础知识,提高计算机应用能力,是当代大学生必备的基本素质之一。但是计算机领域的知识更新很快,所以要求学生有很强的自学能力。自学能力是一个人不依靠他人或更少的帮助,独立获取、掌握和应用知识的能力。它是一种综合能力。一、对计算机有正确的概念误区一:学电脑=上网。网络使学生对世界的认识大大超过他名学生可以直接体验的生活世界。丰富的网络信息可以激发他学生的好奇心,上网本身也非常有利于培养学生的操作能力。然而,互联网也是一把双刃剑。网络在给学生带来各种积极影响的同时,其负面影响也随之而来。长时间上网会影响学生的健康成长,导致学习成绩下降。误区二:学计算机=学编程。有些学生认为学计算机就是学编程,需要良好的英语基础和数学基础,所以害怕计算机。实际上,编程只是理论研究或工程实践过程中表达算法的过程。有些程序员不一定对计算机技术有很深的了解。一个有趣的现象是,许多精通计算机技术的研究人员不知道如何编程。二、掌握正确的自学方法培养学生自学能力的方法有很多,比如阅读、发现问题、提出问题;通过查阅资料完善理论;通过实践,得出结论;通过做笔记、巩固知识,这些是自学的基本要求,也是培养自学能力的基本途径。很多教材都涉及到自学的重点和难点,并提出了理解知识点的关键问题,其中包含了相应的训练内容。围绕自学的重点,学生可以完成自学。学生可以加入感兴趣的社团或组织进行讨论、交流和实践。计算机是一门操作性很强的学科,要求学生多动手,不仅仅是看书,而是理论联系实际,轻松学习计算机技术。计算机网络的主要特点是资源共享和实时交流,因此学生可以更好地利用网络资源,如搜索信息、下载工具和软件、与他人交流、询问专家等。学生要有周密的学习计划,把要学习的内容分成每个学习日,每天完成每天的任务。2023-07-08 17:44:344
不同领域的圣经级书籍有哪些?
下面就让我来为大家讲解一下不同领域的圣经级书籍有哪些?希望能帮助到大家。比如说营销领域的《营销管理》科特勒。 01 现代科学全部从基督教而来。 哥白尼,达尔文,牛顿,弗朗西斯培根,这些被共产主义者奉为反迷信先锋的巨人, 都是虔诚的基督徒。牛顿专门为但以理书写了一本注解。 大学制度也是从教会而来。 现代科学就是从圣经而来。 科学出现的目的不是你老师宣扬的那样,要干掉之前的愚昧和迷信代表,天主教; 在这些伟大科学家眼里,有两本圣经,一本是神亲自启示先知,通过人手记录的新旧约圣经,另一本是神自己一手创造的大自然。 也就是说,很多学科产生的目的就是为了佐证圣经,让人对圣经的理解更深刻。 文学:不用提,圣经对文化影响之深远,文学只是其中之一; 音乐:最伟大的音乐从赞美而来。《你爱永不变》巫启贤 ---上百度搜一下他创作的心路历程,是最近的一个例子; 地质学,考古学:地质考古发现的古生物化石样本,所出现年代的先后秩序,和圣经所启示的造物顺序完全一致;也就是3500年前借着100多岁摩西的手所写的,和现代考古发现完全吻合; 生物学:进化论现在已经被批驳的体无完肤了。物种起源对生物科学的真实贡献在于,给动植物分门别类。各类之间的微变是有的,比如不同种的狗杂交;但不同种类之间的转变是不可能的,在人类历史纪录的几千年里,没有一个文明发现了,狗变成猫,或者马变成猪。这其实佐证了神创论中,“各从其类”这个反复出现的字眼。重要的事说三遍,这个字眼出现n遍,就是在告诉进化论,“类”是创造出来的,不是通过一个东西出来的 这样的学科还有很多 社会学里面就更多了,基本可以分为,不是呼吁人们回到圣经的,就是号召人们反对圣经的。 圣经,成书将近2000年,不改一字,没人能找出一处错误,真正反对潜心研究要推翻圣经的学者,最后都归向圣经。圣经也是现在一切科学的总纲。离开圣经,即使在某领域是专家,对于整个世界的认识也是支离破碎的。 02 古今中外,好书很多很多,不过,在这中间,可以说,堪称圣经级的书,却并不多。为什么呢?首先,要获得这种认可,必须经历时间的淘洗,因此至少近二三十年里出版的书,是无法入选的,理由倒不是它们一定写得不好,而是说,所谓“圣经级”的书,必须要被至少几代人公认为是名作,而绝不能是一时的流行读物,也不能是因为诸如刷流量之类的原因,而被背后巨大的推手打造的、实际水准并不如其名声的作品。 第二,要成为“圣经级”书籍,一定要是内业内专家公认为是好书的。特别是对一些学术性强的书来说,各国专家对它的基本评价,是一本书成为公认的经典的关键。对于那些文学性比较强的书,虽说可能是青菜萝卜各有所爱,但至少,文学也不是没有基本标准的。一部优秀的文学作品,不一定能成为名著,但一部作品,要成为圣经级的,则一定是经过了无数考验的。 下面按不同题材,逐一罗列各领域的圣经级读物。 历史/历史学: 《伯罗奔尼撒战争史》、《罗马帝国兴亡史》、《历史学的理论与实践》、《第三帝国的兴亡》、《八月炮火》 哲学: 《理想国》、《自然哲学》、《历史哲学》、《尼各马可伦理学 》 经济学: 《国富论》、《资本主义与自由》、《资本主义、社会主义与民主》、《就业、利息和货币通论》、《贫困与饥荒》 03 广告的或者marketing的,我推荐这本。 虽然书名叫文案的书,但适合大家。 作为一本1988年的老书,是不是过时了?但事实上,大家都在追新技术,新平台的今天,极多人忽视了,甚至完全不懂广告或者说传播的本质。这本书极好得、朴实得阐述了广告的本质,我称之为古典主义的广告书。 书里引经据典得介绍了很多优秀的思考方式和案例,而最可贵的是,这是我看过的唯一一本清楚说明了广告中,每个环节的工作到底承担了什么角色,逻辑清晰严密。相信看完了,就不会有人搞不清策略(planner)们到底是做什么的了。 或许,你会被惊讶到,原来如今管理咨询和MBA们用的很多思考工具,理论工具,都诞生自广告公司。比如,头脑风暴就来自于BBDO的创始人之一。 希望大家都能读读这本书,虽然它翻译的很糟糕。 04 化学: 《有机化学》 邢其毅 《物理化学》 傅献彩 《结构化学》 周公度 《有机合成:切断法》 沃伦(Stuart Warren) 计算机科学: 《深入理解计算机系统》(csapp),Randal E. Bryant,David R.O Hallaren 著,本书外号就是计算机科学的圣经,理解计算机科学的第一本书。 《计算机程序设计艺术》 Photoshop: 实用、经典、深入首推关文涛的这两本: 《选择的艺术Photoshop CS3图像处理深度剖析》 《选择的艺术-Photoshop CS图层通道深度剖析》 另外还有两本外国人的大作,Dan Margulis写的: 《Photoshop Lab修色圣典》 《Photoshop 修色圣典》 能完全理解这四本书的人可以说对Photoshop的原理和对色彩的理解达到了极高的水平。 05 张旭狂草《心经》 辛弃疾《诗文杂抄》王守仁《王阳明心学》 泰戈尔《飞鸟集》 萧鼎《诛仙》 《易经》《诗经》 《黄帝内经》《难经》《伤寒杂病论》《神农本草经》 《希波克拉底誓言》 Karunesh《Zen Breakfast》《问道》 阿道夫·希特勒《我的奋斗》 西格蒙德·弗洛伊德《梦的释义》 Pat Dorsey《股市真规则》 索罗斯《金融炼金术》 爱德温·李费佛《股票做手回忆录》 Michael Lewis《说谎者的扑克牌》 巴顿·比格斯《对冲基金风云录》 传说三大死亡禁曲《忏魂曲》《第十三只眼睛》《黑色星期天》 梵蒂冈教皇《忏悔录》2023-07-08 17:45:131
没有任何基础的学渣能转行程序员么?要怎样学?怎样学才能学的会学的快,我没有任何程序员基础,22岁
再牛的程序员也是从零基础开始学的,哪有天生自带编程基础的,你现在还年轻,你缺什么就补什么,什么都来得及。就是贵在坚持所以你的问题的答案是当然是能学能转行,前提是你能把握住自己,坚持下去。找到适合自己的学习方式,通过什么样的方式学习那是因人而异的,不是别人给你做决定的。2023-07-08 17:45:235
大神帮我看看一道编程题好吗?
int fitsBits(int x, int n) { int y = x>>(n+~1+1); return !y^!(~y);}2023-07-08 17:45:521
在c语言(vc6)中比较两个无符号整数大小的方法(不能使用>与
不是不能比,是你未比出正确结果,两个数的区间不一样,可以内码却有可能相同,你得如此比法,例如:int si;unsigned int ui;ui = si = -100;int res = (si<0) ? -1 : (ui>>31) ? 1 : (ui-si);当有符号数小于0时,不用比,总是有符号的小,当无符号数最高位为1时不用比,总是无符号位大,有符号数不小于0而无符号数最高位不是1时才做比较,就可以得出正确结果2023-07-08 17:46:021
读《编码:隐匿在计算机软硬件背后的语言》
第一次听说这本书,是在今年过年的时候,在 bang 的博客上看到他对这本书的评价非常高,他甚至感叹到,如果学校里能像这本书中讲述方式一样去教学生,那么也就不会有那么多学生是去学习的兴趣了。 后来在金旭亮老师介绍如何自学计算机课程时,他也推荐了这本书,可以作为学习计算机组成原理的入门读物。 因为我是非科班出身,最近开始补计算机课程,这本书便成为了我的第二本教材。 与作为教材的《计算机科学概论》相比,这本书更像是科普读物,以讲故事的形式,深入浅出地讲解了一台计算机是怎么制造出来的以及计算机科学的发展史,是一本绝佳的入门读物,但是如果要更系统、更全面和深入地学习计算机科学,还是需要再看一看专业教材,比如大名鼎鼎的 CSAPP。 一句话概括,这本书值得每个程序员读一读。 编码是一种用来传递信息的方式,我们使用不同的编码来为我们的交流服务。比如,盲文就是一种编码、电报报文也是一种编码。我们甚至可以说,我们每天说话交流的每一个词汇也是编码,聋哑人用的手语也是一种编码。 在计算机和电子设备中存储和传递文字、音频、图片、视频时,也使用了编码,因为计算机不能像人一样能够用直接通过眼睛、耳朵、嘴巴等方式来接收信息,计算机只认识 0 和 1。不同类型的信息使用了不同的编码。 莫尔斯码也被称作二进制码,因为这种编码的组成元素只有两个——“点”和“划”。 也就是说莫尔斯码的每一位只有两种表示,这一点跟二进制数很相似。所以一个莫尔斯码所能表示的数目大小可以用下面的公式表示: 有一种比莫尔斯码更早的编码方式,叫做布莱叶盲文,是法国的一个盲人布莱叶发明的。 换挡码和逃逸码 手电筒有一个开关,开关控制电路的中电流是否接通。开关只能是闭合状态或者断开状态。电流只能是有或者无。灯泡也只能是发光或不发光。跟莫尔斯和布莱叶发明的编码中每一位的值一样,只有两种状态。 二进制码和电气电路之间有一定的联系。 搭建一个简单的电报系统:通过电线将通讯两方连接起来,接收方有一个灯泡,发送方通过控制灯泡的开关,然后就可以发送摩尔斯编码了。 计算机系统正是基于这个装置构建出来的。 莫尔斯发明的电报机:发报时通过控制按压电键的时间长短来表示“点”和“划”,收报时通过听声音的长短来区分“点”和“划”。 但是一开始,电报机的有效距离不能太长,于是后来出现了继电器,这个继电器可以将接收到的信息转发出去。 继电器的本质是一个开关,但是这个开关的闭合和断开并不是由人来操纵的,而是由电流控制的。 延伸阅读: 大多数文明都建立在以 10 为基数的数字系统上,因为人们用自己的手指来计数。 早期的数字系统只有罗马数字和阿拉伯数字沿用到了今天,而且今天使用最广泛的就是阿拉伯数字。 阿拉伯数字相比其他计数系统的几个特点: 而位置计数法不仅仅适用于十进制,还适用于其他计数系统,比如八进制、二进制。 十进制中,我们用 0~9 这十个符号来表示所有的数字。“十”没有特定的符号,我们用 10 表示“十”。 同样,在八进制中也没有专门表示“八”的符号,我们也是用 10 来表示“八”。 四进制和二进制也是同样的表示方式。 二进制数字系统是最简单的数字系统,它的加法表和乘法表是最简单的。 二进制数字系统在算术和电子技术之间架起了一座桥梁,开关是否打开、电线中是否有电流通过、灯泡是否点亮、电报继电器是否闭合都可以用二进制数 0 和 1 来表示。 大约在 1947 年,美国数学家 John Wilder Turkey 首次用 bit 来表示二进制位 binary digit,一直沿用至今。 延伸阅读: 二进制的特殊性:它是最简单的数字系统。 在计算机时代,比特被看做是组成信息块的基本单位。 二进制并不是传达信息的唯一方法,但是比特所传递的“信息量”极小,1 比特是可能存在的最小信息量。 复杂一些的信息可以用多位二进制数来表达。 信息本质上是指多个可能性中的一种,而比特本质上就是数字。所以,我们可以说,所有可以被转换成两种或者多种可能性的选择的信息,都可以用比特来表示。比如文字、图片、声音、视频、条形码、评分等等。 用比特表示其他信息的时候,我们所要做的就是计算有多少种可能性,每种可能性对应一个编码。 我们通常所讨论的二进制数,都是指有一定位数的二进制数,比特位越多,所表示的可能性越多。 跟十进制类似,在二进制中,一个二进制数可以表示的编码数目等于 2 的整数次幂,其幂指数就是比特位的位数。 在日常生活中,我们一般是看不到比特的,因为它们深藏于 CD、计算机等电子产品中的编码,但在某些场合还是可以看得到的,比如商品包装上的条形码(UPC)。 在逻辑学中也可以找到比特的影子,逻辑学是哲学和数学的结合,其主要目的就是确定某个陈述是真还是假,而真和假同样可以用 1 和 0 来表示。 延伸阅读 Claude Elwood Shannon 首次提出了:电子工程师可以运用布尔代数去设计开关电路。 从这里开始,继电器将会极少地出现了,以后的电路会由缓冲器、反向器、四种基本逻辑电路和其他由逻辑门组成的复杂电路组成。当然,所有这些器件也是由继电器构成的。 摩根定律是简化布尔表达式的一种重要手段,可以用来简化电路: 二进制加法跟十进制相似,也是各位数字相加的组合。 二进制加法的加法表比十进制更简单。 一对二进制数字相加的结果中有两个数位,其中一个叫做加法位,另一位叫做进位位。所以二进制加法表可以表示成下面这样: 使用逻辑门制作一个半加器和一个全加器。 减法和加法的本质区别是,加法中有进位,而减法中没有进位只有借位,也就是说,减法运算中在计算低位时可能需要向更高一位借位,这样就会导致一位运算变成多位运算了。 举个例子,下面这个加法计算 可以拆成两步: 而下面的减法运算 就变成这样了: 减法表达式: 避免借位的关键是保证被减数每一位都比减数中相同位置的数要大,所以我们这里需要用到 对 9 求补数 的概念。 以 253 - 176 为例,为了在计算时不涉及到借位,我们可以将其转成 (999 - 176) + 253 + 1 - 1000 ,就可以得到最终结果了。 步骤: 以 176 - 253 为例,为了在计算时不涉及到借位,我们可以先通过计算 999 - ((999 - 253) + 176 得到最终结果的绝对值,然后再取相反数,。 步骤: 以 253 - 176 (也就是 1111 1101 - 1011 0000 )为例,为了在计算时不涉及到借位,我们可以将其转成 (1111 1111 - 1011 0000) + 1111 1101 + 1 - 1 0000 0000 ,就可以得到最终结果了。 步骤: 以 176 - 253 (也就是 1011 0000 - 1111 1101 )为例,为了在计算时不涉及到借位,我们可以先通过计算 1111 1111 - ((1111 1111 - 1111 1101) + 1011 0000) 得到结果的绝对值,然后再取相反数,就可以得到最终结果了。 步骤: 振荡器:可以在不需要人为干涉的情况下,完全自发地改变状态。振荡器是用来产生重复电子讯号(通常是正弦波或方波)的电子元件。其构成的电路叫振荡电路。能将直流电转换为具有一定频率交流电信号输出的电子电路或装置。 当采用 0 和 1 的交替序列来表示振荡器的输出时,我们可以用下面的图来描述输出。 反馈就是将电子系统中输出回路的输出量(输出电压或输出电流)的一部分或全部,通过一定的电路(反馈网络)反向送回到输入端或输入回路,进而对输入量产生影响的连接形式(过程)。 触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器。 触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器可以处理输入、输出信号和时钟频率之间的相互影响。 这一章主要是通过观察微处理器和外部设备的交互过程,来认识其内部的结构和工作原理。这里作者将微处理器看做一个黑盒,主要的研究方法是通过观测芯片的输入、输出信号。特别是芯片的指令集来理解微处理器的工作原理。2023-07-08 17:46:081
c++中%.2X ,X代表输出是16进制,但是.2是什么意思?我看输出结果应该是02啊。
你看的应该是对的,因为C++不支持用16进制格式显示浮点数,所以.2就没有意义,而02则表示占宽2位右对齐,不足2位时前面补0,倍数大于2时按实际宽度输出。如printf("%02X ",1);则输出01,printf("%02X ",18);.输出12,而printf("%02X ",767);则显示2FF。2023-07-08 17:46:194
一名计算机专业的学生大四应该如何度过?
这个问题主要还是要看你是想读研还是想实习呢?首先我觉得书是肯定要读的,作为一名计算机系的学生,csapp是一定要读的,而且c语言至少应该学的很不错了,当然还有非常多的值得你去读的书,你可以尝试去学点更现代更容易做出一个小玩意的语言,不过这当然是看你的基础和你自己想要去做的事情而且要好好读。至于那本疯狂java的讲义就不评论了,毕竟我也不是专业的。如果你想要去实习的话,你会发现通过实习你完全就可以搞清楚你是不是真的适合或者喜欢计算机这个职业,其实很多人在真正接触计算机之后却发现没有退路,希望你可以比他们更早的发现。至于实习什么领域和项目,这些我觉得并不重要。其次你的眼界要多开阔,你要知道世界很大,有很多可能,世界当然也很小,其实真的很厉害的人和事都不多,只要你自己特别的专注,很快就可以找到适合你自己走的那条路。我觉得你要在大四的这一年可以去熟悉一门或几门编程语言,底层语言,面向对象,脚本语言都熟悉自然最好。这里熟悉的定义是:熟练使用并有项目开发经验,懂得语言底层实现原理并自己可以实现部分语言功,熟练一种平台并有该平台下的开发经验扎实的基础知识。在不清楚自己的定位的时候,多去几家企业实习,找到自己的定位才是最重要的。规划自己未来五年要做什么,十年要做什么,你甚至可以去想一想你二十年之后要做什么。生面这些就是我给你的建议,希望可以帮助到你。2023-07-08 17:46:281
十进制分数怎么转换成二进制小数
十进制分数先转换成十进制小数,再转换成二进制小数。 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)【例】: (0.625)10= (0.101)20.625X2=1.25 ……10.25 X2=0.50 ……00.50 X2=1.00 ……1二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0".‘1"符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0"".""1""的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。2023-07-08 17:46:523
面试官让我回去看看apue,unp,mysql是什么意思
如果不知道一个术语什么意思 请先学会使用谷歌另外反对高票回答所说的装逼论 因为APUE这样的经典书国外很多时候为了方便简单也是这样叫的 甚至他们的网站都是APUE既然是大家约定俗成的一个名字 感觉无所谓装逼 虽然也有可能 但这样揣测人家其实是理论不充分的那如果还是执意认为外国人不说首字母简写的话 再举两个栗子大名鼎鼎的SICP Welcome to the SICP Web Site 网页标题直接就说欢迎来SICP网站了另外一个CSAPP CS:APP2e, Bryant and O"Hallaron 同理 退步说,即使外国人不这么叫,中国内部的程序员圈子这么叫就是山寨就是装b么,只要指代准确,广泛认可,没什么不好的Life is short,何必非得跟着“老外”的叫法叫。2023-07-08 17:46:591
为什么xor eax,eax 指令为2字节,mov eax,0 指令为5个字节?
有的是masm汇编有的是 at&t 汇编 在机器语言级别是不同的,只是表示记录方法有差别而已2023-07-08 17:47:061
传说平台cs怎么加好友
1、首先打开手机,输入密码,在手机桌面找到传说平台csAPP,并打开,输入账号密码,点击登入。2、其次点击好友。3、最后点击搜索,搜索好友的ID,点击添加即可。2023-07-08 17:47:141
学习IT技术要从什么方面入手
学习IT技术要从以下几个方面入手:1.多看书看书不是一扫而过, 编程需要大量实践, 练习也得慢慢过, 别人看技术书快,是因为人家都是科班出身,或者从业很多年。你是从零学, 只能恶补基础,恶补基础的意思是, 你得像科班一样花费大量时间, 而不是跟看小说一样速战速决,那样没用的。人家给你推荐的CSAPP那些书, 对于科班的人当课外书看还得看个1个月, 你如果跟着学,每本书都至少半年。2.多逛IT相关的论坛和社区有些技术是靠经验堆积的,比如整个框架的设计,设计模式的运用。我倒觉得这个能力只要你平时留心,掌握它们只是个时间的问题。而有些技术,是要去实打实钻研的,不看透几本英文原版书,不逛遍几个论坛,你永远不能明白。越是难的东西,越能拉开你跟别人的距离。3.多看大V的文章大V都是过来人,很多你没听说过的问题或者不能解决的难题,他们可能早就遇到过了。现在人人手机不离手,不过有的人是用来学习,有的人却是用来打游戏或者刷剧!4.多上课或者多进社群:现在网上的课有很多很多关于IT技术的,只要你想学,总是会找到相关的课程来学习的。关键就在于你是怎么想的,仅仅是为了业余爱好学习还是为了找一份工作。在社群中除了能学习一些知识以外,还可以跟一些志同道合的朋友相互交流。以上这些经验足以让你入门,如果想系统的学习,是需要专门去学习的!附:IT学习课程表2023-07-08 17:47:2514
本科211考研去哈工大深圳校区专硕,真的会当炮灰吗,我还是跨考计算机,本科信科,哈工大真的很卷吗?
这种顶级高校是看你的学习硬实力的,你的本科有211也不差了,拼命考高分,复试多准备准备,只要你够强,就不用怕卷,你就能考研上岸。这两年专业课因为改csapp后分数有所下降,但是专业课内容太多,复习压力也挺大,公共课准备好的话没有那么难考,总分往400分准备比较稳,看看自己差在哪儿。黑龙江英语政治阅卷比较松,政治英语数学考好了之后专业课拉跨也不怕,如果你数学差,专业课也搞不明白,就算了,难搞。别想调剂的事儿,要么二战,要么上岸。如果准备以后找开发岗,更建议软院,科软南软这种,整两段实习经历秋招直接乱杀,还不用被科研分散精力,不需要躲着导师偷偷去实习,难度你自己去了解下吧,按道理来说会容易点。其他事件:由于今年哈工深有部分硕博被要求搬宿舍,有一些人怨气很大,直接劝退学弟妹(这些学校是哈工深研究生的生源学校),你知道人生气时会添油加醋说的各种可能并不存在事的坏话或有意夸大,这个影响可能比较大,可能不少人看到这个消息放弃了报考就没关注这个学校了。以上内容参考:百度百科-哈尔滨工业大学(深圳)2023-07-08 17:48:161
如何从零开始学编程?
在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏?iOS或者Android应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。不要浮躁Badprogrammingiseasy.EvenDummiescanlearnitin21days.Goodprogrammingrequiresthought,buteveryonecandoitandeveryonecanexperiencetheextremesatisfactionthatcomeswithit.不管是在线下还是线上的书店,满目都是《21天学通Java》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。MatthiasFelleisen在他的著作HowtoDesignPrograms,SecondEdition一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。所谓的「捷径」或者说「银弹」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。培养兴趣Mostgoodprogrammersdoprogrammingnotbecausetheyexpecttogetpaidorgetadulationbythepublic,butbecauseitisfuntoprogram._LinusTorvalds沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。在这里对于初学者有两个大坑:如果初学者们只与预先构建好的「发动机和组件」接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。第二个坑没有第一个那么明显:幼稚的「整体论」方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来「补足基础」会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。但也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为「大厨」,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。总之,编程是连接理论与实践的纽带,是计算机科学与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。作为初学者,应以后者为主,前者为辅。启蒙「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?编程知识的金字塔底部有三个关键的部分:算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个maxSoFar变量,之后对于每个数语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。系统基础:为什么while(1)时线程永远无法结束?为什么int*foo(){intx=0;return&x;}是不可行的?启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用Python作为学习的第一门语言,虽然Python对初学者很友好,但这并不意味着它只是一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉Python后,学习C语言是便是一个不错的选择了:学习C语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理,如果你只想成为一个普通(平庸)的开发者你可以不学习它。下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。完成Codecademy的Python部分。这只是热身部分,尽快完成它,因为你永远只是在浏览器里,你不会学到如何搭建开发环境。在Codecademy这类的编程学习网站学到的那点儿东西,哪怕你只想做一个小的不能再小的项目,你都不知道该从哪儿开始。完成MIT6.00.1x(中文化)(如果你英语不过关,完成麻省理工学院公开课:计算机科学及编程导论。MOOC是学习编程的一个有效途径。虽然该课程的教学语言为Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,python编程语言,一些简单的数据结构与算法,测试与调试。支线任务:完成Python核心编程完成HarvardCS50(如果你英语不过关:完成哈佛大学公开课:计算机科学cs50。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及C,PHP,JavaScript+SQL,HTML+CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《编码的奥秘》完成《C语言编程》[可选]如果你的目标是成为一名Hacker:阅读Hacker"sDelightPS:如果教育对象还是一个孩子,以下的资源会很有帮助:5-8岁:TurtleAcademy8-12岁:PythonforKids12岁以上:MITScratch或KhanAcademy入门结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如Web开发,Android开发,iOS开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。设想:X=用于思考解决方案的时间,即「解决问题」部分Y=用于实现代码的时间,即「利用计算机」部分」编程能力=F(X,Y)(X>Y)要想提高编程能力,就得优化X,Y与函数F(X,Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——StructureandInterpretationofComputerPrograms(SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。在阅读SICP之前,你也许能通过调用几个函数解决一个简单问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP的教学语言为Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。PeterNorvig曾经写过一篇非常精彩的SICP书评,其中有这样一段:Touseananalogy,ifSICPwereaboutautomobiles,itwouldbeforthepersonwhowantstoknowhowcarswork,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,reliablevehiclesforthe21stcentury.ThepeoplewhohateSICParetheoneswhojustwanttoknowhowtodrivetheircaronthehighway,justlikeeveryoneelse.如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:UdacityCS212DesignofComputerProgram):由上文提到的Google研究主管PeterNorvig主讲,教学语言为Python,内容有一定难度。HowtoDesignPrograms,SecondEdition:HtDP的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读HtDP。UCBerkeleySICP授课视频以及SICP的两位作者给Hewlett-Packard公司员工培训时的录像(中文化项目)ComposingPrograms:一个继承了SICP思想但使用Python作为教学语言的编程导论(其中包含了一些小项目)SICP解题集:对于书后的习题,作为初学者应尽力并量力完成。完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,MegaProjectList中选取项目。总之,务必在这时拿下你项目实践的第一滴血。与此同时,别忘了继续打好根基。为了将来的厚积薄发,在下面这几个方面你还要继续做足功课(注意:下面的内容没有绝对意义上的先后顺序):计算机系统基础有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统》ComputerSystemsAProgrammer"sPerspective。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是CMU的「计算机系统导论」的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。如果你看书觉得有些枯燥的话,可以跟一门Coursera上的MOOC:TheHardware/SoftwareInterface,这门课的内容是CSAPP的一个子集,但是最经典的实验部分都移植过来了。同时,可以看看TheCProgrammingLanguage,回顾一下C语言的知识。完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络->内存->缓存->CPU的流向。此外,也是时候去接触UNIX哲学了:KISS-KeepitSimple,Stupid.在实践中,这意味着你要开始熟悉命令行界面,配置文件。并且在开发中逐渐脱离之前使用的IDE,学会使用Vim或Emacs(或者最好两者都去尝试)。阅读《UNIX编程环境》阅读《UNIX编程艺术》折腾你的UN*X系统数据结构与算法基础如今,很多人认为编程(特别是做web开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构和算法,你要去搜它主要拿来干嘛的,使用场景是什么。供你参考的学习资源:《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是IntroductiontoAlgorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数据结构与算法分析》CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;英语没过关的:麻省理工学院公开课:算法导论入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践》编程语言基础Differentlanguagessolvethesameproblemsindifferentways.Bylearningseveraldifferentapproaches,youcanhelpbroadenyourthinkingandavoidgettingstuckinarut.Additionally,learningmanylanguagesisfareasiernow,thankstothewealthoffreelyavailablesoftwareontheInternet-ThePragmaticProgrammer此外还要知道,学习第n门编程语言的难度是第(n-1)门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干净」的脚本语言Python,传统的命令式语言C,以及浪漫的函数式语言Scheme/Racket三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的Ruby小姑娘,Hindley-Milner语言家族的掌中宝Haskell都是不错的选择。但有这么一位你躲不开的,必须得认识的大伙伴—C++,你得做好与他深交的准备:入门:C++Primer[可选]进阶:高效使用:EffectiveC++深入了解:《深度探索C++对象模型》;C++Templates研究反思:TheDesignandEvolutionofC++;对于C++这个NecessaryEvil,看这本书可以让你选择是成为守夜人还是守日人。现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。供你参考的学习资源:《程序设计语言-实践之路》:CMU编程语言原理的教材,程序语言入门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。Coursera编程语言MOOC:课堂上你能接触到极端FP(函数式)的SML,中性偏FP的Racket,以及极端OOP(面向对象)的Ruby,并学会问题的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻松并写出更好的程序。UdacityCS262ProgrammingLanguage:热热身,教你写一个简单的浏览器——其实就是一个javascript和html的解释器,完成后的成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项目:用Python写一个SchemeInterpreter其他编程入门阶段比较容易忽视的几点:学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。此外英语的重要性更体现在沟通交流上,LinusTorvalds一个芬兰人,一口流利的英语一直是他招募开发者为Linux干活的的法宝,这是你的榜样。学会提问:学习中肯定会遇到问题,首先应该学会搜索引擎的「高级搜索」,当单靠检索无法解决问题时,去StackOverflow或知乎提问,提问前读读这篇文章:Whathaveyoutried?不要做一匹独狼:尝试搭建一个像这样简单的个人网站,不要只是一个孤零零的About页面,去学习Markdown与LaTeX,试着在Blog上记录自己的想法,并订阅自己喜欢的编程类博客。推荐几个供你参考:JoelonSoftware,PeterNorvig,CodingHorror小结以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试「费曼」技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。此外不要局限与上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。ThePragmaticProgrammer就是这样一本程序员入门书,终极书。有人称这本书为代码小全:从DRY到KISS,从做人到做程序员,这本书教给了你一切,你所需的只是遵循书上的指导。后记如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些「复杂」的API,更不会畏惧学习具体的技术,甚至感觉很容易。当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和csdn的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。首先要想学编程,选一门合适的计算机语言就十分重要了,怎么去选择就显得尤为重要了,这要根据自己的兴趣爱好及每个语言的特性来选择,比如说PHP适合做web开发,易学习,易上手,非常流行的一门计算机语言了,我个人比较推荐php语言。java可以做web开发,做安卓app开发也用的是java,在学习程度上上可能比php稍微难上手一点,不过也是没问题的,如果对java感兴趣可以尝试一下。python是目前比较火的一门语言了,比较适合做人工智能领域,另外写网络爬虫类的程序,用python也是非常合适的了,看个人兴趣来选择了。c,c++,c#这些语言就不推荐给了,特别是c#,已经是比较过时的一门语言了,即使学习好了,也不太适合去找工作,c与c++并不是十分适合初学者来学习,因此也是没必要进行考虑了,还有一些更小众的语言,更是没有必要去考虑,因此关于语言的学习就从上面3种语言去选择一门自己所感兴趣的吧!研发搭建环境如果选择好计算机语言,那么接下来就是研发环境的搭建了,因为只有研发环境搭建好了,才可以进行后续的编程工作,比如说PHP,那么就从百度上搜一下如何安装PHP环境,能搜出一些简单的教程,初学者按照教程一步一步来,顶多半天时间就可以把研发环境装好了,如果是java,就需要先安装jdk,进行环境变量的配置等,网上也有相关的教程,也是十分容易的,相信大家只要按照教程来做,都可以很轻易的把研发环境搭建起来的选好视频和书籍,辅助学习。既然是零基础学习,就需要进行系统的学习,而不是到处百度零基础的知识点进行学习。代码练习跟随教程一个一个章节的进行学习,需要注意的一点就是不能只是去看,那样不行,要对每一个章节的知识点要亲自用代码敲一遍,运行一下试试效果才行,这样才能提高自己的动手能力,才开始会觉得有一点生疏,慢慢的就会熟练起来,逐渐会增加编程的兴趣。这个过程就是需要反复的进行练习,大量的代码练习才行。这个过程是5步中最关键的阶段了,重在代码亲自练习,对编程中有的章节不明白的地方,千万不要放过去,可以在网上找一些相关的编程交流群,参加进去,在线上咨询一些过来人,也许就可以轻松帮你解决疑问了,对你的学习十分帮助,并且整个过程也都是免费的。项目实战如果说基础教程都按部就班的都实践过一遍了,那么你就有一定的编程的基本功了,那么自己就可以尝试着做一些小项目,把学到的知识给串起来,进入项目实战阶段,比如说自己设计一个学生管理系统,并把它完成,如果不了解怎么设计,可以去网上搜索。慢慢就有思路了。我也在学习这方面,视频书籍看过不少,最推荐的还是北京尚学堂的学习资料,Java.300集,Python400集,都是很经典的入门基础教程,而且是结合项目学习的,很有意思,干货满满,还都是免费的,推荐你可以去看看,相信可以带你走进变成的世界。从零开始学编程,第一关就是要选择你所要学习的编程语言。面对着琳琅满目的编程语言,初学者常常一筹莫展,拿不定主意,不知该选哪2023-07-08 17:48:281
如何学编程 怎样从零开始学编程
在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏?iOS或者Android应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。不要浮躁Badprogrammingiseasy.EvenDummiescanlearnitin21days.Goodprogrammingrequiresthought,buteveryonecandoitandeveryonecanexperiencetheextremesatisfactionthatcomeswithit.不管是在线下还是线上的书店,满目都是《21天学通Java》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。MatthiasFelleisen在他的著作HowtoDesignPrograms,SecondEdition一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。所谓的「捷径」或者说「银弹」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。培养兴趣Mostgoodprogrammersdoprogrammingnotbecausetheyexpecttogetpaidorgetadulationbythepublic,butbecauseitisfuntoprogram._LinusTorvalds沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣。有人为你的代码而惊叹很有趣。有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。在这里对于初学者有两个大坑:如果初学者们只与预先构建好的「发动机和组件」接触(没有理解和思考它们构造的原理),这会严重限制他们在将来构建这些东西的能力,并且在诊断解决问题时无从下手。第二个坑没有第一个那么明显:幼稚的「整体论」方法有些时候会显得很有效,这有一定的隐蔽性与误导性,但是一两年过后(也许没那么长),当你在学习路上走远时,再想回过头来「补足基础」会有巨大的心理障碍,你得抛弃之前自己狭隘的观念,耐心地缓步前进,这比你初学时学习基础知识困难得多。但也不能矫枉过正,陷入还原论的大坑,初学时便一心试图做宏大的理论,这样不仅有一切流于理论的危险,枯燥和乏味还会让你失去推动力。这种情况经常发生在计算机科班生身上。为了更好理解,可以将学习编程类比为学习厨艺:你为了烧得一手好菜买了一些关于菜谱的书,如果你只是想为家人做菜,这会是一个不错的主意,你重复菜谱上的步骤也能做出不赖的菜肴,但是如果你有更大的野心,真的想在朋友面前露一手,做一些独一无二的美味佳肴,甚至成为「大厨」,你必须理解这些菜谱背后大师的想法,理解其中的理论,而不仅仅是一味地实践。但是如果你每天唯一的工作就是阅读那些厚重的理论书籍,因为缺乏实践,你只会成为一个糟糕的厨子,甚至永远成为不了厨子,因为看了几天书后你就因为枯燥放弃了厨艺的学习。总之,编程是连接理论与实践的纽带,是计算机科学与计算机应用技术相交融的领域。正确的编程学习方法应该是:通过自顶而下的探索与项目实践,获得编程直觉与推动力;从自底向上的打基础过程中,获得最重要的通用方法并巩固编程思想的理解。作为初学者,应以后者为主,前者为辅。启蒙「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?编程知识的金字塔底部有三个关键的部分:算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个maxSoFar变量,之后对于每个数语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。系统基础:为什么while(1)时线程永远无法结束?为什么int*foo(){intx=0;return&x;}是不可行的?启蒙阶段的初学者若选择C语言作为第一门语言会很困难并且枯燥,这是因为他们被迫要同时学习这三个部分,在能做出东西前要花费很多时间。因此,为了尽量最小化「语法」与「系统基础」这两部分,建议使用Python作为学习的第一门语言,虽然Python对初学者很友好,但这并不意味着它只是一个「玩具」,在大型项目中你也能见到它强大而灵活的身影。熟悉Python后,学习C语言是便是一个不错的选择了:学习C语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理,如果你只想成为一个普通(平庸)的开发者你可以不学习它。下面给出了一个可供参考的启蒙阶段导引,完成后你会在头脑中构建起一个整体框架,帮助你进行自顶向下的探索。完成Codecademy的Python部分。这只是热身部分,尽快完成它,因为你永远只是在浏览器里,你不会学到如何搭建开发环境。在Codecademy这类的编程学习网站学到的那点儿东西,哪怕你只想做一个小的不能再小的项目,你都不知道该从哪儿开始。完成MIT6.00.1x(中文化)(如果你英语不过关,完成麻省理工学院公开课:计算机科学及编程导论。MOOC是学习编程的一个有效途径。虽然该课程的教学语言为Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,python编程语言,一些简单的数据结构与算法,测试与调试。支线任务:完成Python核心编程完成HarvardCS50(如果你英语不过关:完成哈佛大学公开课:计算机科学cs50。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及C,PHP,JavaScript+SQL,HTML+CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。支线任务:阅读《编码的奥秘》完成《C语言编程》[可选]如果你的目标是成为一名Hacker:阅读Hacker"sDelightPS:如果教育对象还是一个孩子,以下的资源会很有帮助:5-8岁:TurtleAcademy8-12岁:PythonforKids12岁以上:MITScratch或KhanAcademy入门结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如Web开发,Android开发,iOS开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么(Why)要这样设计?,思考怎样(How)写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。设想:X=用于思考解决方案的时间,即「解决问题」部分Y=用于实现代码的时间,即「利用计算机」部分」编程能力=F(X,Y)(X>Y)要想提高编程能力,就得优化X,Y与函数F(X,Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——StructureandInterpretationofComputerPrograms(SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。在阅读SICP之前,你也许能通过调用几个函数解决一个简单问题。但阅读完SICP之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP的教学语言为Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。PeterNorvig曾经写过一篇非常精彩的SICP书评,其中有这样一段:Touseananalogy,ifSICPwereaboutautomobiles,itwouldbeforthepersonwhowantstoknowhowcarswork,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,reliablevehiclesforthe21stcentury.ThepeoplewhohateSICParetheoneswhojustwanttoknowhowtodrivetheircaronthehighway,justlikeeveryoneelse.如果你是文中的前者,阅读SICP将成为你衔接启蒙与入门阶段的关键点虽然SICP是一本「入门书」,但对于初学者还是有一定的难度,以下是一些十分有用的辅助资源:UdacityCS212DesignofComputerProgram):由上文提到的Google研究主管PeterNorvig主讲,教学语言为Python,内容有一定难度。HowtoDesignPrograms,SecondEdition:HtDP的起点比SICP低,书中的内容循循善诱,对初学者很友好,如果觉得完成SICP过于困难,可以考虑先读一读HtDP。UCBerkeleySICP授课视频以及SICP的两位作者给Hewlett-Packard公司员工培训时的录像(中文化项目)ComposingPrograms:一个继承了SICP思想但使用Python作为教学语言的编程导论(其中包含了一些小项目)SICP解题集:对于书后的习题,作为初学者应尽力并量力完成。完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展,如果你自己的想法不明确,MegaProjectList中选取项目。总之,务必在这时拿下你项目实践的第一滴血。与此同时,别忘了继续打好根基。为了将来的厚积薄发,在下面这几个方面你还要继续做足功课(注意:下面的内容没有绝对意义上的先后顺序):计算机系统基础有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:《深入理解计算机系统》ComputerSystemsAProgrammer"sPerspective。这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是CMU的「计算机系统导论」的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。如果你看书觉得有些枯燥的话,可以跟一门Coursera上的MOOC:TheHardware/SoftwareInterface,这门课的内容是CSAPP的一个子集,但是最经典的实验部分都移植过来了。同时,可以看看TheCProgrammingLanguage,回顾一下C语言的知识。完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络->内存->缓存->CPU的流向。此外,也是时候去接触UNIX哲学了:KISS-KeepitSimple,Stupid.在实践中,这意味着你要开始熟悉命令行界面,配置文件。并且在开发中逐渐脱离之前使用的IDE,学会使用Vim或Emacs(或者最好两者都去尝试)。阅读《UNIX编程环境》阅读《UNIX编程艺术》折腾你的UN*X系统数据结构与算法基础如今,很多人认为编程(特别是做web开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构和算法,你要去搜它主要拿来干嘛的,使用场景是什么。供你参考的学习资源:《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是IntroductiontoAlgorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数据结构与算法分析》CourseraAlgorithms:DesignandAnalysis[Part1]&[Part2]:Stanford开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;英语没过关的:麻省理工学院公开课:算法导论入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践》编程语言基础Differentlanguagessolvethesameproblemsindifferentways.Bylearningseveraldifferentapproaches,youcanhelpbroadenyourthinkingandavoidgettingstuckinarut.Additionally,learningmanylanguagesisfareasiernow,thankstothewealthoffreelyavailablesoftwareontheInternet-ThePragmaticProgrammer此外还要知道,学习第n门编程语言的难度是第(n-1)门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干净」的脚本语言Python,传统的命令式语言C,以及浪漫的函数式语言Scheme/Racket三个好朋友。但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的Ruby小姑娘,Hindley-Milner语言家族的掌中宝Haskell都是不错的选择。但有这么一位你躲不开的,必须得认识的大伙伴—C++,你得做好与他深交的准备:入门:C++Primer[可选]进阶:高效使用:EffectiveC++深入了解:《深度探索C++对象模型》;C++Templates研究反思:TheDesignandEvolutionofC++;对于C++这个NecessaryEvil,看这本书可以让你选择是成为守夜人还是守日人。现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。供你参考的学习资源:《程序设计语言-实践之路》:CMU编程语言原理的教材,程序语言入门书,现在就可以看,会极大扩展你的眼界,拉开你与普通人的差距。Coursera编程语言MOOC:课堂上你能接触到极端FP(函数式)的SML,中性偏FP的Racket,以及极端OOP(面向对象)的Ruby,并学会问题的FP分解vsOOP分解、ML的模式匹配、Lisp宏、不变性与可变性、解释器的实现原理等,让你在将来学习新语言时更加轻松并写出更好的程序。UdacityCS262ProgrammingLanguage:热热身,教你写一个简单的浏览器——其实就是一个javascript和html的解释器,完成后的成品还是很有趣的;接下来,试着完成一个之前在SICP部分提到过的项目:用Python写一个SchemeInterpreter其他编程入门阶段比较容易忽视的几点:学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。此外英语的重要性更体现在沟通交流上,LinusTorvalds一个芬兰人,一口流利的英语一直是他招募开发者为Linux干活的的法宝,这是你的榜样。学会提问:学习中肯定会遇到问题,首先应该学会搜索引擎的「高级搜索」,当单靠检索无法解决问题时,去StackOverflow或知乎提问,提问前读读这篇文章:Whathaveyoutried?不要做一匹独狼:尝试搭建一个像这样简单的个人网站,不要只是一个孤零零的About页面,去学习Markdown与LaTeX,试着在Blog上记录自己的想法,并订阅自己喜欢的编程类博客。推荐几个供你参考:JoelonSoftware,PeterNorvig,CodingHorror小结以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试「费曼」技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。此外不要局限与上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。ThePragmaticProgrammer就是这样一本程序员入门书,终极书。有人称这本书为代码小全:从DRY到KISS,从做人到做程序员,这本书教给了你一切,你所需的只是遵循书上的指导。后记如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些「复杂」的API,更不会畏惧学习具体的技术,甚至感觉很容易。当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和csdn的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。首先要想学编程,选一门合适的计算机语言就十分重要了,怎么去选择就显得尤为重要了,这要根据自己的兴趣爱好及每个语言的特性来选择,比如说PHP适合做web开发,易学习,易上手,非常流行的一门计算机语言了,我个人比较推荐php语言。java可以做web开发,做安卓app开发也用的是java,在学习程度上上可能比php稍微难上手一点,不过也是没问题的,如果对java感兴趣可以尝试一下。python是目前比较火的一门语言了,比较适合做人工智能领域,另外写网络爬虫类的程序,用python也是非常合适的了,看个人兴趣来选择了。c,c++,c#这些语言就不推荐给了,特别是c#,已经是比较过时的一门语言了,即使学习好了,也不太适合去找工作,c与c++并不是十分适合初学者来学习,因此也是没必要进行考虑了,还有一些更小众的语言,更是没有必要去考虑,因此关于语言的学习就从上面3种语言去选择一门自己所感兴趣的吧!研发搭建环境如果选择好计算机语言,那么接下来就是研发环境的搭建了,因为只有研发环境搭建好了,才可以进行后续的编程工作,比如说PHP,那么就从百度上搜一下如何安装PHP环境,能搜出一些简单的教程,初学者按照教程一步一步来,顶多半天时间就可以把研发环境装好了,如果是java,就需要先安装jdk,进行环境变量的配置等,网上也有相关的教程,也是十分容易的,相信大家只要按照教程来做,都可以很轻易的把研发环境搭建起来的选好视频和书籍,辅助学习。既然是零基础学习,就需要进行系统的学习,而不是到处百度零基础的知识点进行学习。代码练习跟随教程一个一个章节的进行学习,需要注意的一点就是不能只是去看,那样不行,要对每一个章节的知识点要亲自用代码敲一遍,运行一下试试效果才行,这样才能提高自己的动手能力,才开始会觉得有一点生疏,慢慢的就会熟练起来,逐渐会增加编程的兴趣。这个过程就是需要反复的进行练习,大量的代码练习才行。这个过程是5步中最关键的阶段了,重在代码亲自练习,对编程中有的章节不明白的地方,千万不要放过去,可以在网上找一些相关的编程交流群,参加进去,在线上咨询一些过来人,也许就可以轻松帮你解决疑问了,对你的学习十分帮助,并且整个过程也都是免费的。项目实战如果说基础教程都按部就班的都实践过一遍了,那么你就有一定的编程的基本功了,那么自己就可以尝试着做一些小项目,把学到的知识给串起来,进入项目实战阶段,比如说自己设计一个学生管理系统,并把它完成,如果不了解怎么设计,可以去网上搜索。慢慢就有思路了。我也在学习这方面,视频书籍看过不少,最推荐的还是北京尚学堂的学习资料,Java.300集,Python400集,都是很经典的入门基础教程,而且是结合项目学习的,很有意思,干货满满,还都是免费的,推荐你可以去看看,相信可以带你走进变成的世界。从零开始学编程,第一关就是要选择你所要学习的编程语言。面对着琳琅满目的编程语言,初学者常常一筹莫展,拿不定主意,不知该选哪2023-07-08 17:48:363
学习IT技术要从什么方面入手?
学习IT技术要从以下几个方面入手:1.多看书看书不是一扫而过, 编程需要大量实践, 练习也得慢慢过, 别人看技术书快,是因为人家都是科班出身,或者从业很多年。你是从零学, 只能恶补基础,恶补基础的意思是, 你得像科班一样花费大量时间, 而不是跟看小说一样速战速决,那样没用的。人家给你推荐的CSAPP那些书, 对于科班的人当课外书看还得看个1个月, 你如果跟着学,每本书都至少半年。2.多逛IT相关的论坛和社区有些技术是靠经验堆积的,比如整个框架的设计,设计模式的运用。我倒觉得这个能力只要你平时留心,掌握它们只是个时间的问题。而有些技术,是要去实打实钻研的,不看透几本英文原版书,不逛遍几个论坛,你永远不能明白。越是难的东西,越能拉开你跟别人的距离。3.多看大V的文章大V都是过来人,很多你没听说过的问题或者不能解决的难题,他们可能早就遇到过了。现在人人手机不离手,不过有的人是用来学习,有的人却是用来打游戏或者刷剧!4.多上课或者多进社群:现在网上的课有很多很多关于IT技术的,只要你想学,总是会找到相关的课程来学习的。关键就在于你是怎么想的,仅仅是为了业余爱好学习还是为了找一份工作。在社群中除了能学习一些知识以外,还可以跟一些志同道合的朋友相互交流。以上这些经验足以让你入门,如果想系统的学习,是需要专门去学习的!希望能帮助到你!还请及时采纳谢谢!祝你生活愉快!2023-07-08 17:48:443
不同领域的圣经级书籍有哪些?
下面就让我来为大家讲解一下不同领域的圣经级书籍有哪些?希望能帮助到大家。比如说营销领域的《营销管理》科特勒。 现代科学全部从基督教而来。 哥白尼,达尔文,牛顿,弗朗西斯培根,这些被共产主义者奉为反迷信先锋的巨人, 都是虔诚的基督徒。牛顿专门为但以理书写了一本注解。 大学制度也是从教会而来。 现代科学就是从圣经而来。 科学出现的目的不是你老师宣扬的那样,要干掉之前的愚昧和迷信代表,天主教; 在这些伟大科学家眼里,有两本圣经,一本是神亲自启示先知,通过人手记录的新旧约圣经,另一本是神自己一手创造的大自然。 也就是说,很多学科产生的目的就是为了佐证圣经,让人对圣经的理解更深刻。 文学:不用提,圣经对文化影响之深远,文学只是其中之一; 音乐:最伟大的音乐从赞美而来。《你爱永不变》巫启贤 ---上百度搜一下他创作的心路历程,是最近的一个例子; 地质学,考古学:地质考古发现的古生物化石样本,所出现年代的先后秩序,和圣经所启示的造物顺序完全一致;也就是3500年前借着100多岁摩西的手所写的,和现代考古发现完全吻合; 生物学:进化论现在已经被批驳的体无完肤了。物种起源对生物科学的真实贡献在于,给动植物分门别类。各类之间的微变是有的,比如不同种的狗杂交;但不同种类之间的转变是不可能的,在人类历史纪录的几千年里,没有一个文明发现了,狗变成猫,或者马变成猪。这其实佐证了神创论中,“各从其类”这个反复出现的字眼。重要的事说三遍,这个字眼出现n遍,就是在告诉进化论,“类”是创造出来的,不是通过一个东西出来的 这样的学科还有很多 社会学里面就更多了,基本可以分为,不是呼吁人们回到圣经的,就是号召人们反对圣经的。 圣经,成书将近2000年,不改一字,没人能找出一处错误,真正反对潜心研究要推翻圣经的学者,最后都归向圣经。圣经也是现在一切科学的总纲。离开圣经,即使在某领域是专家,对于整个世界的认识也是支离破碎的。 古今中外,好书很多很多,不过,在这中间,可以说,堪称圣经级的书,却并不多。为什么呢?首先,要获得这种认可,必须经历时间的淘洗,因此至少近二三十年里出版的书,是无法入选的,理由倒不是它们一定写得不好,而是说,所谓“圣经级”的书,必须要被至少几代人公认为是名作,而绝不能是一时的流行读物,也不能是因为诸如刷流量之类的原因,而被背后巨大的推手打造的、实际水准并不如其名声的作品。 第二,要成为“圣经级”书籍,一定要是内业内专家公认为是好书的。特别是对一些学术性强的书来说,各国专家对它的基本评价,是一本书成为公认的经典的关键。对于那些文学性比较强的书,虽说可能是青菜萝卜各有所爱,但至少,文学也不是没有基本标准的。一部优秀的文学作品,不一定能成为名著,但一部作品,要成为圣经级的,则一定是经过了无数考验的。 下面按不同题材,逐一罗列各领域的圣经级读物。 历史/历史学: 《伯罗奔尼撒战争史》、《罗马帝国兴亡史》、《历史学的理论与实践》、《第三帝国的兴亡》、《八月炮火》 哲学: 《理想国》、《自然哲学》、《历史哲学》、《尼各马可伦理学 》 经济学: 《国富论》、《资本主义与自由》、《资本主义、社会主义与民主》、《就业、利息和货币通论》、《贫困与饥荒》 广告的或者marketing的,我推荐这本。 虽然书名叫文案的书,但适合大家。 作为一本1988年的老书,是不是过时了?但事实上,大家都在追新技术,新平台的今天,极多人忽视了,甚至完全不懂广告或者说传播的本质。这本书极好得、朴实得阐述了广告的本质,我称之为古典主义的广告书。 书里引经据典得介绍了很多优秀的思考方式和案例,而最可贵的是,这是我看过的唯一一本清楚说明了广告中,每个环节的工作到底承担了什么角色,逻辑清晰严密。相信看完了,就不会有人搞不清策略(planner)们到底是做什么的了。 或许,你会被惊讶到,原来如今管理咨询和MBA们用的很多思考工具,理论工具,都诞生自广告公司。比如,头脑风暴就来自于BBDO的创始人之一。 希望大家都能读读这本书,虽然它翻译的很糟糕。 化学: 《有机化学》 邢其毅 《物理化学》 傅献彩 《结构化学》 周公度 《有机合成:切断法》 沃伦(Stuart Warren) 计算机科学: 《深入理解计算机系统》(csapp),Randal E. Bryant,David R.O Hallaren 著,本书外号就是计算机科学的圣经,理解计算机科学的第一本书。 《计算机程序设计艺术》 Photoshop: 实用、经典、深入首推关文涛的这两本: 《选择的艺术Photoshop CS3图像处理深度剖析》 《选择的艺术-Photoshop CS图层通道深度剖析》 另外还有两本外国人的大作,Dan Margulis写的: 《Photoshop Lab修色圣典》 《Photoshop 修色圣典》 能完全理解这四本书的人可以说对Photoshop的原理和对色彩的理解达到了极高的水平。 张旭狂草《心经》 辛弃疾《诗文杂抄》王守仁《王阳明心学》 泰戈尔《飞鸟集》 萧鼎《诛仙》 《易经》《诗经》 《黄帝内经》《难经》《伤寒杂病论》《神农本草经》 《希波克拉底誓言》 Karunesh《Zen Breakfast》《问道》 阿道夫·希特勒《我的奋斗》 西格蒙德·弗洛伊德《梦的释义》 Pat Dorsey《股市真规则》 索罗斯《金融炼金术》 爱德温·李费佛《股票做手回忆录》 Michael Lewis《说谎者的扑克牌》 巴顿·比格斯《对冲基金风云录》 传说三大死亡禁曲《忏魂曲》《第十三只眼睛》《黑色星期天》 梵蒂冈教皇《忏悔录》2023-07-08 17:48:511
读完c primer plus后有必要再看c与指针吗
当然没有必要啦!无聊可以看看a book on c加强语法学习.编程珠玑可以试读, 不过我更建议看看weiss的DSAACc缺陷和陷阱c语言解惑c语言专家编程想深入理解c细节看看汇编语言是有必要的看看计算机组成原理了解下硬件, 推荐看计算机组成原理与软硬件接口离散数学, 线性代数看看会有意想不到的收获我们的操作都在操作系统层之上, 所以了解下操作系统是有必要的, 推荐看csapp入门级.对算法情有独钟可以考虑看看clrs, 如果自信满满可以挑战taocp毕竟近乎所以算法都选自此书, 并且作者特意写了本具体数学也是非常值得一看的业余时间看看代码大全也是不错的选择如果对代码自身, 以及文本的分析有兴趣建议看看编译原理, 推荐看完整版龙书. 当然如果你真准备和龙决斗, 那么带上盾牌和宝剑是必要的, 盾牌是否坚固来至你对数据结构的掌握程度, 宝剑是否锋利受你对语言的掌握程度的影响, 杀龙赚的经验是让人欣喜的, 受伤也是正常的.2023-07-08 17:49:081
c语言用指针取值比用数组名取值快吗
CSAPP书上讲数组引用a[i]和&(a+i)是等价的,转换成汇编都是先计算第i个数组元素的地址,然后访问这个内存位置,所以C语言指针取值和数组名取值是一样快的!另外在C陷阱与缺陷中,明确提到对于一个数组的引用,咋看上去是对数组下标的运算,实际上是通过指针进行的,即任何一个数组下标的运算都等同于一个对应的指针运算,所以是一样快的。另外看两种实现的汇编指令也可以得到一样的结论。2023-07-08 17:49:183
signal函数设置的信号怎么退出不了
因为你没有设置ctrl+z(SIGTSTP)的信号处理函数。2023-07-08 17:49:242
如何修改MFC单文档的“无标题”,中间的横线,后面的窗口标题
MFC程序的文档类中定义了一个虚函数SetTitle,用于设置窗口标题的前半部分,如果只是要修改“无标题”部分,可以重载文档类的该函数。窗口标题的后半部分可以通过SetWindowText设置,也可以编辑字符串资源中的IDR_MAINFRAME字符串,将第一个/n之前的字符串替换掉即可,而如果你想把“无标题”部分除掉,则必须修该窗口的风格。一、修改前半部分1) 可以重载文档类的虚函数SetTitlevoid CTestDoc::SetTitle(LPCTSTR lpszTitle){CDocument::SetTitle(L"你的标题");}也可以在 CTestDoc::OnNewDocument()中添加SetTitle(L"你的标题");二、修改后半部分1) 修改资源字符串:将资源文件中的IDR_MAINFRAME修改为修改此处/n/nChange/n/n/nChangeTitle.Document/nChange Document资源字符串中各子串的含义可以参考:IDR_MAINFRAME字符串资源中各子串的含义2) 使用框架窗口类的SetWindowText(L"你的标题"):在应用程序类CTestApp::InitInstance()中调用如下语句m_pMainWnd->SetWindowText(L"你的标题");或者在其他地方用AfxGetMainWnd()->SetWindowText(L"你的标题");3) 如果您想除掉标题中间的“-”,可以通过重CFramWnd类的OnUpdateFrameTitle函数,这个函数在VC提供的帮助文件中找不到,必须手工添加virtual void OnUpdateFrameTitle(BOOL NaDa);void CMainFrame::OnUpdateFrameTitle(BOOL NaDa){CString csAppName;csAppName.Format(AFX_IDS_APP_TITLE);SetWindowText(csAppName);}此时显示的结果只有字符串资源AFX_IDS_APP_TITLE所定义的字符串4) 是在CMainFrame的PreCreateWindow函数中修改窗口风格:return CFrameWnd::PreCreateWindow(cs);}使用此方法,窗口的标题只显示IDR_MAINFRAME字符串中第一个/n之前的部分2023-07-08 17:49:311
c++primer翻译的怎么样
c++primer翻译是相当不错的。 c++primer翻译的含义是人民邮电出版社出版的图书。其内容包含丰富的实践经验,对帮助程序员学会c++有很大的帮助作用2023-07-08 17:49:505
刚学C语言 请问ASCII码值为128-255字符型数据转为整型变量时得到的是-128--1的值 怎样算的 谢谢
因为一个char的大小是一个byte即8个bit,一共可以表示2的8次方即256个数字0-255但是char分为signed和unsigned两种形式,即是否有正负之分如果是signed就是有正负号的,在机器码中8位二进制bit就需要占用一个作为区别正负号的标记,分别用1或0表示,那么剩下的7个bit能够表示0-127的数字,由于2的8次方一共是256个数字,可以得到负数范围内有128个数字,即一个signed char能表示从-128-127的数字与之相对的,unsigned char即表示从0-255的值,由于ASCII码没有负值,而且一般的ASCII码只需要使用0-127就足够了,所以剩下的那128个字符就组成了extended ASCII,当然,一般是没有什么作用的,也可以看到这个范围的符号一般都是些稀奇古怪的,但是你将它赋值到这个范围就引起了这个问题虽然定义一个char变量生成的究竟是unsigned char还是signed char和你具体使用的环境有关,但一般的INTEL计算机都是生成signed char,如果你不能确定可以使用limits.h中提供的常量来确定,当然int long 等等也能够用相同方式查看,如果是float的话用float.h查看,具体的可以查询library的说明,程序如下,自己运行看看吧#include <stdio.h>#include <limits.h>main(){int a=CHAR_MIN;int b=CHAR_MAX;printf("%d %d ",a,b); //Print the minimum value and maximum value of data type char}现在我们已经明白了,用8位bit表示的signed char是无法表示超过127的数字的,所以呢,当你赋予变量一个超过127的值的时候,它就会自动变回负值的最小值并向上递加,可以想象成一个圆环,原理在于CPU中只存在加法器,所以如果不能循环,你就没法做减法了,具体的你可以随便买一本微机原理看看,我推荐CSAPP,如果你想要具体研究C语言的话,可以看看C语言圣经K&R,多用用LINUX2023-07-08 17:50:062
高考志愿想学信息安全专业,有哪些大学可以推荐?
关于这个问题,作为学习信息安全的我可以帮你回答。首先,信息安全。信息安全无论是以前还是现在亦或是未来都是最佳选择,安全是互联网生产的第一保障,没有安全的生产环境,会遭受很多损失,所以一般成熟的企业都会在信息安全投入巨大,因此,这个专业的就业面会非常广,在未来一定是个热门的专业。同时,选一个好大学也很重要。就目前来看,清北是全国最好,因此,无论你怎样,高考一定要冲着清北去,它会给你不一样的平台与选择。当然除了清北外,计算机强校也是信息安全好的大学。如:武汉大学,上海交通大学,浙江大学,国防科技大学,北京航空航天大学。这些是属于第一批次的学校,能考尽量考。在第二批次,好的信息安全专业有西安电子科技大学,这个学校是密码学始祖,信安绝对的棒。北京邮电大学,信息安全专业同样强。电子科技大学,华中科技大学,战略支援部队信息工程大学等同时,第三批次的强校有杭州电子科技大学等。两个排名略有偏差,但大体差不多。能考上其中一所都是不错的,如果想学信息安全专业,根据自己的能力来适当选择学校,上述三个批次对应三个分数段,当然,高考分数也不能作为一个专业好坏的评判标准,一个学校的师资力量,底蕴才决定了一切。因此,努力学习,先考好大学,在择好专业。能考上其中一所都是棒棒的。2023-07-08 17:50:226
汇编语言中LEA指令和MOV指令的区别是什么啊?
MOV指令的功能是传送数据,例如MOV AX,[1000H],作用是将1000H作为偏移地址,寻址找到内存单元,将该内存单元中的数据送至AX;LEA指令的功能是取偏移地址,例如LEA AX,[1000H],作用是将源操作数[1000H]的偏移地址1000H送至AX。理解时,可直接将[ ]去掉,等同于MOV AX,1000H。再如:LEA BX,[AX],等同于MOV BX,AX;LEA BX,TABLE 等同于 MOV BX,OFFSET TABLE。但有时不能直接使用MOV代替:比如:LEA AX,[SI+6] 不能直接替换成:MOV AX,SI+6;但可替换为:MOV AX,SIADD AX,6两步完成。2023-07-08 17:52:477
读书怎么才能更快
沙发上堆了不少书,这些都是计划要看完的。有的要精读,有的要粗读。精读和精读消耗的时间相差巨大。大抵上,读书想要更快,速度就在精读和粗读的速度差上了。当然,排除一种方法,就是你一顿瞎翻,啥也没记住。李笑来先生曾经说过,读书提速的方法,根本没有秘诀。无外乎多读,多读你的速度就快了。你可能问了,为啥啊。有人可能还听说过一种叫"快速阅读"的技术。练习以后,能一行一行地往下看,不是一个字一个字的看。大致上,跟竖着看书差不多。我小学的时候学过,貌似还有点用。英语阅读的时候,我能用别人一半的时间完成阅读和答题--当然准确率并不怎么出色。不过,即使我降速到原来的一半,准确率也就还是那样。这样看来,"快速阅读"似乎还有点用?这跟李笑来先生提到的没有秘诀是否矛盾呢?其实,不矛盾,都是一回事。一者,长时间地阅读,会自然地形成很多技巧,这些技术就跟走路多了的人会走路一样:把文字按行或按词组划分,不要每个字都读,跳着读,不要在心里出声,啥的。要想阅读超过人类的正常语速,还是挺容易的,只要读足够的量。所以,一般没有特殊训练,也容易达到。不过,当我们读教科书、经典著作,或者我们称为晦涩难懂的那些书的时候,问题就来了。这个时候快速阅读完全起到了相反的作用。比如第一次读《C程序设计语言》,比如读《纯粹理性批判》,比如读你明天要考试的那科教材。一目十行,合上就忘,甚至当时也不知道作者在说些啥。所以,计算机领域有一种说法,他们希望发明一种"慢速阅读"方法,从而能字斟句酌地一点点扣。这种时候最好的读书法是 不仅"读",而且"做"。正如CSAPP中说的,学习系统的最好方法,就是 "do system"。当你沉浸其中,不看书实现一遍那些代码的时候,你就真正掌握了。有的似乎把这叫做在"内化"。扮演老师,给别人讲明白;找个实例按书里的路子剖析一遍……总之,经历过的事情,会让你刻骨不忘。这就是为什么讲起近三十几年的历史,三十几岁的人往往连书都不用翻,因为他们身在其中。大量阅读,会自然形成阅读技巧,因此,会读得快。但大量阅读的作用,不止于此。其二,大量阅读会形成知识结构。这样,不仅技术使你读得快,知识结构还会使你越读越快。我面对那么书,也常常挠头,叹"吾生也有涯而知也无涯",悲夫。不过,到真正读的时候发现,有的书读起来比想像地快得多。比如我用一个晚上读完了今何在先生的《我的征途是星辰大海》,用大半个晚上读了半本二月河先生的《九王夺嫡》。这种速度和某些速读牛人比起来并不算什么,不过和我其他的记录相比就令我惊叹了。我读SICP的时候,有过2个小时1页的时候,读康德的时候,有好几天断断续续没翻过去一页的时候。和这些比起来,一晚上半本一本的速度就很快了。一个原因是,这些书的信息含量是不同的。信息论告诉我们:信息,是对无序的度量,只有当可能性未知时,即事件你还不知道结果的时候,告诉你的,才是信息。你明知道的事情,我再说一遍,对你而言是零信息。那种对话一般表达情感,或者是仪式,比如那句古老的"你吃了吗"或者"how are you"。其实说话人对你吃了没有或者好不好一点也不感兴趣。小说和电影,如果只是为了欣赏,而非研究学习,那读起来就可以酣畅淋漓。按Johan Lilius教授对 the Big Bang的评价,把脑子拿走一些看,效果会更好。按《破产姐妹》里胖姑娘的说法,对着电影大喊大叫,那正是享受电影。这样的时间,过得很快,其实也真的不多。一场电影1.5小时,可能康德还没有读完半页。另一种读起来快的书,就是里面的知识全是你知道的。我们翻金庸原版武侠的时候,感觉大概就是这样。谁什么时候要死了,什么时候要难过,后面还有啥阴谋,咱们全知道。只是为了再感动一次。可以几秒钟就翻过一页,如果不细品文字的话。还有精通一种语言的人,再学习其他的语言,看教材的时候,速度也非常快。因为他的头脑中,不管什么语言,都应该有变量声明、类型、结构体、数组、对象、判断、循环、函数、库。一般都这样,内容不变,只是语法上有差别。除非,你遇到了颠覆你人生观世界观价值观的东西。比如,LISP有那么一大堆括号不让人头疼,很多初学者的第一个问题是,这家伙没有循环怎么迭代,然后可能又遇到个问题,函数怎么可以没有名字,可能还会有人疑惑变量怎么可能没有类型。再比如,PYTHON初学者可能对结束没有";"还没有多大意见,缩进是语法的一部分,很多人好几年适应不过来。所有这些,lisp,python,康德罗素,他们让我们不舒服,让我们阅读的速度大大降低,原因在于--他们正拓展我们的知识结构。探索新宇宙,开疆拓土,历来如此。大部分小学生看你现在要考试的教材,速度肯定比你慢上百倍。他的阅读速度,甚至认字和组词的能力,都阻碍他的理解。更重要的,你已经具备了这本教材的知识结构。所以,大量阅读建立的知识结构支持我们更快的阅读,因为它大大减少了书本中我们要接受的 (未知的) 信息数量,那些都是我们已经知道的了。而且,随着你阅读数量的增加,知识结构的完善,你的阅读会越来越快。因为,你的知识结构越完善,在下一本书里,你未知的就越少。有人可能提到"知道的越多,未知的越多",那是针对知识总量而言的,而不是指特定的某一本。特定的一本书,你知道的越多,读起来铁定越快。除非,你是在研究,而别人只是在浏览。再回到我沙发上的那些书,精读和粗读。凡是新知识结构,都只能精读,这是没有别的办法的事情;娱乐的、补允细节知识的、学习别人表述方法的,那些读起来就快得多了。不是的,你不是想多读书,而是想利用更少的时间读书。这个问题容易答多了:只有现在花时间多读书,以后才能少花时间。--------------------2023-07-08 17:53:032
如何修改MFC窗口标题
MFC程序的文档类中定义了一个虚函数SetTitle,用于设置窗口标题的前半部分,如果只是要修改“无标题”部分,可以重载文档类的该函数。窗口标题的后半部分可以通过SetWindowText设置,也可以编辑字符串资源中的IDR_MAINFRAME字符串,将第一个/n之前的字符串替换掉即可,而如果你想把“无标题”部分除掉,则必须修该窗口的风格。一、修改前半部分1) 可以重载文档类的虚函数SetTitlevoid CTestDoc::SetTitle(LPCTSTR lpszTitle){CDocument::SetTitle(L"你的标题");}也可以在 CTestDoc::OnNewDocument()中添加SetTitle(L"你的标题");二、修改后半部分1) 修改资源字符串:将资源文件中的IDR_MAINFRAME修改为修改此处/n/nChange/n/n/nChangeTitle.Document/nChange Document资源字符串中各子串的含义可以参考:IDR_MAINFRAME字符串资源中各子串的含义2) 使用框架窗口类的SetWindowText(L"你的标题"):在应用程序类CTestApp::InitInstance()中调用如下语句m_pMainWnd->SetWindowText(L"你的标题");或者在其他地方用AfxGetMainWnd()->SetWindowText(L"你的标题");3) 如果您想除掉标题中间的“-”,可以通过重CFramWnd类的OnUpdateFrameTitle函数,这个函数在VC提供的帮助文件中找不到,必须手工添加virtual void OnUpdateFrameTitle(BOOL NaDa);void CMainFrame::OnUpdateFrameTitle(BOOL NaDa){CString csAppName;csAppName.Format(AFX_IDS_APP_TITLE);SetWindowText(csAppName);}此时显示的结果只有字符串资源AFX_IDS_APP_TITLE所定义的字符串4) 是在CMainFrame的PreCreateWindow函数中修改窗口风格:return CFrameWnd::PreCreateWindow(cs);}使用此方法,窗口的标题只显示IDR_MAINFRAME字符串中第一个/n之前的部分2023-07-08 17:53:121