直播预约通道开启!2021腾讯数字生态大会邀您共探产业发展新机遇! 了解详情
写点什么

Facebook 应用 Moments 使用 C++ 实现跨平台代码共享

2015 年 6 月 29 日

据 Facebook 工程师 Ashwin Bharambe、Zack Gomez 及 Will Ruben报道,作为Facebook 最新应用之一的Moments 正使用C++ 实现跨iOS 和Android 平台共享业务逻辑。这里,我们将回顾一下Facebook 工程师给出的选择C++ 的理由和结果。

对于Moments 应用,为了“只关注客户端以及尽可能地缩短开发- 运行- 测试周期”,Facebook 工程师决定将服务器端逻辑移到客户端。这种选择的缺点是代码量的增加,他们不得不为他们起初针对的两个平台iOS 和Android 编写代码。

跨平台共享代码有许多可选方案,Facebook 工程师决定,“用特定于平台的代码编写UI,使用C++ 共享代码编写业务逻辑”。虽然缺少高级抽象使程序员不得不自行处理内存管理,但C++ 被认为是一种可以提供高性能的语言。而且,借助 std::shared_ptr、lambda 表达式和auto声明等现代 C++ 特性,Facebook 程序员“能够快速实现性能高且内存安全的代码”。

为了尽力保持 C++ 层 API 的简洁,Facebook 工程师作出了以下几项基本选择:

  • 函数式编码风格,这意味着“原始数据对象会默认转换成可变视图模型。”
  • 单向数据流,包括“即发即弃(fire-and-forget)的变化和方法,用于计算特定视图所需的视图模型”。
  • 缓存,“用于避免重复计算没有变化的中间结果”,性能分析显示这是合理的。

在 Android 平台上还有一个额外的问题,就是生成特定平台代码的绑定。为此,Facebook 工程师使用 Dropbox 的 Djinni 将视图模型从 C++ 转换到 Java。为了更好地匹配他们的函数式方式及优化垃圾收集,他们还重写了 Djinni 代码生成器。在 iOS 上,可以使用 Objective-C++ 实现与 C++ 代码的无缝集成。

这种方法已经使他们可以跨 iOS 和 Android 平台共享 Moments 的大部分业务逻辑,共享代码约占每个平台代码库的三分之一。最后,Facebook 工程师指出,借助这种方法,他们“能够创建新特性,而且工作量更小、Bug 更少”,并且还“可以在这两个平台之间更灵活地分配工程时间,实现在两个平台上同步交付”。

查看英文原文: Facebook’s Moments App Does C++ for Cross-Platform Development

2015 年 6 月 29 日 06:412018
用户头像

发布了 1008 篇内容, 共 319.5 次阅读, 收获喜欢 289 次。

关注

评论

发布
暂无评论
发现更多内容

面试官问:在读多写少的情况下,如何优化 MySQL 的数据查询方案

面试官问

MySQL 数据库 面试题 主从同步 读写分离

新手如何靠区块链赚钱?

CECBC区块链专委会

区块链

产品经理问我:手动创建线程不香吗,为什么非要用线程池呢?

Java鱼仔

线程池 Java 8

week12 作业

zbest

SICP 习题答案1.1 - 1.5

十元

区块链在医疗领域应用所要面临哪些挑战

CECBC区块链专委会

区块链 医疗

滴滴内部分享:如何提高代码的可读性,学习笔记

Java架构师迁哥

我要看 SICP 了!

十元

数据库的两个好帮手:pagehack和pg_xlogdump

华为云开发者社区

数据库 故障 GaussDB pagehack pg_xlogdump

ZEGO全新语音聊天解决方案,4步搭建爆火的语音聊天室

ZEGO即构

都在说云原生,它的技术图谱你真的了解吗?

浪潮云

云原生

大厂面试:求解集装箱港口翻箱问题的最短路径

华为云开发者社区

算法 路径 模型

Spring Boot(一):入门篇

海鸥云

spring Boot Starter

实习记录:PB协议编写

是鱼头啊啊啊

追根溯源,有点意思,关于MySQL更新“丢失”问题

互联网架构师小马

go get下载包失败问题

happlyfox

golang Proxy 28天写作

Kafka.02 - Topic 介绍

insight

kafka 2月春节不断更

Linux 多线程详解 —— 什么是线程

赖猫

Linux 线程 Linux内核

在gradle中构建java项目

程序那些事

Java maven Gradle 程序那些事 构建工具

程序员如何技术划水,Android项目开发如何设计整体架构?Android岗

欢喜学安卓

android 程序员 面试 移动开发

安卓软件开发!Android线程池基础入门和简单实践以及使用技巧,面试真题解析

欢喜学安卓

android 程序员 面试 移动开发

工作日志2-19

一锅水端平

RPC框架-dubbo:架构及源码分析-初篇

程序员架构进阶

微服务 dubbo 七日更 28天写作 2月春节不断更

【得物技术】Keep-alive 原理及业务解决方案

得物技术

前端 标签 页面 得物技术 keepalive

熟练HTML5+CSS3,每天复习一遍

魔王哪吒

面试 前端 28天写作 2月春节不断更

日记 2021年2月20日(周六)

Changing Lin

2月春节不断更

区块链产品走向普及之不完全指南

CECBC区块链专委会

比特币 区块链

一次并发插入死锁带来的“教训”,我才清楚这些MySQL锁知识

互联网架构师小马

AI窥人(三):你想靠AI实现永生吗?

脑极体

为什么 Python 的 f-string 可以连接字符串与数字?

Python猫

Python 开源 编程语言 后端 C语言

《TestNG》源码学习笔记

吴大山

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

Facebook应用Moments使用C++实现跨平台代码共享-InfoQ