raymond williams谈python如何成为它最喜欢地编程语言的一篇文

写简单游戏,学编程语言-python篇:大鱼吃小鱼 - lophy - 博客园
  很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码。这边主要还是以学习编程语言和学习编程思路为重点记录一下吧。最近时间有点吃紧,只能匆忙记录一下。用pygame做的大鱼吃小鱼的游戏截图如下:(有些鱼的图片背景没有做透明处理,这块确实需要点美工时间,只能先凑合了)。
下面的图片是网上随便找的素材,这里用于切换主角的图片有三张,其他则是其他小鱼和boss鱼。我们控制的主人鱼的大小范围来决定加载不同的图片。以上准备的素材,其中一些背景色没有时间做处理,所以游戏中会有难看的背景色,只能凑合着用。。。
一、玩法及逻辑相关:
  控制你的鱼,有个初始大小,当碰到比你小的鱼的时候,你会吃掉它,并且会变大;遇到比你大的鱼,受到一点伤害,当总生命值为0时,失败游戏结束;当你控制的鱼大小增大最大时,游戏获胜。当鱼受到伤害时,有一段时间是无敌时间,且会闪烁。下面是主要的逻辑处理代码
flashIsOn=round(time.time(),1)*10%2==1
if not gameOverMode and not (invulnerableMode and flashIsOn):
playerobj['rect']=pygame.Rect((playerobj['x']-camerax,playerobj['y']
-cameray,playerobj['size'],playerobj['size']))
SCREEN.blit(playerobj['surface'],playerobj['rect'])
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN:
if event.key in (K_UP,K_w):
moveDown =False
moveUp = True
elif event.key in (K_DOWN,K_s):
moveDown =True
moveUp = False
elif event.key in (K_LEFT,K_a):
moveRight = False
moveLeft= True
if playerobj['facing']==RIGHT:
playerobj['surface']=playersurfaceset(playerobj['size'], True)
playerobj['facing']=LEFT
elif event.key in (K_RIGHT,K_d):
moveRight = True
moveLeft= False
if playerobj['facing']==LEFT:
playerobj['surface']=playersurfaceset(playerobj['size'], False)
playerobj['facing']=RIGHT
elif winMode and event.key == K_r:
elif event.type==KEYUP:
if event.key in (K_LEFT,K_a):
moveLeft=False
elif event.key in (K_RIGHT,K_d):
moveRight=False
elif event.key in (K_UP,K_w):
moveRight=False
elif event.key in (K_DOWN,K_s):
moveRight=False
if not gameOverMode:
if moveLeft:
playerobj['x']-=MOVESPEED
if moveRight:
playerobj['x']+=MOVESPEED
if moveUp:
playerobj['y']-=MOVESPEED
if moveDown:
playerobj['y']+=MOVESPEED
for i in range(len(fishobjs)-1,-1,-1):
obj=fishobjs[i]
if 'rect' in obj and playerobj['rect'].colliderect(obj['rect']):
if obj['width']*obj['height']&=playerobj['size']**2:
playerobj['size']+=int((obj['width']*obj['height'])**0.2)
del fishobjs[i]
if playerobj['face']== LEFT:
playerobj['surface']=playersurfaceset(playerobj['size'],True)
if playerobj['face']== RIGHT:
playerobj['surface']=playersurfaceset(playerobj['size'],False)
if playerobj['size']&WINSIZE:
winMode=True
elif not invulnerableMode:
invulnerableMode=True
invulnerableStartTime=time.time()
playerobj['health']-=1
if playerobj['health']==0:
gameOverMode =True
gameOverStartTime=time.time()
主人公的控制类似一般的处理,这边用flashIsonl来生成时间差(偶数值时间为真)playersurfaceset()函数决定主人公的图片类型。
二、敌方鱼的生成处理
  上篇做的敌方的处理会在当前视口随即出现,这个突兀感太强,鱼的出现也不能随机显示在当前视口,应该由摄像机视角之外生成才符合常理。并且当鱼离摄像区域太远的距离,需要删除掉鱼对象。
1 for i in range(len(fishobjs)-1,-1,-1):
if isOutsideArea(camerax,cameray,fishobjs[i]):
del fishobjs[i]
while len(fishobjs)&10:
fishobjs.append(makeNewfish(camerax,cameray))
1 def makeNewfish(camerax,cameray):
generalSize=random.randint(5,25)
multiplier = random.randint(1,3)
sq['width'] = (generalSize +random.randint(0,10))*multiplier
sq['height']= (generalSize +random.randint(0,10))*multiplier
sq['x'],sq['y']=getRandomoffCameraPos(camerax,cameray,sq['width'],sq['height'])
sq['movx'] = getRandomVelcocity()
sq['movy'] = getRandomVelcocity()
if sq['movx']&0:
sq['surface']=surfaceset(sq['width'],sq['height'],True)
sq['surface']=surfaceset(sq['width'],sq['height'],False)
三、跟随视角的处理
    这个主要是跟随主人公视角的问题,计算出主人公的中心点距离摄像机中心点的距离,当距离偏大的时候,需要移动摄像机的位置,具体处理代码如下:
playerCenterx=playerobj['x']+int(playerobj['size']/2)
playerCentery=playerobj['y']+int(playerobj['size']/2)
if (camerax+HALF_WINWIDTH)-playerCenterx&CAMERASLACK:
camerax=playerCenterx+CAMERASLACK-HALF_WINWIDTH
elif playerCenterx-(camerax+HALF_WINWIDTH)&CAMERASLACK:
camerax=playerCenterx-CAMERASLACK-HALF_WINWIDTH
if (cameray+HALF_WINHEIGHT)-playerCentery&CAMERASLACK:
cameray=playerCentery+CAMERASLACK-HALF_WINHEIGHT
elif playerCentery-(camerax+HALF_WINHEIGHT)&CAMERASLACK:
cameray=playerCentery-CAMERASLACK-HALF_WINHEIGHT
&大部分应该介绍的应该就这些了,只能说游戏这块水比较深,只能浅尝辄止一番,python做游戏只能简单玩玩,这块不是他的优势。有人感兴趣的话可以研究它,推荐一本不错的书《Making games with python $ pygame》,哎 只能说有巨人的肩膀上站真好。
&园友交流群: &有兴趣请加入~欢迎来灌水~~~~ 注明:博客园 & &&
附全部源代码如下,比较粗陋,建议以书上源码学习为主:
import pygame,sys,time,random
from pygame.locals import *
WINWIDTH=640
WINHEIGHT=480
CAMERASLACK=70
lfish_img=[]
FISHSIZE=8
PLAYERSIZE=3
SCREEN=None
rfish_img=[]
lplayer_img=[]
rplayer_img=[]
backgroundimg=None
rboss_img=None
lboss_img=None
WHITE=[255,255,255]
MAXHEALTH=3
MINSPEED=3
MAXSPEED=9
MOVESPEED=7
HALF_WINWIDTH=int(WINWIDTH/2)
HALF_WINHEIGHT=int(WINHEIGHT/2)
WINSIZE=300
def main():
global FPSCLOCK,SCREEN,lfish_img,rfish_img,lplayer_img,rplayer_img,BASICFONT\
,rboss_img,lboss_img,backgroundimg
pygame.init()
FPSCLOCK=pygame.time.Clock()
SCREEN=pygame.display.set_mode((WINWIDTH,WINHEIGHT))
pygame.display.set_caption("fish eat fish")
BASICFONT=pygame.font.Font("freesansbold.ttf",32)
for i in range(FISHSIZE):
fishimg=pygame.image.load("Fish%s.bmp" % i)
fishimg.set_colorkey(WHITE)
lfish_img.append(fishimg)
rfishimg=pygame.transform.flip(fishimg,True,False)
rfish_img.append(rfishimg)
for i in range(PLAYERSIZE):
playerimg=pygame.image.load("player%s.png" % i)
playerimg.set_colorkey(WHITE)
lplayer_img.append(playerimg)
rplayerimg=pygame.transform.flip(playerimg,True,False)
rplayerimg.set_colorkey(WHITE)
rplayer_img.append(rplayerimg)
bossimg=pygame.image.load("boss.png")
bossimg.set_colorkey([0,0,0])
SCREEN.blit(bossimg,(0,0))
lboss_img=bossimg
rbossimg=pygame.transform.flip(bossimg,True,False)
rboss_img=rbossimg
backgroundimg=pygame.image.load("background.jpg")
while True:
def runGame():
invulnerableMode=False
invulnerableStartTime=0
gameOverMode=False
gameOverStartTime=0
winMode = False
gameOverSurf=BASICFONT.render('Game Over',True,WHITE)
gameOverRect=gameOverSurf.get_rect()
gameOverRect.center=(HALF_WINWIDTH,HALF_WINHEIGHT)
winSurf=BASICFONT.render('you succeed',True,WHITE)
winRect=winSurf.get_rect()
winRect.center=(HALF_WINWIDTH,HALF_WINHEIGHT)
winSurf2=BASICFONT.render('you succeed',True,WHITE)
winRect2=winSurf2.get_rect()
winRect2.center=(HALF_WINWIDTH,HALF_WINHEIGHT+30)
fishobjs=[]
playerobj={'surface':pygame.transform.scale(lplayer_img[0],(25,25)),
'size':25,
'facing':LEFT,
'x':HALF_WINWIDTH,
'y':HALF_WINHEIGHT,
'health':MAXHEALTH}
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
while True:
if invulnerableMode and time.time() - invulnerableStartTime&2:
invulnerableMode =False
for sobj in fishobjs:
sobj['x']+=sobj['movx']
sobj['y']+=sobj['movy']
for i in range(len(fishobjs)-1,-1,-1):
if isOutsideArea(camerax,cameray,fishobjs[i]):
del fishobjs[i]
while len(fishobjs)&5:
fishobjs.append(makeNewfish(camerax,cameray))
playerCenterx=playerobj['x']+int(playerobj['size']/2)
playerCentery=playerobj['y']+int(playerobj['size']/2)
if (camerax+HALF_WINWIDTH)-playerCenterx&CAMERASLACK:
camerax=playerCenterx+CAMERASLACK-HALF_WINWIDTH
elif playerCenterx-(camerax+HALF_WINWIDTH)&CAMERASLACK:
camerax=playerCenterx-CAMERASLACK-HALF_WINWIDTH
if (cameray+HALF_WINHEIGHT)-playerCentery&CAMERASLACK:
cameray=playerCentery+CAMERASLACK-HALF_WINHEIGHT
elif playerCentery-(camerax+HALF_WINHEIGHT)&CAMERASLACK:
cameray=playerCentery-CAMERASLACK-HALF_WINHEIGHT
backrect=pygame.Rect((camerax-WINWIDTH,cameray-WINHEIGHT,WINWIDTH*3,WINHEIGHT*3))
newbackgroundimg=pygame.transform.scale(backgroundimg,(WINWIDTH*3,WINHEIGHT*3))
SCREEN.blit(newbackgroundimg,backrect)
for obj in fishobjs:
obj['rect']=pygame.Rect((obj['x']-camerax,obj['y']-cameray,obj['width']
,obj['height']))
SCREEN.blit(obj['surface'],obj['rect'])
flashIsOn=round(time.time(),1)*10%2==1
if not gameOverMode and not (invulnerableMode and flashIsOn):
playerobj['rect']=pygame.Rect((playerobj['x']-camerax,playerobj['y']
-cameray,playerobj['size'],playerobj['size']))
SCREEN.blit(playerobj['surface'],playerobj['rect'])
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN:
if event.key in (K_UP,K_w):
moveDown =False
moveUp = True
elif event.key in (K_DOWN,K_s):
moveDown =True
moveUp = False
elif event.key in (K_LEFT,K_a):
moveRight = False
moveLeft= True
if playerobj['facing']==RIGHT:
playerobj['surface']=playersurfaceset(playerobj['size'], True)
playerobj['facing']=LEFT
elif event.key in (K_RIGHT,K_d):
moveRight = True
moveLeft= False
if playerobj['facing']==LEFT:
playerobj['surface']=playersurfaceset(playerobj['size'], False)
playerobj['facing']=RIGHT
elif winMode and event.key == K_r:
elif event.type==KEYUP:
if event.key in (K_LEFT,K_a):
moveLeft=False
elif event.key in (K_RIGHT,K_d):
moveRight=False
elif event.key in (K_UP,K_w):
moveRight=False
elif event.key in (K_DOWN,K_s):
moveRight=False
if not gameOverMode:
if moveLeft:
playerobj['x']-=MOVESPEED
if moveRight:
playerobj['x']+=MOVESPEED
if moveUp:
playerobj['y']-=MOVESPEED
if moveDown:
playerobj['y']+=MOVESPEED
for i in range(len(fishobjs)-1,-1,-1):
obj=fishobjs[i]
if 'rect' in obj and playerobj['rect'].colliderect(obj['rect']):
if obj['width']*obj['height']&=playerobj['size']**2:
playerobj['size']+=int((obj['width']*obj['height'])**0.2)
del fishobjs[i]
if playerobj['face']== LEFT:
playerobj['surface']=playersurfaceset(playerobj['size'],True)
if playerobj['face']== RIGHT:
playerobj['surface']=playersurfaceset(playerobj['size'],False)
if playerobj['size']&WINSIZE:
winMode=True
elif not invulnerableMode:
invulnerableMode=True
invulnerableStartTime=time.time()
playerobj['health']-=1
if playerobj['health']==0:
gameOverMode =True
gameOverStartTime=time.time()
if winMode:
SCREEN.blit(winSurf,winRect)
SCREEN.blit(winSurf2,winRect2)
pygame.display.update()
FPSCLOCK.tick(FPS)
def isOutsideArea(camerax,cameray,fishobj):
boundsLeftEdge =camerax-WINWIDTH
boundsTopEdge=cameray-WINHEIGHT
boundsRect=pygame.Rect(boundsLeftEdge,boundsTopEdge,WINWIDTH*3,WINHEIGHT*3)
objRect=pygame.Rect(fishobj['x'],fishobj['y'],fishobj['width'],fishobj['height'])
return not boundsRect.colliderect(objRect)
def makeNewfish(camerax,cameray):
generalSize=random.randint(5,25)
multiplier = random.randint(1,3)
sq['width'] = (generalSize +random.randint(0,10))*multiplier
sq['height']= (generalSize +random.randint(0,10))*multiplier
sq['x'],sq['y']=getRandomoffCameraPos(camerax,cameray,sq['width'],sq['height'])
sq['movx'] = getRandomVelcocity()
sq['movy'] = getRandomVelcocity()
if sq['movx']&0:
sq['surface']=surfaceset(sq['width'],sq['height'],True)
sq['surface']=surfaceset(sq['width'],sq['height'],False)
def playersurfaceset(size,Face):
surface=None
if size&100:
if Face ==True:
surface= pygame.transform.scale(lplayer_img[0],(size,size))
surface= pygame.transform.scale(rplayer_img[0],(size,size))
elif size&200 and size&=100:
if Face ==True:
surface= pygame.transform.scale(lplayer_img[1],(size,size))
surface= pygame.transform.scale(rplayer_img[1],(size,size))
if Face ==True:
surface= pygame.transform.scale(lplayer_img[2],(size,size))
surface= pygame.transform.scale(rplayer_img[2],(size,size))
return surface
def surfaceset(width,height,Face):
surface=None
if width*height&200*200:
if Face == True:
surface= pygame.transform.scale(lboss_img,(width,height))
surface= pygame.transform.scale(rboss_img,(width,height))
index= int((width*height)%(FISHSIZE-1))
if Face == True:
surface= pygame.transform.scale(lfish_img[index],(width,height))
surface= pygame.transform.scale(rfish_img[index],(width,height))
return surface
def getRandomVelcocity():
speed=random.randint(MINSPEED,MAXSPEED)
if random.randint(0,1):
return speed
return -speed
def getRandomoffCameraPos(camerax,cameray,objwidth,objheight):
cameraRect=pygame.Rect(camerax,cameray,WINWIDTH,WINHEIGHT)
while True:
x=random.randint(camerax-WINWIDTH,camerax+2*(WINWIDTH))
y=random.randint(camerax-WINHEIGHT,camerax+2*(WINHEIGHT))
objrect=pygame.Rect(x,y,objwidth,objheight)
if not objrect.colliderect(cameraRect):
return x,y
if __name__ == '__main__':
ps:最近越来越懒了,不知道当初订的每周至少写一篇随笔的目标能否坚持下去。另外鄙视下12306上刷票的黄牛,刷了一天没买到票,哎 不说了都是泪。君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
A_Byte_of_Python3(中文版)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口为什么我不会舍弃Python投奔Go语言
本文的作者:Russ Cox
本文作者:Russ Cox
Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言。
最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年。这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言。如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的“”,不妨一看。
最近,由于一篇“(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。
在Go语言中,规定的方式是,函数返回错误信息。这没什么。如果一个文件并不存在,op.Open函数会返回一个错误信息。这没什么。如果你向你一个中断了的网络连接里写数据,net.Conn里的Write方法会返回一个错误。这没什么。这种状况在这种程序中是可以预料到的。这种操作就是容易失败,你知道程序会如何运行,因为API的设计者通过内置了一种错误情况的结果而让这一切显得很清楚。
从另一方面讲,有些操作基本上不会出错,所处的环境根本不可能给你提示错误信息,不可能控制错误。这才是让人痛苦的地方。典型的例子;一个程序执行x[j],j值超出数组边界,这才痛苦。像这样预料之外的麻烦在程序中是一个严重的bug,一般会弄死程序的运行。不幸的是,由于这种情况的存在,我们很难写出健壮的,具有自我防御的服务器——例如,可以应付偶然出现的有bug的HTTP请求处理器时,不影响其他服务的启动和运行。为解决这个问题,我们引入了恢复机制,它能让一个go例程从错误中恢复,服务余下设定的调用。然而,代价是,至少会丢失一个调用。这是特意而为之的。引用邮件中的原话:“这种设计不同于常见的异常控制结构,这是一个认真思考后的决定。我们不希望像java语言里那样把错误和异常混为一谈。”
我刚开始提到的那篇文章里问“为什么数组越界造成的麻烦会比错误的网址或断掉的网络引出的问题要大?”答案是,我们没有一种内联并行的方法来报告在执行x[j]期间产生的错误,但我们有内联并行的方法报告由错误网址或网络问题造成的错误。
使用Go语言中的错误返回模式的规则很简单:如果你的函数在某种情况下很容易出错,那它就应该返回错误。当我调用其它的程序库时,如果它是这样写的,那我不必担心那些错误的产生,除非有真正异常的状况,我根本没有想到需要处理它们。
有一个你需要记在心里的事情是,Go语言是为大型软件设计的。我们都喜欢程序简洁清晰,但对于一个由很多程序员一起开发的大型软件,维护成本的增加很难让程序简洁。异常捕捉模式的错误处理方式的一个很有吸引力的特点是,它非常适合小程序。但对于大型程序库,如果对于一些普通操作,你都需要考虑每行代码是否会抛出异常、是否有必要捕捉处理,这对于开发效率和程序员的时间来说都是非常严重的拖累。我自己做开发大型Python软件时感受到了这个问题。Go语言的返回错误方式,不可否认,对于调用者不是很方便,但这样做会让程序中可能会出错的地方显的很明显。对于小程序来说,你可能只想打印出错误,退出程序。对于一些很精密的程序,根据异常的不同,来源的不同,程序会做出不同的反应,这很常见,这种情况中,try + catch的方式相对于错误返回模式显得冗长。当然,Python里的一个10行的代码放到Go语言里很可能会更冗长。毕竟,Go语言主要不是针对10行规模的程序的。
Raymond Chen的文章是我读到过的最好的用来解释异常捕捉模式里问题的文章:
就是要说明这一点:Go语言程序员认为,把error作为一种内置的类型是非常重要的。
有时,你会发现,一种非本地的goto语句被当作错误恢复的方法,就像C语言里的longjmp 和 setjmp。这也不错,但最好只在内部用。如果调用者需要知道错误恢复的走向,那你的这种方式就不好了。
分享这篇文章:
扫一扫二维码分享:
你也许会喜欢这些文章:
[英文原文: ]
对于这篇文章,你的反应是:
You had mail.
Paul read it, so ask him what it said.
本作品采用进行许可。
备案信息:京ICP备号 &&京公网安备00号
感谢你的参与互动。可以用 Python 编程语言做哪些神奇好玩的事情_百度知道【译注】:Eric Raymond是开源运动的领袖人物,对于UNIX开发有很深的造诣,主持开发了fetchmail。他的《大教堂与集市》被奉为开源运动的经典之作。下面对几大开发语言的评价非常中肯,是我近年来看到的比较出色的评论。特别是他评价中抱有的那种“简单就是好”的思想,很值得我们深思。我特别选译出一些段落,供大家阅读思考。
Raymond 此文不是在泛泛地去谈语言的优劣,而是要回答一个问题:在UNIX下开发开源项目,如何选择开发工具?我翻译的很零散,建议大家去看原文。
虽说C语言在内存管理方面存在严重的缺陷,不过它还是在某些应用领域里称王称霸。对于那些要求最高的效率,良好的实时性,或者与操作系统内核紧密关联的程序来说,C仍然是很好的选择。
C良好的可移植性也为它加了分。不过现在很多其他的语言可移植性越来越好,C在这方面的优势可能会逐渐丧失。
现有的很多程序可以产生非常棒的C代码,比如语法分析器、GUI Builder等,这时候C语言也是有吸引力的,因为你所需要编写的代码只是整个程序的一小部分。
再有,我们当然应该认识道,C语言对于程序员来说具有无可替代的价值。就我这里讨论的每一种语言而论,只要你发掘的足够深,到最后你会看到它们的内核都是用纯正的、可移植的C写成的。
到了今天这个时候,我们最好把C看成是UNIX虚拟机上的高级汇编语言。
就算是其他的高级语言完全可以满足你的工作需要,抽出时间来学习C语言也仍然有益,它能帮助你在硬件体系的层次上思考问题。
即使到了今天,最好的C语言教程仍然是1988年出版的K&R第二版The C Programming Language.
总结:C最出色的地方在于其高效和贴近机器,最糟糕的地方在它的内存管理地狱。
C++最初发布于1980年代中期,当时面向对象语言被认为是解决软件复杂性问题的银弹。C++的面向对象特性看相去使其全面超越了C,支持者认为C++将迅速把上一代语言挤到陈列馆里去。
但是历史并非如此。究其原因,至少有一部分归咎于C++本身。为了与C兼容,C++被迫作出了很多重大的设计妥协,结果导致语言过分华丽,过分复杂。为了与C兼容,C++并没有采用自动内存管理的策略,从而丧失了修正C最严重问题的机会。
另外一部分原因,恐怕要算到面向对象身上。看起来OO并没有很好的达成人们当年的预期。我就这个问题调研过,我发现使用OO方法导致组件之间出现很厚的粘合层,并且带来了严重的可维护性问题。今天让我们来看看开放源码社区,你会发现C++的应用还是集中在GUI,游戏和多媒体工具包这些方面,在其他地方很少用到。要知道,面向对象也只是在这些领域被证明非常成功,而开放源码社区的选择,很大程度上体现了程序员的自由意志,而不是公司管理层的胡乱指挥。
也许C++实现OO的方法有问题。有证据表明C++程序在整个生命周期的开销高于相应的C, Fortran和Ada程序。不过,究竟这是否应该归咎与C++的OO实现上,还不清楚。
最近几年,C++加入了很多非OO的思想,其异常思想类似Lisp,STL的出现是非常了不起的。
其实C++最根本的问题在于,它基本上只不过是另一种传统的语言。STL中的内存管理比先前的new/delete和C的方案要好的多,但是还是没有解决问题。对于很多应用程序而言,其OO特性并不明显,相比与C,除了增加复杂度之外没有获得很多好处。
总结:C++优点在于作为编译型语言,把效率与泛型和面向对象特性结合起来,其缺点在于过于华丽复杂,倾向于鼓励程过分复杂的设计。
Java的设计很聪明,它采用了自动内存管理,这是最大的改进,支持OO设计带来的好处虽然不那么突出,不过也很值得赞赏,相比C++,其OO设计规模小而且简单 。
相对于Python而言,Java有一些明显的失误。有些地方设计的还是太复杂,甚至有缺陷。Java的类可见性和隐式scoping规则太复杂了。Interface机制是为了避免多继承带来的问题而设计的,但是要理解和使用它还是挺难。内部类和匿名类导致令人困惑的代码。缺乏有效的析构机制,使得除了内存之外的其他资源(比如互斥量和锁)管理起来很困难。Java的线程不可靠,其I/O机制很强大,但是读取一个文本文件却非常繁琐。
Java没有管理库版本的机制,从而形式上重蹈了了Windows DLL地狱的覆辙。在类似应用服务器这样的环境里,这引起了大量的问题。
总体而言,我们可以说除了系统编程和对效率要求极高的程序之外,Java在大部分领域优于C++。经验表明,Java程序员似乎不太容易象C++程序员那样构造过度的OO层,不过在Java中这仍然是个严重问题。
Java是否优于诸如Perl, Python这样的语言?我们还不是很清楚,很大程度上似乎跟程序规模有关。其擅长的领域基本上于Python相似,在效率上无法跟C/C++相提并论,在小规模的、大量使用模式匹配和编辑的项目里也无法匹敌Perl。在小项目里,Java显得过分强大了。我们猜测Python更适合小项目,而Java适合大项目,不过这一点并没有得到有力的证明。
Python是一种脚本语言,可以与C紧密整合。它可以与动态加载的C库模块交换数据,也可以作为内嵌脚本语言而从C中调用。其语法类似C和模块化语言的杂合,不过有一个独一无二的特征,就是以缩进来确定语句块。
Python语言非常干净,设计优雅,具有出色的模块化特性。它提供了面向对象能力,但不强迫用户进行面向对象设计。其类型系统提供了强大的表达能力,类似Perl,具有匿名lambda表达式,这点又让Lisp黑客们感到亲切。Python依靠Tk提供方便的GUI界面开发能力。
在所有的解释型语言里,Python和Java最适合多名程序员以渐进方式协同开发大型项目。在很多方面,Python比Java要简单,它非常适合与构造快速原型,这一点使得它对于Java有独特优势:对于那些既不很复杂,又不要求高效率的程序,Python十分合适。
Python的速度没法跟C/C++相比,不过在今天的高速CPU上,合理地使用混合语言编程策略使得Python的上述弱点被有效地弥补。事实上,Python几乎被认为是主流脚本语言中最慢的一个,因为它提供了动态多态性。在大量使用正则表达式的小型项目,它逊于Perl。对于微型项目而言,shell和Tcl可能更好,Python显得太过强大了。
总结:Python最出色的地方在于,它鼓励清晰易读的代码,特别适合以渐进开发的方式构造大项目。其缺陷在于效率不高,太慢,不但跟编译语言相比慢,就是跟其他脚本语言相比也显得慢。
相关 [开源 领袖 eric] 推荐:
- 极客521 | 极客521
【译注】:Eric Raymond是开源运动的领袖人物,对于UNIX开发有很深的造诣,主持开发了fetchmail. 他的《大教堂与集市》被奉为开源运动的经典之作. 下面对几大开发语言的评价非常中肯,是我近年来看到的比较出色的评论. 特别是他评价中抱有的那种“简单就是好”的思想,很值得我们深思. 我特别选译出一些段落,供大家阅读思考.
- lostsnow - 走走停停看看
前几天Eric Meyer又思考了一下reset.css的问题,于是有所更新,具体为何要这样做,请看原文Reset Revisited.
- Shengbin - 译言-电脑/网络/数码科技
来源Best algorithms book I ever read.   当我为google的面试准备时,我花了大量的时间来查找数据结构和算法类的知识,同时.根据博学的Steve的建议,我决定入手Steven S. Skiena写的&这本书..   如果你不想仔细阅读我写在下面的关于这本书的废话,那所有的内容有一句话总结:去买这本书吧.如果你正在进行严肃的编程..
- Panfeng - 谷安——谷奥Android专题站
上周在 San Francisco 的 Dreamforce 会议上,Eric Schmidt 在谈论中强调了一些要点,他谈到了未来的云计算以及 HTML5 等. 他也简要的提及了 Google 的移动平台,并证实了 Ice Cream Sandwich(Android 的下一个版本)将在 10 月或 11 月发布.
- mike - 谷奥——探寻谷歌的奥秘
尽管Larry Page已经上位CEO,但他跟其他CEO不同的是我们很难在公众场合见到他,他也很少公开表达自己的意见,除了在每季度一次的财报会议. 还好,Eric Schimidt携手Larry Page出现在一年一度的Google Zeitgeist大会上了,他们爷儿俩还回答了到场观众的问题. Page最开始谈到为什么做搜索引擎,因为在斯坦福的时候如果搜索“大学”,你得到的几乎是一个随机化的搜索结果,所以他们开始打造搜索引擎,并相信没人像他们那样专注于搜索.
- Lamo - 谷奥——探寻谷歌的奥秘
就在大家揶揄说Google一多半高管都没去Google+玩儿之时,Eric Schmidt施大爷这个带头大哥做出了行动,入驻了Google+并发了一些信息流. 注意到施大爷用了青涩的20出头时期在SUN公司工作时的视频截图作为头像,成功卖萌. 但施大爷也像+Larry 和 +Sergey那样隐藏了自己的圈子,大家都在以私密形式玩Google+,难道这是三驾马车在暗示人们Google+的最佳玩法就是这样.
- votis - 谷奥——探寻谷歌的奥秘
关于Google董事主席Eric Schmidt出席在 Dreamforce活动上跟 CEO Marc Benioff谈话内容我们已经挖掘了一些,包括:. 施大爷透露 Google Apps 已有四千万用户,日增五千. 施大爷改口,称 Google 买摩托罗拉移动不只为了专利.
- 改变的勇气 - Engadget 中国版
Google 执行董事长 Eric Schimdt 在东京的 Google Mobile Revolution 会议现身的主要目的是谈该公司在亚洲的布局与计划,但丝毫不意外地,讨论的方向被引导到了最近的几桩重量级的法律案件,Schmidt 也很乐意地为我们提供了一两句看法. 虽然没有指名道姓(嗯哼~),Schmidt 说因为 Google 在 Android 上的成功,「我们的竞争对手靠法律战,而非创新在还击」,但表示他并不为此感到担心.
- 吞佛 - 译言-每日精品译文推荐
曼联现任队长内马尼亚·维迪奇未来有可能成为曼联最伟大的队长之一,不过现在看起来还差点. Similarly, great characters from the past may have been as great in their way as some who are selected here, but it is hard to compare their relative merits other than on historic achievements..
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。}

我要回帖

更多关于 raymond weil 手表 的文章

更多推荐

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

点击添加站长微信