ruby之父的技术剖析(科普)_代码的未来书评-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 代码的未来 > ruby之父的技术剖析(科普)
EE 代码的未来 的书评 发表时间:2015-05-21 01:05:10

ruby之父的技术剖析(科普)

这本书其实是ruby之父Matz的一些期刊文章的集合,可能是发表在比较大众化的杂志《日经linux》上的科普文章,居然意外地浅显易懂我,只花了三天就读完了。 因为作者是日本人,其思维方式和国人较为相似,读起来十分流畅,另外书中的卖萌之处也不少。书中关于Ruby的东西非常多,基本上每章都有,以下是一些笔记和总结:

#1 关于编程
* 编程的本质是思考
* 编程不是和计算机打交道,而是和人打交道,编程应该人性化(有人味),其乐趣在于创造
* 性能并不是最重要的
* 算法是基本保持不变的,大部分算法都是在20世纪60年代提出,有些甚至源于2000多年前的古希腊

#2 关于摩尔定律
* 集成电路中的晶体管数量大概每18个月翻一倍,制程减半意味着成本降低,且速度提升2倍,耗电量降低到1/4
* 20年后的PC也许相当于现在的超级计算机
* 摩尔定律可能会碰到物理极限,届时必然需要新的计算模型

#3 编程语言
* 编程语言进化的方向是更高的抽象化、并行和多核
* 设计API相当于设计DSL
* 库设计就是语言设计(源于AT&T贝尔实验室)
* 所谓元编程,就是“用程序来编写程序”的意思
* OOP语言如Java、C++其实或多或少都具备一些元编程能力
* 根本没有什么元编程,只有编程而已 --《Ruby 元编程》
* C语言中,错误处理主要是通过返回特殊值(如:fopen失败返回Null)
* 闭包,即在函数对象中,将局部变量这一环境封闭起来的结构(与封闭它的函数对象的生命周期相等)
* 静态语言的优点是,易查错(类型确定容易发现bug),高性能(编译时可以更好的优化)
* 动态语言的优点是,简洁,灵活

#4 Go语言
* Go语言的目的是取代C/C++,是一种编译型的,并发性的,带GC(垃圾回收)的系统语言(所谓系统语言,大概是指能编写操作系统)
* Go是静态类型,但类型声明有时候可以省略
* Go通过goroutine源生支持并发编程
* Go是下一代语言中,作者最看好的一个
* 无继承式面向对象、多重赋值、可以返回多个值

#5 Dart和CoffeeScript
* 目的是取代Javascript
* Dart是静态类型,很像Java和Groovy
* Dart提供基于类的对象系统(javascript是基于函数和prototype的)
* CoffeeScript很像Python/Ruby,语法优美,采用强制缩进

#6 Lua
* 是唯一一个来自南美洲的编程语言(Ruby则是唯一一个来自亚洲的编程语言)
* Lua的优势在于其高速虚拟机(LLVM),有时甚至比宿主语言还快
* 核心数据结构是列表(table),数组和列表合为一体(与PHP一样)
* 与Javascript十分相似,函数是first-class Object 面向对象是通过函数来实现的
* 因为轻量、简洁、快速,被嵌入到各种应用程序中,如魔兽世界、仙境传说、Adobe Photoshop LightRoom等

#7 云计算
* 大数据处理中,要用哈希表、布隆过滤器等技术减小计算量
* 在大规模数据中心中,每天都会有几台计算机发生故障
* google采用分布式文件系统GFS,并用MapReduce实现分布式任务处理,其中,Map负责数据映射,Reduce负责数据化简
* GFS和MapReduce都是不开源的,但其原理已通过论文公开,Hadoop和HFS是其开源实现(google在对外的分布式环境讲座中也用Hadoop)

#8 Unix
* Unix进程ID是16位的,也就是说无法超过32767个,Linux则被限制为48353个
* select系统调用能监视的文件描述符(fd)是有上限的(一般为1024),为了解决这个问题,可以使用epoll、kqueue、libev、Ruby的EventMachine框架等
* Unix管道对于多核的运用是非常有效的,类似CPU的流水线优化,多个管道串联的情况也可以进行叠加
* 多核编译和distcc可以通过分布式提升编译速度

#9 Ruby和Rails
* rack是http服务器(如nginx、apache)和Web应用框架(如rails、sinatra)的中间层(类似Python的wsgi)
* rack的工作原理是将请求环境(env)作为参数来调用call方法,和wsgi类似
* Unicorn可以解决web应用的部署问题
* 由于GIL锁的限制,Ruby线程无法利用多核

#10 进程间通信
* 管道(pipe),仅本地
* 消息(message),仅本地
* 信号量(semaphore),仅本地,不能传递数据
* 共享内存,仅本地
* TCP套接字,可用于不同主机通信,可靠,需建立连接(开销大)
* UDP套接字,可用于不同主机通信,无连接,不可靠,实时性好
* Unix套接字,通过本地文件实现,仅本地,可靠
* ZeroMQ可以统一管理各种底层通信(TCP、进程间、进程内线程、UDP多播等)

#11 存储技术
* NoSQL 并不是不再需要SQL,而是 "Not Only SQL"
* 关系型数据库由于要保持ACID,在分布式中,并发访问存在很多问题
* 将关系型数据库分割到多台服务器上,可以采用水平分割(分割行)和垂直分割(分割列)
* NoSQL数据库包括键-值型、文档型和对象型,键-值型有memcached、redis等,文档型有MongoDB
* MongoDB的数据格式是Json,没有表结构定义(schema),并使用javascript作为命令行语言
* 关系型数据库不会消亡,VoltDB是一个高性能关系型数据库(据说比传统RDBMS高出数十倍);VoltDB只能用存储过程,无法直接使用SQL,它的数据存在内存中,并支持分布式
* memcached可用作高速缓存数据库,但由于限制较多,逐渐被redis取代
* SSD、MRAM、FERAM等存储技术的革新,可能会颠覆数据库技术,下一代内存技术成熟后,像Smalltalk、Lisp这样将内存空间直接保存下来的模型也许会东山再起

#12 Node.js
* Node.js 采用单线程、事件驱动、非阻塞IO
* JavaScript是目前动态语言中,性能最高的一种
* 单线程和事件循环方式内存占用小,性能高,但是无法利用多核,而且如果回调函数产生了阻塞,事件循环就整体停滞了
* Node.js的http连接采用keep-alive方式,并且通过实践驱动模型,减少了每个连接消耗的资源,非常适用于同一客户端对同一服务器进行频繁连接,且连接数非常大的场景(比如,聊天服务器)

展开全文
有用 1 无用 0

您对该书评有什么想说的?

发 表

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读