一位跨平台开发者的自白

Andreia Gaita[1] 在 OSCON 开源大会上发表了一个题为跨平台开发者的自白[2]的演讲。她长期从事于开源工作,并且为Mono[3] 工程(LCTT 译注:一个致力于开创 .NET 在 Linux 上使用的开源工程)做着贡献,主要以 C#/C++ 开发。Andreia 任职于 GitHub,她的工作是专注构建 Visual Studio 的 GitHub 扩展管理器。

我在她发表演讲前就迫不及待的想要问她一些关于跨平台开发的事,问问她作为一名跨平台开发者在这 16 年之中学习到了什么。

在你开发跨平台代码中,你使用过的最简单的和最难的代码语言是什么?

我很少讨论某种语言的好坏,更多是讨论是那些语言有哪些库和工具。语言的编译器、解释器以及构建系统决定了用它们做跨平台开发的难易程度(或者它们是否可能做跨平台开发),可用的 UI 库和对本地系统的访问能力决定了与该操作系统集成的紧密程度。按照我的观点,我认为 C# 最适合完成跨平台开发工作。这种语言自身包括了允许快速的本地调用和精确的内存映射的功能,如果你希望你的代码能够与系统和本地函数库进行交互就需要这些功能。而当我需要非常特殊的系统功能时,我就会切换到 C 或者 C++。

你使用的跨平台开发工具或者抽象层有哪些?

我的大部分跨平台工作都是为其它需要开发跨平台应用的人开发工具、库和绑定binding,一般是用 MONO/C# 和 C/C++。在抽象的层面我用的不多,更多是在 glib 库和友元friends方面。大多数时候,我用 Mono 去完成各种跨平台应用的,包括 UI,或者偶然在游戏开发中用到 Unity3D 的部分。我经常使用 Electron(LCTT 译注:Atom 编辑器的兄弟项目,可以用 Electron 开发桌面应用)。

你接触过哪些构建系统?它们之间的区别是由于语言还是平台的不同?

我试着选择适合我使用的语言的构建系统。那样,就会很少遇到让我头疼的问题(希望如此)。它需要支持平台和体系结构间的选择、构建输出结果位置可以智能些(多个并行构建),以及易配置性等。大多数时候,我的项目会结合使用 C/C++ 和 C#,我要从同一源代码同时构建不同的配置环境(调试、发布、Windows、OSX、Linux、Android、iOS 等等),这通常需要为每个构建的输出结果选择带有不同参数的不同编译器。构建系统可以帮我做到这一切而不用让我(太)费心。我时常尝试着用不同的构建系统,看看有些什么新的变化,但是最终,我还是回到了使用 makefile 的情况,并结合使用 shell 和批处理脚本或 Perl 脚本来完成工作(因为如果我希望用户来构建我的软件,我还是最好选择一种到处都可以用的命令行脚本语言)。

你怎样平衡在这种使用统一的用户界面下提供原生的外观和体验的需求呢?

跨平台的用户界面的实现很困难。在过去几年中我已经使用了一些跨平台 GUI,并且我认为这些事情上并没有最优解。基本上有两种选择。你可以选择一个跨平台工具去做一个并不是完全适合你所有支持的平台的 UI,但是代码库比较小,维护成本比较低。或者你可以选择去开发针对平台的 UI,那样看起来更原生,集成的也更好,但是需要更大的代码库和更高的维护成本。这种决定完全取决于 APP 的类型、它有多少功能、你有多少资源,以及你要把它运行在多少平台上?

最后,我认为用户比较接受这种“一个 UI 打通关”了,就比如 Electron 框架。我有个 Chromium + C + C# 的框架侧项目,有一天我希望可以用 C# 构建 Electron 型的 app,这样的话我就可以做到两全其美了。

构建/打包系统的依赖性对你有影响吗 ?

我依赖的使用方面很保守,我被崩溃的 ABI(LCTT 译注:应用程序二进制接口)、冲突的符号、以及丢失的包等问题困扰了太多次。我决定我要针对的操作系统版本,并选择最低的公有部分来使问题最小化。通常这就意味着有五种不同的 Xcode 和 OSX 框架库,要在同样的机器上相应安装五种不同的 Visual Studio 版本,多种 clang(LCTT 译注:C语言、C++、Object-C、C++ 语言的轻量级编译器)和 gcc 版本,一系列的运行着各种发行版的虚拟机。如果我不能确定我要使用的操作系统的包的状态,我有时就会静态连接库,有时会子模块化依赖以确保它们一直可用。大多时候,我会避免这些很棘手的问题,除非我非常需要使用他们。

你使用持续集成(CI)、代码审查以及相关的工具吗?

基本每天都用。这是保持高效的唯一方式。我在一个项目中做的第一件事情是配置跨平台构建脚本,保证每件事尽可能自动化完成。当你面向多平台开发的时候,持续集成是至关重要的。没有人能在一个机器上构建各种平台的不同组合,并且一旦你的构建过程没有包含所有的平台,你就不会注意到你搞砸的事情。在一个共享式的多平台代码库中,不同的人拥有不同的平台和功能,所以保证质量的唯一的方法是跨团队代码审查结合持续集成和其他分析工具。这不同于其他的软件项目,如果不使用相关的工具就会面临失败。

你依赖于自动构建测试,或者倾向于在每个平台上构建并且进行本地测试吗?

对于不包括 UI 的工具和库,我通常使用自动构建测试。如果有 UI,两种方法我都会用到——针对已有的 GUI 工具的可靠的、可脚本化的 UI 自动化少到几乎没有,所以我要么我去针对我要跨我所支持的平台创建 UI 自动化工具,要么手动进行测试。如果一个项目使用了定制的 UI 库(比如说一个类似 Unity3D 的 OpenGL UI),开发可编程的自动化工具并自动化大多数工作就相当容易。不过,没有什么东西会像人一样双击就测试出问题。

如果你要做跨平台开发,你喜欢用跨编辑器的构建系统,比如在 Windows 上使用 Visual Studio,在 Linux 上使用 Qt Creator,在 Mac 上使用 XCode 吗?还是你更趋向于使用 Eclipse 这样的可以在所有平台上使用的单一平台?

我喜欢使用跨编辑器的构建系统。我更喜欢在不同的IDE上保存项目文件(这样可以使增加 IDE 变得更容易),通过使用构建脚本让 IDE 在它们支持的平台上去构建。对于一个开发者来说编辑器是最重要的工具,学习它们是需要花费时间和精力的,而它们是不可相互替代的。我有我自己喜欢的编辑器和工具,每个人也可以使用他们最喜爱的工具。

在跨平台开发的时候,你更喜欢使用什么样的编辑器、开发环境和 IDE 呢?

跨平台开发者被限制在只能选择可以在多数平台上工作的所共有的不多选择之一。我爱用 Visual Studio,但是我不能依赖它完成除 Windows 平台之外的工作(你可能不想让 Windows 成为你的主要的交叉编译平台),所以我不会使用它作为我的主要 IDE。即使可以,跨平台开发者的核心技能也是尽可能的了解和使用大量的平台。这就意味着必须很熟悉它们——使用该平台上的编辑器和库,了解这种操作系统及其适用场景、运行方式以及它的局限性等。做这些事情就需要头脑清醒(我的捷径是加强记忆),我必须依赖跨平台的编辑器。所以我使用 Emacs 和 Sublime。

你之前和现在最喜欢的跨平台项目是什么?

我一直很喜欢 Mono,并且得心应手,其它的项目大部分都是以某种方式围绕着它进行的。Gluezilla 是我在多年前开发的一个 Mozilla 绑定binding,可以把 C# 开发的应用嵌入到 Web 浏览器页面中,并且看起来很有特色。我开发过一个 Winform 应用,它是在 linux 上开发的,它可以在 Windows 上运行在一个 Mozilla 浏览器页面里嵌入的 GTK 视图中。CppSharp 项目(以前叫做 Cxxi,更早时叫做 CppInterop)是一个我开始为 C++ 库生成 C# 绑定binding的项目,这样就可以在 C# 中调用、创建实例、子类化 C++ 类。这样,它在运行的时候就能够检测到所使用的平台,以及用来创建本地运行库的是什么编译器,并为它生成正确的 C# 绑定binding。这多么有趣啊。

你怎样看跨平台开发的未来趋势呢?

我们构建本地应用程序的方式已经改变了,我感觉在各种桌面操作系统的明显差异在慢慢变得模糊;所以构建跨平台的应用程序将会更加容易,而且对系统的集成也不需要完全本地化。不好的是,这可能意味着应用程序易用性更糟,并且在发挥操作系统特性方面所能做的更少。库、工具以及运行环境的跨平台开发是一种我们知道怎样做的更好,但是跨平台应用程序的开发仍然需要我们的努力。


via: https://opensource.com/business/16/5/oscon-interview-andreia-gaita

作者:Marcus D. Hanwell [4] 译者:vim-kakali[5] 校对:wxy[6]

本文由 LCTT[7] 原创翻译,Linux中国[8] 荣誉推出


推荐文章

点击标题或输入文章 ID 直达该文章

262 我是如何从 Web 开发转向移动开发的?

1070 一大波有用的 bash 别名和函数

1100 为什么一些古老的编程语言不会消亡?

将文章分享给朋友是对我们最好的赞赏!


内容转载自公众号

Linux中国
Linux中国
了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS (intermediate value).Format is not a function问题解决

JS (intermediate value).Format is not a function问题解决 前言 最近项目遇到一个问题,就是在javascript中使用new Date().Format("YYYY-mm-dd")的时候,会出现报错现象,直接导致界面无法正常显示。下面为大家解答一下。 问题详情…

java程序大笨钟怎么打,L1-018.大笨鍾(Java)PAT團體程序設計天梯賽-練習集

微博上有個自稱“大笨鍾V”的家伙,每天敲鍾催促碼農們愛惜身體早點睡覺。不過由於笨鍾自己作息也不是很規律,所以敲鍾並不定時。一般敲鍾的點數是根據敲鍾時間而定的,如果正好在某個整點敲,那么“當”數就等於那個整點數&#xff…

JSP JavaBean

转载自 JSP JavaBeanJSP JavaBean JavaBean是特殊的Java类,使用J ava语言书写,并且遵守JavaBean API规范。 接下来给出的是JavaBean与其它Java类相比而言独一无二的特征: 提供一个默认的无参构造函数。需要被序列化并且实现了Serializable接…

layui 单独使用日期组件

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet" href"/layui/css/layui.css" media"all"><style type"text/css"…

JSP中的EL表达式详细介绍

转载自 JSP中的EL表达式详细介绍一、JSP EL语言定义EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种…

php如何直接使用iview,iview安装使用

iView 是一套基于 Vue.js 的开源 UI 组件库&#xff0c;主要服务于 PC 界面的中后台产品。安装cd 项目cnpm install iview -S在项目中引入iview 在入口文件main.js中配置import iView from iviewimport iview/dist/styles/iview.cssVue.use(iView)官网示例{{ message }}export …

想获得腾讯发行机会?来“腾讯GAD•游戏创新大赛”

世界上最快乐的事&#xff0c;莫过于为理想而奋斗。正是源于心中对游戏的情怀和梦想&#xff0c;无数游戏人走上了游戏开发的道路。这条路&#xff0c;或迷茫、或坚定、或痛苦、或喜悦&#xff0c;但只要拥有理想与热情&#xff0c;便是航行的舵和帆。 腾讯GAD游戏开发者平台&a…

oxyen eclipse 启动 报错 se启动提示javaw.exe in your current PATH、No java virtual machine

eclipse启动提示javaw.exe in your current PATH、No java virtual machine 另外&#xff0c;也可修改eclipse.ini 文件&#xff0c;在最前面加上下面两行内容&#xff1a; -vm D:/java/jdk1.6.0_10/bin/javaw.exe *******************************************************…

JSTL常用标签6

转载自 JSTL常用标签6JSTL常用标签&#xff1a; 1、EL表达式可以取出Java Bean以及单个属性的值&#xff0c;在页面中使用${..},但是不能遍历集合。 使用JSTL可以遍历集合&#xff0c;因此使用EL和JSTL配合使用&#xff0c;基本上可以实现所有的功能。 2、在使用标签的页面中&…

matlab eval 不显示,matlab中 eval(command); 运算符无效的问题

下面这个程序是haar-like特征提取-->haar-like关键点显示-->haar-like特征人脸检测代码&#xff0c;该段代码在运行时出现了如图片所示的bug&#xff0c;本人看不懂这个bug出错的根源&#xff1a;(各行代码已有注释&#xff0c;出错的那一行代码已经用黄色底纹标出&#…

.NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上

天下午我们将生产环境中一个单台服务器 QPS&#xff08;每秒请求数&#xff09;在100左右的 ASP.NET Core 站点部署到了 Linux 服务器上&#xff0c;这是我们解决了在 .NET Core 上使用 EnyimMemcached&#xff08;memcached客户端&#xff09;的问题之后&#xff0c;.NET 跨平…

百世

https://blog.csdn.net/lsh_2013/article/details/45507619 https://blog.csdn.net/lsh_2013/article/details/45507619 https://blog.csdn.net/snowwhite211/article/details/49450613?locationNum8&fps1

matlab哈明窗带阻,基于matlabFIR低通,高通,带通,带阻滤波器设计.doc

基于matlabFIR低通,高通,带通,带阻滤波器设计课 程 设 计 报 告课程名称&#xff1a; DSP设计名称&#xff1a;FIR 低通、高通带通和带阻数字滤波器的设计姓 名&#xff1a;学 号:班 级&#xff1a;指导教师&#xff1a;起止日期&#xff1a;课 程 设 计 任 务 书学生班级&…

JSTL 标签大全详解

转载自 JSTL 标签大全详解一、JSTL标签介绍 1、什么是JSTL&#xff1f;JSTL是apache对EL表达式的扩展&#xff08;也就是说JSTL依赖EL&#xff09;&#xff0c;JSTL是标签语言&#xff01;JSTL标签使用以来非常方便&#xff0c;它与JSP动作标签一样&#xff0c;只不过它不是J…

C# 在腾讯的发展

.NET 主要的开发语言是 C# ,.NET 平台泛指遵循ECMA 334 C#和 ECMA 335 CLI 标准的开发平台&#xff0c;包括微软自行开发的.NET 平台和开源实现的Mono 以及微软最新开发的.NET Core。从2007年加入公司自今一直在使用C#, 对这门语言在腾讯的使用情况有大概的了解&#xff0c;最近…

sam+matlab,Sam版Matlab粒子群PSO工具已经更新

显著亮点这次最大的更新是支持除了bound上下边界约束之外的其它类型的线性和非线性约束条件。名字也从Another Particle Swarm Toolbox改为Constrained Particle Swarm Optimization英文版介绍DescriptionPreviously titled “Another Particle Swarm Toolbox”IntroductionPar…

chengxuyuan

程序人生的四个象限和两条主线 置顶 2018年08月20日 12:00:36 vivian_wanjin 阅读数&#xff1a;120 零 为什么我们要自己做职业生涯规划&#xff1f;记得《社交网络》里边&#xff0c;CFO同学在知道自己股权被稀释时说了一句话&#xff0c;“我以为那些律师是我的律师。” …

.NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

.NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono。 BenchmarkDotNet支持 C#, F#, 和Visual Basic&#xff0c;可以跨平台运行。 而且支持各种报表导出&#xff0c;相当的方便。 GitHub&#xff1a; https://github.com/PerfDotNet/…

matlab amd补丁,Matlab升级 AMD锐龙性能恢复满血:轻松提升60%

Mathwork Matlab是一款极为流行、权威的计算软件&#xff0c;但是去年11月的时候&#xff0c;有人发现AMD锐龙处理器疑似被它“劣化”&#xff0c;无法正确调用最新指令集&#xff0c;导致性能残血。具体来说&#xff0c;Matlab会提前检测处理器身份&#xff0c;也就是CPUID字符…

JSP2.0中的表达式语言(EL表达式)

转载自 JSP2.0中的表达式语言(EL表达式) EL语法EL的语法很简单&#xff0c;他最大的特点就是使用上很方便 例&#xff1a; ${sessionScope.user.sex} 所有EL都是以${ 为起始、以} 为结尾的。 上述EL范例的意思是&#xff1a;从Session取得用户的性别。如果使用之前JSP代码的写…