快速了解 Hacklang

最近某个不存在的社交网络 Facebook 发布了一个新的编程语言 hacklang(确实是hack的,hack 的 PHP)。目的是在 PHP 基础上增强安全和类型,增加了异步,让语言用起来更『体面』,运行起来更快。很多同学肯定会问,为啥非要弄个编程语言呢?PHP 不挺好的么,速度慢用点缓存啊,真不行写扩展啊。如果您这么想的,那 Facebook 的同学真是非死不可了。人家虽然是 PHP 网站,但那流量,国内有几家能把 PHP 用到那个份上?也就微博吧。

那先看看 hacklang 的发展历史吧:几年前 Facebook 宣布了一个项目,Hiphop PHP,目的是把 PHP 编译成 C++ 来提高运行速度;后来演变成了 PHP 的虚拟机,改名为 HHVM;由于在改进过程中,引入了不少新特性,干脆,一不做二不休直接弄成了一门编程语言,hacklang 也就算横空出世了。

特性

笼统翻了翻文档,基本了解了下这门语言如何使用,把一些比较重要的点写下来仅供看官参考:

类型声明

在 hacklang 中,可以为变量声明更完整的类型。包括输入和输出类型。

下面用一个例子展示基本语法为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Class Type {
  // 整形
  public int $number;
  
  // 字符串,可为 null
  public ?stirng $string;
  
  // 浮点
  public float $float;
  
  // 数组
  public array<int, string, MyClass> $arr = null;
  
  // 数字列表
  public Vector<int> $numberList;
  
  // 输入整数,返回整数
  function calc(int $number): int {
  }
  
  // 输入一个 Map,返回类对象自身
  function process(Map<string, string> $config): this {
  }
  
  // 返回一个匿名函数,匿名函数接受一个 string 作为参数,返回一个 int
  function getProcessor(): (function (string): int) {
  }
}

有点像 Go 有木有?

增强类型

众所周知,PHP 中一个 Array 可以干几乎所有集合的事,因为具有 Dict, List 的双重特性,这也给 PHP 的 Array 增加了一层神奇(迷惘)。为了让这些更清晰,hacklang 增加了如下的类型:

  • Vector 有序的列表
  • Map 有序的字典
  • Set 唯一值列表
  • Pair 偶数列表
  • Shape 类型字典,没每个 key 指定一个类型,只接受该类型
  • Tuple 元组

除了 Shape 其它都比较常见,不再敖述。

还有个奇怪的就是类型别名。如果你不想让别人知道你的是什么类型,只是让最上层去使用该类型,那么可以给类型设定一个别名:

1
newtype MyInt = int;

类的优化

类的优化包括以下几方面:

  • 构建方法可以接收带 public/private/protected 关键字的参数,表示将其提升为内部变量。
  • 方法分发:动态方法和静态方法可以用一个名字了,看例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
Class MyClass {
  public function start(): this {
    // instance start
  }
  
  pubilc static function start(): this {  
    // Class start
    $instance = new self();
    return $instance->start();
  }
}

MyClass::start();
  • 方法覆盖声明。hacklang 里面要覆盖父类方法,必须加上 <> 关键字

简化 Lambda

以前写一大串的代码,现在一行搞定了,这个太酷了:

1
array_map($x ==> $x*2, $array);

XHP 语法

hacklang 是为了严禁而生的,所以 HTML 方面的安全也没有落下。XHP 就是一种自动过滤 XSS 生成 HTML 的语法。不用再用字符串的方式,直接写 HTML 就行。

1
2
3
4
// xhp 的返回值比较特殊
function render(string $keyword, int $count): :xhp {
  return <span>搜到 {$keyword} 共有 {$count} 个结果</span>;
}

异步

hacklang 实现了 async 和 await 关键字,来表示函数是异步执行和等待异步返回结果。如果一个函数返回值声明为 Awitable 类型,既可以试用 await 关键字来等待结果。目前还没有找到具体是如何实现的,PHP 之上总算也有真正的异步了。但看起来比 Go 的协程是弱多了。

除了异步和等待之外,还对生成器进行了 Continuas 类型封装,可以指定生成器返回的值类型。仅此而已。

不支持的

估计是为了更好的支持新特性,所有有些可有可无的干脆就放弃了:

  • 全局代码(函数外,不能再写代码了)
  • 类的同名构建函数(同名表示构建方法,现在也不支持了)
  • 父级的静态方法也不能调用了(parent::xxx)
  • 对象级别的静态调用(个人本来就不用)

其它的

  • trait 加入了 require 语法,可以要求试用 trait 的类 extend 某个类或 implements 某个接口。
  • 类名可以通过几种方式简化
    • 自用可以试用 MyClass
    • as 语法 MyLongLongNameClass as C

写在最后

hacklang 是 PHP 之上的一种增强和优化。确实补足的不少 PHP 的缺点和痛点,但要想成为主流还真是任重道远。即使好不容易接受了,但 PHP 官方支持了某些不错的特性,猜想依然会有大部分用户宁愿用官方的。而且加上现在 HHVM 安装的麻烦和各方面的不足,推行确实比较困难,尤其是还得改代码,对于很多『懒人』那简直是不可想想的。但如果是公司级的产品,为了性能还真是可以试试。

安装试用

安装 HHVM 即可获得 hacklang 运行时,具体看安装文档

想了解更多可以参考官方手册

Comments