博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么 Facebook 发明新语言“Hack”
阅读量:6895 次
发布时间:2019-06-27

本文共 1807 字,大约阅读时间需要 6 分钟。

为什么Facebook发明新语言“Hack”

(注:Hack是一种PHP的派生语言)

为了替换掉那些有年头的老代码,Facebook创建了一个新的语言。这篇文章将会告诉背后的故事。

By Steven Melendez

这个故事来自Facebook工程师Julien Verlaguet和Ed Smith的一次访谈。2004年2月,扎克伯格(Mark Zuckerberg)的哈佛同学们第一次登陆Facebook,服务器里运行着PHP。那个时候PHP击败了Perl成为最炙手可热的Web开发语言。

使用类似Ruby的Rails或者Python的Django这些当下最流行的开发框架都不是那个时候的选择。Rails第一次发布是在几个月之后(注:2004年7月),而Django在一年后才被发布(注:2005年)。十年后,PHP因为笨拙的库,不一致的命名规则,内置定义的函数,在多语言程序中语法和语义与相关语言巨大差异使人混淆,过去的设计原则极容易导致安全性问题等而被指责。

“每一个PHP程序员日复一日地处理着难以捉摸或者棘手的任务”,Facebook的工程师Julien Verlaguet和Alok Menghrajani在最近的公司博客上写道。

但是,PHP并没离开Facebook,并且其他的大公司和工程的数百万行代码都是用这个语言写的。程序员们仍然得益于PHP的快速开发和部署,且努力去除那些不好的特性。

减轻PHP程序员的痛苦不是说抛弃这个语言和多年的开发成果。Facebook开发了Hack,这是一种新的,派生于PHP的语言。它将与已有的代码和谐相处,增强了安全特性源于函数式编程语言和学术研究。

“这是一种很特别的设计,能与PHP进行无缝的交互”,Verlaguet说。技术引领着Hack项目的发展,它的背后是一份混合编程语言和行业经验的正式学术研究。Facebook已经在内部使用和发展Hack大概有两年时间了。最近,已经将项目开源,并且在4月9日安排公开的“开发者日”。

“我们这样做的目的是希望能更好地倾听来自社区的反馈, 同时开源社区也会让Hack面对Facebook外的开发者有更好的体验”,Verlaguet说。

也许Hack的主要创新是引入了自动类型判断,概念类似于深奥难懂的Haskell和 ML语言但是比他们少得多的命令行,同时更接近主流的编程语言。

传统的PHP是动态类型,这意味着在代码中的基本的本质的变量类型是一个数还是一个字符串或者其他类型是不确切的,除非程序实际运行着。程序员们享受这种灵活,却为错误开辟了空间,它不像Java或者C那样的静态类型语言,代码被写出来的时候就明确告诉你变量的类型。

Hack走了一条中间路线:它可以基于变量怎样被使用的使用逻辑让开发者指定类型,如果代码的逻辑冲突,就会给出一个错误(error)。这个概念本身不是新的,但是它以前都是被用在编译型语言上的,开发者需要等待他们的源代码被转换成机器码,不能像PHP程序员希望的那样点完保存立即执行,Verlaguet说。

“解决方案在于建立了一个类型检查守护进程”,他说。关于这个后台程序运行在开发者的电脑里。它代替等待开发者去显示调用一个编译器,当源代码文件被改变的时候,类型检查进程要求操作系统去通知编译器。这类似于同步文件需要更新时,Dropbox就得到一个信号。

被改变检查的有效的方法是通过类型检查器被反复检测,直到其确认与其他的代码是一致的。只要类型检查器足够快,程序员基本就不需要等待,类似于在Git版本管理系统上转换到新分支那样,Verlaguet说。

Hack还有其他一些特性,增强的集合类型如vector和set来增强PHP的数组,匿名函数被使用在函数编程上。新的语言让Facebook逐步提升已有的PHP代码,使得长期投资在PHP上的价值继续发挥作用, Ed Smith说,Facebook的HHVM运行引擎将会同时提供给Hack和PHP。

“Hack 让我们能在同一时间和同一文件上动态转换我们的代码”,Smith说,“换做其他的一种语言将会有很大的困难”你认为是吗?

其他的公司和工程转换到时髦的Hack还为时尚早,项目刚刚开源,Verlaguet说。不过,从对他采访的记录来看,整个项目目前是处于积极的态势中。

英文原文:fastcolabs

文章转载自开源中国社区 [

你可能感兴趣的文章
Java的类型擦除
查看>>
好程序员web前端教程分享js闭包
查看>>
可以给redis的hash中的hashKey设置expire吗?
查看>>
Python获取本机 IP/MAC(多网卡)
查看>>
jQuery EasyUI 学习资料链接整理
查看>>
iOS textView 选中指向左上角
查看>>
OpenSSL学习(十二):基础-指令gendsa
查看>>
mac:python:pycharm:osx:可怕的case-sensitive硬盘格式
查看>>
MySQL备份与恢复
查看>>
Unsupported major.minor version
查看>>
PHP框架高级编程——应用Symfony、CakePHP和Zend
查看>>
读取xml节点值生成一个实体类,读取xml所有节点值,读取所有xml所有节点名称
查看>>
RAC 归档目录不同的备份
查看>>
配置管理小报100122:能者上、平者让、庸者下
查看>>
配置管理小报100204:产品路线图
查看>>
开发 Windows RT 桌面应用(来自 Surface RT)
查看>>
iOS 6版本与之前版本差异总结
查看>>
JNI编程(二) —— 让C++和Java相互调用(1)
查看>>
memcached简介
查看>>
Ubuntu 更改 Gun Make 版本
查看>>