主流编程语言特性概述和安全问题以及对编程鄙视链的看法

前言

        作者是一名渗透测试从业人员,励志成为一名大黑客而不是脚本小子,因此开启了自学各大编程语言之路,本文是作者自学了主流编程语言之后的一个阶段性总结;希望能帮助初入此行的小白们对计算机编程有一个大概的认识,任何看到本文的朋友,都欢迎指正其中的问题和不足,感激不尽!废话不多说,下面就进入main方法:(Are You Ready?原神,启动!!!咳咳...开玩笑)

1.语言及特性

1.1二进制

1.1.1提要

        严格来说,二进制并不是一门编程语言,但是为了从底层到上层的完整性,这里简单提一下。

1.1.2概述

        我们的计算机存储的数据,本质上都是由无数个0和1组成,计算机在工作中,也就是由CPU不断从内存中取出数据,而内存中的数据则来源于从磁盘中的加载(也就是电脑中的abcdef盘)。因此计算机底层实际就是无数个与非门(在远古时期,与门就是接通电流(1),非门则是断开电流(0);到了现在,则是通过高低电平表示0和1),由此不断进行着与非异或等等的简单运算。(是不是很神奇,那么简单的东西,却能形成功能如此强大的计算机)

~~~~~~~~~~我猜已经有小伙伴听晕了,没关系,看我施展必杀技:抽象具象化之术~~~~~~~~~~

1.1.3生活具象化例子

        0和1之于计算机,类比到我们人类身上,就好比细胞;单个的它们是如此渺小,可一旦汇聚,就可以形成像我们人类一样复杂的生物。因此我认为计算机发展到今天的成就,无异于人类从0创造了一种高级生物(佩服先贤们的智慧,大佬请收下我的膝盖!!!)

1.1.4题外话

        这里提一下计算机数据取值范围为什么是-128~127(负数比正数大1)的问题,相信很多初学者也和当初的我有着一样的疑惑。

        我们知道在计算机中,一个内存单元是8个bit,对于有符号数则为7位,最高位为符号位,负数为1,正数为0。此时我们就会发现有两个表示为0的数据,分别是10000000和00000000,因此我们将10000000规定为了-128。(这里只是概述一下,如果想要具体了解计算机计算过程可以去搜索一下原码、反码和补码)

1.2汇编语言

1.2.1概述

        汇编语言可以说是最底层的计算机编程语言,属于始祖级的存在,无论是C/C++还是后来的Java、Python等语言都是基于汇编语言进行的优化和扩展(这里的优化不是指比汇编语言更强大,而是更加方便我们学习和理解)。

1.2.2什么是汇编语言

        汇编语言其实就是汇编指令,它是为了方便我们对计算机存储的无数个0和1进行运算,所设计的指令,我们可以通过汇编指令对内存中的数据通过寄存器中的运算器进行运算,再持久化存储到硬盘中,以此完成对文件的读写。因此对于计算机而言,汇编指令是最直接的对底层数据进行操作的语言。但是计算机本身并不认识汇编指令,而是通过架构进行的设计(例如目前windows系统使用的x86架构)

        我猜你肯定想问:"计算机不是只认识0和1吗?汇编指令又是什么鬼,你是不是在忽悠我!"兄弟们别急,容我细细道来。

        汇编指令本质上也是0和1,我们之前提到的x86架构就是对哪些0和1数据对应哪些汇编指令的规定集。我们日常直接打开的浏览器和游戏等应用,它们当中存放的就是汇编指令,当你双击时,它们就会被操作系统加载进内存,被CPU一条一条的执行,最终写入到显存并经过渲染,就成了你在屏幕上看到的样子(怎么样,有没有更加佩服先贤们的智慧,把神奇打在公屏上)。

1.2.3语法特性

        汇编指令虽然给我们操作计算机数据进行运算提供了方便,但本质上还是在进行0和1的不断运算,并且存储到内存的相应地址等,因此它还是位于底层,因此也被称为低级语言。但是所有的高级语言C/C++、Python、Java等在执行时,都会被它们的解释器全部解释为汇编指令,由操作系统控制计算机进行执行(怎么样,无愧于始祖之名吧)。

1.2.4为什么会产生C语言

        试想,如果只有汇编语言,虽然你不需要看无数个0和1了,但也只是能够用一些指令去把无数个0和1进行运算,但是你仍然很难做到很多更加个性化的需求,例如开发简单游戏等,由此C语言应运而生。

1.3C语言

1.3.1概述

        C语言是在汇编语言之后,最初诞生的高级语言之一,如果你同时学完了C语言和汇编语言,那么你一定会发现他们在语法上有很多的相似之处。但是C语言在汇编的基础上简化了我们对内存的操作,同时新增了库函数进一步降低了开发难度(当然还有其它的优化,这里着重提这两点)。

1.3.2C语言的特性

        C语言仍然可以对计算机内存直接进行操作,精确到位级,如果是对栈空间内存进行操作,都无需我们手动的指定地址来开辟空间,会由操作系统自动帮助我们完成;只有当涉及到动态内存时,才会需要我们手动创建使用以及释放(用完一定要记得释放哦,否则会导致内存泄漏)。

        C语言中提出了库的概念,所谓库就是别人写好的,方便我们直接使用的代码。比如对字符数组或字符指针指向的字符数据的拼接等等(其实就是字符串,但是c语言中没有字符串的概念,一般通过字符指针或文字常量区的连续字符来表示字符串,这里严谨一点就这么说,哼哼怎么样,作者我还是有点实力的吧)。

1.3.3C语言的适用场景

        经过前面的描述,朋友们应该发现了,c语言虽然比起汇编语言有了很大的提升,但是操作仍然十分复杂,并且还是需要开发者自己来管理内存,即便有了库函数,但想要用来开发游戏等应用还是欠点火候,毕竟开发效率着实不高(但是运行效率嘎嘎高,这就与对内存的管理有关,有兴趣的小伙伴可以自行去了解,我就不多说了)。

        也正因为运行效率高,因此适合用来开发操作系统,例如windows系统、Linux系统、苹果系统等等最核心的内核部分都由C/C++编写。

1.3.4为什么会产生其它高级语言

        开动你的小脑筋,想一想,如果世界上只有C语言,你的老板让你开发一款叫原神的游戏。请问你头大不头大,你怕不是心想:“我只会对着数据来个加减乘除,做一些简单判断,让我给你算个数就可以了,你让我用这玩意搞出那种级别的游戏?”。但是现实情况下,人们就是需要玩更好玩的游戏或满足其它需求,由此就诞生了许多其它的高级语言。

1.3.5C语言的常见漏洞以及永恒之蓝原理猜测(非安全从业人员的火鸡们可以跳过)

        哎呀,毕竟是一名网络安全从业者,还是想提一嘴C语言的安全问题。C语言的安全问题中九成都与缓冲区溢出有关,那么什么是缓冲区呢?缓冲区其实就是在内存中为你的数据开辟的内存空间,但是C语言不会真的把你限制在这片空间内。通俗来说就是你买了一套房,但是你把邻居的房子也占用了,也不会有人来管你,你的邻居也只会忍气吞声,任由你霸占。这便是所谓的缓冲区溢出了。

        而缓冲区溢出又会造成怎么样的影响呢?那影响可就大了,试想,你通过可控参数写入了超越该参数本身内存空间的值,这就会占用了下一行代码的内存空间,如果你写入的是恶意代码,那么就相当于你直接修改了源码,而这样的接口通常是操作系统提供的。那么不就相当于你拥有了最高级的系统级权限的RCE(远程代码执行),因此我猜测永恒之蓝底层一定是覆盖掉了原本的逻辑判断代码,写入了新的恶意逻辑。但是由于微软不公开源码,因此实际上无人能知道具体原因,可能只有盖茨自己知道吧。

1.4Java语言

1.4.1概述

        Java语言是目前主流的高级语言之一,在市面上的占有率正在逐年攀升,它延续了C语言的强数据类型,在很多规则方面都与C语言相向,但是比起C语言,Java语法更加严格。

1.4.2Java的语法特性

        提到Java语言,那么不得不提的必然是面向对象,Java语言中类是一切,所有功能的实现都是一个个由开发人员封装好的标准JavaBean(其实就是类,但是java将类分为了三种:分别是工具类、测试类以及标准的JavaBean)。

        这里简单提一下三种类的区别:

        工具类:类如其名,就是用来使用的工具,例如我们对字符串的一些查找分割等操作所调用的函数都是写在工具类中的(其实工具类中的方法就是静态方法,可以直接通过类名.的方式进行调用而无需进行实例化)。

        JavaBean:它是我们封装好的一个个类,用来代表某一事物,以门为例,我们可以在门这个类中写它的材料,开门关门等方法,那么封装门的这个类就是标准的JavaBean,在使用时要实例化。

        测试类:测试类就是代码运行时的程序入口,也就是main方法,在一个java项目中,只能有一个main方法。说的好理解点你可以把测试类比作你自己,其他两种都是工具,它们一直静静的躺在那里,只有你去使用时才会产生作用。

        内心独白:哈哈哈,我都感觉自己说的挺抽象的,就不硬说了到此为止。

1.4.3类为什么要实例化才能使用

        很多java开发的朋友一直搞不明白,为什么类不能直接使用,而是必须new了之后才能使用,讲课老师大多会告诉你类好比一个图纸,你需要根据图纸造出具体的工具才能用(将这个过程比喻为类的实例化)。但其实火鸡们并不理解计算机底层是怎么做的,为什么需要这么做。这也很正常,因为火鸡们大多没有学习底层知识如c和汇编。而到了Java这里就已经无需开发人员来操作内存,一切都由操作系统和jvm进行处理。

        其实new的过程就是将类加载进内存的过程,程序不进入内存就无法调用。就好比你要和朋友打牌,你朋友不来你家里(内存),而是在门外,你俩要如何打牌呢,因此才需要实例化。

1.4.4java为什么适合用来开发大型项目

        我们可以把Java实例化类的过程比作建造铅笔工厂,如果你只造一根铅笔,但是你仍然需要先把工厂造起来再造铅笔。你肯定会想,就为了一根铅笔造了一个工厂,我真是疯了,完全是本末倒置。事实确实如此,因此至于这些小型的项目,python或其它高级编程语言显然更加方便。但如果你要造的是100万根铅笔呢?(是不是一下子就理解了Java为什么适合开发大项目,比如JavaWeb)

        当然这还与java生态的完善以及spring框架等有关,java最繁琐的类的实例化等过程都由spring容器(早期是bean工厂)通过控制反转和依赖注入帮助你自动全部制作好,你只需要写个配置文件即可。再加上AOP(面向切面编程)的应用(目的是解耦),使得Java更加能够高效的胜任大型项目的开发。

1.4.5Java的安全问题为什么很少(非网安从业人员跳过)

        哈哈,作为网安从业人员,还是想谈谈这个话题。

        由于java的语法十分严苛,几乎绝大部分的操作都已经有框架写好的类,只需根据官方手册进行使用即可(也正因为如此,java代码的看上去就不太易读),因为java本身主代码很简单,但是所有逻辑都写在类中,有人想问这与安全性高有什么关系?且听我细细道来。

        以现实例子“我给你一个零食”为例:

        除了java以外的其他语言,直接接过了我给的零食,谨慎点的进行了检查,怕我下毒。但如果忘记了检查直接吃下,那么就直接中毒GG。

        但是Java语言:由于所有处理逻辑都提前封装在类中,而且参数还有强类型语言的限制,就好比我给你的零食必须是带包装的否则不要(这点就已经隔绝了大量的下毒可能),再加上本身封装的类一定般都会提供特方法才允许修改类中的成员(例如set方法),也就会进行层层检查,因此被毒的可能就微乎其微。

1.5python语言

1.5.1概述

        python语言是很多非计算机相关专业的朋友,转行的首选语言,论难度而言,他确实比前面的每一种都要简单得多,具体有多简单呢,以我自身为例,除python以外的所有语言我至少都需要两周以上的时间才会对它们有个基本的认识以及熟悉语法。但唯独python从第一次接触到直接写工具仅仅用了两天,因此他确实很适合非计算机从业者学习,语法简单的同时功能还十分强大,强推、强推、强推。

1.5.2python语法特性

        其实对于python的语法特性,在我看来就是自由,除了前面提到的几种编程语言,在js和php中,它们与python类似,语法都很宽松,限制很少,因此写起来也容易很多。但也正因为宽松,就注定了它们适合用来写工具而非作为对安全性要求高的大型项目。

1.5.3应用场景

        由于python语法简单,但是其模块生态却十分繁荣,因此常被用来写一些工具,例如大众熟知的爬虫、抢票等软件基本都是以python编写。

1.5.4python存在的安全问题

        对此没什么想说的,我只能说用python编写web等大型项目本身就是个巨大的安全问题。

1.6杂谈

1.6.1对大型项目未来发展的预测

        昔日的王者php,因为漏洞多的问题正在逐渐没落,我个人认为不出几年,java就会以绝对的王者姿态统治web等大型项目的开发(至少在golang的生态圈完善起来之前,都会如此,golang这个新生的幼年王者,还需要很长的时间来成长)。

1.7浅谈程序员鄙视链

        众所周知,在程序员中有着这样一条鄙视链:汇编鄙视C,C鄙视C++.........

        鄙视链的原因:由于语言特性汇编语言需要对计算机底层有着绝对深刻的认识,不论是数据底层运算还是对内存的管理都完全依靠开发人员,因此需要极高的编程能力;对于C语言,前面也提到过它对汇编进行了简化,但仍然需要开发人员对内存做一定程度的管理,因此也需要深厚的编程能力;而到了java,已经无需再人为操作内存空间,一切都由jvm和操作系统完成,但是java与其它高级语言相比有着最严格的语法,因此编程难度也较高;而对于python等其它高级语言,则既不需要管理内存,又没有严格的语法限制因此就处在鄙视链的末端。

        我的看法:其实如果大家认真看了我的文章,或者本身对计算机编程有着自己的认识,应该可以发现每一门语言都是由于特定的需求而诞生的,它们都有自己的长处及适用场景,因此我认为并没有谁更高贵一说,虽然开发难度确实有差别,但是这些语言无一不是强大的语言,因此我觉得大家都一样,只是喜好和选择不同。

2.0结语

        各位看官和同行,感谢大家能够看到结尾,相信你们对我的看法一定有认同也有反对,欢迎大家在评论区跟我交流,因为有不同看法的碰撞,才会有进步,我很期待大家给予我指正和建议,如果我的文章能够对你产生一点点帮助,那么我觉得这篇文章就是有意义的,感谢支持。

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值