美文网首页
0.1编程真经

0.1编程真经

作者: MXi4oyu | 来源:发表于2017-10-19 11:53 被阅读0次

    编程真经

    我是因项目需求而接触的go语言,而在此已经多少了解过的语言有:汇编、C、C++、Python、Lua、PHP、Java、C#、JS。之前有一位大师曾告诫我:工欲善其事,必先利其器!

    学习技术,贵“恒”,重“精”,忌“浮”! 切不可“这山望着那山高”!先专心学精一门语言,然后对其它的语言便可融会贯通! 但是我还是走了弯路,接触了众多的编程语言而未先专精一门。这也跟我的职业有关,在15年之前,我的主要工作是渗透测试与漏洞挖掘。主要方向是Web安全。我的启蒙老师是邪恶八进制的char,曾教过我00截断的上传技巧,后来丢给我一本书《精通脚本黑客》,从此便踏上了Web安全的旅程。后来陆续接触了android安全、物联网安全、云安全。也就接触到了众多的编程语言。

    接触了众多的编程语言之后,也就慢慢的理解了之前那位大师对我的告诫。语言只是你思想的表达,只是一些招式,所以无高低贵贱之分。最重要的是修炼内功,内功深厚后,草木竹石皆可为剑。

    机器生汇编,汇编生B,B生C,C生万物!

    虽然语言无高低贵贱之分,但是对于信息安全从业者,有两门语言必须要掌握。那就是汇编和C。这是你通往高手的必经之路。(如果量子计算机普及后,可能会有所变化,但是在电子计算机的世界绝对适用)

    我们这里看下编程语言的进化:汇编——C——C++——Python——Lua——PHP——Java——JS——Go。

    编程语言由最开始的机器语言到汇编语言,再由汇编语言到C/C++这种静态类型语言,再到Python/lua/php这种解释性动态语言,再到Java/C#这种基于JVM和.NET运行库的静态语言,再到Go这种带动态特性的静态语言。从流行程度上来说,可以从静态语言到动态语言,再由动态语言到静态语言。两种类型的语言相互结合,从趋势上来看,是返璞归真了。

    从信息安全行业推而广之到整个IT行业,如果要想有所提升。那应该在以下四个层面加强修炼。

    语言层面、算法层面、项目层面、专业层面。

    语言层面:编程语言是一个工具,是用来表达你思想的工具,跟你说英文、中文、法文、德文一样。人们便于交流发明了文字和自然语言。而给跟计算机进行交流,就发明了计算机能懂的编程语言。所以,在编程语言层面,要先熟悉一门编程语言,同时也不要忘记学习不同范式的编程语言。如果非要在这里推荐几门编程语言的话,那就是必须学好一门静态语言+一门动态语言。通常要么是C/C++与Python双修。要么是Java与Python双修。要么是Go与Python双修。在学好一门静态语言+一门动态语言的基础上再去根据个人的时间去合理安排其他语言的学习。

    算法层面:《离散数学》、《具体数学》、《数据结构与算法》、《算法导论》、《算法》、《算法竞赛入门经典》、《挑战程序设计竞赛》这些书都是修炼内功心法的法门,如果掌握了这些心法,对你今后其他武功与招式的学习将起到事半功倍的效果。

    项目层面:用你熟悉的编程语言多做一些项目,积累一些行业经验,学习技术的同时也要了解业务。到这个层面,就是两个字:积累。

    专业层面:根据自己的兴趣,学习一些专业知识。比如密码学、数据挖掘、机器学习、自然语言处理、漏洞挖掘、编译原理、嵌入式系统、分布式系统等,这个层面要根据你自己的兴趣来。如果要推荐一些的话,我只能给你提供这些关键词:物联网、大数据、人工智能、云计算。

    20世纪70年代,贝尔实验室的Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统,同时Dennis M. Ritchie为了解决UNIX系统的移植性问题而发明了C语言,UNIX和C语言奠定了整个现代IT行业的软件基础(目前三大桌面操作系统中的Linux和Mac OS X都是源于UNIX,两大移动平台的操作系统IOS和Android也都是源于UNIX。Python是C些的,Lua是C写的,PHP是C写的。C++是C的拓展,从编译器角度上看C和C++是同一个东西,Java是C++的简化版本,并且JVM是用C和C++写的。目前比较或的Node.JS底层同样是C++写的。Go语言的早期编译器也是C写的,后来从Go1.5开始,Go语言实现了自举。现在已经是C和C++的世界了。这也就是我说的C生万物的原因。)。在UNIX和C发明40年后,由原来贝尔实验室的Ken Thompson和Rob Pike以及V8引擎和HotSpot虚拟机作者Robert Griesemer一起合作,为了解决21世纪多核和网络化环境下日益复杂的编程问题而发明了Go语言。

    Go语言起源

    讲了一些道的东西,我们现在讲以下术。

    编程语言的演化跟生物物种的演化类似,一个成功的编程语言的后代一般都会继承它们祖先的优点;当然有时多种语言杂合也可能会产生令人惊讶的特性;还有一些激进的新特性可能并没有先例。我们可以通过观察编程语言和软硬件环境是如何相互促进、相互影响的演化过程而学到很多。

    下图展示了有哪些早期的编程语言对Go语言的设计产生了重要影响。

    Go语言被誉为“21世纪的C语言”,定位为分布式系统编程语言。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。

    但是在Go语言的家族树中还有其它的祖先。其中一个有影响力的分支来自Niklaus Wirth所设计的Pascal语言。然后Modula-2语言激发了包的概念。然后Oberon语言摒弃了模块接口文件和模块实现文件之间的区别。第二代的Oberon-2语言直接影响了包的导入和声明的语法,还有Oberon语言的面向对象特性所提供的方法的声明语法等。

    Go语言的另一支祖先,带来了Go语言区别其他语言的重要特性,灵感来自于贝尔实验室的Tony Hoare于1978年发表的鲜为外界所知的关于并发研究的基础文献顺序通信进程communicating sequential processes,缩写为CSP。在CSP中,程序是一组中间没有共享状态的平行运行的处理过程,它们之间使用管道进行通信和控制同步。不过Tony HoareCSP只是一个用于描述并发性基本概念的描述语言,并不是一个可以编写可执行程序的通用编程语言。

    接下来,Rob Pike和其他人开始不断尝试将CSP引入实际的编程语言中。他们第一次尝试引入CSP特性的编程语言叫Squeak(老鼠间交流的语言),是一个提供鼠标和键盘事件处理的编程语言,它的管道是静态创建的。然后是改进版的Newsqueak语言,提供了类似C语言语句和表达式的语法和类似Pascal语言的推导语法。Newsqueak是一个带垃圾回收的纯函数式语言,它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道是动态创建的,属于第一类值, 可以保存到变量中。

    在Plan9操作系统中,这些优秀的想法被吸收到了一个叫Alef的编程语言中。Alef试图将Newsqueak语言改造为系统编程语言,但是因为缺少垃圾回收机制而导致并发编程很痛苦。Go语言从其中借鉴了很多特性。

    Go语言的其他的一些特性零散地来自于其他一些编程语言:比如iota语法是从APL语言借鉴,词法作用域与嵌套函数来自于Scheme语言。在我学习Go语言的过程中,也隐约看到了JavaScript的身影。当然,我们也可以从Go中发现很多创新的设计。比如Go语言的切片为动态数组提供了有效的随机存取的性能,这可能会让人联想到链表的底层的共享机制。还有Go语言新发明的defer语句。

    相关文章

      网友评论

          本文标题:0.1编程真经

          本文链接:https://www.haomeiwen.com/subject/cbhqjxtx.html