1

Comments

今天突然有兴致来对比一下我在过去的一年中主要学习的两种语言,Python 和 Erlang,他们都是很神奇的语言。不过,在我看来,更神奇的是,这两种语言几乎是完全对立的!

下面我弄了张表格来对比他们:

名称 Python Erlang
主要范型 面向对象 函数式、面向并发
开发者 Python 基金会 商业公司 爱立信
文件编码 在 Python 2 中默认为 ASCII,Python 3 中默认为 UTF-8,但都可以制定任意编码。 默认为 Latin-1,不允许指定文件编码。不过事实上编译器并不会在意文件中是否存在“不正确”的字符。
变量 几乎什么都是变量,变量都可以不断变化,无论是值还是类型。甚至你可以改变 True 和 False,让他们颠倒。(当然,也有例外,如 None,我至今没找到改变他的方法) 且不说原子是显然不可变的,任何一个变量被赋值之后,他的值也是不可变的,这是所谓变量绑定。(单次赋值)
字符串 拥有完善的字符串支持,在 Python 3 中这更是发挥到了极致。 根本不存在字符串类型,一切字符串都是字符列表,因此就更没有什么强大的字符串处理函数了。
列表 可以根据下标索引快速获取列表任意位置的内容。 考虑效率的话,只能从列表的头部摘取内容。
模块 依据文件系统的文件分布构建层级式的模块体系,使用模块前必须声明将模块引入当前名字空间。 所有模块是平行的,在同一层中,模块名称强制与文件名相同。使用模块时模块必须已经被编译,Erlang 将会自动寻找模块并读取。
并行 通过 GIL 这一全局锁将所有多线程操作退化为单线程操作,不存在任何并发性。(不过 Python 正在尝试加入新的模块来改变这一问题) 天生就是面向并发的……用他仅做顺序编程是一种莫大的浪费……
C 接口 使用 Python.h 编写接口,编译为动态链接库,运行时调入 Python 内使用。 编写外部程序,通过标准输入输出与 Erlang 主进程交换数据,在 Erlang 进程空间外单独运行。(也有一种在进程空间内运行的接口,不过不推荐使用)
函数重载 不支持任何形式的函数重载,但支持可选参数。 支持参数数量不同的同名函数,但不支持可选参数。而且基于模式匹配,支持同一函数的不同分支的定义。
数据库 内置了通用的 SQLite 数据库支持,可以通过 SQL 语句进行数据库操作,储存的信息限制在文本、数字等几种。 内置了专用的 Mnesia,可以与 Erlang 无缝衔接地储存任何内容,通过 Erlang 的 qlc 模块不使用 SQL 语句进行数据库操作。(NoSQL)
代码热替换 支持使用 reload 函数重新载入一个模块。 模块的新版本被编译后任何调用即采用新的代码。

可以看到这两种语言真的是非常非常不同,我想这和他们的设计初衷和适用范围是很有关系的:Python 大多数时候被用于快速的原型开发、用作胶水语言、创建小型桌面级应用程序;而 Erlang 则在一开始就被用在电信,这一对容错、并发要求较苛刻的领域。

不过我还是觉得,这两种语言都是非常优美的,以他们自己的专长而言。不过 Python 已经非常不错了,Erlang 在我看来则还有很大的发展空间~

PS:以上仅仅是就我自己的了解给出的一些对比,疏漏和错误在所难免,也希望看到了及时告诉我~

< , >
0

Comments

因为以后可能要用到,于是今天用 Erlang 写了一个 0-1 背包算法,这算是我第一次用 Erlang 写算法,也是我第二次写 Erlang 程序……

以前都使用正常语言写,各种算法自然不会难写。所谓正常的语言,呃……也就是我们平时用的最多的语言了,像 C++、Python 什么的在我看来都还算正常的语言。那么 Erlang 到底哪里不正常了呢?

其实 Erlang 只要两个不正常的地方就足够囧死人了……那就是:

  1. 没有循环,必须用递归代替
  2. 数组不能随机访问,只能从头部读写

其实说数组不能随机访问吧,应该也是能的,只不过时间恐怕就不是 O(1) 了罢了。
Read the rest of this entry »

< , >
1

Comments

什么叫 BMP 到 HTML 呢……?就是生成一个网页,里面用不同颜色的字符拼出那个图片……很无聊的功能嗯,而且原理上说,生成的 HTML 文件如果要表现整个 BMP 的所有细节,大小肯定大大超过原 BMP 文件……

为什么会做这个呢?主要是受到我们 C++ 老师的启发,尝试去做的。不过我没有用 C++ 写,而是选用了寒假学的 Erlang,这也是我写的第一个 Erlang 程序。

为什么会选用 Erlang 呢?主要是基于两点原因:1、寒假学了半天,一点都没有练过,就拿这个来练练;2、看中了 Erlang 强大的模式匹配和比特语法。比特语法在 Erlang 里面原来是用来解决网络传输协议中的二进制数据的,不过这里拿来处理二进制文件着实是一个很好的选择~不过其实 Erlang 真正最重要的特性:面向并发,我完全没有用到,而是继续使用了顺序编程。主要是,BMP to HTML 没什么可以并发化的,而且就算并发了,也是大传输小计算,并没有什么很大的优势。因为是第一次写 Erlang 程序,如果有 Erlang 高手路过,还请多多指点咯~

另外一点,为什么选用 BMP 这种几乎被人抛弃的格式呢?因为最容易呗……而且我这里还用了 BMP 中最简单的一种:真彩色无压缩格式。这是最直接的图形表示方式了,就是一个点一个点的,每个点三个字节表示一种颜色。所以还是很简单的。

先看看最后的效果:

下面说干就干。
Read the rest of this entry »

< ,, >