硬件工程师要学的编程语言 - Python
早年,虽然Python是一款比较容易上手的脚本语言,而且有强大的社区支持,一些非计算机专业领域的人都选它作为入门语言。遗憾的是,它不能实现一些非常底层的操控,所以在硬件领域并不起眼。
然而今时不同往日!
硬件圈同样非常关注Python!
说到Python用于硬件开发。很多人可能想到的是树莓派等支持linux系统的(树莓派和Arduino应用Python的的例子实在是多,比如,利用Raspberry Pi的硬件和Python语言来完成一个机器人制作。),然而现在Python已经完全可以脱离系统,直接进行单片机的开发了。
用Python语言控制单片机
MicroPython是在单片机上可以跑的Python,你可以通过Python脚本语言开发单片机程序。MicroPython基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器、编译器、虚拟机和类库等。目前它支持基于32-bit的ARM处理器,比如STM32F405、STM32f407等,也就是说ARM处理器STM32F405上直接可运行Python语言,用Python语言来控制单片机。
借助Micro Python,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。
下面这篇美国EDN发布的文章,介绍了Python在实时嵌入式系统中扮演的角色:Python's role in developing real time embedded systems。
Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机。不过,随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地。答案是肯定的。下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色。
作用# 1设备调试和控制
在嵌入式软件开发过程中,开发人员常常需要分析总线通信量,如USB、SPI或I2C。有的分析仅仅是出于调试目的,但有时则需要控制总线分析仪并发送信息至嵌入式系统。许多总线分析仪和通信工具都有友好的用户接口,可以用来控制工具。他们通常还提供一种方法来开发脚本,也可以用来控制工具。Python是一种普遍支持的脚本语言,有时则是一些工具的接口,或是用来控制工具。
作用# 2–自动化测试
通过Python控制工具在嵌入式系统中发送和接收消息的能力,使得利用Python构建自动化测试(包括回归测试)成为可能。Python脚本可以设置嵌入式系统进入不同的状态,设置配置文件,并测试所有可能的干扰以及系统与外部环境的相互作用。使用Python开发自动化测试的好处是,回归测试可以开发持续测试并训练系统。任何的代码变动导致的bug或不合格的结果都将被实时的检测出来。
作用# 3–数据分析
通过Web简单地搜索Python库,你会发现,有许多免费强大的Python库都可以用来开发应用程序。Python可以用来接收非常重要的嵌入式系统数据,然后存储到数据库或是本地进行分析。开发者还可以使用Python开发实时可视化功能来展现临界参数,或是存储这些参数用于后续分析。使用Python进行数据分析的优点之一是当基础性工作完成之后,新功能的植入会显得比较简单。
作用# 4–实时软件
Python已经证实了自己的强大性和易使用性,甚至发现它是作为一门编程语言进入实时嵌入式系统。是的,嵌入式软件本身就是用Python写的而不是C/C++。用于实时软件最广泛的Python版本是MicroPython,大多是设计在ARM Cortex-M3/4微控制器上运行。MicroPython并不孤立。Synapse和OpenMV公司在嵌入式系统中既使用MicroPython也使用他们自己的Python port。对MicroPython感兴趣的读者可能对DesignNews(EDN的姐妹机构)的继续教育课程也感兴趣。
作用# 5–学习面向对象编程
Python是一门免费的编程语言,可以跨多个平台使用,对于学生和非编程人员而言比较简单。该语言与C语言不同,它也是现代式的,并且可以在自由形态的脚本类型中结构化,或是作为一个复杂的面向对象的体系结构。Python本身也很灵活。甚至还有这种情景:没有编程经验的电气工程师可以利用Python写出有用的测试脚本或用最少的时间实施电板检查。
Python的学习曲线并不陡峭,熟悉Python学习曲线的开发人员发现,当你有了其它语言的基础之后,学习Python比学习任意其他的编程语言都要简单。出于这些原因,当开发人员看到Python扮演着编程孵化器角色,并吸收其它缺乏经验的工程师对宜早不宜迟的设计周期做出贡献时,不应该感到惊讶。
什么?Python+FPGA!?
夏宇闻老师几个月前在微信上推荐了一个帖子,说的是有人用Digilent的PYNQ-Z1板卡实现了超强的加速性能。
早年,关于FPGA的开发都是基于硬件描述语言,从开始的VHDL到现在更为流行的Verilog,软件应用也从由最开始的汇编语言发展到现在的c/c++实现,这些都是目前为大多数FPGA开发者所熟悉的FPGA发展路程。上个月,IEEE收录了一篇关于使用Python开发FPGA应用的论文。
在美国纳帕举行的第25届关于可编程计算机器领域IEEE国际讨论会上,一篇名为“评估通过Python快速开发异构处理器FPGA应用性能”的短篇论文获得了最佳短篇论文奖。这篇论文主要讨论了Python开发FPGA应用的优势和效率,论文中针对Digilent的PYNQ-Z1板卡(内部集成一个Xilinx Zynq SoC),通过支持Python编程和Jupyter Notebooks框架的PYNQ开发环境,应用Python对此板卡进行开发编程,并最终评估开发结果的优势和效率。值得一提的是,发表这篇论文的作者都是业界大佬,包括高级计算机科学家AndrewG.Schmidt、计算机科学家Gabriel Weise以及来自美国南加州大学工程技术科学协会的研究室主任Matthew French。在论文中,Matthew French教授主要就利用PYNQ开发环境,应用Python语言对Xilinx Zynq器件进行编程应用开发时对FPGA器件的影响、性能结果以及瓶颈影响进行了评估。此外,各位教授就基于Python的开发结果与已经存在的基于C语言的开发及手动开发结果进行了比较分析。
在论文中,各位教授还对PYNQ开发环境的优缺点进行了阐述:
首先来说,PYNQ应用开发框架是一个开源的开发环境,提供了标准的可以约束芯片I/O引脚的“Overlay”比特流,同时,开发人员可以在此开发环境中,利用Python对FPGA进行快速编程开发。此外,PYNQ开发环境内部集成标准的编程范式,支持HDMI和视频流的输出输出,同时具有两组12pin的PMOD连接器和一个兼容Arduino的连接器(可以连接或配置为Arduino系列板卡)。其中,默认的overlay中实例化了多个可以驱动多I/O接口的微Blaze处理器核,也可以配置一些支持图像滤波功能和试验SIMT(单指令,多线程)编程软逻辑GPU的overlay。同时,PYNQ也提供了支持比特流编程的API和可扩展的通用Python库和包,并且可以通过存储映射I/O(MMIO)直接寻址可编程逻辑单元,另外还支持DMA交易(不需要经过器件驱动和核模块之间的不断握手确认)。
其次,就目前来说,PYNQ还不支持任何高级的综合,也无法将Python应用直接移植到FPGA中。这就意味着,开发者依然原型必须使用FPGA来创建一个设计,即当PYNQ提供一个支持板卡IO接口的Overlay框架以时,任何用户逻辑依然必须由开发者亲自创建并综合。不过,开发者仍然可以使用高级综合工具或上面提到的Python-to-HDL工程来完成这个任务,但是最终,开发者依然需要基于此设计并创建一个整合了Python代码比特流文件。
也正是由于PYNQ存在这方面的缺陷,论文的作者并没有简单依赖现存的PYNQ API接口和overlay,他们开发出一个基于Redsharc项目的特定应用程序内核进行研究。
结果如何呢?论文最后,作者对给出了Python开发Zynq应用的各项评估结果。结果中给出了通过c/c++实现这项研究的一般图像处理管道性能,以及定制的硬件加速器和Python实现的性能结果(下图所示),帮助我们更好地理解了Python + FPGA开发环境的性能和能。表中可以看出,结果十分明显,通过PYNQ实现较c实现速度提高了30倍之多,更甚者,从结果中可以看出,当Python实现时有更加有效的可用库时,比如OpenCV,其性能可以增长更多。
Python软件实现和FPGA性能潜力的结合是一个非常有意义的工作,将会开创出一个类似于树莓派和Arduino的广大的开发者社区。Python+FPGA是一个广阔的未经勘察过的领域——一个全新的更加高效的开发空间——通过PYNQ开发环境将会吸引更多的系统开发者加入的领域。
日前在赛灵思OPENHW2017创新大赛暨教师峰会上,北京理工大学嵩天副教授《Python编程语言和PYNQ在中国》的演讲,科普了Python编程风靡全球的原因。
Python编程语言举例,只用了21行代码就完成了一个图像素描的处理,Python大大提升了开发效率。
人工智能和机器学习走热,让 Python 从众多编程语言中脱颖而出。
还等什么呢?
人生苦短,我用Python
附11大编程语言薪资排行榜
编程语言有很多,但并非每一种的需求或工资都相同。人工智能和机器学习走热,让 Python 从众多编程语言中脱颖而出。下文将综合各种信源,以不同编程语言在美国市场的相关薪资水平、人气和前景,为你提供一些参考。
薪资水平
使用国外招聘网站 Indeed.com 将编程语言的薪资水平划分为 9 档:基于这个结果,Ruby/Ruby on Rails 看起来会让你挣得最多,而 Python,C++,iOS 和 Java 也是体面的选择。如果薪资是你的主要关注点,那么也许 C,PHP 和 SQL 不是最理想的选择……
而下面是来自 gooroo.io的数据,根据每条招聘启事给出的薪酬范围取了平均数:懂 Ruby,C++ 或 Java 的开发人员看上去起始工资更高。Python 和 Ruby 开发人员的薪资潜力最大,这可能意味着好的 Ruby/Python 开发人员市场缺口相对较大。
有些人可能对“拜金求职”这种事情比较嗤之以鼻,但是即便你不太关注薪资,每种语言的需求(有多少招聘职位)和供应(有多少开发人员了解语言)情况,你也得多少了解一些吧。
工作需求
根据你熟悉的编程语言找到工作的可能性有多大?以下是来自 Indeed.com 的工作趋势:
可以看到,C,SQL,Java 和 Java 在招聘启事中经常被提到,而 C#,C++ 和 Python 也是表现不错的语言。
另一方面,如果你的目标是在创业公司工作,那么可能 Indeed.com 的工作趋势不是你应该参考最佳的指标。我们找到了 AngelList 网站,这里有更多美国初创公司发布的职位,来看看基于 AngelList 的软件开发人员需要的编程技巧:再一次地,Java 高居榜首。但是,美国创业公司似乎更喜欢 Python 和 Java,对这两者的需求超过了 Ruby(两年前 Ruby 最受欢迎),PHP,C 或 C#。
供应情况
我们再来看开发人员这边,根据网站 Codementor 的数据:当然,这个结果并不能准确反映实际市场的情况,但可以作为参考。例如,虽然移动应用业务已经蓬勃发展了一段时间,但 Objective-C 专家仍然很少。由于 Objective-C 开发人员供应不足,他们的薪资自然相对更高。
另一方面,PHP 在劳动力中的供应量很大,因此雇主有更多的选择,在薪资方面议价能力更强。同时,市场对 PHP 开发人员的需求也不如 Java,SQL 或 Java 那么多。 因此,PHP 开发人员普遍收入较少。这个情况也体现在了我们文章一开始的那张图里面(参见图2)。
Java 是个很特殊的例子。尽管供应量最大,但 Java 开发人员并不处于薪水层的底线。
了解每种语言的需求和供应情况,薪资信息,我们需要看看各大语言前景。
Github 过去 16 年编程语言迁徙:更多人转而使用 Python
一种编程语言将来的发展前景如何?首先,这在很大程度上取决于其社区的发展,因为新鲜血液/采用率是使语言受欢迎的保障。因此,让我们来看看人们最感兴趣的语言是什么:
根据谷歌搜索,2016 年使用 Python 的兴趣大增。
其次,Github 的项目数量能够从一定程度上体现出语言的流行程度。
同时,我们还需要注意——开发人员或许有过这样的体验,在挣扎完成第 N 个艰难晦涩的项目后,心想:“我可以用这种语言做这件事,但为什么不换种语言更加愉快地工作呢?”分析了 4500 万 GitHub 用户、393 种不同的语言以及 10 TB 的源代码后,Waren Long 在博客 source{d} 发表博文,用详尽的数据和科学的方法展现了过去 16 年 Github 用户编程语言的大变迁(也就是从一种语言换到另一种语言的情况)。
使用 5 种最流行的语言(Java,C,C ++,PHP,Ruby)其中一种的开发人员,最有可能用切换到 Python,平均 24% 的机率。
过去 16 年,Python 和 Java 逐渐取代了 C 语言。
Python 在 2014 年成为美国高校入门课程最受欢迎语言
最后,为了想要学习编程语言的读者,我们简要介绍一下各种编程语言。
I. 动态语言(Dynamic Languages)
动态语言通常更容易让初学者学习,因为它们灵活而有趣。你可以从头开始快速构建一个应用程序,需要的代码数量较少,并且没有硬性规则。由于动态语言通常是非常高级(high level)的语言,所以你会花更少的时间纠结细节,更多的时间学习编程概念,这也是动态类型的语言受初学者欢迎的一个原因,初学者一般都会因能够构建事物和快速看到结果得到反馈而鼓舞。
Java
不要与 Java 混淆了,Java 是主要用于前端开发的客户端脚本语言。Java 在所有浏览器中都兼容,用于创建交互式 Web 应用程序,通常是通过诸如 jQuery 和前端框架(比如 AngularJS,Ember.js,React 等)的库来创建。Java 也可以通过 Node.js 平台用作服务器端语言。过去两年来,Node.js 开发社区已经有了很大的发展,现在你可以在这里找到很多资源。你还可以通过使用诸如 phonegap 这样的框架,用 Java 构建混合移动应用程序。Facebook 的 React Native 能让你使用 Java 构建本地移动应用程序。不过,Java 的难度很高,因为它是无类型的语言,因此很难调试。也有静态类型的版本,比如 Microsoft的 Type 或 JSX,在 React 上使用。
Ruby
有了 Ruby,开发人员可以很开心地工作。Ruby 的流行得益于 Ruby on Rails 框架,Ruby 与英语很类似,而 Rails 框架(是全栈 Web 框架)有“开箱即用”的工具,让开发工作变得简单。因此,很多人会建议你首先学习 Ruby。Ruby 主要用于后端开发,一些常用大网站,比如 Airbnb,Shopify,Bloomberg,Hulu,Slideshare 都是使用 Ruby on Rails 构建的。
Python
Python 是另一种强烈推荐初学者学习语言,Python 也是美国顶尖大学最受欢迎的入门级介绍语言。开发人员使用 Python 构建桌面应用程序和网络应用程序,Python 也是数据挖掘的好工具。此外,Python 在科学计算,数据分析和生物信息学的学术界尤其受欢迎。Google,Dropbox,Pinterest,Instagram,Reddit,BitTorrent,Civilization IV 等都是用 Python 构建的。
不仅如此,Python 从 2014 年起就成为美国顶级高校入门级课程教学语言(Introductory Teaching Language):
下面是部分美国顶级高校计算机相关课程使用编程语言列表:
美国顶级高校入门级课程使用编程语言的情况
PHP
PHP 是一种服务器端脚本语言,通常被认为是初学者友好的。要理解 PHP 代码要做什么比较容易,因此 PHP 很容易学。大多数网站都是用 PHP 构建的,因为这种语言是专门针对网络的。Facebook,维基百科,Yahoo!, Tumblr,Wordpress 等都是用 PHP 构建的。
II. 静态语言
使用静态类型的语言构建的应用程序有更高的可扩展性、稳定性和可维护性。静态语言在通过类型检查查找错误时一般更严格,并且需要更多的代码来构建一个原型。游戏引擎、移动应用和企业级后端通常使用静态类型的语言构建。
Java
作为通用语言,Java 用于构建 Android 应用程序、桌面应用程序和游戏。Java也常用作企业级后端开发的服务器端语言——90% 的财富 500 强公司使用 Java。此外,用于存储和处理大数据的 Hadoop 是基于 Java 的流行框架,Yahoo,Facebook 和 Amazon Web Services 等企业都在用 Hadoop。
C
C 常用于编程系统软件,是操作系统的通用语言(lingua franca)。C 几乎影响了本文中提到的所有编程语言,尤其是 Objective-C 和 C++。所以,如果你知道 C 语言的话,你可能更容易学习其他流行的语言。由于 C 语言需要用更复杂的代码来执行简单的任务,所以初学者如果把 C 语言作为第一语言往往很难保持动力。但是,从长远看,C 语言的知识肯定对你程序员的工作有所帮助。
Objective-C
Objective-C 是建立在 C 语言之上的一层,因此是静态的。话虽这么说,Objective-C 也可以用于动态打字。Apple 的 Swift 是一种静态语言,与 Objective-C 兼容,但它的静态类型使其更有弹性。Swift 受 Python 启发而来,旨在为新手轻松编写新手,旨在修复 Objective-C 的一些问题。
C++
C++ 是基于 C 语言的一种强大的语言,专为编程系统软件而设计,但也被用于构建游戏/游戏引擎,桌面应用程序,移动应用程序和网络应用程序。C++ 功能强大且速度很快,Facebook 用 C++ 已经开发出了好几个高性能、高可靠性的组件。许多软件都用 C++ 构建,包括 Adobe Systems,Amazon,Paypal,Chrome 等。与 C 语言类似,C++ 通常被认为不太好让初学者自己学习。所以,如果你决定学习 C++ 作为你的第一个编程语言,建议与人讨论或找一个导师。
C#
C# 用于微软的 .NET 框架,主要在Microsoft Windows 上运行。C# 用于 Web 开发、游戏开发和一般 Microsoft 开发。此外,Xamarin 一直在开发一个名为 Mono 的开源项目,该项目旨在将 C# 移植到其他平台,为 Linux 开发人员带来更好的开发工具。最近,你还可以使用 C# 通过 Xamarin 为 iOS 和 Android构 建原生手机应用。
III. 其他
SQL
SQL(“Sequel”)或结构化查询语言,是用于与数据库通信的查询语言。虽然 SQL 不能用于构建应用程序,但它用于管理使用关系数据库管理系统(RDMS)的应用程序中的数据。
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com