脚本语言对比学习随笔

程序语言学习

  • 一起对照学习,通过发现差异,引发思考,更有心得,理解更扎实
  • 操作大于纯理论,使用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 特别,不在 中的代码都是输出
  • 文件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组织有秩序好理解

你可能感兴趣的:(编程语言理解)