本文是Python“脑残”安利文,不适者请点击右上角叉叉。谢谢!
  早年,虽然Python是一款比较容易上手的脚本语言,而且有强大的社区支持,一些非计算机专业领域的人都选它作为入门语言。遗憾的是,它不能实现一些非常底层的操控,所以在硬件领域并不起眼。
  然而今时不同往日!
  硬件圈同样非常关注Python

  说到Python用于硬件开发。很多人可能想到的是树莓派等支持linux系统的(树莓派和Arduino应用Python的的例子实在是多,比如,利用Raspberry Pi的硬件和Python语言来完成一个机器人制作。),然而现在Python已经完全可以脱离系统,直接进行单片机的开发了。
  用Python语言控制单片机
  MicroPython是在单片机上可以跑的Python,你可以通过Python脚本语言开发单片机程序。面包板论坛就有《MicroPython技术交流小组》https://mbb.eet-china.com/c/forum/micropython。MicroPython基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器、编译器、虚拟机和类库等。目前它支持基于32-bit的ARM处理器,比如STM32F405、STM32f407等,也就是说ARM处理器STM32F405上直接可运行Python语言,用Python语言来控制单片机。
  借助Micro Python,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。
  下面这篇美国EDN发布的文章,介绍了Python在实时嵌入式系统中扮演的角色。
          edn.com             Python's role in developing real time embedded systems

  Python is finding an increasing role in development of real-time embedded systems.
                    
   
    作者:Jacob Beningo,翻译:csdn/刘帝伟/刘翔宇/周建丁
  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开发环境将会吸引更多的系统开发者加入的领域。
  上文中提到的论文

  Evaluating Rapid Application Development with Python for Heterogeneous Processor-based FPGAs.pdf (562.9 KB)
  日前在赛灵思OPENHW2017创新大赛暨教师峰会上,北京理工大学嵩天副教授《Python编程语言和PYNQ在中国》的演讲,科普了Python编程风靡全球的原因。
  Python编程语言举例,只用了21行代码就完成了一个图像素描的处理。Python大大提升了开发效率。
  

  人工智能和机器学习走热,让 Python 从众多编程语言中脱颖而出。



  还等什么呢?
  
人生苦短,我用Python

  附11 大编程语言薪资排行榜

  编程语言有很多,但并非每一种的需求或工资都相同。人工智能和机器学习走热,让 Python 从众多编程语言中脱颖而出。下文将综合各种信源,以不同编程语言在美国市场的相关薪资水平、人气和前景,为你提供一些参考。
  薪资水平

  使用国外招聘网站 Indeed.com 将编程语言的薪资水平划分为 9 档:基于这个结果,Ruby/Ruby on Rails 看起来会让你挣得最多,而 Python,C++,iOS 和 JavaScript 也是体面的选择。如果薪资是你的主要关注点,那么也许 C,PHP 和 SQL 不是最理想的选择……
  
  而下面是来自 gooroo.io的数据,根据每条招聘启事给出的薪酬范围取了平均数:懂 Ruby,C++ 或 Java 的开发人员看上去起始工资更高。Python 和 Ruby 开发人员的薪资潜力最大,这可能意味着好的 Ruby/Python 开发人员市场缺口相对较大。

  有些人可能对“拜金求职”这种事情比较嗤之以鼻,但是即便你不太关注薪资,每种语言的需求(有多少招聘职位)和供应(有多少开发人员了解语言)情况,你也得多少了解一些吧。
  工作需求

  根据你熟悉的编程语言找到工作的可能性有多大?以下是来自 Indeed.com 的工作趋势:
  可以看到,C,SQL,Java 和 JavaScript 在招聘启事中经常被提到,而 C#,C++ 和 Python 也是表现不错的语言。
  
  另一方面,如果你的目标是在创业公司工作,那么可能 Indeed.com 的工作趋势不是你应该参考最佳的指标。我们找到了 AngelList 网站,这里有更多美国初创公司发布的职位,来看看基于 AngelList 的软件开发人员需要的编程技巧:再一次地,JavaScript 高居榜首。但是,美国创业公司似乎更喜欢 Python 和 Java,对这两者的需求超过了 Ruby(两年前 Ruby 最受欢迎),PHP,C 或 C#。
  
  供应情况

  我们再来看开发人员这边,根据网站 Codementor 的数据:当然,这个结果并不能准确反映实际市场的情况,但可以作为参考。例如,虽然移动应用业务已经蓬勃发展了一段时间,但 Objective-C 专家仍然很少。由于 Objective-C 开发人员供应不足,他们的薪资自然相对更高。
  
  另一方面,PHP 在劳动力中的供应量很大,因此雇主有更多的选择,在薪资方面议价能力更强。同时,市场对 PHP 开发人员的需求也不如 Java,SQL 或 JavaScript 那么多。 因此,PHP 开发人员普遍收入较少。这个情况也体现在了我们文章一开始的那张图里面(参见图2)。
  JavaScript 是个很特殊的例子。尽管供应量最大,但 JavaScript 开发人员并不处于薪水层的底线。
  了解每种语言的需求和供应情况,薪资信息,我们需要看看各大语言前景。
  Github 过去 16 年编程语言迁徙:更多人转而使用 Python
  一种编程语言将来的发展前景如何?首先,这在很大程度上取决于其社区的发展,因为新鲜血液/采用率是使语言受欢迎的保障。因此,让我们来看看人们最感兴趣的语言是什么:
  
图4:根据谷歌搜索,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 语言。
  篇幅有限,我们这里就直接看结果了。要知道更详细的信息,可以访问参考资料 3。
  
  Python 在 2014 年成为美国高校入门课程最受欢迎语言
  最后,为了想要学习编程语言的读者,我们简要介绍一下各种编程语言。
  I. 动态语言(Dynamic Languages)
  动态语言通常更容易让初学者学习,因为它们灵活而有趣。你可以从头开始快速构建一个应用程序,需要的代码数量较少,并且没有硬性规则。由于动态语言通常是非常高级(high level)的语言,所以你会花更少的时间纠结细节,更多的时间学习编程概念,这也是动态类型的语言受初学者欢迎的一个原因,初学者一般都会因能够构建事物和快速看到结果得到反馈而鼓舞。
  

  • JavaScript
  不要与 Java 混淆了,JavaScript 是主要用于前端开发的客户端脚本语言。JavaScript 在所有浏览器中都兼容,用于创建交互式 Web 应用程序,通常是通过诸如 jQuery 和前端框架(比如 AngularJS,Ember.js,React 等)的库来创建。JavaScript 也可以通过 Node.js 平台用作服务器端语言。过去两年来,Node.js 开发社区已经有了很大的发展,现在你可以在这里找到很多资源。你还可以通过使用诸如 phonegap 这样的框架,用 JavaScript 构建混合移动应用程序。Facebook 的 React Native 能让你使用 JavaScript 构建本地移动应用程序。不过,JavaScript 的难度很高,因为它是无类型的语言,因此很难调试。也有静态类型的版本,比如 Microsoft的 TypeScript 或 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):
  
  下面是部分美国顶级高校计算机相关课程使用编程语言列表:
  
图4:美国顶级高校入门级课程使用编程语言的情况。在这里仅列出了部分高校,更完整的表单参见参考资料 4 的网页。
  

  • 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)的应用程序中的数据。
  参考资料
  Developers Who Use Spaces Make More Money Than Those Who Use Tabs
What Programming Language Should a Beginner Learn in 2017?
Analyzing GitHub, how developers change programming languages over time
Python is Now the Most Popular Introductory Teaching Language at Top U.S. Universities
  综合: 新智元,知乎,csdn,fpga开发圈