首先感谢面包板社区人员的热心服务,很高兴自己再一次被面包板社区抽中了,能够有幸读松本行弘《编程语言设计与实现》,聆听 Ruby 之父畅谈设计新语言的动机,过程中的纠结与取舍以及 Ruby 开发中不为人知的故事,学习大师级程序员的思维方式。在此向为开发新语言的工作者表示衷心的感谢,感谢你们为编程语言的发展贡献自己的力量。 一. 创造一门什么样的语言 首先打开书,我们便能看到 Ruby 写的编程语言第一章创造一门什么样的语言,从编程语言的创造史开始讲起,世界上的所有编程语言都是由某个地方的某个人创造的,它们不是自然产生的,而是根据明确的意图和目的被设计并实现的。 Ruby 根据自己的经历和参考其他语言作者的意见,我认为有以下几点理由 提高编程能力,提高设计能力,打造个人品牌,活得自由。在这个开源的时代,技术人员要想生存下去,在技术社区的存在感是非常重要的。 成就一番伟大的事业首先需要的就是热情,不能保持热情是不行的。一旦有了创造编程语言的热情,就应该尽快开始,以后再根据需要慢慢地掌握所需要的基本知识以及工具的使用方法。 如上图所示,我们可以看到书的封皮和 Ruby 之父松本行弘,发现书包装的不错,而且里面的字迹也特别清晰,一打开就能够闻到书的味道。在扉页我们能够看到有这样一句话:站在巨人的肩膀上,我想学习 Ruby 语言的,都是站在松本行弘老师的肩膀上的。在此非常感谢老师。 第一章主要从语言的最基本讲起,首先是创造编程语言的意义和语言处理器的结构,虚拟机,编程语言设计的前篇和后篇这几部分组成。从本书中,我们可以看到一门编程语言的设计和实现的方法,以及 Ruby 语言在底层架构中如何的使用和应用。 二. 新语言 Streem 的设计与实现 首先,打开第二章,看到第二章的标题新语言 Streem 的设计与实现,介绍到多核时代,研究新时代的并行编程,设计支持并行编程的新语言,讲解了并行和并发编程。 Ruby 是开源的,在 Web 上免费提供,但需要一个许可证, Ruby 是一种类似于 Python 和 Perl 的服务器端脚本语言。 Ruby 语法简单,这使得新的开发人员能够快速轻松地学习 Ruby 。 Ruby 可扩展性强,用 Ruby 编写的大程序易于维护。 Ruby 有丰富的内置函数,可以直接在 Ruby 脚本中使用。 Ruby 是 " 程序员的最佳朋友 " 。 Ruby 可运行于多种平台,如 Windows 、 MAC OS 和 UNIX 的各种版本。 Ruby 是纯面向对象的语言, Ruby 中的一切都是以对象的形式出现。 在支持并发编程的结构中,最具代表性的是进程的线程。下面我们将介绍一下 Ruby 多线程的设计。每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作 , 称为多线程。 Ruby 中我们可以通过 Thread 类来创建多线程, Ruby 的线程是一个轻量级的,可以以高效的方式来实现并行的代码。 2.1 创建 Ruby 线程 要启动一个新的线程,只需要调用 Thread.new 即可 : # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 } # 线程 #1 执行代码 以下实例展示了如何在 Ruby 程序中使用多线程: #!/usr/bin/ruby def func1 i=0 while i<=2 puts "func1 at: #{Time.now}" sleep(2) i=i+1 end end def func2 j=0 while j<=2 puts "func2 at: #{Time.now}" sleep(1) j=j+1 end end puts "Started At #{Time.now}" t1=Thread.new{func1()} t2=Thread.new{func2()} t1.join t2.join puts "End at #{Time.now}" 以上代码执行结果为: Started At Wed May 14 08:21:54 -0700 20 19 func1 at: Wed May 14 08:21:54 -0700 20 19 func2 at: Wed May 14 08:21:54 -0700 20 19 func2 at: Wed May 14 08:21:55 -0700 20 19 func1 at: Wed May 14 08:21:56 -0700 2019 func2 at: Wed May 14 08:21:56 -0700 2019 func1 at: Wed May 14 08:21:58 -0700 2019 End at Wed May 14 08:22:00 -0700 2019 2.2 线程生命周期 1 、线程的创建可以使用 Thread.new, 同样可以以同样的语法使用 Thread.start 或者 Thread.fork 这三个方法来创建线程。 2 、创建线程后无需启动,线程会自动执行。 3 、 Thread 类定义了一些方法来操控线程。线程执行 Thread.new 中的代码块。 4 、线程代码块中最后一个语句是线程的值,可以通过线程的方法来调用,如果线程执行完毕,则返回线程值,否则不返回值直到线程执行完毕。 5 、 Thread.current 方法返回表示当前线程的对象。 Thread.main 方法返回主线程。 6 、通过 Thread.Join 方法来执行线程,这个方法会挂起主线程,直到当前线程执行完毕。 三. Ruby 类和对象 Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括: 数据封装、数据抽象、多态性、继承。这些特性将在面向对象的 Ruby 中进行讨论。一个面向对象的程序,涉及到的类和对象。类是个别对象创建的蓝图。在面向对象的术语中,您的自行车是自行车类的一个实例。 以车辆为例,它包括车轮( wheels )、马力( horsepower )、燃油或燃气罐容量( fuel or gas tank capacity )。这些属性形成了车辆( Vehicle )类的数据成员。借助这些属性您能把一个车辆从其他车辆中区分出来。 车辆也能包含特定的函数,比如暂停( halting )、驾驶( driving )、超速( speeding )。这些函数形成了车辆( Vehicle )类的数据成员。因此,您可以定义类为属性和函数的组合。 类 Vehicle 的定义如下: Class Vehicle { Number no_of_wheels Number horsepower Characters type_of_tank Number Capacity Function speeding { } Function driving { } Function halting { } } 通过给这些数据成员分配不同的值,您可以创建类 Vehicle 的不同实例。例如,一架飞机有三个轮子,马力 1,000 ,燃油罐容量为 100 升。以同样的方式,一辆汽车有四个轮子,马力 200 ,煤气罐容量为 25 升。 一. Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核( Kernel )模块中实现。所有的 I/O 方法派生自 IO 类。类 IO 提供了所有基础的方法,比如 read 、 write 、 gets 、 puts 、 readline 、 getc 和 printf 。 4.1 puts 语句 在前面的章节中,您赋值给变量,然后使用 puts 语句打印输出。 puts 语句指示程序显示存储在变量中的值。这将在每行末尾添加一个新行。 4.2 gets 语句 gets 语句可用于获取来自名为 STDIN 的标准屏幕的用户输入。 4.3 putc 语句 与 puts 语句不同, puts 语句输出整个字符串到屏幕上,而 putc 语句可用于依次输出一个字符。 4.4 print 语句 print 语句与 puts 语句类似。唯一的不同在于 puts 语句在输出内容后会跳到下一行,而使用 print 语句时,光标定位在同一行。 4.5 打开和关闭文件 截至现在,您已经读取并写入标准输入和输出。现在,我们将看看如何操作实际的数据文件。 File.new 方法 您可以使用 File.new 方法创建一个 File 对象用于读取、写入或者读写,读写权限取决于 mode 参数。最后,您可以使用 File.close 方法来关闭该文件。 语法 aFile = File.new("filename", "mode") # ... 处理文件 aFile.close File.open 方法 您可以使用 File.open 方法创建一个新的 file 对象,并把该 file 对象赋值给文件。但是, File.open 和 File.new 方法之间有一点不同。不同点是 File.open 方法可与块关联,而 File.new 方法不能。 File.open("filename", "mode") do |aFile| # ... process the file End 下表列出了打开文件的不同模式: 模式 描述 r 只读模式。文件指针被放置在文件的开头。这是默认模式。 r+ 读写模式。文件指针被放置在文件的开头。 w 只写模式。如果文件存在,则重写文件。如果文件不存在,则创建一个新文件用于写入。 w+ 读写模式。如果文件存在,则重写已存在的文件。如果文件不存在,则创建一个新文件用于读写。 a 只写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于写入。 a+ 读写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于读写。 五 . 总结 通过上面的介绍,相信每个人都对 Ruby 语言有了更深的了解。学习了松本行弘编书的设计新语言的设计流程和思路。感谢面包板社区,是我更近一步了解到 Ruby 语言的的思想和流程。