程序语言学习
- 一起对照学习,通过发现差异,引发思考,更有心得,理解更扎实
- 操作大于纯理论,使用vim,快速频繁的练习
- 评价语言不是开发快,而是简洁直观,因为维护重构和演进更重要
语言分类学习
数据类型,运算
空值
- 空值: nil|null|none, 是否有专用的空值,is null | is none
数值类型
- 数字类型:整形细分,浮点细分
- lua 只有 64bit 浮点,但是足够表达精确的整数
- javascript 也是一样,只有8bytes 数字类型
- c/c++/java 则非常精细,为了和硬件支持匹配获得最高性能,
也是为了方便二进制数据和网络协议编码方便
boolean/logic
- 有没有专门的 boolean 类型
- 逻辑运算,assert
- and/or/not &&/||/!
- 比较绝对相等,经过自动类型转换后相等的区别
- 值类型决定运算符功能,
- 三元运算符 (expr1) ? (expr2) : (expr3),可省略中间默认不变
- nvl(plsql), ??(php), ||(c,java,js…)
- 二元组合比较
<=>
(php,ruby)
字符串
- 字符串连接:. .. || +
- “” 替换, interpolation
- “ 执行脚本生成内容
- heredoc
- 多行文本
日期时间支持
转换
- 操作符决定运算功能,如php
- 类型转换,特别是数字和字符串类型的转换
- 时间表示,一般是1970以来的s,ns,配合时间库
- 运算符决定数据类型 lua, ruby ?
- 强制类型转换 (type)value, php, java 等
- 真值假值:lua 只有false,nil 是假,0都是真
- 若类型语言和解释型语言,如php,支持
var_dump
数据结构
- hash/kv 结构
- 数组结构
- 数组成员类型是否一样,js typed buffer, c++/java 设计
- 可变长度,定长;稀疏还是 dense; 内部是否是 hash/kv
- 数组是对象吗?arr.length | length(arr)
- 更复杂的结构
- kv/array 遍历
- php: foreach( setas key => $val)
变量
- 变量声明
- php 直接使用 $varname
- lua,javascript 使用 var name 声明
- perl 使用 my name 声明
- 变量命名
- 能够明确的在编码上区分变量非常方便
- php 使用 $var
- ruby 使用 @instance @@class
- ruby 使用 Constant method
- 变量是否需要先声明后使用
- lua, javascipt 是
- php 不用先声明
- noradle request 对象也不需声明
- 变量作用域
- lua,javascript 默认作用域是全局
- lua 使用 local 前缀说明是局部作用域
- javascript 使用 var 说明是在当前函数的作用域
- php 默认引用变量都是局部,除非显示说明
- global, global hash
- 引用支持
- php 支持引用,相当于是别名
- 变量类型:强类型语言,弱类型语言
- javascript, type-script, dart
- lua, perl, php, python, ruby 都是弱类型语言
- c,c++,java,go 都是强类型语言
context aware
- perl (a,b,c…) 根据赋值变量前缀决定数据类型
- perl 的 $_ 当前变量
控制结构
- 语法使用 {} 还是 do / begin|end,还是完全自由
- c/c++/java/php 都一样
- 三目运算符
- if/elseif/elsif/else if/else
- switch/case/default or case/when/else
- 是否需要 break
- continue/exit/break
并发、流、事件
- 多线程,多进程,携程,非阻塞I/O
- stream, generator 支持
- 面向事件回调
异常
- try|catch|finally, begin|exception|en
- assert
- type check
- on error
- 区分异常和告警
- 异常是否按调用栈级联升起
- 未捕获异常是否造成程序退出
代码组织
- 函数或子过程支持
- 定义关键字: function, def
- 函数是否可以作为值,闭包支持
- php 闭包需要用 use
- 是否需要显示return,或者最后语句的值返回
- coffee, ruby 最后语句返回
- 参数:命名参数,可选参数,可变参数
- 是否可以返回多个值
- 面向对象
- 实例成员类成员靠成员命名还是靠关键字声明
- 属性可见性声明支持,public,protected,private
- final, static 支持
- 访问成员代码 . or ->
- 继承语法 extends
- 魔术方法: getter, setter
- 面向接口:工程化支持
- trait, mixin 替代继承
- 命名空间
- nodejs 从来不需要命名空间,进行名字隔离和别名
- nodejs 也不需要设置 path 环境变量
- 模块
- 导入支持,多次导入防范,容忍导入失败
- 模块导出
- lua 就是返回一个table
- php 就是 return 一个值,类型可以是复杂类型
- module可以是一个文件,一个目录,一个lib/jar/war
- 库支持
- framework 支持
- 主要是钩子机制,事件机制
- 如 sysdig 的 lua chisel,nginx 的 lua
- 如前端浏览器的 js
- 如后端web服务框架
元编程
- 反射,原型链
- 编译还是解释,多数现代语言都是二阶段,有些jitc
外接交互
- 标准输入输出
- php 特别,不在
<?php code ?>
中的代码都是输出
- php 特别,不在
- 文件I/O操作
- 网络I/O操作
- 各种协议支持
- http client/server
- mail client/server
- database driver
- 各种数据格式支持
- 多媒体,图像,音频,视频
所有的语言和数据库结合都不太好
- 代码混入SQL排版、编码、阅读都不好
- 代码混入连接池管理等也一样
- 写 ORMapping 复杂,维护同步性差
bash: line 1: Missing: command not found - ruby active record 提供的新的机会
和 web 结合
- 是否可以轻松处理 json 数据结构
- xml 解析和生成
- 模板中的代码是否和直接写尽量一致?
- php 的控制结构语句使用:而不是{}
- 模板和语言
- php 生来就在模板中,输出内容很方便
- plsql(noradle)必须使用API输出
- 高并发服务能力支持
计算机语言分类
- 嵌入式语言:javascript|lua,站在巨人的肩膀上,一身轻
- 平台开发语言:做基础设施,不适合做业务数据处理
- 胶水语言:下可调c-lib,也可被嵌入,可以继承网络、多媒体、数据库
- os 脚本,处理os事务杂项管理用,shell,perl
- 高并发服务器语言:erlang|go
- 精简语言:ruby
脚本语言选择:
* perl/python 存在风格之争,
但是perl5/perl6差异很大,
python2/python3差异也很大,
说明已经否定了前面版本的基础设计,
这时其他后来这居上,也就是ruby,
所以加以时日,等ruby的外围库和生态圈繁荣起来,
一定会超过 perl/python 的。
* php 越来越 java了,是个大杂烩,
语言不够干练,这抄一下那抄一下。
分不清语言核心和库,或者说核心臃肿。
不过 php 还是非常实用的。
* js 看上去很简陋,确实内核最精炼的,
ruby 的内部实质和js非常项,
而 js 也大量借鉴了ruby的设计,
加上 coffee|type-script|dart|es6,
js 站在巨人肩膀上的浏览器环境和nodejs环境,
js将有很好的未来。
javascript 的特点
- evented|hooked
- none-blocking I/O, async/callback/closure
- chained function call
- prototype chain,没有传统风格的面向对象
- npm module system
- 没有静态变量一说
- 没有 public,protect,private 一说
- 没有强类型
- 没有细致的数据类型
- 函数参数和返回简单
noradle 的特点
- 无需进行 new,delete,内存管理,全部是call level变量
- 无需面向对象
- 没有命名空间的问题,使用synonym
- 无需各种array操作支持,直接使用数据库的功能
- 面向数据处理,面向业务
- 无需定义很多变量,r.get 系列从 call env 取,tmp 系列支持
- 无需学习模板,直接用友好的 print API
- 无需连库,本身就在数据库中运行
- 不需要 file API, net API
- 直接指示 nginx/nodejs 接入进行数据处理
- 直接输出compat结果集,支持父子结构,可转json
perl 的特点
- 依赖环境
- 文本匹配,报告生成
python 的特点
- 缩进代表结构
- 数据结构丰富,易用,包括 set
- 将 array/tuple 用于函数和返回值,非常统一
php 的特点
- 直接的web支持
- 直接就在模板系统中
- 模板可以套代码,代码也可以输出内容
- 写 PHP 的代码,也就像是写页面模板,和现代的纯前端开发是一样的
- web 输入直接进入全局变量_globals
- 大量的使用函数库,虽然不那么优雅,但是非常实用
- 演进速度快,其他语言的优秀成分很快就能吸纳进来
ruby 的特点
- 大小写,前缀的规则,snake case,状态
- 一切皆对象,语法糖只是对象的一种使用形式,API组织有秩序好理解