从 C/C++ 到 Ruby

由于 Ruby C/C++ 的差异实在太大,很难将两者间的差异一项一项列出。其中的一个重要理由是:Ruby C 语言的「不隐藏内部机制(No hidden mechanism)」原则完全处在两个极端上。Ruby 选择让人们的工作更轻松,但让执行期环境(runtime)负担加重。除非你要开始对你的 Ruby 程序代码做最佳化,你不需要关心编译器的脸色如何。

 

 

也就是说,你可以预期 Ruby 程序将会比等价的 C/C++ 程序慢的多。然而,你也会惊讶于只需要写这么少的程序代码,就可以迅速地完成你的 Ruby 程序。Ruby 能完全满足你的需求,又比C++简单的多。

 

 

Ruby 是动态型别(Dynamically typed),而不是静态型别(Statically typed)的程序语言。Ruby的执行期环境(runtime)会尽可能的处理所有工作。举例来说,你不需要事先知道你的 Ruby 程序将会被连结(link)到哪一个模块,或是哪一个方法(method)将会被呼叫。

 

幸运的是,Ruby C 有着良好的共生关系。Ruby 支持所谓的「扩充模块」。这些由 C 语言写成的模块能够在 Ruby 程序中使用(而且看起来与一般 Ruby 模块无异)。因此,你可以将你的 Ruby 程序中影响效能最大的部份划分出去,用纯粹的 C 语言来完成这些部分。

 

最后,Ruby 本身理所当然的是用 C 语言写成。

 

C语言的相似之处

C语言相同,在Ruby...

  • 你可以用程序式的方式写程序(但是底层依然是对象导向的环境。)
  • 大多数的运算子都是相同的。(包含复合运算子跟位运算子。)然而Ruby并没有++或是--运算符。
  • 你可以使用__FILE__  __LINE__
  • 你可以定义常数。虽然并没有特殊的 const 关键词,Ruby利用命名的惯例来强迫变数为常数:第一个字母为大写的变量便为常数。
  • 字符串由双引号包住。
  • 字符串是可变的。
  • 就像man page一样,你可以利用ri指令在终端机窗口中阅读大多数的文件。
  • 你也有一样的命令行调试器可以使用。

C++的相同之处

C++相同,在Ruby...

  • 大多数的运算符都是一样的(包含::),<<常常用来将元素串接在list之后。要注意的是:Ruby中你不需要使用->,永远只需要.
  • publicprivate,与protected的功能在两者是类似的。
  • 对象的继承一样只需要一个字符,只是从 : 变成 <
  • 可以将你的程序代码放进模块(module)之中,类似 C++ 中的 namespace 的作法。
  • 例外(Exceptions)的运作方式类似。虽然为了保护无辜的人们,我们把关键词改了。

C语言的不同之处

C语言不同的是,在Ruby...

  • 物件是强类型。(变量名称则没有任何的类型定义。)
  • 没有宏(macro)或是预处理器(preprocessor)、没有typedef、没有sizeof,也没有enum
  • 没有头文件(.h)、没有typedef、没有sizeof、也没有enum
  • 没有#define。用常数来代替他们便可。
  • Ruby 1.8中,程序代码在执行期才被解译,而不是被编译成任何一种机械语言或是byte-code
  • 所有的变量都存放在堆栈(heap)中。因此,你不需要自行释放他们,垃圾回收机制(Garbage collector)会处理他们。
  • 方法的参数是传引用,而非传值。
  •  require 'foo' 而不是 #include <foo> 或是 #include "foo"
  • 你不能在程序代码中插入汇编语言。
  • 每行的结尾不需要分号(例外:如果要在同一行内写多个语句,那就需要分号把它们分隔开)。
  •  if  while 这类条件表达式中,你可以省略括号。
  • 调用方法时,括号通常是选择性的。
  • 你不会常常使用大括号。一般只需要使用 end 关键词来结束一个多行的区块(像是 while 循环。)
  • do关键词被称作「block」,Ruby中没有C语言的「do statement。」
  • block」这个词在 Ruby 中有着不同的意义。它是指一段可以结合到一个方法调用的程序代码,使得该方法体在执行时可以呼叫这段程序代码。
  • 你不需要事先声明变量,当你需要一个变量时直接使用一个新名字就可以了。
  • 当测试真值的时候,除了 false  nil 之外的东西都视为真(包含 00.0,以及"0"。)
  • Ruby没有字符(char)型别,只有长度为一的字符串。
  • 字符串并不需要一个空字节作为结束。
  • 数组声明使用中括号而非大括号。
  • 当你加入更多元素到数组中时,数组会自动变大。
  • 如果你将两个数组相加,你会得到一个更大的新的数组,而不是指针运算的结果。
  • 大多数的情况下,一切都是一个表达式。(也就是说,while之类的东西实际上会被当做一个右值。)

C++的不同

C++不同的是,在Ruby...

  • 你不能明确的定义引用(reference)Ruby中每个变量都会被自动解参照回原本的对象。
  • 对象型别是强型别也是动态型别。Ruby执行期环境将会在执行期的方法呼叫成功时,自行辨识型别。
  • 对象的建构子用 initialize 命名,而不是类别名称。
  • 所有的方法都是虚拟(virtual)的。
  • 类别变量(静态变量)的变量名称永远用 @@开头。
  • 你不能直接存取成员变量――所有公开的成员变量(在Ruby中称作属性, attribute)都得通过方法访问。
  • self取代this
  • 有些方法会以 ’?’ 或是 ’!’结尾,这些符号都真的存在于方法名称中。
  • 本质上,Ruby没有多重继承。然而,Ruby可以使用”mixin”。(也就是说,你可以「继承」某个模块的所有方法)
  • 呼叫方法时的括号通常都可以省略。
  • 你可以在任何时候重新打开一个类别以加入新的方法。
  • 你不需要 C++ template 机制。(因为你可以将某个变量设值为任何一种对象,型别将在执行期自动辨识。)你也不需要转型。
  • 迭代(Iteration)的运作方式有些许不同,Ruby中你会让你的对象mixinEnumerator模块并且直接呼叫 my_obj.each 方法,而不是使用一个独立的迭代器(Iterator)
  • Ruby只有两种容器类别:ArrayHash
  • Ruby没有类型转换,你也会发现在Ruby中你不需要它们。
  • Ruby内建了多线程机制。但是在Ruby 1.8之中只有”green threads”(只在解释器中有效的线程),而不是原生的线程。
  • Ruby的标准函式库中就包含了单元测试(Unit test)函式库。

 http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/

http://www.ruby-lang.org/zh_TW/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值