缘来我们在这里

乱世天狼的博客


  • 首页

  • 归档

mac下执行定时任务之动态生成git分支

发表于 2018-05-08

问题

我在 5 月 7 号创建了一个 qa/20180509 分支,然而 5 月 9 号并不是一个发版日(我们的发版日是二,四,日)。最后重新从 master 拉了一个 qa/20180508 解决问题,这样会导致其他同学要把自己代码重新合到新的 qa/20180508 分支,这,很有问题。如果项目开发人员很多,这样就要浪费掉很多的沟通成本。解决问题有两种,一是细心一点,发版日的前一个工作日早上上班立马创建一个正确版本的分支。二是用程序解决这个问题,让一切自动化的执行。

分析问题

我选择第二个方案,因为我粗心,而且懒。。。

一、创建 qa 分支的逻辑

创建 qa 分支的目的是为了测试用于发布的代码。如果提前二个版本日创建,例如周二创建周四的 qa 分支,这会导致周二的测试代码同步到周四,但周二大部分测试代码周二就会被发掉,也就是说合并到 master。而且 master 也会有一些 hotfix,这些都不会同步到周四的测试分支上,这很僵硬。所以最好就是提前一个版本创建。也就是说最好周三早上创建一个从 master 出来的干净的测试分支。

二、自动化方式的逻辑

那么怎么通过自动化解决呢?如果开机启动,执行一次,那么 mac 如果不关机,下次就会失效,所以最好是连上公司 wifi 的那一刻,执行自动化的脚本。还有一种简单粗暴的办法是,每隔一段时间执行一次,我这里暂时使用了这种粗暴的方法,每隔一个小时执行一次脚本。因为检测公司 wifi 这个还要细探。

三、自动化脚本的逻辑

脚本使用的是 shell 脚本,用其他脚本最后还要使用 shell 调用,感觉更麻烦些,所以直接采用 shell 脚本

  1. 判断当前是不是发版日
  2. 如果是,判断下个版本的 qa 分支有没有远端分支;如果否,退出
  3. 如果是,退出;如果否,判断下个版本的 qa 分支有没有本地分支
  4. 如果是,直接推到远端(逻辑不严谨,但情况不多,有的话是人为的)。如果否,切换到 master,拉取最新代码,创建本地分支,推送远端。

四、自动化工具

利用 Launchd 定制 Mac 启动任务

实现

cd ~/Library/LaunchAgents

touch com.baidi.plist

launchctl load com.baidi.plist

launchctl start com.baidi.plist

plist 内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.baidi.wificheck</string>
<key>Program</key>
<string>/Users/xxc/pdd/study/auto/run.sh</string>
<key>StartInterval</key>
<integer>3600</integer>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

run.sh 内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
editionDay(){
for DAY in 2 4 0
do
WEEK_DAY=$(date +%w)
if test $WEEK_DAY -eq $DAY
then
return 1
fi
done
return 0
}
echo "-----函数开始执行-----"
WEEK_DAY=$(date +%w)
editionDay
if test $? = 0
then
EDITION=''
if test $WEEK_DAY -eq 5
then
EDITION=$(date -v +2d +%Y%m%d)
else
EDITION=$(date -v +1d +%Y%m%d)
fi
QABRANCH='qa/'$EDITION
cd /Users/xxc/pdd/mobile-merchant
RESULT=$(git branch -r | grep $QABRANCH)
RESULT2=$(git branch | grep $QABRANCH)
if [ ! $RESULT ]
then
if [ ! $RESULT2 ]
then
git checkout master
git pull
git checkout -b $QABRANCH
git push --set-upstream origin $QABRANCH
else
git checkout master
git pull
git checkout $QABRANCH
git rebase master
git push --set-upstream origin $QABRANCH
fi
else
echo '远端分支已存在'
fi
fi
echo "-----函数执行完毕-----"

其他

改进一下可以自动生成更多版本控制的分支,比如 dev or release。自动化可以做很多事情, 比如:定时提醒自己去美餐网点餐。想要做的可以搞起来哦。

mac安装win7虚拟机

发表于 2018-05-01

安装VMware Fusion 8

(VMware Fusion 8地址)[https://www.waitsun.com/vmware-fusion-8-1.html]

(win7下载地址)[https://msdn.itellyou.cn/]

(安装教程)[https://blog.csdn.net/github_37626080/article/details/57418102]

问题解决

(VMware Fusion 8 Pro 序列号)[http://www.tianwaihome.com/2015/08/vmware-fusion-8-pro-key.html]

(VMware Fusion Pro 8 for Mac 启动出现“内部错误” 解决方案)[https://blog.csdn.net/form_/article/details/56498639]

分辨率和共享

(将 Mac 中的文件夹共享到虚拟机 (2074940))[https://blog.csdn.net/yangcs2009/article/details/43566861]

分辨率设置:设置->显示器->勾掉使用retina屏显示

webpack由来和原理

发表于 2018-04-29

引子

孟子见梁惠王。王曰:“叟不远千里而来,亦将有以利吾国乎?”

孟子对曰:“王何必曰利?亦有仁义而已矣。王曰‘何以利吾国’?大夫曰‘何以利吾家’?士庶人曰‘何以利吾身’?上下交征利而国危矣。万乘之国弑其君者,必千乘之家;千乘之国弑其君者,必百乘之家。万取千焉,千取百焉,不为不多矣。苟为后义而先利,不夺不餍。未有仁而遗其亲者也,未有义而后其君者也。王亦曰仁义而已矣,何必曰利?

注:不全对,人有不同,位有不同,利有不同。利弊同存,费思量矣。但是必须要有规则,规则和框架是用来约束非正常定位的机制的,最和谐的结果是根据人的能力和品德,决定他的地位。

– 《孟子 梁惠王章句上·第一节》

什么是 Webpack

Webpack 是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

为什么重复造轮子

市面上已经存在的模块管理和打包工具并不适合大型的项目,尤其单页面 Web 应用程序。最紧迫的原因是如何在一个大规模的代码库中,维护各种模块资源的分割和存放,维护它们之间的依赖关系,并且无缝的将它们整合到一起生成适合浏览器端请求加载的静态资源。

这些已有的模块化工具并不能很好的完成如下的目标:

  • 将依赖树拆分成按需加载的块
  • 初始化加载的耗时尽量少
  • 各种静态资源都可以视作模块
  • 将第三方库整合成模块的能力
  • 可以自定义打包逻辑的能力
  • 适合大项目,无论是单页还是多页的 Web 应用

Webpack 的特点

代码拆分

Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。

Loader

Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。

智能解析

Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require(“./templates/“ + name + “.jade”)。

插件系统

Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。

快速运行

Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。

js模块化

发表于 2018-04-29

引子

诗曰:“衣锦尚絅”。恶其文之著也。故君子之道,闇然而日章;小人之道,的然而日亡。君子之道,淡而不厌、简而文、温而理。知远之近,知风之自,知微之显。可与入德矣。

诗云:“潜虽伏矣,亦孔之昭。“ 故君子内省不疚,无恶于志。君子之所不可及者,其唯人之所不见乎。

诗云:“相在尔室,尚不愧于屋漏。“ 故君子不动而敬,不言而信。

诗曰:“奏假无言,时靡有争。“ 故君子不赏而民劝,不怒而民威于鈇钺。

诗曰:“不显惟德,百辟其刑之。“ 是故君子笃恭而天下平。

诗云:“予怀明德,不大声以色。“ 子曰:“声色之于以化民,末也。“

诗曰:“德輶如毛。“ 毛犹有伦。 “上天之载,无声无臭。“ 至矣。

–《中庸》

CommonJS

module对象

Node内部提供一个Module构建函数。所有模块都是Module的实例。

module.exports属性

module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。

exports变量

为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。

1
var exports = module.exports;

造成的结果是,在对外输出模块接口时,可以向exports对象添加方法。

注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。

1
exports = function(x) {console.log(x)};

上面这样的写法是无效的,因为exports不再指向module.exports了。

下面的写法也是无效的。

1
2
3
4
5
exports.hello = function() {
return 'hello';
};

module.exports = 'Hello world';

优点:

  • 服务器端模块便于重用
  • NPM 中已经有将近20万个可以使用模块包
  • 简单并容易使用

缺点:

  • 同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的
  • 不能非阻塞的并行加载多个模块

实现:

  • 服务器端的 Node.js
  • Browserify,浏览器端的 CommonJS 实现,可以使用 NPM 的模块,但是编译打包后的文件体积可能很大
  • modules-webmake,类似Browserify,还不如 Browserify 灵活
  • wreq,Browserify 的前身

AMD

Asynchronous Module Definition 规范其实只有一个主要接口 define(id?, dependencies?, factory),它要在声明模块的时候指定所有的依赖 dependencies,并且还要当做形参传到 factory 中,对于依赖的模块提前执行,依赖前置。

1
2
3
4
define("module", ["dep1", "dep2"], function(d1, d2) {
return someExportedValue;
});
require(["module", "../file"], function(module, file) { /* ... */ });

优点:

  • 适合在浏览器环境中异步加载模块
  • 可以并行加载多个模块

缺点:

  • 提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅
  • 不符合通用的模块化思维方式,是一种妥协的实现

实现:

  • RequireJS
  • curl

CMD

Common Module Definition 规范和 AMD 很相似,尽量保持简单,并与 CommonJS 和 Node.js 的 Modules 规范保持了很大的兼容性。

1
2
3
4
5
6
define(function(require, exports, module) {
var $ = require('jquery');
var Spinning = require('./spinning');
exports.doSomething = ...
module.exports = ...
})

优点:

  • 依赖就近,延迟执行
  • 可以很容易在 Node.js 中运行

缺点:

  • 依赖 SPM 打包,模块的加载逻辑偏重

实现:

  • Sea.js
  • coolie

UMD

Universal Module Definition 规范类似于兼容 CommonJS 和 AMD 的语法糖,是模块定义的跨平台解决方案。

ES6 模块

ECMAScript6 标准增加了 JavaScript 语言层面的模块体系定义。ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。

1
2
3
import "jquery";
export function doStuff() {}
module "localModule" {}

优点:

  • 容易进行静态分析
  • 面向未来的 ECMAScript 标准

缺点:

  • 原生浏览器端还没有实现该标准
  • 全新的命令字,新版的 Node.js才支持

实现:

  • Babel

期望的模块系统

可以兼容多种模块风格,尽量可以利用已有的代码,不仅仅只是 JavaScript 模块化,还有 CSS、图片、字体等资源也需要模块化。

前端模块加载

前端模块要在客户端中执行,所以他们需要增量加载到浏览器中。

模块的加载和传输,我们首先能想到两种极端的方式,一种是每个模块文件都单独请求,另一种是把所有模块打包成一个文件然后只请求一次。显而易见,每个模块都发起单独的请求造成了请求次数过多,导致应用启动速度慢;一次请求加载所有模块导致流量浪费、初始化过程慢。这两种方式都不是好的解决方案,它们过于简单粗暴。

分块传输,按需进行懒加载,在实际用到某些模块的时候再增量更新,才是较为合理的模块加载方案。

要实现模块的按需加载,就需要一个对整个代码库中的模块进行静态分析、编译打包的过程。

所有资源都是模块

在上面的分析过程中,我们提到的模块仅仅是指JavaScript模块文件。然而,在前端开发过程中还涉及到样式、图片、字体、HTML 模板等等众多的资源。这些资源还会以各种方言的形式存在,比如 coffeescript、 less、 sass、众多的模板库、多语言系统(i18n)等等。

如果他们都可以视作模块,并且都可以通过require的方式来加载,将带来优雅的开发体验,比如:

1
2
3
4
require("./style.css");
require("./style.less");
require("./template.jade");
require("./image.png");

那么如何做到让 require 能加载各种资源呢?

静态分析

在编译的时候,要对整个代码进行静态分析,分析出各个模块的类型和它们依赖关系,然后将不同类型的模块提交给适配的加载器来处理。比如一个用 LESS 写的样式模块,可以先用 LESS 加载器将它转成一个CSS 模块,在通过 CSS 模块把他插入到页面的

杂

发表于 2018-04-03

linux引用文件夹区分大小写,mac不区分
node-sass直接关联node版本号

java学习

发表于 2018-02-28

引子

唯天下至诚,为能经纶天下之大经,立天下之大本,知天地之化育。夫焉有所倚?

肫肫其仁!渊渊其渊!浩浩其天!

苟不固聪明圣知,达天德者,其孰能知之?

–《中庸》

开发项目前的准备

  1. 了解客户真实需求
  2. 需求分析
  3. 功能分析
  4. 绘制用例图(uml)
  5. 绘制系统流程图

产品计划

发表于 2018-02-27

引子

唯天下至圣,为能聪、明、睿、知,足以有临也;宽、裕、温、柔,足以有容也;发、强、刚、毅,足以有执也;齐、庄、中、正,足以有敬也;纹、理、密、察,足以有别也。

溥博,渊泉,而时出之。

溥博如天;渊泉如渊。见而民莫不敬;言而民莫不行;行而民莫不悦。

是以声名洋溢乎中国,施及蛮貊。舟车所至,人力所通,天之所覆,地之所载,日月所照,霜露所队;凡有血气者莫不尊亲。故曰:‘配天’

– 《中庸》

简微商城

解决的问题:帮助商家更方便的接订单!!!

痛点:商家有东西需要推广,手工接订单很累!!!

卖家端:支持上传商品,sku等,支持查看订单,标记发货

买家端:支持下单,购买,管理收货地址

创建一个平台,关键是对于卖家足够简单,完全免费,每个人都可以成为卖家。

买家可以查看最近下的单,可以管理自己的收获地址。舍弃购物车模式,支付之后形成订单。

第一步要点,简单粗暴好用,每个人可以比较省心的卖东西!

点评:这个是重点!

饭店点餐小程序

功能点:

用户可以选择饭店,选择菜品,可以邀请人加入,可以设置加入时间。用户可以自建饭店,自己输入菜品,也可选择已有饭店。

饭店:提供菜品,接入订单,拒绝订单。后期接入支付

点评:实用性强,最开始做一个用户版的即可。后期可拓展性还是挺强的。

自我学习发展用的小程序

功能:形式开放自由,只有基本的组件,时间组件,提醒组件。提醒事件排行。

点评:不是特别靠谱,没啥竞争力,初始的想法是提醒自己该做什么。这个最次,基本没啥实用价值。

人人都是卖家,人人都是买家,区域自治

这个目标比较庞大,通过互联网促进实际的社交活动,以实际可信的真实社交取代网络上虚拟的社交。

js随记

发表于 2018-02-25

元素大小

偏移量

  • offsetHight: 元素在垂直方向上占用的空间大小,以像素计
  • offsetWidth: 元素在水平方向上占用的空间大小,以像素计
  • offsetLeft: 元素的左外边框到包含元素的左内边框的像素距离
  • offsetTop: 元素的上外边框到包含元素的上内边框的像素距离

客户区大小:元素内容和其内边距所占空间大小

  • clientWidth: 元素内容区域宽度加上左右内边距宽度
  • clientHeight: 元素内容区高度加上上下内边距高度

滚动大小:包含滚动内容的元素大小

  • scrollHeight: 没有滚动条的情况下,元素内容的总高度
  • scrollWidth: 没有滚动条的情况下,元素内容的总宽度
  • scrollLeft: 被隐藏在内容区域左侧的像素数,通过设置这个属性可以改变元素的滚动位置
  • scrollTop: 被隐藏在内容区域上方的像素数,通过设置这个属性可以改变元素的滚动位置

新年计划之狗年

发表于 2018-02-23

引子

仲尼祖述尧舜,宪章文武。上律天时,下袭水土。

辟如天地之无不持载,无不覆帱。辟如四时之错行。如日月之代明。

万物并育而不相害。道并行而不相悖。小德川流;大德敦化。此天地之所以为大也。

– 《中庸》

关于成功感受

成功分为两种,一种是内视的成功,一种是外视的成功。换句话说,第一种是自己认为自己是成功的,第二种是别人认为自己是成功的。

内视的成功是一种满足感,根本源于达到自己对自己的心理预期。外视的成功是得到大家的尊敬,认可。

而外视的成功往往源于内视的成功,并给于正反馈。

我对自己心理预期是,能够将自己的天赋发挥出来,不管是哪方面的,音乐,绘画,舞蹈,物理,算术,编程,政治,逻辑,社会,生物等等。但是人生时间是及其有限的,在天赋一般的情况下,在任何一个方面取得成就都不是一蹴而就的。

有两种模式一直是相悖的,当然任何事物都有其两面性。一种是求全,不求精。一种是求精,不求全。历史证明,求精不求全的好处是明显优于求全不求精的。

任何一门学问都可以是无止境的,然而去做到精深的地步都是需要大量的必要的训练的,一般的天赋是很难做到精通数门的。像我这种中等偏上的资材,特别需要注意!精通一门远远要优于门门通,门门稀松。

认识和剖析自己

智力-中等偏上的资材

智商在130左右,忝列前10%的行列。但是于我弊大于利。成长环境非常普通,大多数人都是平庸的,求学过程中往往喜欢走捷径,忽略踏实努力的重要性。走捷径同时会带来的一个问题就是懒,懒于思考,往往得到一个解答就直接给出来,不去进行严密的检验和拓展的思考。

情商与性格-下等

情商可谓及其低,通常不会注意别人感受,只注重自己舒服。性格上因为上一点养成的急躁,自负,粗心等缺点。成长环境的问题又会导致自卑,拖延等缺点。

精力-下等

并不是一个精力充沛的人,常常会感到疲倦

生活-下等

自由主义泛滥,这里同样有两种模式,一种是按照计划去做事,一种是散漫自在。前者如果严格执行,会限制人的发散思维能力,限制人的发展。后者会把人废掉。我属于后者

心态-下等

总是摆不正自己的位置,不管是由于什么原因,自己目前所处的地位,所拿到的薪水,所得到的肯定,所得到的成就都是应该的。现在通常有心比天高,命比纸薄的感觉

往前的道路与计划

于当今的状况,似乎是一团糟。但是不要灰心和丧气,其实成功远远没有想象的难。换个角度,成功其实非常简单。认真的做一件事即可成功!对,就是很简单。大部分人是不愿意做出改变的,只是日复一日地重复,然后环境形成的性格就左右着一生的命运。

但,只要作出改变,形成良好的正反馈机制。成功其实并不远。

智力上,增加耐心和细致,前者是连续思考的能力,用各种方法去找到答案或者途径;后者是事后的检验和拓展思考,总结经验或者拓展运用。

情商上,开口之前应该做一下计较,别人是否会感到不快,环境和场合是什么,该不该说等。人性其实说难难,说容易容易,人们都喜欢真诚的赞美,不喜欢任何形式的批评。所以要指责别人的时候一定要想好这样会不会对别人产生伤害,有没有更好的方法,是不是可以借这个机会赢得一个朋友而不是多一个敌人?性格上的自卑已经基本上被我用‘自负’所掩盖掉了,但是还是解决的不够好,正确的做法是,对于别人的恩惠,铭记于心,有感恩的心态。当别人言论让自己不爽的时候,如果没有更好的方法,可以自嘲一番,能够自嘲的人一定是有着非常健康的自信的人。还有,如果感到烦的时候,感到不爽的时候,可不可以尝试微笑面对。
因为情商上问题实在比较严重,所以这些特别重要

生活上,应该有一些简单的规划,譬如,工作时间,把所有精力投入到和工作相关的东西上,认真仔细完成每一项工作。但是业余时间应该致力于提升自己,完成自己的学习计划。养成良好的生物钟,同时每天留给自己一些自由的时间来总结和随意发散。

心态上,接受自己目前的状态,然后去改变自己,勇于接受他人的质疑,但是同时永远保留着对于自身的公正评价和认知,不卑不亢,温润而有力量。温煦如春风,坚强似精铁,外圆内方。

一命二运三风水,四修阴德五读书。改变命运并不是一个很简单的事情,相当于代际间群体间维度的进化,需要个体通过自己的努力达成,然而幸运的是,人乃万物之灵,可以成熟到通过学习和踏实的执行,一点点让既定的命运之轮一点点偏移轨迹。

具体的计划和小目标

认证方面:考上数据库工程师和系统架构师

工作上:形成api自动生成的闭环工具,参考陈冶的工具,完成一个功能完善的订餐浏览器app

其他学习:以js语言为主,目标是掌握react-native制作app的技术,能够娴熟的制作移动端自适应网站,学会使用nodejs构建后端架构。

看似任务很多很重,但是如果一直不断努力,不松懈,这些任务都会一个个被征服。

加油,张雁峰!

远景

打工永远只能是权宜之计,因为穷的无奈选择。远景是要形成自己的一份事业。

有这样几种选择,一是拥有过硬的技术,当技术leader,这样虽然赚钱不少,但是时间依然不自由,而且没有安全感。二,拥有技术的前提下,成为自由职业者,不断寻找商机和转型中介。三,使用自己的资金和人脉创业,最终达成自己想要的区域自治的目标。

  1. 打工,同时习得过硬的技术,为下一个阶段做准备技术和资金;此阶段投资只求稳健,不求高收益。(2年)
  2. 提供技术服务,寻找商机,转换为中介,利用人脉赚钱。(1年)
  3. 使用自己的部分资金创业;部分资金投资(一直)

前端技术方面:

  1. 前端技术总结并熟练掌握,手机端的开发模式,移动端的开发模式
  2. 使用服务端渲染的技术
  3. 使用reactNative构建app

业务方面:

  1. 做一个微商城
  2. 做一个社区

今后从实用角度出发,技术为实用服务
技术方面求全责备是很耗费时间和精力的,目的是创业,则必须考虑实用行!!!

计算机组成原理

发表于 2018-02-07

引子

王天下有三重焉,其寡过矣乎!

上焉者虽善,无征。无征,不信。不信,民弗从。下焉者虽善,不尊。不尊,不信。不信,民弗从。

故君子之道,本诸民,徵诸庶民。考诸三王而缪,建诸天地而不悖。质诸鬼神而无疑。百世以俟圣人而不惑。

质鬼神而无疑,知天也。百世以俟圣人而不惑,知人也。

是故君子动而世为天下道,行而世为天下法,言而世为天下则。远之,则有望;近之,则不厌。

诗曰:在彼无恶,在此无射;庶几夙夜,以永终誉。君子未有不如此,而蚤有誉于天下者也。

–《中庸》

计算机系统概论

计算机系统简介

计算机 = 硬件 + 软件

  1. 由硬件直接执行微指令,微程序机器$M_0$,微指令系统
  2. 直接执行机器语言的机器称为实际机器$M_1$,最底层$M_1$,机器语言机器
  3. 用机器语言解释操作系统,虚拟机$M_2$,操作系统机器
  4. 具有翻译功能的汇编程序的计算机称为$M_2$,虚拟机$M_3$,汇编语言机器
  5. 将高级语言先翻译成汇编语言程序,再在$M_2$、$M_1$上执行,虚拟机$M_4$,高级语言机器

20世纪60年代出现了各种面向问题的高级语言:FORTRAN,BASIC,PASCAL,C

翻译程序有两种:编译程序,解释程序

把软件永恒地存于只读存储器中,称为固件

计算机体系结构:偏向于抽象,和高级,是指封装后的使用特性。

计算机组成:实现特性的底层技术,偏向于具体,和底层。

1945年,数学家冯·诺伊曼(von Neumann)在研究EDVAC机时提出了‘存储程序’的概念,以此概念为基础的各类计算机通称为冯·诺伊曼机。特点如下:

  • 计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成
  • 指令和数据以同等地位存放于存储器内,并可按地址寻访
  • 指令和数据均用二进制表示
  • 指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数在存储器中的位置
  • 指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下,可根据运算结果或根据设定的条件改变执行顺序。
  • 机器以运算器为中心,输入输出设备与存储器间的数据传送通过运算器完成

典型计算机各部件功能:

  • 运算器用来完成算数运算和逻辑运算,并将运算的中间结果暂存在运算器内
  • 存储器用来存放数据和程序
  • 控制器用来控制、指挥程序和数据的输入、运行以及处理运算结果
  • 输入设备用来将人们熟悉的信息形式转换为机器能识别的信息形式,常见的有键盘、鼠标等
  • 输出设备可将机器运算结果转换为人们熟悉的信息形式,如打印机输出、显示器输出等。

大规模集成电路制作工艺出现后,运算器和控制器往往集成在同一芯片上,统称为CPU(Central Processing Unit)。输入和输出设备简称为I/O设备

这样,现代计算机可认为由三大部分组成:CPU、I/O设备及主存储器(Main Memory)。CPU和主存储器合称为主机,I/O设备又可称为外部设备。

算数逻辑单元(Arithmetic Logic Unit, ALU)简称算逻部件,用来完成算数逻辑运算。控制单元(Control Unit, CU)用来解释存储器中的指令,并发出各种操作命令来执行指令。ALU和CU是CPU的核心部件。

I/O设备也受CU控制,用来完成相应的输入、输出操作

计算机有条不紊的工作都是在控制器统一指挥下完成的

用计算机解决一个实际问题通常包括两个步骤:

  1. 上机前的准备
    1. 建立数学模型
    2. 确定计算方法
    3. 编制解题程序
  2. 计算机的工作过程
    1. 主存储器
    2. 运算器
    3. 控制器
    4. I/O

计算机主要技术指标

  1. 机器字长
  2. 存储容量
  3. 运算速度

计算机的发展及应用

ENIAC 1943年开始批准制造,1946年交付使用

  1. 第一代电子管计算机:1946
  2. 第二代晶体管计算机:1964
  3. 第三代集成电路计算机:1964 System/360

集成电路的影响是革命性的,Moore定律:微芯片上集成的晶体管数目每三年翻两番。

计算机设计者必须不断平衡处理器、主存、I/O设备和互连结构之间的数据吞吐率和数据处理的需要,使计算机性能越来越好。

21世纪初的眼光来看,微处理器的发展重点将会是以下这几个方面:

  1. 进一步提高复杂度来提高处理器性能
  2. 通过线程/进程级并行性的开发提高处理器的性能
  3. 将存储器集成到处理芯片内来提高处理器性能
  4. 发展嵌入式处理器

软件发展的特点

  1. 开发周期长
  2. 制作成本昂贵
  3. 检测软件产品质量的特殊性

软件是程序以及开发、使用和维护程序需要的所有文档

软件的应用

  1. 科学计算
  2. 数据处理
  3. 工业控制和实时控制
  4. 网络技术的应用
1234…7

乱世天狼

乱世天狼 | 前端 | html | css | html5 | css3 | react | redux | webpack | 哲学 | 精神 | 生活

67 日志
48 标签
© 2020 乱世天狼
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4