每家初创企业都在谈论如何改变世界,但其中大部分根本不会讨论世界本身或者说存在于其中的物理事物。很多企业只是单纯打算交换数据库中的数据包与位置——虽然这一切也很重要,但字节本身并没有意义。毕竟这个世界是由原子组成。
字节与原子之间的障碍正在逐渐消失,归功于物联网的迅猛发展,如今程序员已经不再被局限于虚拟世界当中。如今,我们能够超越向磁盘写入1与0的传统作法:我们可以切实通过编写代码告诉设备如何掠夺、剪切、扭曲或者变更原子形态。现在,我们的软件能够开启灯光、变更室内外观、驾驶汽车以及移动墙壁等等。
时至今日,大量新的市场空间与机遇允许开发人员立足于真实世界。快速发展的相关领域包括自动驾驶汽车、智能家居、智能办公环境等等,而大规模定制化方案要求程序员们熟悉如何对数据结构做出调整,从而在对象之内实现变化。如果“面向对象编程”真能名符其实,那么开发人员的黄金时代可以算是真正来临了。
这些任务需要由新型语言——或者尚未正式诞生的新型语言——以及能够与陈旧语言相对接的新型协议来实现。改变世界意味着学习这些语言与协议的工作方式以及部署需求。如果大家希望真正改变世界,那么今天的这份语言与协议清单将成为各位必须掌握的先决性专业知识。而一旦大家开始直接改变世界,那么将永远无法重新满足于鼓捣什么数据库。
Basic
作为经典编程语言之一,Basic以部分简单硬件控制器为基础直接推动了早期微型计算机革命。那些制作出ESP8266控制器主板的技术人员使用的正是Basic语言,因为正如他们所言,这是“一款简单但却非常强大的语言,允许大家在无需计算机科学学位的前提下实现令人惊叹的成果。”
其中包含所有经典结构,包括一些古董级成果:goto。不过其中也包含一部分用于提取网络页面或者发送电子邮件的新命令。但必须承认,在使用Basic时我们的大部分时间都将被用于调整接口以收集需要被发送至互联网的数据。
要获取更多相关信息,大家可以参阅ESP8266社区或者该语言的专门网站。
X10
X10是首款允许程序员摆脱虚拟世界并触及真实世界的工具。X10从来不是一种复杂或者难于理解的协议,这可能是因为其诞生时间为1975年——比沃兹尼亚茨与乔布斯推出Apple I还早一年。尽管已经相当老迈,但X10仍然具备极高人气,因为目前还有着大量低成本设备对其提供支持。
该协议只提供一部分主要消息收发功能。大家可以向开关发送几个字节,并借此实现开关开、闭以及亮度调节。就这么多。除此之外,大家可以利用其它一些选项轮询远程开关并嵌入更多数据,但其大部分功能似乎仍是打开与关闭之类的简单操作。这些数据包可上行至家庭环境下的120伏供电线路,且必须通过由X10制造的FireCracker等独立设备来生成。
包括Flipit与Bottle Rocket在内的多种软件项目致力于简化与FireCracker的协作流程。当然,大家也可以直接选择最为原始的解决方案——X10,该公司自1978年就一直在推出家庭功能控件。
Insteon
2005年,Insteon公司发布了一项协议以提供体积更大的消息收发与更好的传输能力,并希望借此取代X10协议。众多报道指出,X10信号往往会在大型家居环境或者线路复杂的场景下发生丢失。也有不少人抱怨称,其信号会受到噪音的影响。因此,Insteon添加了一项机制以确保每个节点或者开关同时作为中继器运作,从而使得信号能够传递得更远并顺利抵达电路体系中最为幽深的角落。这是一种值得称道的睿智设计,也确实带来了理想的信号广播效果。
除此之外,该协议也更加丰富、复杂且具备冗余特性。相较于仅由两比特构成的简单命令,Insteon数据包能够承载“高达”十个字节的信息以构成两条完整命令。其主要命令仍然致力于实现开关的开启与关闭,但其同时也提供其它选项,旨在轮询传感器或者创建智能恒温机制。
Insteon公司的协议被广泛应用于各类智能hub以及家庭自动化工具当中,包括Amazon的Echo以及罗技的Harmony产品。以Linux Home Automation项目与OpenRemote为代表的多款开源工具也将通过发送数据包的方式集成这款供电线路控制器。
Zigbee、Z-Wave以及更多
X10与Insteon所触及的还仅仅是表面。另有多种解决方案能够将信号发送至设备——一部分通过供电线路,也有一部分以无线形式传输。Zigbee与Z-Wave都属于设备间的低功耗无线通信标准,尤其适用于需要在企业或者家庭环境中相互通信的低功耗嵌入式传感器及处理器。
举例来说,Zigbee最近刚刚发布公告,宣称开始在超市中实验温度传感器以实现农产品监测,从而确保部分水果与蔬菜处于最佳保存环境。Z-Wave则在其官方网站中介绍了一款能够通过无线按钮帮助年老或者体弱用户遭遇困境时进行呼救的“家庭尊严”设备。目前这类应用方案已有数百种,其每次执行只需发送数比特数据即可完成任务。
Zigbee与Z-Wave并非惟一的执行标准。这份日渐庞大的名单中还包括Panstamp、AMX、KNX、Lutron以及更多。其中一部分属于利基型方案:以AMX为例,其专注于音响设备以强化会议室效果。Panstamp则面向遍布于世界每个角落的小型无线控制器。它们都拥有自己的格式,但却可以通过编程方式实现交互。标准间的竞争可能令程序员们感到困惑,不过这毕竟要比不存在标准好得多。
XBMC、Freebox以及更多
如果说有人能够坐在沙发上边看着白痴电视节目边改变世界确实有些夸张,但可以肯定的是,数字化图像、视频以及音频确实打破了传统娱乐方式的束缚。以XBMC、Freebox以及VLC为代表的各类协议与框架原本被设计将填鸭式视频提供给躲在沙发中的无聊人士,但其如今也能够为整栋房屋乃至建筑物做出贡献。
这些视听设备从表面上看似乎与改变世界没有任何关系,因为它们在很大程度上只是在处理数字化内容文件——不过必须强调的是,随着平板显示器的普及程度越来越高,它们的作用也在逐步凸显。举例来说,时代广场周边的建筑物就能够根据屏幕上的显示内容不断变更外观。更多屏幕意味着数字化内容绝仅仅是大家手机上的显示素材,这同时也是一种转变建筑物或者室内效果的有效途径。
PostScript
很多人并不理解在PDF文件内存储数据或者将文本页面内容发送至打印机时所使用的数据结构的复杂性水平。事实上,PostScript文件中的数据并非简单的数字排列,而是一整套由字母、线条、数字以及图形构建而成的页面勾勒体系。该语言能够沿直线或者贝塞尔曲线移动笔划,而后对生成的图形进行填充。各种字体也不单纯属于位图,而是复杂曲线的集合,从而轻松以亚像素精度进行缩放或者位移。
该语言本身属于上世纪七十年代的神器,其基于堆栈的语法能够显著降低括号的使用频率。任何曾经使用过惠普计算器的朋友都会在PostScript中找到熟悉的感觉。该语言由图灵设计完成,而人们则通过编写PostScript代码进行复杂的分形计算及其它古怪的任务——哦,当然还有开发病毒。
时至今日,该语言的人气往往略逊于SVG,这是因为此种XML变体能够在Web之上得到广泛支持。不过二者的底层结构非常相似,而且代码转换也非常简单。这两款语言都能够通过PSToEdit等多种软件包被转换为其它代码格式,从而驱动激光切割机以及铣床设备。
OBD-II
多年以来,汽车只不过是由油箱、活塞、齿轮组外加后轮曲轴共同构成的简单机械。然而如今的汽车已经成为大量计算机制构建而成的复杂网络,只不过恰好还是配备四条轮胎。ODB-II标准是人类与汽车进行互动,并借此了解当前车辆运转状况的重要接口。
大部分游走于计算机与汽车之间的代码都属于纯粹的信息。举例来说,我们可以向传动轮端口发送部分字节,从而由其返回当前时速信息。类似的代码还可以实现RPM、引擎效率乃至数十种其它指标的查询。像Torque这样的多数基础应用都需要通过OBD-II端口对车辆进行追踪。
这类应用在业余赛车手以及汽车爱好者群体中极具人气,但它们也完全能够服务于普通民众。ArduinoOBD库就是一种很好的选项,可以帮助大家将自己的计算机与车辆相对接。
G
计算机数字控制,简称CNC,最初于上世纪五十年代出现在铣机设备之上,而工程师们随后很快开发出G语言——专门用于操控切割工具的移动方式。整个流程在初次接触时可能有点反直觉的意味,因为从代码控制角度出发,其实现的是从当前材料上切掉某些部分而非添加某些部分。不过一旦我们习惯了立足于最终结果逆向审视设计思路,大家就可以想象出如何移动切割刀并去除不需要的部分。
大部分编码工作涉及选定坐标系,同时安排切割刀移动到特定位置。这些设备往往能够“插补”并计算直线或者圆的中位点,从而简化简单形状的创建方式。不过对于复杂的形状,我们仍然需要采取一些特定规划。
随着多年以来各家制造商向其中添加强化元素,G语言的性质也出现了显著变化。很多目前被广泛使用的现代化宏以及面向对象层都会经过编译为原始G代码并发送至设备当中。
目前,G语言的一类变体将用于驱动多种3D打印机。虽然变体与本体所使用的具体代码有所区别,但其核心语言却从未发生改变。
STL
这种用于描述3D对象的标准格式已经成为3D打印领域的通用语言。在线商店通过交付STL文件出售虚拟对象,大家可以对其进行编辑或者直接发送至3D打印机。
这种语言本身可以说相当基础。文件的大部分内容为用于覆盖物体表面的刻面三角形角部三维坐标。虽然该格式似乎能够支持更为复杂的多边形,但文件本身倾向于使用传统三角形。另外,尽管与构建3D对象的基本要求有所冲突,但这种文件格式本身并不强制要求三角形完全覆盖对象或者定义所述表面的每个部分。
STL文件能够容纳点或者二进制版本的ASCII表达内容,不过大多数文件都选择使用二进制版本——因为其更为紧凑。
Slicer
STL文件并不能容纳充足的信息以驱动3D打印机,因此其中包含的三角形需要被转换成一份指令列表,从而移动3D打印机喷头并控制挤压机开关。打印机本身通常使用GCode,也就是Slicer,其在本质上相当于将GCode交付至CNC铣机设备。二者之间最大的不同在于Slicer代码属于添加型描述,即以从无到有的方式进行对象构建——相比之下,数控机床为消减型描述,将多余部分去除以雕刻对象轮廓。二者用于驱动打印喷头位置的指令大多相同,但Slicer新增了用于控制素材挤压的指令。
目前市面上存在着相当数量的Slicer程序,一部分为开源、一部分属于专有性质。其中一些拥有复杂的IDE,用于在打印之前对对象进行编辑。举例来说,KISSlicer就提供一套免费版本,其能够与单头打印机对接; 而其Pro版本则支持更为复杂的多头打印机。
Python
Python语言在生物实验室、社交科学中始终牢牢占据人气榜首,甚至在Raspberry Pi社区中被称为“官方语言”。后面这种说法有点夸张,因为Raspberry Pi单片机通常直接引导Linux,而大多数Linux代码库也都能够运行在该单片之上,不过需要直接面向ARM(v6或者7)架构进行编译。
不过,Python仍然拥有诸多既有优势。它作为一种高级语言拥有简洁的语法与相当宽松的数据传递规则。程序员们并不需要深陷抽象的泥潭,例如面对复杂的指针规则。相反,他们只需要编写一套指令集以处理数字,并利用这些值以指示Raspberry Pi进行哪些操作。
Raspberry Pi社区提供丰富的说明文档以帮助大家从零开始学习Python。
Processing
机器人与真实世界当中充满了使用Arduino语言——属于C与C++子集——的单片机。不过很多程序员希望事件能够更为简单,这也是该语言Processing这一名称的由来。这是一套经过简化的Java子集,保留了相当一部分较为粗放的类细节规则,同时添加了部分标准方法以帮助获取结果及切换开关。Java程序员们可能会对Processing在陈旧AWT Applet以及Frame上的表现非常满意,不过大多数人只是单纯希望编写几个循环并变更代码。
Processing代码通常运行在主机计算机之上,并由其向Arduino发送指令——Arduino则运行Firmata等本地解释器。开发工作立足于主机设备,不过具体任务则在Arduino之上完成。
Processing亦在移动应用开发场景中发挥着巨大作用,并凭借着利用JavaScript编写而成的Processing衍生版本而在Web应用开发领域站稳了脚跟。卡恩学院目前正使用其进行计算机编程授课。
原文标题:Program the world: 12 technologies you need to know
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】