裸奔已经可以老婆满足绿帽需求小说需求了,那么为什么还要OS

您当前的位置:&>&&>&&>&
裸奔已经可以满足需求了,那么为什么还要OS?
为什么要裸奔?
理由1:裸奔已经可以满足需求了,那么为什么还要OS?
理由2:os很高大上,但是能被hold住么?
以上两点差不多就OK了。
一般说,单片机,就是搞点简单的东西。简单不是贬义,乔布斯总说自己要做最简单易用的作品,所以说我们遵从简单的设计原则,是没有问题的了。
那么如何裸奔呢?
看到21IC网站很多所谓大牛给出了所谓的架构,感觉高大山的架构,在我看来都是差的一塌糊涂,纯属照猫画虎,形式主义罢了。
最经典而完美的架构就是
while(1) {
INT J = K;
就是前后台 的架构。当然这样说放到论坛里面肯定被喷。但这里没人喷。所以可以胡说八道了。
好的架构一定是隔离,大家互不干涉。说起来简单,做起来不易。如何做到互不干涉,有些是一定要有交叉了。比如定时器。首先提到定时器,因为太太重要了。基本山搞懂了定时器,就搞定了架构的很大一部分。看看哪些PLC的定时器的涉及,猜猜他们是怎么实现的。比如你可以实现这样一个定时器
if (timeup(n ms)) {
//do something
如果实现了这样一个函数,在各个所谓的任务中都用这个函数。基本上架构就很清晰了。
那么对于串口发送这种需要耗时的功能?咋办?如果有DMA,那么就用上。如果你有500个字节要发送,你还想实时性比较高,若没有DMA,那么很抱歉,裸奔没有办法搞定,即便是实时性OS,也很难办。如果接收方判断两个字符的间距的话,如modbus。那么发送必须是高优先级的,若采用os。
基本就这些了。
裸奔,感觉就是完全可以掌控得住。
如果要集成一些代码,比如我最近要集成canopen的代码,于是我就觉得我的代码整体可靠性要下降一档。心理上真的如此觉得。对自己就是这么自信。
如果要用os,那么也要熟读。弄透。然后采用。这样才觉得过瘾。否则感觉没有掌控力。
锣拢盗朔匣埃杉裉焓欠匣傲恕裸奔到嵌入式操作系统的挑战
嵌入式设备网络化、u盘化、功能复杂化的趋势,使越来越多的、过去可以用裸奔实现的嵌入式产品,产生了应用操作系统的需求。
而人力成本的持续上升、芯片成本的连续下降,以及cpu性能的迅速提高,又为大面积应用操作系统提供了物质基础。
本文和大家一起讨论一下,从裸奔到操作系统,我们将面对什么挑战。
我们首先面对的,将是cpu运行速度的问题,毋庸置疑,操作系统调度需要cpu开销,需要cpu有更高的速度来弥补;再者,嵌入式系统经常用于实时控制,需要较高的定时精度,缩短tick时间间隔有利于提高控制精度,嵌入式系统中经常使用1mS甚至更短的tick间隔。然而,tick间隔越短,调度开销就越高,同样需要更高的cpu速度来弥补。当前日益提高的嵌入式cpu的性能,甚至单片机都32位了,很好地回答了这个问题。
2、内存容量
先讨论一个问题,一个原先需要50K内存的裸奔程序,如果移植到自身开销1K内存的RTOS下面,需要增加多少内存?是51K吗?
有许多嵌入式操作系统,都把运行操作系统的内存开销作为主要性能指标,有些甚至声称不到1K内存就可以运行。但我们千万不要被误导,以为用操作系统需要的内存与裸机差不多,只要比裸奔程序多那么1K、2K就行了。操作系统会使应用程序所需要的内存暴增,使用操作系统所增加的内存需求,主要来自以下方面:
1) 运行操作系统本身需要的内存。
2) 创建线程控制块、消息控制块等操作系统组件需要的内存。
3) 每个线程配置独立的栈所增加的内存需求。
其中第一项很好理解,几乎所有操作系统都会给出这个指标。第二项也容易理解,不用操作系统的情况下,我们常常定义标志位或全局变量来在不同模块之间传递信息,需要的内存就很少。而操作系统模式下,需要用到同步、互斥、线程间交换数据等,这就需要使用信号量、邮箱等操作系统组件,信号量需要分配信号量控制块,邮箱需要分配邮箱控制块&&,这些,都需要消耗可观的内存。许多操作系统标明的,仅仅是OS本身运行需要的内存,并不包括信号量控制块拉、邮箱控制块拉等等这些操作系统组件需要的内存。我们知道,一个仅运行OS的系统,是毫无意义的,真正实现产品功能的,是应用程序。而djyos的si版本,大约需要的10K内存,则包含了一定数量的事件控制块、信号量控制块等操作系统组件所需内存的条件下的,完全满足一个小型系统所需。
说了半天,其实也只讲了操作系统对内存需求的冰山一角,OS下编程,对内存需求的影响最大的,当属OS的多线程并发特性,这使得我们要为每一个线程分配独立的栈。下面我们定性分析一下栈独立化带来的内存需求变化。栈是用来保存函数参数和局部变量的,可以说,有函数调用,就有局部变量。在单线程环境下,应用程序需要的栈,几乎就是main函数需要的栈,而在多线程环境下,每个线程的栈是独立的,分别等于该线程的线程执行函数所需要的栈,而系统总的栈需求,就是所有线程的栈需求之和。
假设有一不使用OS的应用程序,main函数如下:
void main(void)
func1(); //本函数需要10K栈
func2(); //本函数需要5K栈
func3(); //本函数需要9K栈
func4(); //本函数需要8K栈
func5(); //本函数需要9K栈
在超级循环中,分别调用了func1~func5这5个函数,他们的栈需求分别是10K、5K、9K、8K、9K。调用func1时,系统分配10K的ram作为栈,func1函数返回,这10K空间将被释放,并且再次分配给func2使用,所以,整个程序的栈需求,就是这5个函数中需要栈最多的那个函数需要的栈空间:10K。
如果要把这个程序移植到OS下,最简单的方法就是创建5个线程来调用func1~5这5个函数,这5个线程需要的栈分别是10K、5K、9K、8K、9K,而这5个栈是独立的,不能共用,程序总共需要的栈空间是(10+5+9+8+9)=41K,线程栈一般是从堆中动态分配的,考虑到动态分配本身的开销,硬件须准备50K以上的内存用于程序的运行栈。一下子增长到5倍,没想到吧。
可见,上操作系统,虽然操作系统本身不需要很大内存,但会极度增加应用程序的内存需求。做项目时,一是不要盲目上OS,要根据需求综合考虑,二是设计硬件系统时,应该充分考虑到内存方面的需求,配置充足的内存。
任何产品都是由人开发的,所以,讨论嵌入式产品开发的任何话题,都不能离开人的因素,科技以人为本嘛!从裸奔到操作系统,那么程序员,也将由编写裸奔程序转为在操作系统下编程。这些迅速、大量增加的程序员,他们可能习惯了在裸奔环境下编程,他们可能是化工、建筑、地质等不同行业的专家,他们也许已经上了年纪,没有太多的精力学习多线程编程等知识。然而,涉及到专业的程序,仍然离不开他们,如何从技术上降低他们的入门门槛,是一个亟需考虑的问题。但是,普通的操作系统下,你不掌握线程控制技术,就无法编写正确的程序。djyos允许你按事件编程,没有任何跟线程相关的api函数,无需程序员掌握线程技术,客观上降低了裸奔到OS编程的转换技术门槛。
关注微信公众号奇迹总是出现在那些永不放弃的人身上!
一、MMU的介绍
MMU全称Memory Management Unit,中文称内存管理单元
主要有两个功能:
A.将虚拟地址转换成实际的物理地址
B.对物理内存设置访问权限
二、MMU的工作过程
在s3c2410中MMU是由协处理器(cp15)控制的,s3c0最多会用到两级页表:以段(Section,1MB)的方式进行转换时只用到一级页表,以页(page)的方式进行转换时用到两级页表。页的大小有3种:大页(64KB),小页(4KB),极小页(1KB)。
明确一个概念:
条目也称为"描述符"(Descriptor),有:段描述符,大页描述符,小页描述符,极小页描述符----它们保存段、大页、小页或极小页的起始物理地址;粗页表描述符、细页表描述符---他们保存二级页表的物理地址
转换过程如下:
(1) 根据给定的虚拟地址找到一级页表中的条目
(2)如果此条目是段描述符,则返回物理地址,转换结束
(3)如果此条目是二级页表描述符,继续利用虚拟地址在二级页表中找到下一个条目;
(4)如果这第二个条目是叶描述符,则返回物理地址,转换结束;
(5)其他情况出错
注意:这里面所有的转换过程都是由MMU完成的
以段的方式映射实例说明:
例如:虚拟地址 0xa0004000
注意:当MMU打开以后,所有的地址都会被MMU拦截,然后将其转换,cpu是不管虚拟地址还是实际物理地址的。
先来看看TTB
简单的来说,它保存了一级页表所存放的实际物理地址,要求16KB对齐,以段的方式映射,4GB的虚拟地址空间,需要段描述符4096个(每个段描述符映射1M空间),没个描述符占用4byte,所以一段的方式映射一级页表占用的空间为16KB。
在这里我们假设,我们的一级页表存放在物理地址:0x.
获得虚拟地址所对应的段描述符所在的地址
addr = TTB&0xffffc000 | ((viraddr && 20) && 2 ) = 0x & 0xfffc000 | ((0xa0004000 && 20) && 2)= 0x | (0xa00 && 2) = 0x
从0x取出虚拟地址所对应的段描述符
段描述的构造我们到后面再来讲解,这里我们假设我们把0xa0004000映射到实际的物理地址0x,则这里的[31:20]为0x300
组合成实际的物理地址
phyaddr = 0x300 && 20 | (0xa0004000 & 0xfffff) = 0x
目标:以段的方式映射s3c2410的地址空间,一级页表存放在0x
A.计算每个虚拟地址对应段描述符所在的地址(addr),方法如下:
B.构造段描述符
注意:Section base address 存放的是实际的物理地址的[31:20]
C.存放段描述符
(unsigned int *)addr = section descriptor
整个流程比较复杂的就是段描述符的构造,具体的流程大家可以直接看芯片手册,写的很详细
/*Nand 启动sdram的起始地址*/
#define SRAM_START_ADDR
/*内存空间地址*/
#define VMRAM_ADDR_START
0xa0000000
#define SDRAM_ADDR_END 0x
/*IO空间地址*/
#define VMIO_ADDR_START 0xb0000000
#define PHIO_ADDR_START 0x
#define PHIO_ADDR_END 0x
/*用SDRAM起始地址开始的16KB,存放页表*/
#define PAGE_TABLE_BASE 0x
#define PAGE_TABLE_BASE_MASK 0xffffc000
#define VIRADDR_MASK 0xfff00000
#define PHYADDR_MASK 0xfff00000
/*页表项内容*/
#define PAGE_TABLE_SECTION_AP (0x01 && 10)
#define APGE_TABLE_SECTION_DOMAIN (0x0 && 5)
#define PAGE_TABLE_SECTION_CACHE_WB (0x0 && 2)
#define PAGE_TABLE_SECTION_4BIT (1 && 4)
#define PAGE_TABLE_SECTION_TYPE (0x2)
/*段大小*/
#define SECTION_SIZE 0x100000
//根据虚拟地址和页表基地址确定页表项所在的物理地址
unsigned int get_pgtindex_addr(unsigned int viraddr,unsigned int pgtaddr)
/*[31:14]页表基地地址
*[13: 2]虚拟地址&&20位得到的page index
*[1 : 0]总是为0,因为每一项占用4byte
addr = (pgtaddr & PAGE_TABLE_BASE_MASK) | (((viraddr & VIRADDR_MASK) && 20) && 2);
//获取页表项
unsigned int get_page_entry(unsigned int phyaddr)
unsigned int entry_
/*[31:20]section base address
*[11:10]AP
*[8:5]Domain
*[1:0]:Type
entry_value = (phyaddr & PHYADDR_MASK) | PAGE_TABLE_SECTION_AP |\
PAGE_TABLE_SECTION_CACHE_WB | PAGE_TABLE_SECTION_4BIT|\
PAGE_TABLE_SECTION_TYPE;
return entry_
/*创建一级页表:段描述符*/
void create_page_table()
unsigned int pgt_index_
unsigned int viraddr,phyaddr,
/*我们代码的起始运行地址0x在这里需要注意的是:当我们开启MMU后,cpu发出的地址都会被MMU拦截,要想程序正常运行,pc所用的的地址必须是虚拟地址。然而此时cpu执行下一条指令实际运行的地址是物理地址,但是MMU会将此物理地址当作虚拟虚拟地址处理。晕,乱套了。为了解决这个问题,我们通常的做法是,让开启MMU的附近地址指令的虚拟地址和物理地址空间做一个等价的映射。在这里我们将0x开始的1M物理空间映射到0x开始的虚拟地址空间。*/
phyaddr = SRAM_START_ADDR;
pgtaddr = PAGE_TABLE_BASE;
pgt_index_addr = get_pgtindex_addr(viraddr,pgtaddr);
*(volatile unsigned int *)pgt_index_addr = get_page_entry(phyaddr);
/*映射64MSDRAM*/
for(phyaddr = SDRAM_ADDR_START,viraddr = VMRAM_ADDR_START;\
phyaddr & SDRAM_ADDR_END;phyaddr += SECTION_SIZE,\
viraddr += SECTION_SIZE)
pgtaddr = PAGE_TABLE_BASE;
pgt_index_addr = get_pgtindex_addr(viraddr,pgtaddr);
*(volatile unsigned int *)pgt_index_addr = get_page_entry(phyaddr);
/*映射IO地址空间*/
phyaddr = PHIO_ADDR_START;
viraddr = VMIO_ADDR_START;
pgtaddr = PAGE_TABLE_BASE;
pgt_index_addr = get_pgtindex_addr(viraddr,pgtaddr);
*(volatile unsigned int *)pgt_index_addr = get_page_entry(phyaddr);
Care must be taken if the translated address differs from the
untranslated address as several instructions following the
enabling of the MMU may have been prefetched with the MMU off
(using physical = virtual address - flat translation) and enabling
the MMU may be considered as a branch with delayed execution. A similar
situation occurs when the MMU is disabled. Consider the following code
p15, 0, R1, c1, C0, 0: Read control rejectio
p15,0,R1,C1, C0,0 ; Enable MMUS
Translated
void init_mmu()
unsigned long mmu_table_base = PAGE_TABLE_BASE;
/*set Translation Table Base(TTB) register*/
"mrc p15,0,r0,c2,c0,0\n"
"mov r0,%0\n"
"mcr p15,0,r0,c2,c0,0\n"
/*set Domain Access Control register*/
"mrc p15,0,r0,c3,c0,0\n"
"mvn r0,#0\n"
"mcr p15,0,r0,c3,c0,0\n"
/*Enable MMU*/
"mrc p15,0,r0,c1,c0,0\n"
"orr r0, #0x1\n"
"mcr p15,0,r0,c1,c0,0\n"
"mov r0,r0\n"
"mov r0,r0\n"
"mov r0,r0\n"
:"r"(mmu_table_base)
.global _start
#define pWTCON 0x
0x4c000014
0x4c000004
SRAM_2_ADDR
SDRAM_2_ADDR
start_code:
@set the cpu to SVC32 mode
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
@打开指令cache
mrc p15,0,r0,c1,c0,0
@orr r0,r0,#0x1000
mcr p15,0,r0,c1,c0,0
@设置栈指针位置
ldr sp,=4096
bl disable_watchdog
@初始化系统时钟
bl init_sys_clock
@初始化内存
bl init_sdram
@拷贝SRAM的代码到SDRAM
bl copy_to_sdram
bl create_page_table
bl init_mmu
@运行led程序
ldr sp,=0xa3000000 @重设sp指针,mmu之后,@cpu操作的地址都是虚拟地址
ldr pc,_main
halt_loop:
b halt_loop
.word main
disable_watchdog:
@关看门狗,不然cpu会不断重启
ldr r0,=pWTCON
str r1,[r0]
init_sys_clock:
@目前为止,cpu工作在12MHZ频率下
@提升cpu工作频率FCLK:HCLK:PCLK=1:2:4
ldr r0,=CLKDIVN
str r1,[r0]
@ifHDIVN=1,must asynchronous buf mode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
@设置MPLL,使cpu工作在202.80MHZ
ldr r0,=MPLLCON
ldr r1,=0x000a1031
str r1,[r0]
copy_to_sdram:
r0,=SRAM_2_ADDR
@第二阶段代码起始地址(2048)
r1,=SDRAM_2_ADDR
@第二阶段代码存放的物理地址(0x)
r2,[r0],#4
r2,[r1],#4
r0,#SRAM_SIZE
init_sdram:
@初始化sdram
r0,=MEMBASE
@13个寄存器的首地址
r1,SMRDATA
@13个寄存器值存放的地址
r2,#52 @13 * 4 = 52
r3,[r1],#4
r3,[r0],#4
/*every thing is fine now*/
@声明一个数据缓冲池的开始
@BWSCON 设置BANK3位宽16,使能nWait,使能UB/LB
0x0700 @BANKCON0
0x700 @BANKCON1
0x700 @BANKCON2
0x700 @BANKCON3
0x700 @BANKCON4
0x700 @BANKCON5
(3 && 15) + (1 && 0) @BANKCON6
0x18001 @BANKCON7
(1 && 23) + (2 && 18) + (1256 && 0) @REFRESH
(1 && 7) + (1 && 0) @BANKSIZE
(3 && 4) @MRSRB6
(3 && 4) @MRSRB7
//#include "s3c2410.h"
/*虚拟地址*/
#define GPFCON
(*(volatile unsigned long *) 0xb0000050)
#define GPFDAT
(*(volatile unsigned long *) 0xb0000054)
static inline void led_init()
//GPFCON -& [8:15]清零
GPFCON &= ~(0xff && 8);
//GPF4 GPF5 GPF6 GPF7设为输出模式
GPFCON |= 0x55 && 8;
//输出高低平,关闭四路LED灯
GPFDAT |= 0xf && 4;
static inline int led_off()
GPFDAT |= 0xf && 4;
//延时函数
static inline int delay_time(int time)
//让两个for循环作为延时
for(i = 0;i &i ++)
for(j = 0;j &j ++);
static inline int run_water_led(int count)
int i = 0;
while(count --)
led_off();
delay_time(500);
for(i = 4;i & 8;i ++)
GPFDAT &= ~(0x1 && i);
delay_time(500);
int main()
led_init();
run_water_led(5);
led_off();
delay_time(5000);
led.bin:start.S led.c
arm-none-linux-gnueabi-gcc -c start.S -o start.o
arm-none-linux-gnueabi-gcc -c mmu.c -o mmu.o
arm-none-linux-gnueabi-gcc -c led.c -o led.o
#arm-none-linux-gnueabi-ld -Ttext 0x start.o led.o -o led_elf
arm-none-linux-gnueabi-ld -Tmap.lds start.o mmu.o led.o -o led_elf
arm-none-linux-gnueabi-objcopy -O binary -S led_elf led.bin
cp led.bin /tftpboot
rm -rf *.o led_elf led.bin
连接脚本(map.lds)
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
firtst 0x:
second 0xa0004000:
转自:http://www.embedu.org/Column/Column583.htm
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!初级的:说说JS常用的对话框。&br&中级的:讲下web页面DOM渲染处理机制。&br&高级的:看过jquery源码吗?写过自定义js框架吗?谈谈你对html5 css3看法,用你最熟悉的方式写个JS的继承。
初级的:说说JS常用的对话框。 中级的:讲下web页面DOM渲染处理机制。 高级的:看过jquery源码吗?写过自定义js框架吗?谈谈你对html5 css3看法,用你最熟悉的方式写个JS的继承。
所有的web框架都需要http知识,所以如果你理解 http headers, GET POST, ..., HEAD, 200, ... 404, ... 500, Cookie, body, request, response 等知识的具体涵义以后, 你就能快速上手很多框架&br&&br&其次,每个框架有每个框架的哲学,现在大家接触的python,ruby,php框架都基于MVC,但不是所有的框架都是这样的,比如ZOPE,大家理解z-object吗?&br&&br&之所以有框架的哲学,就是希望用一种模型将要做的工作具体起来。&br&就像买东西这件事,事实上是价值的交换,但是人们确造出来了货币。&br&&br&最后,尝试在最快的时间内掌握一门框架,并且理解它的本质吧,这样你才会觉得其他框架其实也没什么神奇的,这有助于我们设计出优秀的产品,省掉不必要的工作。&br&&br&最后,在玩遍了各类框架以后,我现在成了一个python tornado用户。
所有的web框架都需要http知识,所以如果你理解 http headers, GET POST, ..., HEAD, 200, ... 404, ... 500, Cookie, body, request, response 等知识的具体涵义以后, 你就能快速上手很多框架 其次,每个框架有每个框架的哲学,现在大家接触的python,ruby…
web前端开发流程是什么?进行操作会用到哪些便捷的小工具?是先用模板做好,然后在基础上改吗??正常大家说的改框架是不是指的用模板做的网站原文件?前端开发做的文件一般是哪些?放在主机什么文件夹里啊&br&&br&&b&1. web前端开发流程是什么?&/b&&br&老板或甲方是一个需求的真正发起者,也是一个基础idea的梦想师,产品是需求专业化梳理或进行有效评估细化需求负责的,&br&而设计是前端的上游,前端是设计的下游。设计的工作目的是把产品宏观的思维结果进行专业的处理,因为按一般的习惯,产品最终的结果是原型图,而原型图可以理解为设计的草图,&br&对真正的用户来说,这个草图过于简单或不符合使用的操作习惯,所以需要设计师进行专业的处理,比如颜色搭配,布局分隔,有时候还兼交互的一部分工作,设置用户与页面发生交互的预订流程,&br&那有人问,不需要设计不行吗?直接让前端写页面不就得了,还需要麻烦设计师来做个图出来。&br&因为这里边有一个成本风险控制的一个理念,因为在前期,尤其是设计,主观感受大于理性的思考,所以每天的结果都不一样,所以需要设计师去消化掉这部分主观感受带来的误区,&br&而且从成本上来讲,有些场景设计师改图比改代码要容易控制一些。&br&设计师的结果是psd文件,他是很多个图层叠加在一起的结果,而前端的工作结果html页面,是把很多图层上的效果,有机的用html组织起来的过程。&br&前端是把转化后html交给下游服务端开发工程师,或叫后台开发,这个html里边包括一些交互的js文件等。总的来说前端是一个承前启后的岗位。&br&也有的公司把前端的责任放大,负责整个前台view层页面的开发,这样的好与坏在前面的文章中已经探讨过就不一一细表了。&br&&br& 我们以前基本的流程是,领导或甲方提出需求,然后产品分析需求,并且根据需求画出原型图,然后根据原型图出设计稿。&br&出完设计稿团队评审,过后交与前端制作静态页面,然后静态页面,交与设计审核,过后交给开发人员,进行动态数据的添加。&br&添加完之后,发布测试环境,产品测试领导审核,成功后,直接发布产品环境。或进行版本迭代。&br&这是整个的一个设计,开发,部署的流程。&br&&br&根据前面的,在补充一下,前面的所有流程中的灵魂是原始需求提出者,但人随着客观条件的变化,思维认识会有所不一致,&br&所以产生了文档,文档是贯穿整个流程的一个灵魂。&br&而产品是整个流程中文档的编写者,因为产品最能接触最原始的需求,对需求的理解更深刻或专业,所以他会有一个文档出来。&br&这个文档是需要交付给设计,让设计在设计过程中进行参考。&br&前端看的另外一个文档。交互设计师出交互文档,一般的公司没有交互设计师那就是由产品来出的交互文档。&br&有的交互不过于复杂,就没有文档,只是邮件。&br&有时候说,不要这个邮件行不行,那怕是最简单的原始东西,没有文件或邮件是不能做一个后期测试回溯的依据。&br&产品文档表示页面的流转或数据的走向,交互文档描述页面复杂的交互或各个用户表单与用户发生的各种互动。&br&另外2个是,要架构师或项目经理出的需求文档,需求文档是对整个项目的历史背景,系统开发软硬件要求,或版本信息,等等。&br&另外一个是由服务端工程师提供的接口文档,这里边包括一些请求类型,传参的数目与键名,还有服务端返回的参数名约定等等的,这些文档是开发中的灵魂,也是以后测试回溯的标准或依据。&br&&br&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/daoshi/p/3751922.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&创立一个网站的前前后后(起因,域名,云平台,备案,CDN等等)(1)&/a&&br&&br&&b&2. 进行操作会用到哪些便捷的小工具?&/b&&br&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/jikey/p/3607133.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&4. web前端开发分享-css,js工具篇&/a&&br&最主要是开发工具,还有上游是ps要求略会。其它就是不同语言的开发环境的搭建,如果是开端就求助后端,如果是后端自己折腾了。&br&其它的,都不难,难的是可能是windows,mac,linux平台切换后的思路断片,需要有一个过程熟悉,熟悉之后,基本都不是问题,开发的核心是语言,平台,需求,真正的工具没有难度。&br&剩下的就是三个利器:vim,git,五笔,有空的学学,没空就慢慢看了。&br&&br&&b&3.是先用模板做好,然后在基础上改吗??&/b&&br&一般新项目都是手动要写的,写好的有可能也不是模板。&br&&br&&b&4. 正常大家说的改框架是不是指的用模板做的网站原文件?&/b&&br&框架,有几层意思,frameset也是框架,现在mvvm也是框架,有的java,strusts,php的laravel也叫框架,大部分是不改原文件,而是配置文件,像strusts的xml配置文件,像laravel是直接是后生成的新的php文件。&br&&b&5. 前端开发做的文件一般是哪些?放在主机什么文件夹里啊&/b&&br&一般是html,css,js三个文件,放在服务器的,有可能是这三个,也有可能是.php,.jsp,.aspx等等的。&br&可能目录啥的,可以参考一下这个:&br&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/jikey/p/4240911.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&豪情-CSS解构系列之&/a&一&br&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/jikey/p/4259360.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&豪情-CSS解构系列之&/a&二&br&&br&以上纯是个人经历,不具有普遍性,仅供参考。有兴趣加群交流:&b&&/b&,禁止大Gif,闲聊,非喜勿进。
web前端开发流程是什么?进行操作会用到哪些便捷的小工具?是先用模板做好,然后在基础上改吗??正常大家说的改框架是不是指的用模板做的网站原文件?前端开发做的文件一般是哪些?放在主机什么文件夹里啊 1. web前端开发流程是什么? 老板或甲方是一个需…
&p&这是个很有意思的问题。&br&&br&一句话:这是命运的偶然安排,也是历史的必然选择。对,现在JavaScript绝对有资格矫情!&br&&br&-------------------&br&&b&本文核心观点是“一门程序语言脱离实际的硬件环境和相应的软件环境谈它的发展变化,谈为什么我们最后选择它往往是不够深刻的”。我尝试从非另一个角度看待问题。&/b&&br&&b&&u&--------------------&/u&&/b&&br&&br&这个话题很大,但确实值得Web从业者去深究和探讨!但这是一个很有难度的问题,到目前为止我还看不到一个让人心锐诚服的答案!&br&&br&在我看来,找到相对合情合理的答案得从计算机硬件(尤其是CPU)开始,从操作系统发展变化的角度审视互联网的进化,这样才更容易理解浏览器上的开发语言为什么是JavaScript,而不是其他的语言。&br&&br&&u&&b&(此文很长,如果你没有耐心看完但又想知道我的看法,请直接飞到“第11章”,那里有我对此次问题的分解和回答。)&/b&&/u&&br&&br&------------------&br&&b&## 1,浏览器的进程都运行着什么?&/b&&br&&br&先上个图:&br&&figure&&img src=&https://pic3.zhimg.com/50/9dae86a2d73e59cc6f8cb3_b.jpg& data-rawwidth=&577& data-rawheight=&336& class=&origin_image zh-lightbox-thumb& width=&577& data-original=&https://pic3.zhimg.com/50/9dae86a2d73e59cc6f8cb3_r.jpg&&&/figure&(图片来源:&a href=&//link.zhihu.com/?target=http%3A//grosskurth.ca/papers/browser-refarch.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&grosskurth.ca/papers/br&/span&&span class=&invisible&&owser-refarch.pdf&/span&&span class=&ellipsis&&&/span&&/a&)&br&这是浏览器内部的大致结构,也就是浏览器的主要组成部分有:&br&&/p&&blockquote&&ol&&li&The user interface/用户接口: 除了网页显示区域以外的部分,比如地址栏、搜索栏、前进后退、书签菜单等窗口。&br&&/li&&li&The brower engine/浏览器引擎: 查询与操作渲染引擎的接口,&b&包含事件驱动引擎,提供浏览器进程及其线程之间的资源共享调度机制&/b&。&br&&/li&&li&The rendering engine/渲染引擎: 负责显示请求的内容,比如请求到HTML, 它会负责解析HTML 与 CSS 并将结果显示到窗口中,也是后面几个线程或引擎的父级控制线程。&br&&/li&&li&Networking/网络: 用于网络请求, 如HTTP请求,执行POST、GET等操作就是由它来处理的。&br&&/li&&li&UI backend/UI后台: 绘制基础元件,如消息窗口(alert默认的样子)、下拉选项卡等等。&br&&/li&&li&JavaScript interpreter/JavaScript解释器:也就是JavaScript引擎,用于解析和执行JavaScript代码。&br&&/li&&li&Data storage/数据存储:数据持久层,在我们浏览页面时,浏览器需要把一些数据存到硬盘或内存上,如Cookies、localStorage、sessionStorage、webSql等。&br&&/li&&/ol&&/blockquote&我们用浏览器看到的每一个页面,背后都是由以上的组件或功能来协作完成的。&u&浏览器完成打开一个页面的整个过程,通俗地说这是页面“渲染”。这里的“渲染”,其实是一个组合概念,即浏览器的“渲染引擎”并不是单独工作的,必须依赖其他引擎(组件),经过某种协同机制联合起来完成页面的展示及交互。&/u&&br&&br&关于浏览器如何渲染的,我就不详细展开,请阅读:&br&&ul&&li&原文——&a href=&//link.zhihu.com/?target=http%3A//taligarsiel.com/Projects/howbrowserswork1.htm%231& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&taligarsiel.com/Project&/span&&span class=&invisible&&s/howbrowserswork1.htm#1&/span&&span class=&ellipsis&&&/span&&/a&&br&&/li&&li&译文——&a href=&//link.zhihu.com/?target=http%3A//ued.ctrip.com/blog/%3Fp%3D3287& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&ued.ctrip.com/blog/?&/span&&span class=&invisible&&p=3287&/span&&span class=&ellipsis&&&/span&&/a&&br&&/li&&/ul&&br&相信很多人看完原文或译文依然一头雾水,当初我也这样,但我们至少知道这样的知识:&br&&blockquote&&b&浏览器内部有很多组件或功能,不同的功能必定包含不同的模块,而不同的模块当然就需要不同的实现逻辑,书写并运行不同的代码。&/b&&/blockquote&很显然,不同的逻辑需要不同的代码,那么当我们启动浏览器时,OS要运行指定的程序,在OS的任务管理器里面就表现为某个进程(可能是单个也可能是多个)。例如我所用电脑(MAC)在写这篇文章时需要打开Chrome(如下图所示)。&br&&figure&&img src=&https://pic3.zhimg.com/50/c045d7d0faf5ad5a73168_b.jpg& data-rawwidth=&1419& data-rawheight=&713& class=&origin_image zh-lightbox-thumb& width=&1419& data-original=&https://pic3.zhimg.com/50/c045d7d0faf5ad5a73168_r.jpg&&&/figure&发现没有,我其实只运行了一个Chrome,但打开了N个网站(N个Tab)。当然,我们看到是浏览器的主进程,事实上主进程下面还包含组N个子进程,每个子进程就是一个页面Tab的实例,在Mac系统中可以用以下的命令来打印:&br&&div class=&highlight&&&pre&&code class=&language-text&&ps aux | grep 'Google Chrome'
&/code&&/pre&&/div&如果是Windows系统就更加简单了,Ctrl+Shift+Esc的组合键打开任务管理器,看到类似这样的图:&br&&figure&&img src=&https://pic4.zhimg.com/50/b0dbefe3067_b.jpg& data-rawwidth=&793& data-rawheight=&644& class=&origin_image zh-lightbox-thumb& width=&793& data-original=&https://pic4.zhimg.com/50/b0dbefe3067_r.jpg&&&/figure&Windows会将所有运行中的进程列出来,如果你启动的时候只点击(运行)过一次桌面上的浏览器图标,那么系统中就只有一个主进程。当你打开很多页面之后,Windows就可能要启动N个子进程,如果你找到了主进程并右键“强制结束”,那么就是可以把子进程一起结束掉。&br&&br&--------------------&br&&b&## &/b&&b&2,“进程”和“线程”是什么?它们有什么&/b&&b&关系和&/b&&b&区别?&/b&&br&&br&有点跑题了,咱们还是回到主题。这里涉及一个概念——“进程”。还有,我们应该听说过“JavaScript是单线程的”这种说法,到底“进程Process”和“线程Thread”是什么玩意呢?&br&&br&这两个是CPU和OS层面的概念,比较抽象。(下面的概念解析是抄的,但我认可这种解析,复制粘贴过来,但不知谁是原作者)&br&&br&&b&什么是进程?&/b&&br&&blockquote&进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。&/blockquote&&b&什么是线程?&/b&&br&&blockquote&线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。&/blockquote&&b&进程和线程的关系:&/b&&br&&blockquote&&p&(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;&/p&&p&(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源;&/p&&p&(3)处理机分给线程,即真正在处理机上运行的是线程;&/p&&p&(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。&/p&&/blockquote&&p&&b&进程与线程的区别:&/b&&/p&&blockquote&&p&(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;&/p&&p&(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;&/p&&p&(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;&/p&&p&(4) 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。&/p&&/blockquote&&p&&b&结论:&/b&&/p&&blockquote&&p&(1)线程是进程的一部分;&/p&&p&(2)CPU调度的是线程;&/p&&p&(3)OS为进程分配资源,不对线程分配资源。&/p&&/blockquote&很显然,这种解析还是比较晦涩难懂。很久很久以前,我曾写过比这上面更加通俗易懂硬件知识刊发在某杂志上,但一下子找不到了,随便找来两个替代品:&br&&blockquote&&ul&&li&《电脑爱好者》的解析:&a href=&//link.zhihu.com/?target=http%3A//www.cfan.com.cn/292.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&走进多核CPU的世界&/a&&br&&/li&&li&阮一峰的解析:&a href=&//link.zhihu.com/?target=http%3A//www.ruanyifeng.com/blog/2013/04/processes_and_threads.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&进程与线程的一个简单解释&/a&&/li&&/ul&&/blockquote&&b&在这里我再补充一点——主进程和子进程是什么?&/b&&br&对于CPU而言,它是没有进程这个概念的,这其实OS层面的概念。这种主/子关系(也可称为父/子关系)是OS建立的关联,因为OS要知道谁启动了谁(例如A运行B,B运行C),知道了这种关系,那么在权重或安全层面就可以建立某种控制机制,让软件的运行有序起来。但是,不管主进程还是子进程都需要单独占用内存空间,运行时都要安排单独的硬件资源。&br&&br&OK,补脑先到这里,请客官您务必理解这两个知识点。当然了,如果还是没能分清楚它们两,那也没有关系,请继续往下看。&br&&br&--------------------&br&&b&## &/b&&b&3,简单回顾CPU硬件和OS的发展&/b&&br&&br&先复制一段总结,括号里面的文字是我的理解:&br&&blockquote&&p&&b&(根据CPU多核心和多进程特点,运行&/b&&b&)&/b&&b&在OS上面的(软件)设计,可归结为三点:&/b&&/p&&p&&b&(1)以多进程形式,允许多个任务同时运行;(现在绝大多数软件都是这种设计)&/b&&/p&&p&&b&(2)以多线程形式,允许单个任务分成不同的部分运行;(软件在运行过程中的特点)&/b&&/p&&p&&b&(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。&/b&&b&(软件在运行过程中的特点)&/b&&/p&&/blockquote&这是阮大神的总结,足够精简,但基本把浏览器这种软件的内部外部表现说得非常清楚明白了。当然,别人在总结这种文字的时候未必是为了用来解析浏览器原理的,但是这是计算机底层的知识,底层的东西是通用的。&br&&br&&u&从这里可以看出,要想对程序开发有深层次的认识,最好对计算机底层的原理和机制有了解,越是高级别的开发,计算机硬件知识就要越丰富。&/u&(TM)的又废话了,咱们回到进程和线程这两个概念。&br&&br&&u&浏览器不是单线程的,它是多线程的,是多进程的&/u&(我在‘&a href=&http://www.zhihu.com/question//answer/& class=&internal&&网站为什么 JS 调用尽量放到网页底部?&/a&’回复中有解析,但不详细),这话怎么理解呢?这还得从操作系统及硬件层面来解析,这样才更容易理解,也理解得更加深刻。&br&&br&我们都知道,现代的操作系统是支持多进程和多线程的,因此运行在它上面的软件就可以设计成这个样子,比如浏览器。这是现代软件的特点,这点不需要证明了吧?前面的系统管理器截图足够说明这一点。&br&&br&当然,在浏览器诞生初期,它并不是这样的,其他软件也不是。很久很久以前,在DOS时代,所有的软件都是单进程单线程的(如果你玩过DOS,就知道你只能逐条命令地键入,等上一条命令执行完成之后才能输入下一条命令),甚至到了后来的Win95/98时代,软件设计依旧是以单进程单线程为主,为什么?&br&&br&因为那个时代提供多线程并没有太实际意义,这是由计算机硬件层面的特性决定的。简单地说,在2000年以前,民用级别的CPU都只是单个物理核心,多线程技术还没被应用。因此,运行在硬件上面的OS,即便提供多进程多线程不会给电脑性能带来显著的提升,CPU处理程序只能一个挨着一个地排队慢慢处理。&br&&br&首个单核心多线程的CPU是Intel发布的,型号是&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel 奔腾4 3.06GHz&/a&,发布时间大约是2000年样子(具体时间记得不清楚了),它是首个提供 &a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/67916.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&EM64T&/a&技术的民用级64位CPU,也是首个提供HT超线程技术的单核心CPU。&br&&figure&&img src=&https://pic1.zhimg.com/50/3c5c7cd199d10feb816447_b.jpg& data-rawwidth=&1000& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic1.zhimg.com/50/3c5c7cd199d10feb816447_r.jpg&&&/figure&(&a href=&//link.zhihu.com/?target=http%3A//detail.zol.com.cn/29/28771/param.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel 奔腾4 3.06GHz CPU参数&/a&)&br&&br&这是一款事关Intel生死的产品。那个时候,单纯地通过提高CPU运行频率对其性能的提高价值已越来越小,而且提高频率这种技术AMD也能可以做到,但超线程(多线程)技术却可以在不提高运行频率的前提下显著地改善CPU的性能。正是凭借着这一技术,Intel保住了CPU行业老大的位置。&br&&br&随后,多线程技术逐渐被CPU行业所接受,进而开启了Intel和AMD在CPU层面的性能PK大赛,当然Intel一直领先。性能PK大赛让普通用户尝到了多线程技术的好处,电脑性能更好了,而微软也顺势发布了&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/6399.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WinXP&/a&。&br&&br&WinXP刚刚上市的时候,和Win98一样,依然最多可以使用1个物理处理器,但它由于支持“超线程”,可以利用第2个(虚拟)处理器;另一方面,WinXP采用全新的NT内核(纯32位),CPU和内存的寻址能力更好也更稳定,多进程的处理能力显著提高。因此,除了外观更漂亮外,我们感觉到的是WinXP更稳定,性能也更好了。&br&&br&如果你用过Win98,那么一定记得要定期重启电脑,否则运行久了就会莫名其妙死机或蓝屏。虽然WinXP也一样,但频率低很多。为何?这其实是由&b&微软Windows OS的内核设计决定的。&/b&在早期(大约是1988年-2000年),微软将Windows系统分为面向服务器的NT内核和面向终端用户的16位/32位混合模式内核两类。&br&&br&最为典型的代表就是Win95/98,它们都是16位与32位混合的内核,但是这种混合内核非常不稳定,时不时就蓝屏,用过Win98的用户一定深有感触。为了解决这个问题,微软决定将更加稳定的NT内核应用到普通用户市场,于是就有了纯32位的WinXP的诞生。至此之后,Windows系统都是NT内核,都要么纯32位,要么纯64位,而不存在两者的混合,以避免重蹈16位与32位混合的覆辙。&br&&blockquote&&b&详细了解Windows的历史:&br&&/b&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/41346.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Windows NT_百度百科&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//server.it168.com/a2/.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&二十六年历程 20个版本Windows完全解析&/a&&br&&/li&&/ul&&b&了解64位和32位有啥区别的:&/b&&br&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//cpu.zol.com.cn/445/4453295.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三分钟小科普:64位和32位芯片的区别&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.360doc.com/content/10/4.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&32bit和64bit 的区别&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/ggjucheng/archive//2288919.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于x86和JVM浅谈32bit与64bit的区别&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/dolphin0520/archive//3110555.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&32位系统最大只能支持4GB内存之由来&/a&&br&&/li&&/ul&&/blockquote&&br&--------------------&br&&b&## &/b&&b&4,从硬件和系统层面来理解浏览器和JavaScript的设计&/b&&br&&br&经过上述的知识补充,我们了解到浏览器必须运行在OS上面(比如Windows、Mac,Linux等),而OS则运行在硬件(硬盘、内存、CPU、主板、显卡等)上面,只有在硬件(CPU)提供了多进程或多线程技术支持的前提下,OS的多线程多进程设计才有实用价值,而只有OS提供了这种运行环境支持,其上面的软件谈多进程,而开发语言才能使用多线程。&br&&br&有了这个层面的知识,我们再来看看&b&浏览器&/b&及&b&Javascript&/b&的历史。这个历史很长,我就不复制粘贴了,补脑的传送门:&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/7718.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&浏览器&/a&。&b&请努力记住浏览器各个版本&/b&&b&出生的时间,并详细看看网景和微软争斗史。&/b&&br&&blockquote&&b&一个关于浏览器的认识误区&/b&&br&我们大多数人对“浏览器”是有误解的,认为“浏览器”只不过是个系统插件/软件而已,事实并非如此,真正的浏览器是应该可以独立存在系统的,比如Google Chrome OS,就是一个不依赖其他OS独立运行的浏览器系统。不过,是否了解这个知识点并不会影响我们对于它的运行机制的理解。&/blockquote&浏览器的历史看完了,我们再来看看 &a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/16168.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript&/a& 的历史,补脑的传送门:&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/16168.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&javascript_百度百科&/a&。&br&&br&&figure&&img src=&https://pic1.zhimg.com/50/2cd3d4df81cefed3e306d09f13adb6c7_b.jpg& data-rawwidth=&816& data-rawheight=&416& class=&origin_image zh-lightbox-thumb& width=&816& data-original=&https://pic1.zhimg.com/50/2cd3d4df81cefed3e306d09f13adb6c7_r.jpg&&&/figure&百度词条有点扯淡,&b&JavaScript&/b&的发行时间怎么变成了1992年?网景浏览器1994年才出生,没有妈哪来的儿子?我们还是看看阮大神的作品吧——&a href=&//link.zhihu.com/?target=http%3A//javascript.ruanyifeng.com/introduction/history.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript的历史 -- JavaScript 标准参考教程&/a&。&br&&figure&&img src=&https://pic2.zhimg.com/50/b11a1185ebbc2a5cf2868_b.jpg& data-rawwidth=&935& data-rawheight=&441& class=&origin_image zh-lightbox-thumb& width=&935& data-original=&https://pic2.zhimg.com/50/b11a1185ebbc2a5cf2868_r.jpg&&&/figure&这一段很关键,很多JavaScript的书籍都反复述说这一段,我认为作为前端开发者,你必须倒背如流才算合格。正是因为JavaScript这门语言的诞生背景有点奇特,它的设计是为了满足用户浏览网页时产生的交互需求,而且它的生产设计时间也相当紧张(只有10天),因此它有很多不完善的设计。但即便是这样,JavaScript居然能生存并存活到现在,并展现出其独特的生态和旺盛的生命力。&br&&br&这是一个奇迹,但这绝非是偶然的。&br&&br&--------------------&br&&b&## &/b&&b&5,为什么JavaScript被设计成单线程和异步运行?&/b&&br&&br&我只能说,Brendan Eich才是真大神,不管他是偶然,还是故意。事实上,换一个人来实现这门语言未必做得比他做的更好设计得更合理,为什么?&br&&br&这个我们要结合时代,特别是计算机硬件的背景。那个时候,操作系统还是DOS的天下,Win95才发布。要知道Win95/Win98都是基于DOS的GUI层面的封装,多进程能力弱,可能Brendan Eich还不晓得存在多线程这概念,这种情况下如何设计一门运行在浏览器下的语言才是最合理的呢?&br&&br&浏览器是单进程的,可能具备多线程能力,但是硬件不支持,因此那时的它也只能以单线程在运作。&u&这就是语言运行的环境,请嘲笑JavaScript出身的人仔细理解这个时代背景。这种情况下,Brendan Eich只能将JavaScript设计成单线程的,但将异步特点赋予了它。这是神来之笔。&/u&&br&&br&我们应该都知道,&b&单线程和异步运行是JavaScript区别于其他语言的最显著特性。&/b&正是由于Brendan Eich一开始定下的基调,让JavaScript既能够在浏览器这个狭窄的舞台上发挥其独特的魅力,即便它在语法、词法等层面有很多这样那样的问题,但这些都是可以被开发者所克服的。&br&&br&然而,&u&语言设计层面的基调一旦定下来就很难被更改,甚至设计者本身都无法左右。&/u&很多历史事实反复证明这一点,JavaScript出生之后,其发展壮大及演变并不是由Brendan Eich说了算,甚至基本没他什么事。&br&&br&从语言本身来解析这一疑惑其实很难,但如果结合时代背景,并从硬件和操作系统层面来解析,就很容易说通。&br&&br&&b&请问在单核心单进程的CPU硬件环境下,同步执行和异步执行这两个设计方案,采用哪一种会更好?&/b&可能两者区别不大,但如果硬件层面优化了单进程的多线程能力,那么这两种运行模式谁更好?&br&&br&可能答案开始明确了,或许异步优秀一些。&br&&br&硬件发展并不是停滞不前的,在摩尔定律的指挥下,硬件技术飞速发展。当到了硬件具备了多核心(同步运行多个进程)多线程(同时处理多个线程)的能力,而且OS对于这种技术的利用逐渐完善之后,运行在OS上的软件(浏览器)必定会积极利用这种技术。&br&&br&记得我让大家仔细品味网景和微软的争斗历史吗?从硬件层面,网景的衰败是一个必然的结局,因为它离硬件相对遥远,而微软则近很多。&br&&br&微软是OS起家的,而OS是最接近硬件的。或许,浏览器可能只是微软顺手弄出来的,但盖茨看到它在互联网上的价值,因此将它弄到了Windows里面,并Win98开始逐渐改善软件在单进程下的多线程机制。&br&&br&其实,作为用户用什么浏览器来看页面,并不会有特别明显的倾向。如果撇开系统内置这一招,你我都应该相信,从IE浏览器一定会在某个时候超越网景浏览器,毕竟要运行在OS上面(对于普通用户而言),谁会对浏览器的优化做得更好或新技术的运用更快一步呢?&br&&br&答案是显而易见的。对于IE浏览器的优化,几乎伴随着Windows的全部发展进程。2001年,微软发布了Windows XP后,并内置了新一代浏览器——Internet Explorer 6,这是当时最先进的浏览器,它统治了浏览器市场多年。不管是不是前端开发人员,对于IE6应该不会太陌生,它其实是那个时代单进程浏览器的巅峰之作了(IE6原生不支持多标签,记得吧?)。&br&&br&IE统一天下之后,垄断让微软变得傲慢而无理,具体表现在IE6/7/8在技术层面的停滞不前,这是前端开发者的噩梦。然而,硬件技术和互联网发展并不是微软说了就算的,否则浏览器端的语言可能是&b&JScript或VbScritp&/b&。&br&&br&--------------------&br&&b&## &/b&&b&6,硬件高速发展,互联网也在进化!&/b&&br&&br&如果单纯从软件和互联网发展的角度看,很难解析这些和JavaScript的这门语言有什么关联,我还是谈谈硬件吧。&br&&br&事实上,互联网的高速发展离不开硬件的支持,但硬件的发展始终要领先软件一步甚至多步。如何理解?当CPU支持多线程技术时,微软利用Wintel组合总能得到第一手资料,因而获得某种先发优势。其他非底层的软件开发商了解到新技术已经是别人发布新版并公布最新的API才会知道,并且这里需要经历一个再学习的过程。&br&&br&很显然,除了微软外,其他浏览器的厂商大多属于这种情况。但是硬件技术发展并不会停下进化的脚步,它始终高速发展。&br&&br&Intel发布&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel 奔腾4 3.06GHz&/a&之后,2002年初,又发布了第二代130nm的Pentium 4(Northwood),加上支持DDR内存、FSB提升到533MHz等一系列动作,P4的威力得以发挥,帮助Intel夺下了性能的宝座。&br&&br&对手AMD的基于K7微架构的Athlon处理器开始呈现出颓势,但它并没有坐以待毙,一方面继续发布改进版本的Athlon XP(采用PR值类标识性能,避开Intel以频率的命名方式),另一方面宣布了新一代K8架构处理器(提出了多线程、多核心概念)。&br&&br&在2001年-2002年期间,Intel一直以“高频+多线程”来对付AMD,并基本处于领先位置,后者则通过更好的性价比来应对。尽管时有超越,但AMD始终处于被动的挨打态势。直到2003年,AMD终于推出了AMD64 架构 Opteron 以及 Athlon 64 处理器产品线,开启了超线程竞争的时代,尽管新技术架构并没有直接表现为更好的性能,但是它展现出来的后续能力,还是让Intel疲于应付。&br&&br&2004年,Intel 承认 AMD 在市场上的成功,并着手开发 AMD64 延伸的替代品,称为 IA-32e,稍后改名为 EM64T。升级版本的 Xeon 和 Pentium 4 处理器家族支持了新推出的指令。&br&&br&2005年4 月 30 日,微软发布提供给 AMD64 和 EM64T 处理器的 Windows XP Professional x64 Edition。&br&&figure&&img src=&https://pic1.zhimg.com/50/820db916bfb3f2aff4a2_b.jpg& data-rawwidth=&500& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic1.zhimg.com/50/820db916bfb3f2aff4a2_r.jpg&&&/figure&&br&Intel在日,抢先AMD发布了桌面上第一款双核CPU——&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/239686.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Pentium D_百度百科&/a&,虽然内部是由两颗Pentium 4共享FSB组成、后来还被证实为“高发热、低性能”,但也是历史上第一款双核了。约1周后,AMD拿出了双核Athlon 64 X2。&br&&figure&&img src=&https://pic1.zhimg.com/50/bc3dabc4867_b.jpg& data-rawwidth=&860& data-rawheight=&820& class=&origin_image zh-lightbox-thumb& width=&860& data-original=&https://pic1.zhimg.com/50/bc3dabc4867_r.jpg&&&/figure&Athlon 64 X2可以说是AMD历史上最成功的CPU,凭借K8微架构的优势,功耗控制、双核性能都领先于Intel的Pentium D。凭借这款真正意义上的双核CPU,AMD挑起了“真假双核”之争,Intel只好沉默了,这让AMD开始骄傲了起来,尽管市场方面它还并未获得应有的优势。&br&&br&在这个时候,AMD做了一个在今天看来属于鲁莽级别的决定——收购显卡厂商ATI,尽管从某些角度看这桩高达54亿美元交易是一个不错的决定,但其实非常的不划算,有三个原因:&br&&br&第一,这件事情提醒了Intel,未来CPU和GPU会在某种程度上进行融合。后来,Intel利用CPU制程工艺和酷睿架构上的优势,快速跟进,抢险完成了CPU和GPU的整合,在性能和功耗上找到了动态的平衡,进而提供了更加符合笔记本电脑需求的整合产品,于是在笔记本电脑会取代台式电脑的大势下,AMD又一次完败。&br&&br&第二,触怒了显卡领域的老大—— NVIDIA,促使它不得不与Intel联合,一起对付AMD+ATI的组合。很显然,Intel & AMD && NVIDIA & ATI,这种PK基本上是一边倒;&br&&br&第三,AMD收购ATI并完成整合才会有战斗力,但这显然不是一个简单的过程,对手肯定不会停下来等待,于是AMD在没有将多核的优势保持太久,Intel就于日发行了新一代的Core(酷睿)架构处理器,而它却陷入了旷日持久的财务危机。&br&&br&&figure&&img src=&https://pic2.zhimg.com/50/5dffdc82d7ab25e79632_b.jpg& data-rawwidth=&450& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic2.zhimg.com/50/5dffdc82d7ab25e79632_r.jpg&&&/figure&&br&自从Core处理器面世之后,直到今时今日,Intel在PC端的地位再也没有被撼动过。&br&&br&--------------------&br&&b&## &/b&&b&7,Ajax的发明促进了Web2.0,JavaScript焕发了青春!&/b&&br&&br&&b&###&/b&&b&(一)&/b&&br&看到这里,可能有人会质疑笔者的啰嗦,为啥要花这么多笔墨来书写这些与浏览器、JavaScript无关的事情?&br&&br&当然,在很多人看来这是毫无关系的。但在我看来,从硬件的角度才更容易看清互联网技术快速发展背后的原因。为什么这么说?&br&&br&这是因为CPU和GPU是PC的核心,而Intel、AMD和NVIDIA则是整条生态链的顶端,它们之间的竞争其实是整个PC行业的风向标,而硬件的快速发展则大大促进了PC互联网(传统互联网,相对于移动互联网而言)的高速发展,竞争尘埃落定的那一刻则正好是PC互联网辉煌的开始,你还觉得这是偶然吗?&br&&br&然而,事情并不是这样简单的。PC硬件领域的军备竞赛决出了胜负,参与对决的选手都可能太过于投入,Intel、AMD和NVIDIA都忽略它们的革命者——高通,并而在一定程度上错失了另一个世界——移动互联网。&br&&br&当然,我们依然要感谢Intel、AMD以及NVIDIA,如果没有他们的竞争,我们不可能这么快地使用到各种多核、多进程、多线程技术,互联网的发展也不会发展得这么快,这么的朝气蓬勃。&br&&br&从2000年到2006年,这是在PC硬件和PC互联网高速发展时代,在这个过程中,浏览器还只是一个相对狭窄的领域,尽管它是互联网的入口,在这个过程中,互联网信息的生产主要依赖传统的手段,直到分出了胜负那一刻,你我他等普通网民(YOU)才成为了信息的主要制造者。&br&&br&&figure&&img src=&https://pic3.zhimg.com/50/34b41b9af51f3d55898f5a_b.jpg& data-rawwidth=&468& data-rawheight=&620& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic3.zhimg.com/50/34b41b9af51f3d55898f5a_r.jpg&&&/figure&还记得这个封面吧?&a href=&//link.zhihu.com/?target=http%3A//news.qq.com/a/838.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网民成为美国时代周刊2006年年度人物(图)&/a&&br&&br&&b&###(二)&/b&&br&&br&在IE称霸天下的途中,在Intel和AMD争霸的过程中,Web领域都发生了些什么大事?&br&&ul&&li&1999年,IE 5部署了XMLHttpRequest接口,允许Javascript发出HTTP请求,为后来大行其道的Ajax应用创造了条件。&br&&/li&&li&2000年,KDE项目重写了浏览器引擎KHTML,为后来的WebKit和Blink引擎打下基础。这一年的10月23日,KDE 2.0发布,第一次将KHTML浏览器包括其中。&br&&/li&&li&2001年,微软公司发布Internet Explorer 6。这是当时最先进的浏览器,它后来统治了浏览器市场多年。&br&&/li&&li&2001年,Douglas Crockford提出了JSON格式,用于取代XML格式,进行服务器和网页之间的数据交换。JavaScript可以原生支持这种格式,不需要额外部署代码。&br&&/li&&li&2002年,Mozilla项目发布了它的浏览器的第一版,后来起名为Firefox。&br&&/li&&li&2003年,苹果公司发布了Safari浏览器的第一版。&br&&/li&&li&2004年,Google公司发布了Gmail,促成了互联网应用程序(Web Application)这个概念的诞生。由于Gmail是在4月1日发布的,很多人起初以为这只是一个玩笑。&br&&/li&&li&2004年,Dojo框架诞生,为不同浏览器提供了同一接口,并为主要功能提供了便利的调用方法。这标志着JavaScript编程框架的时代开始来临。&br&&/li&&li&2004年,WHATWG组织成立,致力于加速HTML语言的标准化进程。&br&&/li&&li&2005年,苹果公司在KHTML引擎基础上,建立了WebKit引擎。&br&&/li&&li&2005年,Ajax方法(Asynchronous Javascript and XML)正式诞生,Jesse James Garrett发明了这个词汇。它开始流行的标志是,2月份发布的Google Maps项目大量采用该方法。它几乎成了新一代网站的标准做法,促成了Web 2.0时代的来临。&/li&&li&&p&2005年,Apache基金会发布了CouchDB数据库。这是一个基于JSON格式的数据库,可以用Javascript函数定义视图和索引。它在本质上有别于传统的关系型数据库,标识着NoSQL类型的数据库诞生。&/p&&/li&&li&&p&2006年,jQuery函数库诞生。jQuery为操作网页DOM结构提供了非常强大易用的接口,成为了使用最广泛的函数库,并且让Javascript语言的应用难度大大降低,推动了这种语言的流行。&/p&&/li&&li&&p&2006年,微软公司发布IE 7,标志重启浏览器的开发。&br&&/p&&/li&&/ul&(以上是阮老师的文字,我是复制粘贴)&br&&br&从这些事件看到,JavaScript本身变化并不明显,它依旧是单线程和异步的,但是浏览器及相关Web技术已经有了很大的飞跃。虽然我们鄙视IE,但它还是提供了一些新的并且很有用的接口,比如XMLHttpRequest。&br&&br&2005年,Ajax方法(Asynchronous Javascript and XML)正式诞生,它实现的基础就是IE的XMLHttpRequest接口。有了它,更加注重交互体验的网络应用才会更加受欢迎,用户参与的积极性才会更高,于是Web2.0来了。&br&&blockquote&&b&什么是Web2.0?补脑的传送门:&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/733.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&web2.0_百度百科&/a&&/b&&br&简单地说,Web2.0 是相对于Web1.0 的新的时代,指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式。Web2.0模式下的互联网应用具有以下显著特点:&br&&ul&&li&1.用户分享。在Web2.0模式下,可以不受时间和地域的限制分享各种观点。用户可以得到自己需要的信息也可以发布自己的观点。&br&&/li&&li&2.信息聚合。信息在网络上不断积累,不会丢失。&br&&/li&&li&3.以兴趣为聚合点的社群。在Web2.0模式下,聚集的是对某个或者某些问题感兴趣的群体,可以说,在无形中已经产生了细分市场。&br&&/li&&li&4开放的平台,活跃的用户。平台对于用户来说是开放的,而且用户因为兴趣而保持比较高的忠诚度,他们会积极的参与其中。&/li&&/ul&&/blockquote&&b&--------------------&br&&/b&&b&## &/b&&b&8,为什么&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/subview/.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ajax&/a&不是其他时刻出现,而是在2005年?&/b&&br&&br&这可能是一个偶然的事件。&br&&br&实际上,这个技术应该Google Maps发布之前就已经被使用了,时间应该在2004年-2005年之间,但是Jesse James Garrett还没有想好叫什么名字或暂时不想公布罢了。&br&&br&要知道早在1999年,IE 5就部署了XMLHttpRequest接口,后来很长一段时间里面,JavaScript本身并没有翻天覆地的变化,它完全可以在更早的时间里被发明出来。不是吗?&br&&br&当然,你完全可以说是一种偶然,但我依然不这么认为。可以从硬件层面解析,它的出生时间节点和CPU技术发展是密不可分的。&br&&br&下图是同步请求和异步请求的差异:&br&&figure&&img src=&https://pic4.zhimg.com/50/ff97cd5e303f50e38e21ca536c9023bd_b.jpg& data-rawwidth=&475& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&475& data-original=&https://pic4.zhimg.com/50/ff97cd5e303f50e38e21ca536c9023bd_r.jpg&&&/figure&&br&再来看看这个CPU的单线程和多线程的差异;&br&&figure&&img src=&https://pic4.zhimg.com/50/a17fae049a91a207bbbeccfe59cbc3e1_b.jpg& data-rawwidth=&686& data-rawheight=&430& class=&origin_image zh-lightbox-thumb& width=&686& data-original=&https://pic4.zhimg.com/50/a17fae049a91a207bbbeccfe59cbc3e1_r.jpg&&&/figure&有没有发现,两种技术有着异曲同工之处吗?我之前反复强调过这样的概念——&u&软件是根植于硬件,只有硬件层面的技术支持完善了,相应的软件技术才会有用武之地。&br&&/u&&br&我们都知道,JavaScript是一个单独的线程,而http请求也是,但它们都必须基于同一个浏览器进程。那么,请问在单核心单进程的硬件环境下,JavaScript发起一个异步http请求和发起一个同步请求,对于浏览器进程而言,两者有很明显的区别吗?&br&&br&很显然,不会有明显的区别。&br&&br&因此,在Win98时代,理论上IE5已经支持AJAX了,但开发人员并不会考虑用它来做什么,理由是硬件和系统层面不给力。但随着CPU的单核多线程和多核多线程技术的完善,OS积极利用这些技术,使得运行在其上面的软件的多个线程能力明显加强了。&br&&br&于是,就有了程序员来思考单线程的JavaScript如何利用异步来发起http请求这种技术。由于在OS层面,浏览器可以根据CPU的多线程并行执行的特点,将HTTP请求安排到JavaScript线程之外的线程堆栈里面来执行,进而改善Web界面交互的体验。&br&&figure&&img src=&https://pic1.zhimg.com/50/aa3af7ccb7183b_b.jpg& data-rawwidth=&990& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&990& data-original=&https://pic1.zhimg.com/50/aa3af7ccb7183b_r.jpg&&&/figure&这是我根据自己的理解所画的,表示在一个支持双线程系统上的某个浏览器进程中,JavaScript发起AJAX请求后的运行状态示意图。&br&&br&从CPU硬件及系统发展角度看,Ajax也应该在这个时间节点上出现,或许它不叫“Ajax”,而是其他名字。&br&&br&当然,如果从Web互联网的角度思考,Ajax的出现是因为随着互联网信息传输量的不断加大,传统的Web应用所采用的同步交互方式显现出越来越明显的问题。当服务器端处理请求时,浏览器端的用户就必须要等待,只有到最终的响应结果传输到浏览器客户端时,整个页面才会重新进行刷新,以显示处理的结果。&br&&br&可以想象,这样的一种处理方式往往会让用户的体验变得不连贯、不顺畅。JavaScript异步交互的处理方式则能够很好的解决这个问题,而正好IE提供了XMLHttpRequest接口,于是基于异步交互的JavaScript技术被人们发明了出来。&br&&br&--------------------&br&&b&## &/b&&b&9,JavaScript成为宠儿,是历史的选择。&/b&&br&&br&在我看来,JavaScript被设计成单线程是由于它独特的运行环境决定的,它出生在一个普通的这个家庭(网景浏览器),而非底蕴更加深厚的豪门(接近底层的OS)。也就是说,JavaScript决定不了自己的出身,但它的父亲(Brendan Eich)还是非常尽职尽责的,并且很有远见的。&br&&br&虽然只能给它一颗单线程的心,但却赋予了异步的灵魂。尽管出生的时机也不太对(微软开始独霸天下),并且准备也不够充分(只用了10天时间),导致JavaScript天生有些营养不良,但它却是赶上了一个好的时代——互联网的飞速发展。&br&&br&在众人的努力帮助下,帮JavaScript改良的体质,将单线程+异步的特性发挥并很好地运作起来,进而焕发了青春!跟随者互联网环境的发展,在没有可替代品的前提下,JavaScript的潜力被人们发挥到了极致。&br&&br&人们发明基于JavaScript的Ajax技术,从某种意义上看,这一发明是对于JavaScript而言是一件生死攸关的大事。因为正当人们对Web应用有更高的体验要求时,它的出现正好满足了这种需求,而这里的关键其实是JavaScript这门语言的异步特性,让浏览器端与服务器的对话不再阻塞用户的交互。&br&&br&事实上,除了JavaScript外,能够实现AJAX技术的HTML脚本语言还有&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/24920.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VBScript&/a&和&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/40829.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JScript&/a&,它们都来自微软,在当时都只能运行于Windows平台下,这两语言拥有得天独厚的优势,因为它的运行环境——IE6发布之后不久就夺取了统治级别的地位,并于2002年达到96%的峰值。&br&&br&&b&### 为什么&/b&&b&VBScript&/b&&b&没能成为“JavaScript”呢?&/b&&br&&br&我下面讨论的是VBScript&b&,而不是&/b&JScript,因为现在的JavaScript其实网景的JavaScript和微软的JScript的合体,两者都是&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/810176.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ECMAScript&/a&规范在浏览器上的实现。&br&&br&原因很多,我认为有以下2点(原来有3点):&br&&br&&b&#### 第1,来自非Windows体系的浏览器组织的抗争。&/b&&br&&br&其中,最重要的就是&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/393243.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mozilla&/a&,它最初是由网景公司内部成立的,后来网景被AOL收购后,这一组织独立了出来,并接管了网景许多业务,而它最重要的产品就是开发人员非常熟悉的Firefox。我们都知道Firefox一直和IE对着干,其原因就是它是网景体系的延续(JavaScript创造者Brendan Eich一直是Mozilla的带头人)。&br&&br&除了Mozilla组织外,还有苹果以及KDE项目等。虽然这些对手在当时还非常弱小,但星星之火可以燎原,后来就是这些不起眼的对手将IE赶下了神坛。很显然,死而不僵的网景起到了关键的作用,作为前端开发从业者,我们应该好好感谢网景。&br&&figure&&img src=&https://pic1.zhimg.com/50/194c89abb5ba1ddb0e17_b.jpg& data-rawwidth=&500& data-rawheight=&140& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic1.zhimg.com/50/194c89abb5ba1ddb0e17_r.jpg&&&/figure&&br&(前端人记得烧柱香,祭拜一下)&br&&br&&b&#### 第2,微软的垄断导致Windows和IE的封闭。&/b&&br&&br&Windows 95/98之后,&b&微软霸占了&/b&桌面系统,绝对垄断让它拥有了很多特权,比如IE直接内置在Windows里面,玩死了网景。绝对的市场地位,微软压根不用考虑IE是不是可以安装在其他系统上面,而针对网景的JavaScript,它弄出来的VBScript和JScript也只能运行在IE上面,够封闭吧?&br&&br&然而,除了Windows外,这世界还有不少系统需要浏览器,比如linux系统、比如苹果系统。虽然当时的它们市场份额很小,但是这些系统的用户都是高端用户,拥有非常强势的话语权。正是由于这个原因,浏览器需要一门可以跨平台的编程语言,JavaScript正好符合需求。&br&&br&就这样,JavaScript成为了浏览器端编程的胜利者。&br&&br&于是,人们容忍了它的不足,并主动修补了它的各种缺陷,各种兼容类库纷纷涌现,而jQuery的出现,为Web开发人员操作网页DOM结构提供了非常强大易用的接口,为JavaScript这门语言的流行铺平了道路,而它则成为了最最广泛的JavaScript函数库,没有之一。&br&&br&就这样JavaScript成为了时代的宠儿。现在,它完全有资格矫情地说:“这是命运的安排,躲都躲不开。”&br&&br&--------------------&br&&b&## 10,移动互联网的崛起,浏览器成为入口,JavaScript被迫成为王者。&/b&&br&&br&&b&### (一)&/b&&br&时间来到2007年。&br&&br&对于整个互联网而言,这是非常重要的一年。这一年的互联网依旧是PC的天下,PC硬件依然在摩尔定律的指挥下高速发展,而AMD则依然在和Intel抗争。&br&&br&当然,计算机行业也在发生着变化,笔记本电脑开始取代台式电脑,成为了人们上网的主要选择,而网络成为了人们日常生活的重要组成部分,电脑工具化的趋势已经越来越明显。为此,人们发明了“上网本”这种东西,并掀起了一阵移动上网的热潮。&br&&figure&&img src=&https://pic3.zhimg.com/50/837ddc76a3e155c765079ce_b.jpg& data-rawwidth=&940& data-rawheight=&627& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&https://pic3.zhimg.com/50/837ddc76a3e155c765079ce_r.jpg&&&/figure&首款上网本是由华硕于2007年8月发布的,但日华硕发布申明不再生产这类产品,这意味着在“上网本”告别了舞台。这类产品曾被誉为“未来之星”,但存世的时间只有短短5年,它一度“辉煌”过但却又快速消亡。这一定是有原因的。&br&&br&在我看来,这是PC行业(包括硬件和软件)看到移动互联网崛起的迹象后,发明的一种用于满足人们移动上网需求的产品,这显然只是传统PC领域的一次意淫。这里面的玩家都一度玩得很嗨,包括领头羊Intel也专门为此类产品开了专门的CPU产品线——&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/1893620.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Atom处理器&/a&,定位就锁定在个人的第二台电脑,希望人们专门用它来上网。&br&&br&领头羊的带头示范作用还是非常牛逼的。刹那间,PC行业来了非常多的跟随者,除了传统的笔记本厂商跟积极进外,许多非笔记本厂商也想分一杯羹。&br&&br&记得2009年的时候,我还是一名IT编辑时参加了报社的重要合作伙伴——多彩科技的上网本发布会,它高价请来了当时红极一时的周迅来代言,异常高调。在发布会的现场,我第一次近距离接触了娱乐圈的当红花旦,很是兴奋。&br&&br&不过我不是娱记,可没机会采访明星要个签名什么的,而是被安排对多彩科技总裁进行了专访,这是本人以媒体记者身份进行的最后一次相对高级别的采访,之后不久我就离开媒体转行了做了开发,因此对此记忆非常深刻。&br&&br&如果你了解PC行业的话,就应该知道多彩科技其实是一家以机箱、电源、键鼠等为电脑外设产品为主的传统硬件企业。就是这样一家外设企业也想来分一杯羹,可想而知,整个行业是多么重视“上网”这个需求!&br&&br&然而,这种为了上网而“上网”的PC硬件,其实是一个虚假的需求。或许,这个描述可能有点问题,“移动上网”这个需求并不虚假,但传统IT企业在大方向上弄错了!悲催的是,这是上游——由一线厂商华硕发起,然后由领头羊Intel主导的一次针对互联网移动化的变革。&br&&br&当然了,有头羊的带领,后面的小羊就会不假思索地往前冲,但用户并不是十分买账!上网本的结局早已注定,这不仅是一个短命的产品,而且整个PC行业几乎没人能够从这里面分到蛋糕。&br&&br&新闻传送门:&a href=&//link.zhihu.com/?target=http%3A//fashion.pconline.com.cn/article_source/164777.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&永别了上网本! 本经典之华硕 EeePC 700_笔记本&/a&&br&&br&&b&###(二)&/b&&br&&br&当然,传统硬件企业在互联网变革大潮中的很多努力和尝试,并非没有任何意义。比如上面提到的上网本(Google的ChromeOS就是为了在它上面运行),传统硬件企业尝试通过更小号的笔记本电脑来满足移动上网这个需求,虽然不失败了,但也在一定程度上教育了市场,教育了用户。&br&&br&与此同时,在硬件变革的带动下,除了Intel和苹果外,Google、微软、诺基亚等各个领域的领头羊都在积极探索如何移动互联。&br&&br&微软一直都是努力的,旗下的&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/40733.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Windows Mobile&/a&一直在求变,但缓慢的市场反应和布局而让其收效甚微。抱着号称最牛逼的智能手机系统——塞班大腿的诺基亚成为了手机行业的老大,但其实也没有闲着,联合Intel搞了一个叫&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/3263982.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MeeGo&/a&的手机系统,但最后也胎死腹中。&br&&br&除了苹果外,成功者唯有既不是传统软件也不是硬件的纯互联网大咖——Google,它针对移动互联网的布局要早于苹果。我们可以从三个关键事情上看到Google的野心。&br&&br&&b&#### 第一,2004年,扶持Mozilla的Firefox来对抗微软的IE。&/b&&br&&br&自2004年起,Google搜索便开始作为火狐浏览器的默认搜索引擎,并且Google针对Firefox开发了响应的浏览器工具条,依靠搜索变现,Mozilla在IE的夹缝中生存了下拉(绝大多数营收来自Google的搜索分成),并在很长一段时间内是仅次于微软的第二大浏览器厂商。&br&&blockquote&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//www.cnbeta.com/articles/151851.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&解惑:Google为什么需要Firefox&/a&&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.csdn.net/article//2822853& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&与Google分道扬镳,Firefox新默认搜索引擎Yahoo!&/a&&/li&&/ul&&/blockquote&&br&&b&#### &/b&&b&第二,2005年,低价收购安卓&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/subview/2617.htm%3Ffromtitle%3D%Protect%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android&/a&&/b&&b&。&/b&&br&&br&&p&2005年,Google仅花费5000万美元低调收购Android公司。Android公司起初仅仅是一家默默无闻的美国公司,经Google之手,摇身一变成为全球最流行的操作系统平台。2010年,Android操作系统已经在智能手机市场达到33%的市场占有率,Google曾表示Android是“史上最佳收购”。而今天,Android更是稳稳占据全球智能手机市场逾80%的份额。&/p&&blockquote&&ul&&li&&b&&a href=&//link.zhihu.com/?target=http%3A//www.newhua.com/7510.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&盘点Google史上八笔重大收购&/a&&/b&&br&&/li&&/ul&&/blockquote&&br&&p&&b&#### &/b&&b&第三,2006 年开发V8引擎,2008年发布Chorme。&/b&&/p&&br&&p&作为Web开发从业者对于&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/subview/75433.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&V8(JavaScript引擎)&/a&和&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/1835854.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google Chrome&/a&一定不会陌生,这里就不介绍了。不清楚的,自己补脑。当然,在2006年和2008年之间,也就是2007年的11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。&/p&&br&&b&###(三)&/b&&br&&br&&p&今天,我们知道浏览器已经取代OS(APP内置浏览器也算在内)成为人们获取信息的标准入口。那么,从这一角度回头看Google当初针对移动互联网的布局,完全可以用环环相扣、步步惊心、招招致命等很多牛逼的形容词来描述。&/p&&br&&p&对此,我的解读是这样的:&/p&&br&&p&要想占领移动互联网的入口,从底层来思考,必须有两个武器——移动端的OS和浏览器引擎。Google两个都没放过,当然苹果也一样。&/p&&br&&p&咱先不说OS,单就我们熟悉的浏览器而言,要想获得更好的性能体验,必须解决浏览器的引擎性能问题,于是WebKit成为了Chrome和Safari的标配。但这还是不够的,除了渲染引擎外,要改善浏览器的性能更重要的其实是优化&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/9475854.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript引擎&/a&,只有提高了浏览器平台上的编程语言的性能,那么才会真正提高浏览器的性能。&/p&&br&&p&同时,考虑到未来移动互联网可能存在跨平台应用的需求,V8引擎一开始就没有说一定要在浏览器上才能运行,这一点或许不是Google当初做这个决定能够想到的(我无法确定,只是意淫),但正是这一举措,让JavaScript终于可以脱离浏览器这个环境而运行了。&/p&&br&&p&于是,就在Chrome发布后不久,NodeJS出来了!&/p&&br&&p&虽然NodeJS可以让JavaScript运行在服务端,本质上和在浏览器端进行开发是完全两个不同的工作,很难说有太直接的关系,但是正是由于它的出现,大大拓宽了JavaScript的应用范围,让Web开发的从业者看到了前端的深度,并且基于NodeJS开发的各种前端工具,极大地改良了前端开发的生态,JavaScript成为了最受欢迎的开发语言,让前端开发成为了炙手可热的技术工种。&/p&&p&&figure&&img src=&https://pic3.zhimg.com/50/a7da709b0e18_b.jpg& data-rawwidth=&698& data-rawheight=&636& class=&origin_image zh-lightbox-thumb& width=&698& data-original=&https://pic3.zhimg.com/50/a7da709b0e18_r.jpg&&&/figure&(数据来源&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/research/developer-survey-techLanguages-2015& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stack Overflow Developer Survey 2015&/a&)&br&&/p&&br&&p&然而,假设当初Google没有扶持FireFox来对抗IE,那么微软的VBScript完全有可能发展成为浏览器端的主流编程语言。一旦基于VBScript的开发生态圈建立起来,那么后来的网站首选服务端开发语言就可能是.NET,而客户端的首选则是VBScript了。&/p&&br&&p&以微软在民用OS上的垄断,再加上IE6统治级市场份额,只要身段稍微低那么一点点,比如及时出一个MAC版本和Linux版本IE6来封堵一下FireFox,那么上述的可能性是存在的,不是吗?&/p&&br&&p&但这只是假设,历史是不能重演的。在通过FireFox稳住了JavaScript的阵脚之后,针对IE内核在JavaScript渲染上的性能瓶颈,立马做出了优化JavaScript引擎的重要决定,于是V8项目就被立项了。&/p&&br&&p&而V8的出现极大地改善了JavaScript的性能,瞬间可以秒掉微软的&a href=&//link.zhihu.com/?target=http%3A//www.966266.com/jishu/jscript.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JScript&/a&引擎,进而大大促进了JavaScript语言的发展。正是浏览器背后的JavaScript渲染引擎的对决,让Google获得了浏览器端开发语言的胜利,再加上安卓系统这个操作系统,使得它能够更加从容地对移动互联网进行布局。&/p&&br&&p&对于微软而言,死而不僵的网景是它的噩梦,正是它留下的那点点星火,在Google的照料下实现了燎原。&/p&&br&&p&&b&###(四)&/b&&/p&&br&&p&这里我还是想继续聊聊上网本这个移动上网设备,它为什么会被推出而又快速消亡?在我看来,有两个方面的原因:&/p&&br&&p&第一,2006年以后,CPU进入到多核多线程时代,在办公上网这种日常应用上面,PC硬件的性能已经出现盈余。通俗地说,电脑性能过剩了。剩余的性能如果不用来玩游戏,那么就是一种浪费,于是CPU开始被阉割。&/p&&br&&p&第二,互联网的快速发展,人们随时随地需要上网的欲望越来越大,而当时的智能手机及其生态圈还不足以满足人们的需求,因此更小号的笔记本或许可以胜任。&/p&&br&&p&就这样,上网本就被推上了历史的舞台。但是人们需要的是随时随地上网,比如一手扶着地体、公交的扶手时,另一只手也能上网!很显然,上网本并不能满足需求,能够上网的手机才是最佳的选择。&/p&&p&&figure&&img src=&https://pic4.zhimg.com/50/08fcf9a7f9e7a37a2fa2bf_b.jpg& data-rawwidth=&640& data-rawheight=&420& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/50/08fcf9a7f9e7a37a2fa2bf_r.jpg&&&/figure&日,&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/15181.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&苹果公司&/a&前&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/subview/3.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&首席执行官&/a&&a href=&//link.zhihu.com/?target=http%3A//baike.baidu.com/view/90660.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&史蒂夫·乔布斯&/a&宣布苹果将发布第}

我要回帖

更多关于 满足需求 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信