Java可以做哪些Python做不到的事情?
我想学一种新的编程语言——Java,因为我已经用Python有一段时间了。但我发现用Java能做的事情,Python也能做到。所以我想知道:
- 有什么事情是Java能做而Python做不了的?
- 移动编程(比如Android开发)。
- POSIX线程编程。
- 反过来,有什么事情是Python能做而Java做不了的呢?
补充说明: 我希望得到一个实用的回答,而不是理论上的讨论,内容应该是关于现在的情况,而不是未来的预测。理论上所有编程语言都能完成任何任务,但实际上每种语言都有自己的局限性。
5 个回答
你一定会喜欢下面这两种语言之间的比较。
快来看看吧:
这两种语言都是图灵完备的,也就是说它们都能完成任何计算任务。它们都有很多现成的库可以使用,而且都支持用C语言写扩展,这样你就可以在需要的时候访问底层代码。它们之间的主要区别在于目前的支持情况。一般来说,Java的支持范围比Python更广。
你提到的Android就是一个Java的标准选择,虽然Python也有一些支持,比如Android脚本环境。大多数家用电脑上都已经安装了Java。你可以编写Java小程序,并且大部分浏览器都能正常运行它们。
不过,在Java中,你不能很方便地快速编写一些短小的脚本来完成有用的任务。相比之下,Python更适合用来写脚本(当然,还有其他选择)。
我想用Jython的话,你可以用Python做任何在Java中能做的事情。
反过来说,Python有一个叫PyPy的编译器,这个东西挺酷的——它是一个虚拟机,有很多不同的后端(比如Java运行时、LLVM、.net,还有Python本身,没记错的话),有多种垃圾回收机制,还有多种实现方式(比如无栈实现)等等。我知道Java有很多虚拟机可供选择,但PyPy的发展真是惊人,因为它是用RPython写的,这是一种相对高效的语言。
另外,Java能做到这一点吗?只用一个文件,少于20行代码,而且不需要导入任何库?显然这两种语言都有可以做到这点的库,但我只是想讨论一下这两种语言的灵活性。
class Logger(object): # boilerplate code
def log(self,level,msg,*args,**kwargs): # *args, **kwargs = flexible arguments
self._log(level,msg,*args,**kwargs) # call with flexible argments
def _log(self,level,msg,*args,**kwargs):
# override me at runtime :)
# I think Java people call this Dependency Runtime Injection
if level>1:
print msg,args,kwargs
logger = Logger() # boilerplate code
def logged(level): # what pattern do you call this?
def logged_decorator(function): # and this?
def func(*args,**kwars):
name = func.__name__ # look ma, reflective metaprogramming!
logger.log(level,name,*args,**kwargs)
return func(*args,**kwargs)
return func # boilerplate code
return logged_decorator # boilerplate code
示例用法:
@logged
def my_func(arg1,arg2):
# your code here
pass