作为一个IC后端工程师,常年需要和工具、数据库和unix打交道,零零总总算下来也学(被)会(迫)了好几种脚本语言:perl,shell,TCL等。在项目的反复捶打下,确实提高了不少工作效率,受益匪浅!
软件工具不比IC设计工具,更新换代比较快,优秀的语言层出不穷,对于使用多年脚本语言的IC工程师而言,可能已经很久没有碰过大学里边学习过的高级语言了吧。
最近被一个软件专家安利了当下时髦的高级语言python,小小学习了一下,感觉受益颇深,顺手写了几个小程序,又回到年(臭)轻(美)时代,确实好用到飞起!
基于过往IC设计的工作诉求,python对于IC设计有点杀(实)鸡(在)用(太)牛(强)刀(大)的感脚。芯片工程师的大部分的工作都是针对明码报告、数据的整合和抽取(应该没有小伙伴去研究DDC之类文件的数据结构吧)。
这个世界最大的不变就是变化本身,停留在过去越久身(灵)体(魂)就会越沉重,尽管有点大材小用,但是对于有追求,有理想,有job要跑,有bug要修的IC四有芯人而言,这点进步的动力还(以)是(免)要(被)有(淘)的(汰)。看看下面这位老哥(Bruce Eckel, 如有误:烦请指正) 的坚持,小伙伴还有借口不学python吗?
从代码解析的原理上讲还是一个类脚本语言,因为在使用的时候用户需要指定python解析器(interpreter )的位置,解析后就可以直接执行。不用像高级语言那样需要编译(build)和链接(link),譬如C。对于C这种语言,对应的工具就是编译器(compiler ),譬如很老很老的TurboC2.0。
这里的区别就是,
一解析器步就可以生成CPU可以识别的机器码,出发执行,速度比较快
编译器:先make,生成的中间文件后,再使用link链接成对口CPU可以执行的机器码,进行执行
解析器稍快:但是出来的机器码,没有经过link步骤,通用性好,但是性能有可能会有折损,但是鉴于python是用C语言开发的,生成的机器码性能并不会差,对于时效性要求不高的场景,由于一步到位的操作,效率可能还会跑赢C
多一步操作,编译会稍慢,但是生成的机器码是针对当前运行环境CPU的,程序跑起来自然是很溜。
可以看到,python具备脚本语言的快进快出,同时也有类似高级语言的运行效率,兼顾开发时效性(realtime)和运行速度(CPU time),如此的语言怎能会被工程师们忽略?
python 语法简单,剔除了一些缀子(譬如:$, set)和尽量减少括号(譬如if等循环语句,用缩进和空行组合来替代传统的括号/end/then之类的写法)。所以说python可能是最省键盘的高级语言之一。
当然,稀松语法带来的坏处自然也是灾难性的,譬如缩进的混乱,一处不经意的空格缺少会摧毁整个python!为此python提出了先(严)进(格)的格式化检查方法(PEP8: Python Enhancement Proposal 8)。 Python + PEP8 这才实大家真正要的那种feel。
PEP8 只关注代码格式化,并非语法错误,如果所有人都按照格式化去写python,任何人的接盘和二次开发都变得如丝般顺滑。这绝不是开玩笑,用python就一定要用PEP8做格式化检查,其中的奥妙?谁用谁知道。
PEP是一类规范和制度,PEP8只是其中一种,从www.python.org可以看到更多的各有专攻的PEP小伙伴们
数据类型是一个语言的基础面。python的数据类型非常灵活和多变。数据的引用和回收机制可以让计算机的管理和用户的使用双双提高效率。
字符串(string),元组(tuple),集合(set),列表/数组(list),字典(dictionary)等等。
乍看起来,都是相貌平平,但是加上任意的数据嵌套,会让应用场景变得几位灵活和方便,字典嵌套字典组成二位字典
d11 = dict{}
d12 = dict{}
d21 = dict{}
d22 = dict{}
d = {"11":d11,"12" d12,"21":d21,"22" d22,}
类似的,数组套接数组成二维、甚至多维数组。同样,数组和字典也可以互相嵌套。更有趣的是,对于数组这种变量,也不要实现定义长度,可以随时裁剪和追加,对于变量使用的的各种调整提供了非常便利的操作可能。
对于这么复杂多变的变量类型,主要原因还是python使用引用的方法来构造变量:任何一个变量都可以看作是到一个内存的指针关系
所以变量的调整和改变更像是调整了这个指针而非变量本身。这种对象共享式结构对于不可变变量(string/tuple)非常好用也方便内存管理。但是对于可变变量(list/dict)而言,对象的改变会引起连锁反应,用户需要慎重使用变量赋值和变量内容更新。
除此之外,变量类型本身也是一种变量的理念,给用户带来更广阔的空间进行变量的扩充和客制化
基于自然界的一个较简单的思维,任何事件都是时间的积累,譬如:文章的从头开始阅读,时间越长,阅读的行数越多。基于此传统的程序方法是使用面向过程(时间线)来进行程序开发。这里边有很多好处,结构比较好理解,程序顺序易梳理,可读性强。
但是随着应用场景的不断变化和模块化,面向过程的编程方式慢慢出现了一些瓶颈。仍然一阅读举例:正常的按顺序阅读,但是在阅读到书籍后面内容的时候,发现前边的某个部分的理解已经不合时宜,这样需要返回前边重新阅读,那么如果任何一个部分(模块化的对象)产生了变化,其他对象可能会被联动影响,这样的复杂场景在面向过程的编程理念里边就会有点难以适应。
譬如C语言就是面向过程编程的语言,相应的C++、java,python等是面向对象编程的语言
python提供了丰富的类别和接口,这让面向对象编程变得可能,至于用户是采用python来做面向对象还是面向过程编程,完全在于用户的场景和处理方法,简单的总结:面向过程容易理解和开发,面向对象容易扩展和维护。
在网络、社区和git中,python具有非常多的模块(model),很多高大上的模块广受好评,甚至之前的一些支持C的模块现在也提供了对python的支持。【摘录自: Python有哪些实用的模块? 侵删】
1. Requests. The most famous http library written by kenneth reitz. It’s a must have for every python developer.
2. Scrapy. If you are involved in webscraping then this is a must have library for you. After using this library you won’t use any other.
3. wxPython. A gui toolkit for python. I have primarily used it in place of tkinter. You will really love it.
4. Pillow. A friendly fork of PIL (Python Imaging Library). It is more user friendly than PIL and is a must have for anyone who works with images.
5. SQLAlchemy. A database library. Many love it and many hate it. The choice is yours.
6. BeautifulSoup. I know it’s slow but this xml and html parsing library is very useful for beginners.
7. Twisted. The most important tool for any network application developer. It has a very beautiful api and is used by a lot of famous python developers.
8. NumPy. How can we leave this very important library ? It provides some advance math functionalities to python.
9. SciPy. When we talk about NumPy then we have to talk about scipy. It is a library of algorithms and mathematical tools for python and has caused many scientists to switch from ruby to python.
10. matplotlib. A numerical plotting library. It is very useful for any data scientist or any data analyzer.
11. Pygame. Which developer does not like to play games and develop them ? This library will help you achieve your goal of 2d game development.
12. Pyglet. A 3d animation and game creation engine. This is the engine in which the famous python port of minecraft was made
13. pyQT. A GUI toolkit for python. It is my second choice after wxpython for developing GUI’s for my python scripts.
14. pyGtk. Another python GUI library. It is the same library in which the famous Bittorrent client is created.
15. Scapy. A packet sniffer and analyzer for python made in python.
16. pywin32. A python library which provides some useful methods and classes for interacting with windows.
17. nltk. Natural Language Toolkit – I realize most people won’t be using this one, but it’s generic enough. It is a very useful library if you want to manipulate strings. But it’s capacity is beyond that. Do check it out.
18. nose. A testing framework for python. It is used by millions of python developers. It is a must have if you do test driven development.
19. SymPy. SymPy can do algebraic evaluation, differentiation, expansion, complex numbers, etc. It is contained in a pure Python distribution.
20. IPython. I just can’t stress enough how useful this tool is. It is a python prompt on steroids. It has completion, history, shell capabilities, and a lot more. Make sure that you take a look at it.
如文章开头所言,一般的IC芯片工程的大部分时间的处理对象都是纯文本的数据,这也是为什么前边提出来的脚本语言:TCL、shell、perl在IC设计领域里流行的一个原因。
随着工作的节奏越来越快,数据量越来越大,传统的脚本语言慢慢也会遇到一些障碍。譬如:大数据的处理和归集、友好的图表展示、具有GUI界面的胶水粘合器、office全家桶以及PDF等富文本文件编辑等等
在过往,perl一直是一个效率不错的脚本语言,但是正如某位大咖所言:perl是一个文学家构建出来的,而python则是由一个数学家开发出来的。维护过perl程序(即便是自己写的perl脚本)的工程师对此一定深有体会。
在初接触phtyon后,笔者对IC工程师的脚本语言的选择,有下面一些建议
** EDA工具内的操作:**
!CMD
唤起shell命令,譬如:grep ,sort
之类的。但是由于一些特殊字符的影响,$,",[]
,经常会花费更多的时间进行命令调整。!FILE.py ,
等等。shell下简单的文本处理:
grep、sort,awk、sed
等等。通常这类操作简单便捷,即用即显,以交互模式进行文本处理效率比较高(文本数据量不大的情况 ,<100M)tclshell
):使用TCL命令完成功能。但是TCL的优势是在工具里边和工具命令联动使用,单独的TCL语法非常简单,不适合稍微复杂的情景处理,加之shell命令强大的处理能力,已经鲜见有小伙伴这么使用TCL了。python的用武之地
词汇 | 解释 |
---|---|
Pycharm | JetBrain公司出品的专门用于python语言的IDE工具 |
软件语言的丰富给工程师提供了多样化的选择,正所谓跳跳大路通罗马,python的这条罗马之路貌似短了那么一点点
Mark Lutz Python 学习手册
www.python.org