笔记之Io

来源:互联网 发布:java标准字符串转日期 编辑:程序博客网 时间:2024/06/07 09:17

Io

简介:

    Io是用原型语言(如同Lua、JavaScript),这意味着,每个对象都是另一个对象的复制品。Io的语法非常简单,但到了Io库的学习就会花多些时间了,因为这门语言的复杂性和丰富性,统统来自于库的设计。大多Io社区都致力于把Io作为带有微型虚拟机和丰富并发特性的可嵌入语言来推广;其核心优势是拥有大量可定制语法和函数,以及强有力的并发模型。(了解Io,可以很好的了解javascript的运行机制)
  Io的语法与它的名字一样的简单直接,Io语法只不过是把消息全部串联起来,每条消息都会返回一个对象,每条消息也都带有置于括号内的可选参数。在Io中,万事万物皆是消息,且每条消息都会返回另一个接收消息的对象。Io这门语言没有关键字,有的只有少量在行为上接近于关键字的字符;
  用Io的时候,不必既操心类又操心对象。你只需要和对象打交道,必要是把对象复制下就行。这些被复制的对象就叫做原型
开场:
  •       对象的制造是复制已有的对象(Io>Vehicle :=Object clone)//这是基于Object对象创造新对象

  •       每个对象多有一组槽(类似于对象的各个属性或方法) (有type这个原型类型,还有各种的方法等;使用slotname 方法可以返回对象的槽类表。

  •       Io是通过发送消息来获取槽的值。

   以上这些只是开场,具体对于对象的槽等可以google:Io language;;

对象、原型、继承::

   这里举个例子:对于一个面向对象的设计是这样的:
对象<-交通工具(描述)<-小汽车->(实例)->法拉利(描述)
  而对于Io对象模型的方式就只有继承:
对象<<---交通工具(原型:对象:描述:。。)<<--小汽车(原型:交通工具)<<--法拉利(原型:小汽车)
/**这里就不给出代码了,Io只有继承,没有实例这种东东**/

    Io的类型是一种非常好用的机制。其一大些字母开头的对象是类型,Io对它设置了type槽;而类型的复制品若以小谢字母开头,就是对象,没有对其设置type槽,调用时会调用父类的type槽;!。!
(除了这个槽之外,类与对象是完全一样的!)
/*-:
  • 对象会记住它的原型(在type槽);

  • 槽可以包含对象(包括方法和对象)(方法:method(。。。))

  • 消息返回槽中值,或调用槽中的方法;

  • 如果对象无法响应某消息,则它会把该消息发送给自己的原型;

列表和映射:
    列表(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清晰易懂,但语法常常使得Io难以用简短的方式表达艰深的概念;就是说,会很容易明白某个程序如何用Io写出来,但很难明白某个程序到底做了什么。

  • 社区:它的社区很小;

  • 性能:在单线程上有其执行速度的特性,不过Io的并发结构可得到一定程度的缓解,但Io在性能上的这种局限性;

        最后:我觉得Io这个语言挺好玩的,就是这种原型语言的方法吧,这是第一次看到所谓的原型语言,那个槽的设计感觉挺好玩的,消息的i传递和反射感觉也是一个特点吧!不过和Ruby相比,觉得小巧或是说是太简陋了!(我是这么觉得的)  ;但是用来开发什么的,我根本搞不懂要怎么搞的,单单处理一些小的算法等觉得还是可以的 ,但其他的就不知道要怎么编写的了。。。
--------原书《七周七语言 理解多种编程泛型》,笔记里面的照片是拍书上的。


0 0
原创粉丝点击