一、归并排序css
二、快速排序html
三、算法复杂度python
四、哈希表数据结构mysql
一、设计一个用户关注系统的数据库表,写三个相关的SQL语句
两张表,一张user表,一张relation表程序员
# 创建user表web
create table user(name varchar(30) not null)
# 创建relation表:uid--用户ID,rid--用户关注的人IDajax
create table relation(uid int not null,rid int not null)
# 1.查询用户a关注的人redis
select name from user where id in (select rid from relation where uid = a)
# 2.查询关注用户a的人算法
select name from user where id in (select uid from relation where rid = a)
# 3.查询和a相互关注的人sql
select name from user where id in (select uid from relation where rid = a and uid in (select rid from relation where uid = a))
# 普通索引 INDEX index_emp_name (name) 或者 KEY index_dept_name (dept_name) # 惟一索引 UNIQUE INDEX index_emp_name (name) # 全文索引 FULLTEXT INDEX index_resume (resume) #多列索引(联合索引) INDEX index_name_resume (name, resume) #CREATE在已存在的表上建立索引 CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(长度)] [ASC |DESC]) ; #ALTER TABLE在已存在的表上建立索引 ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX索引名 (字段名[(长度)] [ASC |DESC]) ; # 删除索引 DROP INDEX index_emp_name on emp1
MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须从新编译MYSQL。在缺省状况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也经常可使用。
ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。所以,ISAM执行读取操做的速度很快,并且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不可以容错:若是你的硬盘崩溃了,那么数据文件就没法恢复了。若是你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实 时数据,经过其复制特性,MYSQL可以支持这样的备份应用程序。
MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操做,其代价是你须要常常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操做,这可能就是为何MySQL受到了WEB开发如此青睐的主要缘由:在WEB开发中你所进行的大量数据操做都是读取操做。因此,大多数虚拟主机提供商和INTERNET平台提供商只容许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
HEAP:HEAP容许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,可是它所管理的数据是不稳定的,并且若是在关机以前没有进行保存,那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很是有用。要记住,在用完表格以后就删除表格。
InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢不少,可是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,若是你的设计须要这些特性中的一者 或者二者,那你就要被迫使用后两个引擎中的一个了。
MySQL 官方对InnoDB是这样解释的:InnoDB给MySQL提供了具备提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级而且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特点增长了多用户部署和性能。没有在InnoDB中扩大锁定的须要,由于在InnoDB中行级锁定适合很是小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你能够自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也能够混合。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率多是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被彻底与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它本身的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间能够包含数个文件(或原始磁盘分区)。这与MyISAM表不一样,好比在MyISAM表中每一个表被存在分离的文件中。InnoDB 表能够是任何尺寸,即便在文件尺寸被限制为2GB的操做系统上。
InnoDB默认地被包含在MySQL二进制分发中。
InnoDB被用来在众多须要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。 Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的
MyISAM适合:(1)作不少count 的计算;(2)插入不频繁,查询很是频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都至关的频繁,而且表锁定的机会比较大的状况。
通常状况下,MySQL会默认提供多种存储引擎,能够经过下面的查看:
(1)看你的MySQL如今已提供什么存储引擎: mysql> show engines;
(2)看你的MySQL当前默认的存储引擎: mysql> show variables like '%storage_engine%';
(3)你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎): mysql> show create table 表名;
对mysql优化是一个综合性的技术,主要包括
互联网协议(Internet Protocol Suite)是一个网络通讯模型,以及一整个网络传输协议家族,为互联网的基础通讯架构。它常被通称为TCP/IP协议族,简称TCP/IP。
TCP协议是面向链接,保证高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复达到)
UDP:面向无链接的通信协议,不可靠的传输,数据丢失,无论数据包的顺序、错误或重发(qq基于udp协议)
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,是Web联网的基础,也是手机联网经常使用的协议之一,HTTP协议是创建在TCP协议之上的一种应用。
HTTP链接最显著的特色是:
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不一样。因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。
灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。
支持B/S及C/S模式。
https协议须要到CA申请证书,通常免费证书不多,须要交费。
http是超文本传输协议,信息是明文传输;https 则是具备安全性的ssl加密传输协 议。
http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
客户端先发送FIN,进入FIN_WAIT1状态
服务端收到FIN,发送ACK,进入CLOSE_WAIT状态,客户端收到这个ACK,进入FIN_WAIT2状态
服务端发送FIN,进入LAST_ACK状态
客户端收到FIN,发送ACK,进入TIME_WAIT状态,服务端收到ACK,进入CLOSE状态
域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程当中,须要用SSL/TLS对数据进行加密和解密,须要用HTTP对加密后的数据进行传输,由此能够看出HTTPS是由HTTP和SSL/TLS一块儿合做完成的。
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通讯提供安全及数据完整性的一种安全协议。SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL,其最新的版本是3.0。
TLS的全称是Transport Layer Security,即安全传输层协议。在TLS与SSL3.0之间存在着显著的差异,主要是它们所支持的加密算法不一样,因此TLS与SSL3.0不能互操做。虽然TLS与SSL3.0在加密算法上不一样,可是在咱们理解HTTPS的过程当中,咱们能够把SSL和TLS看作是同一个协议。
dns是一个域名系统,是万维网上做为域名和IP地址相互映射的一个分布式数据库,可以使用户更方便的访问互联网,而不用去记住可以被机器直接读取的IP数串。
经过主机名,最终获得该主机名对应的IP地址的过程叫作域名解析(或主机名解析)。在解析域名时,能够首先采用静态域名解析的方法,若是静态域名解析不成功,再采用动态域名解析的方法,域名是互联网上的身份标识,是不可重复的惟一标识资源; 互联网的全球化使得域名成为标识一国主权的国家战略资源。
1 、DNS:域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。
如今顶级域名TLD分为三大类:国家顶级域名nTLD;通用顶级域名gTLD;基础结构域名
域名服务器分为四种类型:根域名服务器;顶级域名服务器;本地域名服务器;权限域名服务器。
二、FTP:文件传输协议FTP是因特网上使用得最普遍的文件传送协议。FTP提供交互式的访问,容许客户指明文件类型与格式,并容许文件具备存取权限。FTP其于TCP。
三、telnet远程终端协议:telnet是一个简单的远程终端协议,它也是因特网的正式标准。又称为终端仿真协议。
四、HTTP:超文本传送协议,是面向事务的应用层协议,它是万维网上可以可靠地交换文件的重要基础。http使用面向链接的TCP做为运输层协议,保证了数据的可靠传输。
五、电子邮件协议SMTP:即简单邮件传送协议。SMTP规定了在两个相互通讯的SMTP进程之间应如何交换信息。SMTP通讯的三个阶段:创建链接、邮件传送、链接释放。
6 、POP3:邮件读取协议,POP3(Post Office Protocol 3)协议一般被用来接收电子邮件。
一、并发:系统具备处理多个任务的能力;
二、并行:系统具备同时处理多个任务的能力;并行是并发的子集;
三、同步:当进程执行到一个IO(等待外部数据)的时候,必须等待;好比打电话,一直等到对方接听;
四、异步:当进程执行到一个IO(等待外部数据)的时候,不等待,直到数据接收成功,再回来处理;好比发短信,不须要等到对方回复,能够先去作别的,收到后再来回复短信;
五、IO多路复用:监听多个socket对象(while循环),谁有变化就处理谁,利用这个特性,能够开发出不少操做,好比异步IO模块;
六、异步IO:当进程执行到一个IO(等待外部数据)的时候,不等待,直到数据接收成功,再回来处理,其实就是回调;
七、利用非阻塞的socket+IO多路复用,能够实现伪并发;
八、协程:
线程和进程的操做是由程序触发系统接口,最后的执行者是系统;协程的操做则是程序员;
协程存在的意义:对于多线程应用,CPU经过切片的方式来切换线程间的执行,线程切换时须要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的适用场景:当程序中存在大量不须要CPU的操做时(IO),适用于协程,即高并发的io操做,协程比多线程节省时间;
九、线程
一个应用程序能够有多进程、多线程;默认是单进程、单线程;
每个进程有一个全局解释器锁(GIL),每一次CPU调用只能调用一条线程;
若是是IO操做,不占用CPU,单进程,多线程能够提升并发;
若是是计算型操做,占用CPU,多进程提升并发;
十、线程锁:因为线程之间是进行随机调度,当多个线程同时修改同一条数据时可能会出现脏数据,因此出现了线程锁,同一时刻只容许一个线程执行操做
十一、进程
进程本质上就是一个程序运行的过程;进程通常由程序、数据集、进程控制块三部分组成;
一个程序至少有一个进程,一个进程至少有一个线程;
进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源. 一个线程能够建立和撤销另外一个线程;同一个进程中的多个线程之间能够并发执行。
用一个递增的数字去维护数据库,只须要把数字转换成字母的编码格式,就能获得相应的key,而后再把value存成长连接,就实现了短连接和长连接的对应关系。
经过发号策略,给每个过来的长地址,发一个号便可,小型系统直接用mysql的自增索引就搞定了。若是是大型应用,能够考虑各类分布式key-value系统作发号器。不停的自增就好了。第一个使用这个服务的人获得的短地址是 http://xx.xx/0 第二个是 http://xx.xx/1 第11个是 http://xx.xx/a 第依次日后,至关于实现了一个62进制的自增字段便可。
其实咱们并不须要在存储中用62进制,用10进制就行了。好比第10000个长地址,咱们给它的短地址对应的编号是9999,咱们经过存储自增拿到9999后,再作一个10进制到62进制的转换,转成62进制数便可。这个10~62进制转换,你彻底均可以本身实现。
用key-value存储,保存“最近”生成的长对短的一个对应关系。注意是“最近”,也就是说,我并不保存全量的长对短的关系,而只保存最近的。好比采用一小时过时的机制来实现LRU淘汰。
这样的话,长转短的流程变成这样:
因此当一个地址被频繁使用,那么它会一直在这个key-value表中,总能返回当初生成那个短地址,不会出现重复的问题。若是它使用并不频繁,那么长对短的key会过时,LRU机制自动就会淘汰掉它。
固然,这不能保证100%的同一个长地址必定能转出同一个短地址,好比你拿一个生僻的url,每间隔1小时来转一次,你会获得不一样的短地址。可是这真的有关系吗?
上面设计看起来有一个单点,那就是发号器。若是作成分布式的,那么多节点要保持同步加1,多点同时写入,这个嘛,以CAP理论看,是不可能真正作到的。其实这个问题的解决很是简单,咱们能够退一步考虑,咱们是否能够实现两个发号器,一个发单号,一个发双号,这样就变单点为多点了?依次类推,咱们能够实现1000个逻辑发号器,分别发尾号为0到999的号。每发一个号,每一个发号器加1000,而不是加1。这些发号器独立工做,互不干扰便可。并且在实现上,也能够先是逻辑的,真的压力变大了,再拆分红独立的物理机器单元。1000个节点,估计对人类来讲应该够用了。若是你真的还想更多,理论上也是能够的。
301是永久重定向,302是临时重定向。短地址一经生成就不会变化,因此用301是符合http语义的,同时对服务器压力也会有必定减小。
可是若是使用了301,咱们就没法统计到短地址被点击的次数了。而这个点击次数是一个很是有意思的大数据分析数据源。可以分析出的东西很是很是多。因此选择302虽然会增长服务器压力,可是我想是一个更好的选择。
Memcache 是一个开源、高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它经过在内存中缓存数据和对象来减小读取数据库的次数,从而提升动态、数据库驱动网站的速度。它能够应对任意多个链接,使用非阻塞的网络IO。因为它的工做机制是在内存中开辟一块空间,而后创建一个存储键/值对的HashTable,Memcache这个软件项目通常叫Memcache,但项目的主程序文件叫memcached.exe(字母d能够理解为daemon),是靠服务端的这个守护进程管理这些HashTable。因为这个命名问题,因此不少人把这个软件系统叫memcache,想叫成memcached也没什么问题!其守护进程(daemon )是用C写的,可是客户端能够用任何语言来编写,并经过memcached协议与守护进程通讯。
redis是一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。
(1) 速度快,由于数据存在内存中,相似于HashMap,HashMap的优点就是查找和操做的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash,memcached全部的值均是简单的字符串
(3) 支持事务,操做都是原子性,所谓的原子性就是对数据的更改要么所有执行,要么所有不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过时时间,过时后将会自动删除
1)、存储方式 Memecache把数据所有存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。
2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。
3)value大小 redis最大能够达到1GB,而memcache只有1MB
(1) Master最好不要作任何持久化工做,如RDB内存快照和AOF日志文件
(2) 若是数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽可能避免在压力很大的主库上增长从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3... 这样的结构方便解决单点故障问题,实现Slave对Master的替换。若是Master挂了,能够马上启用Slave1作Master,其余不变。
(1)、会话缓存(Session Cache)
(2)、全页缓存(FPC)
(3)、队列
(4),排行榜/计数器
(5)、发布/订阅
分表分库,小图片规整,css/js合并压缩,Redis缓存热点数据,使用浏览器的缓存功能
首先,能够调整webserver配置,修改页面响应时间的参数,延长timeout时间
第二,采用异步方式加载,就是ajax,请求时传递参数到后台,页面显示等待信息,等后台处理完成返回结果再展现
第三,优化你的程序或sql,找出慢的缘由,数据量大只是一个方面,不少大型数据库用的时候也不会慢到哪里去
一、Sql 依赖缓存
对于全部用户读到相同结果的数据,改成从内存中读取,减小数据库访问的次数,下降数据库CPU的压力,但会提升Web服务器的一些压力,和增长少许的内存占用量。
二、页面缓存、控件缓存的技巧
对于全部用户获得相同页面结果的页面来讲,能够采用页面缓存的方式,好比咱们在首页上展现公告信息的结果,这些结果对于全部用户来讲是同样的,能够采用页面缓存的方式,同时经过设置页面缓存的失效机制保证全部用户获得最新的结果,好比后台代码增长新的公告内容时能够设置一个Application的值,告诉页面缓存失效。
三、智能的静态页面处理技巧
一些已经处理完成的页面展现的时候,系统已经再也不有交互的动做,对于用户来讲,仅仅只是查看结果的状况下,能够智能的生成静态页面文件,只有一个用户是经过.NET计算去得到展现,其它用户访问的则是生成的静态页面,这样也能够减小很是大数据量的.NET计算,提升性能。 好比E8.Net工做流平台中展现流程结束后的结果就有客户使用到了这些技巧,大大减小了服务器的压力。
class Person(object): """Silly Person""" def __new__(cls, name, age): print '__new__ called.' return super(Person, cls).__new__(cls, name, age) def __init__(self, name, age): print '__init__ called.' self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if name == 'main': piglei = Person('piglei', 24) print piglei 执行结果: piglei@macbook-pro:blog$ python new_and_init.py new called. init called. <Person: piglei(24)>
经过运行这段代码,咱们能够看到,new方法的调用是发生在init以前的。其实当 你实例化一个类的时候,具体的执行逻辑是这样的:
1.p = Person(name, age)
2.首先执行使用name和age参数来执行Person类的new方法,这个new方法会 返回Person类的一个实例(一般状况下是使用 super(Persion, cls).new(cls, ... ...) 这样的方式),
3.而后利用这个实例来调用类的init方法,上一步里面new产生的实例也就是 init里面的的 self
因此,init 和 new 最主要的区别在于:
1.init 一般用于初始化一个新实例,控制这个初始化的过程,好比添加一些属性, 作一些额外的操做,发生在类实例被建立完之后。它是实例级别的方法。
2.new 一般用于控制生成一个新实例的过程。它是类级别的方法。
可是说了这么多,new最一般的用法是什么呢,咱们何时须要new?依照Python官方文档的说法,new方法主要是当你继承一些不可变的class时(好比int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass。
一、继承自object的新式类才有__new__
二、__new__至少要有一个参数cls,表明当前类,此参数在实例化时由Python解释器自动识别
三、__new__必需要有返回值,返回实例化出来的对象,这点在本身实现__new__时要特别注意,能够return父类(经过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
四、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上能够完成一些其它初始化的动做,__init__不须要返回值
五、若是__new__建立的是当前类的实例,会自动调用__init__函数,经过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,若是是其余类的类名,;那么实际建立返回的就是其余类的实例,其实就不会调用当前类的__init__函数,也不会调用其余类的__init__函数。
优势:
1.简洁易懂
2.跨平台
3.可扩展性
可移植性
既支持面向过程的函数编程也支持面向对象的抽象编程
丰富的标准库和第三方库
缺点:
Python 的执行速度不够快,和C相差五倍,若是是大规模计算问题,大约能差10倍以上,python的效率问题也不是技术缘由致使的,并且python也对这方面有所弥补,那就是对效率敏感的地方能够用C重写,以达到预期的效率需求,可是治标不治本,追求python的高开发效率的同时,就得舍弃一些性能上的追求。
全局解释器锁GIL(Global Interpreter Lock),致使计算密集型任务效率低下;以致于我如今对高并发计算都采起多进程的模式。多进程模式的通信效率确定比多线程低,并且麻烦。
解释性语言和编译型语言的区别:
1.编译型语言在程序执行以前,有一个单独的编译过程,将程序翻译成机器语言,之后执行这个程序的时候,就不用再进行翻译了。
2.解释型语言,是在运行的时候将程序翻译成机器语言,因此运行速度相对于编译型语言要慢。
3.C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。