Io
简介:
Io是用原型语言(如同Lua、JavaScript),这意味着,每个对象都是另一个对象的复制品。Io的语法非常简单,但到了Io库的学习就会花多些时间了,因为这门语言的复杂性和丰富性,统统来自于库的设计。大多Io社区都致力于把Io作为带有微型虚拟机和丰富并发特性的可嵌入语言来推广;其核心优势是拥有大量可定制语法和函数,以及强有力的并发模型。(了解Io,可以很好的了解javascript的运行机制)
Io的语法与它的名字一样的简单直接,Io语法只不过是把消息全部串联起来,每条消息都会返回一个对象,每条消息也都带有置于括号内的可选参数。在Io中,万事万物皆是消息,且每条消息都会返回另一个接收消息的对象。Io这门语言没有关键字,有的只有少量在行为上接近于关键字的字符;
用Io的时候,不必既操心类又操心对象。你只需要和对象打交道,必要是把对象复制下就行。这些被复制的对象就叫做
原型。
开场:
以上这些只是开场,具体对于对象的槽等可以google:Io language;;
对象、原型、继承::
这里举个例子:对于一个面向对象的设计是这样的:
对象<-交通工具(描述)<-小汽车->(实例)->法拉利(描述)
而对于Io对象模型的方式就只有继承:
对象<<---交通工具(原型:对象:描述:。。)<<--小汽车(原型:交通工具)<<--法拉利(原型:小汽车)
/**这里就不给出代码了,Io只有继承,没有实例这种东东**/
Io的类型是一种非常好用的机制。其一大些字母开头的对象是类型,Io对它设置了type槽;而类型的复制品若以小谢字母开头,就是对象,没有对其设置type槽,调用时会调用父类的type槽;!。!
(除了这个槽之外,类与对象是完全一样的!)
/*-:
列表和映射:
列表(list);映射(map) ;如同Ruby的散列表一样;具体的实现这里略;
(散列表的结构和Io对象很像——散列表的键就是一个个绑定了值的槽。)
true、false、nil、 单例:
true、false、nil这三个就没什么好特别介绍了;要讲的是这三个都是单例:
就是在对它们进行复制的时候,返回的只是单例对象的值;(就是其本身,在程序中都只有一个实例,其被复制(实例化)是返回的是其本身,所以永远都只有一个)
/**实现方式就是重定义clone方法**/
你可以改变任何一个对象上的任意一个槽,甚至那些定义这门语言的对象也概莫能外。这样,当你完全掌握运算符合组对象的各个槽,就可以简单漂亮的实
现领域特定语言(domain-specific-language);这个和Ruby一样,让人爱恨交加啊:-(
条件和循环::
-
Io的循环是像方法一样调用的;而if控制结构是以函数的形式实现的,(形如:if(condition,true code,false code,);
-
循环:无限循环:loop(“getting 天才“ println)
-
while循环:while(i<11, i println; i=i+1);
-
for循环:for(i,1,11,2,i println)://循环1~11,递增2
-
(在Io中”;”是可以用来连接前后连个语句的,在循环中直接用)(好像这个有点多余,不过还是写上去下下)
-
运算符:Io可以自定义一些运算符,可以调用OperatorTable来查看运算表。
消息与反射:
!!(在Io中除了注释和参数之间的逗号外,一切事物都是消息!)
一个消息由三个部分组成:发送者(sender)、目标(target)和参数(arguments)。
在Io中,消息由发送者发送至目标,然后由目标执行该消息。
你可以使用call方法访问任何消息的元信息(mate information)。
反射:
我的理解就是,对于接收到消息后,如果没有响应,则剑消息放射到原型,层层向上;
(放射和消息,的使用很强大,也能搞出很有意思的玩意儿。有兴趣可以另外看一些资料或google)
给个小的代码,关于反射的:
Object ancestors := method(
prototype := self proto
if(prototype !=Object,
writeln("Slots of",prototype type,"\n--------")
prototype slotNames foreach(slotNmae,writeln(slotName))
writeln
prototype ancestors))
/**代码的结果是输出消息发送者的各个原型和原型的原型,直到Object**/
领域特定语言:Io是很开放的,完全可以从定义任何对象和任何槽;这里就不加以说明了;
Io的method_missing:
(这就是处理自身不存在的方法的方法)
下面是一个XML的处理语言(方法)
并发:!!
这是Io非常出色的地方;有初设的并发库,主要组成 协程‘actor和future
(这个东东笔记太多了,我直接拍照了)
协程是组成过更高级抽象概念(如actor)的基本元素;
actor:一个actor改变自身状态,并且通过严格控制的队列接触其他actor;其实就是在消息前加上@@就可以让对象在自己的线程中运行。
future:这个是在异步调用消息时立即返回的一个结果对象。就是在一个需要长时间处理等待的语句后面先执行一些操作,在一定的位子等待之前运行结果的返回。(这个不怎么理解,好像在网络编程设计时会用到的)
future还提供死锁自动检测机制。
Io总结:
核心优势:
-
Io是原型语言,具有良好的可塑性,可以改变任意对象的任意槽。可以哦使用它创建出你想要的语法。
-
占用空间小:大多是Io应用程序的产品都是嵌入式系统。语言的个头小但功能强大且灵活,Io的虚拟机也易于移植到不同的操作系统环境中;
-
简单:Io的语法极为简洁,不过学会核心后,重要的是库是如何组织的;
-
灵活:很开放,能改变任何对象的任何槽,这可以快速创建出自己想要的语法;
-
并发!!:actor、future和协程使得Io编写多线程应用程序比较容易,而且写出来的程序易于测试且拥有更出色的性能;
不足:
最后:我觉得Io这个语言挺好玩的,就是这种原型语言的方法吧,这是第一次看到所谓的原型语言,那个槽的设计感觉挺好玩的,消息的i传递和反射感觉也是一个特点吧!不过和Ruby相比,觉得小巧或是说是太简陋了!(我是这么觉得的) ;但是用来开发什么的,我根本搞不懂要怎么搞的,单单处理一些小的算法等觉得还是可以的 ,但其他的就不知道要怎么编写的了。。。
--------原书《七周七语言 理解多种编程泛型》,笔记里面的照片是拍书上的。