沉寂了这么多天,终于决定再写一篇blog来描述一下今天(20170118)的想法。这篇博客主要是写一下这一年半以来我在大学所学到的一切以及我课外的所学。
还记得大一刚进入学校,我便励志要成为一个顶尖的程序员,于是我付出的比同类、同龄稍微多那么一点点。在大一的一节重要的课(计算机导论)上,我接触到了一门语言——Python,计算机导论也是导致我后来做出重要抉择的一门课。当时教我们课程的是我们的班主任——肖老师,他在解释什么是编译型语言和解释性语言的时候给我们演示了一门神奇的语言,当时我还不知道那是Python,我只是依稀记得有三个尖括号,和老师对它的描述——一门用于科学计算的解释性语言,后来我猜想它可能是fortran之类的计算语言,直到我后来接触到了Python,我才确定这门神奇的需要缩进的解释性语言。后来我觉得底层的嵌入式开发不适合我,于是我毅然决然地选择离开了原来的班级。关于嵌入式,最近我接触到树莓派,觉得这东西特别有意思,又突然想去弄弄嵌入式这东西了。不过这个树莓派仍然是需要使用Python进行编程的。
c#我觉得真不是一门有前途的语言,一切都是因为微软是不开源的商业公司,在大一的第二个学期我曾疯狂地迷恋微软所维护的mfc,我觉得mfc能做出一个很酷炫的界面真是了不起,直到我接触java之后,我鄙视那种拖控件点鼠标的开发方式,我觉得Java是自然的,我认为微软的开发过多地依赖于它自身的ide,一旦脱离了微软的开发环境,想要在记事本上完成一个简单的helloworld都变得那么地不现实。所以我自始至终都有接触c#,这可能是我自接触编程语言以来黑某一门编程语言黑得最要命的一次。
提到c#主要是它号称尖锐c,而我本人对c语言是无比的崇拜,我觉得它这样的自称有损于c在我心目中的伟大形象。Linux下的许多工具都是纯的c所开发的,在Linux下安装一些大型的无法在源里直接安装的软件,就必须使用gcc来编译成可执行文件。Python的许多核心的功能可以使用纯c语言来编写以提高效率.因此我个人是比较推崇C语言的,而接下来我来总结一下自大一到现在的我所学到的c语言的大部分知识,由于是全靠记忆来书写的,存在批漏是在所难免的,假如大一的初学者要c语言的资料参考的话,此文可略去不看,我写作之目的重在梳理,而非传授知识。
首先我记得c语言的第一章大概是讲c语言是如何发展的,据说是著名的贝尔实验室发明了C语言,贝尔——发明电话的那位伟大的科学家,c语言就是诞生于此。然后就是c程序的编译和执行过程,编辑成的 .c 文件被编译器编译成.obj 文件在被连接成 .exe 的可执行文件,以上就是在Windows下的文件的编译和执行的整个过程。在Linux下, 我通常都是不带参数的 gcc 命令直接编译成 a.out 文件,然后在将该文件重命名成其它名字的可执行文件,这样就避免了下次生成的 a.out 覆盖原来的 a.out 文件。然后学到的就是数据类型以及在内存中所占用的空间,分别是 int 、float、double、long,这些是数值类型,在内存中分别占用4bytes、4bytes、8bytes、4bytes,有Java版本规定long是8字节的,这就另当别论了。然后就是布尔类型和字符类型,bool和char ,我记得有资料说bool是占用 1 bit的,但是存储的基本单位是字节而非比特位,所以硬是给bool加了 7 个比特位变成了1个字节,它只有两个值,true和false,但是各个版本的c是有区别的,因此我好像从来没有在纯c的环境下使用过bool类型,都是使用的 int 的 0 和非零来代替bool类型,至于 char 类型,好像它只有 256 个值, 索引从 0 到 255 ,我之记得65代表大 a ,97 代表小 a ,之后的字母依次类推,49好像是 0, 128 之后的字符是二进制2字符,在显示器上是没办法显示的,可能这也是为什么众多语言的文件操作需要分为是否以二进制格式打开的原因,char类型也是占1个字节也就是8个比特位的,所以这也很好的解释了它只有从索引为 0 到255 所表示的 256 个字符,2的 8 此方恰好是256, 好像在 c 语言里还有个 %c 的格式符用来表示char类型,而这256 个原始的字符就恰好对应最原始的 ASCII 码,这个码就是用1个字节保存的,我接触到的还有utf-8 编码,据说这种编码包含了目前地球上出现的所有字符,具体是多少个字节我真是忘了,好像是32 字节或者 64 字节,那么表示这样一个简单的小 a 就需要用 8*32 个 01 序列来表示 ( 暂且认为它是 32 字节的 吧 ) ,而且这个码是兼容 ascii 码的,也就是说它的 第50 个一定是表示 0,也就是ascii 码索引为 49 的,utf-8 只不过是 对 ascII 的一个扩充而已。以上好像提到数据类型,目前我接触的一个浮点类型比较诡异,在Java Javascript python python3 php c c++ 测试都好像是成立的
代码大致如下:
if (0.3-0.2==0.1){printf("same");}else{printf("not same ");}
以上语言的测试结果都是 not same ,这是为什么呢?官方的解释是,计算机的小数点位都是采用的二进制计数,只能用 1/2 ,1/4, 1/8 表示小数位,0 .1 0.001 这些我们日常所用的小数只能用二进制数来近似地表示,近似自然没有办法做到精确了。
c语言的基本数据类型如上述5种,我依稀记得书中还说什么中级数据类型,我暂且把其它的数据类型归为中级数据类型吧,数组,指针、结构体和枚举,至于什么联合体,我至今仍不清楚。
学了c 语言之后,后续课程就是数据结构,据说这也是一门特别基础的课程,学这门课程主要还是靠理解,用c语言实现的各种数据结构至今我还是没有办法完全依靠自己敲出来,总共就那几种数据结构,线性表、树和图,线性表又分成好多种,按逻辑来分成普通线性表,stack和queue,按在内存中的地址来分,有可以分为顺序表和链表,这两种表完全可以实现栈和队列,至于代码,我真的是没有理解透,我也记不了这么多,但是我觉得这个主要是靠自己理解原理。在java等各种高级语言中,这些数据结构都被封装得很完善了,自己用底层语言在重新写完全是在重新造轮子。但是后来者想要更加深刻地理解c语言的指针,还是完全可以自己动手写一写这些基础代码,培养自己code的能力。
大一下学期的那门神一样的课程——离散数学,据说是构建顶层软件架构的基础课程,学得我都糊涂了,如果要是一些算法也就算了,尽是一些基础的晦涩难懂的表达式,老师还要求学生一定要背下来,这个也许真的有用,但愿我是真的无知,领会不了其中的奥妙。
大一下学期还学了存c++,这门既面向对象又面向过程的编程语言,有人说这就是有类的c语言,加上STL之后才能够和各大高级编程语言相媲美,的却如此,我个人认为,c++还是偏底层了些,好多想要用的函数在标准库里找不到,需要下载其它的东西,否则就是自己造轮子,难怪别人都说c++是最难学习的语言,它的学习曲线如此得陡峭,投入与产出不成正比,还不如Java实在。
大二上学期学的Java,真是一门伟大的编程语言,我原来以为Java就是从Oracle下载下来的几个写好的包,后来我发现自己真的错了,从Java诞生的那一天起,无数大公司往上面投了多少钱,Java就是各大公司用钱堆出来的,我关注了一个微星公众号,importview,上面就是关于Java的各种资源,上面介绍了Java实现的各种技术,Java用于测试的工具,用于日志的工具,用于web开发的各种写好的框架,深度学习的框架,人工智能的框架,真是不胜枚举,由于目前技术能力实在有限,我真是看不过来。
大二上学期还学习了数字逻辑,那门被我勉强算作专业课程的课程, 我对硬件开发真的是没有兴趣,对于各种门电路,我反正是无语了,要不是那个老师教得还不错,我压根就不会认真学。2016整年我都是在自学另外一门脚本语言——Python,我觉得这才是真正的高级语言。Python包含了无数个库,几乎涵盖了软件领域的各个角落,在我心目中完全能够媲美Java。其实我学习Python,最主要的原因是在Linux下,Python自动化运维能力是其它语言无法比拟的,而我的服务器开发离不开Python,与其学一门效率低的bash shell ,不如学习强大的Python来的有意义。有人说Python是一门黑客的语言,那纯粹是对Python的误读。我不否认Python hacker有, 但是Python能够完成的任务Java不仅能够胜任而且还能做得更高效。用Python做病毒或者木马简直就是不切实际,首先要给客户端安装Python解释器,这本身就是不太可能完成的任务,其次Python是一门解释型语言,我觉得hacker之所以选择Python是因为它的高效开发,一个Python程序员可以在同一时间内完成10个Java程序员的任务,虽然程序执行得比较慢,但是我觉得Python的快速开发完全可以弥补它在运行速度上的劣势,随着未来计算机硬件的不断发展,Python在计算机上的计算也会越来越快,最终在某些领域达到速度能够被忽略的地步。与Python竞争的是Perl,这是一门对字符串处理最为优秀的语言,这是其它任何语言都无法媲美的。
利用课余时间我还自学了一些网页制作等等,不过这些都只能算是设计而不能算软件,html是web的基本元素,要想精通web,html是最最基本的知识,然后 就是 css 样式和javascript,网页制作其实没多大技巧,说白了前段开发就是靠基本的记忆,练习在记忆,实践然后赚钱,但不可否认的是,前段开发确实是达到高薪的捷径,无论是后台开发还是基于其它硬件的开发都是需要付出巨大的努力然后才能收获的过程,而前段开发真的不需要多么高智商,需要的就是掌握各种设计的风格和代码,但前端开发和修图片又是另外一回事, 前段开发是要靠代码实现的一些网页效果,虽然经常会使用到一些图片,但图片的编辑、 ps之类的工作真的不是软件工程的范畴。
至此,我的这篇又臭又长的blog就算结束了,写下这些主要是记录一下我这一年半的一些收获,可以这么说吧
还记得大一刚进入学校,我便励志要成为一个顶尖的程序员,于是我付出的比同类、同龄稍微多那么一点点。在大一的一节重要的课(计算机导论)上,我接触到了一门语言——Python,计算机导论也是导致我后来做出重要抉择的一门课。当时教我们课程的是我们的班主任——肖老师,他在解释什么是编译型语言和解释性语言的时候给我们演示了一门神奇的语言,当时我还不知道那是Python,我只是依稀记得有三个尖括号,和老师对它的描述——一门用于科学计算的解释性语言,后来我猜想它可能是fortran之类的计算语言,直到我后来接触到了Python,我才确定这门神奇的需要缩进的解释性语言。后来我觉得底层的嵌入式开发不适合我,于是我毅然决然地选择离开了原来的班级。关于嵌入式,最近我接触到树莓派,觉得这东西特别有意思,又突然想去弄弄嵌入式这东西了。不过这个树莓派仍然是需要使用Python进行编程的。
c#我觉得真不是一门有前途的语言,一切都是因为微软是不开源的商业公司,在大一的第二个学期我曾疯狂地迷恋微软所维护的mfc,我觉得mfc能做出一个很酷炫的界面真是了不起,直到我接触java之后,我鄙视那种拖控件点鼠标的开发方式,我觉得Java是自然的,我认为微软的开发过多地依赖于它自身的ide,一旦脱离了微软的开发环境,想要在记事本上完成一个简单的helloworld都变得那么地不现实。所以我自始至终都有接触c#,这可能是我自接触编程语言以来黑某一门编程语言黑得最要命的一次。
提到c#主要是它号称尖锐c,而我本人对c语言是无比的崇拜,我觉得它这样的自称有损于c在我心目中的伟大形象。Linux下的许多工具都是纯的c所开发的,在Linux下安装一些大型的无法在源里直接安装的软件,就必须使用gcc来编译成可执行文件。Python的许多核心的功能可以使用纯c语言来编写以提高效率.因此我个人是比较推崇C语言的,而接下来我来总结一下自大一到现在的我所学到的c语言的大部分知识,由于是全靠记忆来书写的,存在批漏是在所难免的,假如大一的初学者要c语言的资料参考的话,此文可略去不看,我写作之目的重在梳理,而非传授知识。
首先我记得c语言的第一章大概是讲c语言是如何发展的,据说是著名的贝尔实验室发明了C语言,贝尔——发明电话的那位伟大的科学家,c语言就是诞生于此。然后就是c程序的编译和执行过程,编辑成的 .c 文件被编译器编译成.obj 文件在被连接成 .exe 的可执行文件,以上就是在Windows下的文件的编译和执行的整个过程。在Linux下, 我通常都是不带参数的 gcc 命令直接编译成 a.out 文件,然后在将该文件重命名成其它名字的可执行文件,这样就避免了下次生成的 a.out 覆盖原来的 a.out 文件。然后学到的就是数据类型以及在内存中所占用的空间,分别是 int 、float、double、long,这些是数值类型,在内存中分别占用4bytes、4bytes、8bytes、4bytes,有Java版本规定long是8字节的,这就另当别论了。然后就是布尔类型和字符类型,bool和char ,我记得有资料说bool是占用 1 bit的,但是存储的基本单位是字节而非比特位,所以硬是给bool加了 7 个比特位变成了1个字节,它只有两个值,true和false,但是各个版本的c是有区别的,因此我好像从来没有在纯c的环境下使用过bool类型,都是使用的 int 的 0 和非零来代替bool类型,至于 char 类型,好像它只有 256 个值, 索引从 0 到 255 ,我之记得65代表大 a ,97 代表小 a ,之后的字母依次类推,49好像是 0, 128 之后的字符是二进制2字符,在显示器上是没办法显示的,可能这也是为什么众多语言的文件操作需要分为是否以二进制格式打开的原因,char类型也是占1个字节也就是8个比特位的,所以这也很好的解释了它只有从索引为 0 到255 所表示的 256 个字符,2的 8 此方恰好是256, 好像在 c 语言里还有个 %c 的格式符用来表示char类型,而这256 个原始的字符就恰好对应最原始的 ASCII 码,这个码就是用1个字节保存的,我接触到的还有utf-8 编码,据说这种编码包含了目前地球上出现的所有字符,具体是多少个字节我真是忘了,好像是32 字节或者 64 字节,那么表示这样一个简单的小 a 就需要用 8*32 个 01 序列来表示 ( 暂且认为它是 32 字节的 吧 ) ,而且这个码是兼容 ascii 码的,也就是说它的 第50 个一定是表示 0,也就是ascii 码索引为 49 的,utf-8 只不过是 对 ascII 的一个扩充而已。以上好像提到数据类型,目前我接触的一个浮点类型比较诡异,在Java Javascript python python3 php c c++ 测试都好像是成立的
代码大致如下:
if (0.3-0.2==0.1){printf("same");}else{printf("not same ");}
以上语言的测试结果都是 not same ,这是为什么呢?官方的解释是,计算机的小数点位都是采用的二进制计数,只能用 1/2 ,1/4, 1/8 表示小数位,0 .1 0.001 这些我们日常所用的小数只能用二进制数来近似地表示,近似自然没有办法做到精确了。
c语言的基本数据类型如上述5种,我依稀记得书中还说什么中级数据类型,我暂且把其它的数据类型归为中级数据类型吧,数组,指针、结构体和枚举,至于什么联合体,我至今仍不清楚。
学了c 语言之后,后续课程就是数据结构,据说这也是一门特别基础的课程,学这门课程主要还是靠理解,用c语言实现的各种数据结构至今我还是没有办法完全依靠自己敲出来,总共就那几种数据结构,线性表、树和图,线性表又分成好多种,按逻辑来分成普通线性表,stack和queue,按在内存中的地址来分,有可以分为顺序表和链表,这两种表完全可以实现栈和队列,至于代码,我真的是没有理解透,我也记不了这么多,但是我觉得这个主要是靠自己理解原理。在java等各种高级语言中,这些数据结构都被封装得很完善了,自己用底层语言在重新写完全是在重新造轮子。但是后来者想要更加深刻地理解c语言的指针,还是完全可以自己动手写一写这些基础代码,培养自己code的能力。
大一下学期的那门神一样的课程——离散数学,据说是构建顶层软件架构的基础课程,学得我都糊涂了,如果要是一些算法也就算了,尽是一些基础的晦涩难懂的表达式,老师还要求学生一定要背下来,这个也许真的有用,但愿我是真的无知,领会不了其中的奥妙。
大一下学期还学了存c++,这门既面向对象又面向过程的编程语言,有人说这就是有类的c语言,加上STL之后才能够和各大高级编程语言相媲美,的却如此,我个人认为,c++还是偏底层了些,好多想要用的函数在标准库里找不到,需要下载其它的东西,否则就是自己造轮子,难怪别人都说c++是最难学习的语言,它的学习曲线如此得陡峭,投入与产出不成正比,还不如Java实在。
大二上学期学的Java,真是一门伟大的编程语言,我原来以为Java就是从Oracle下载下来的几个写好的包,后来我发现自己真的错了,从Java诞生的那一天起,无数大公司往上面投了多少钱,Java就是各大公司用钱堆出来的,我关注了一个微星公众号,importview,上面就是关于Java的各种资源,上面介绍了Java实现的各种技术,Java用于测试的工具,用于日志的工具,用于web开发的各种写好的框架,深度学习的框架,人工智能的框架,真是不胜枚举,由于目前技术能力实在有限,我真是看不过来。
大二上学期还学习了数字逻辑,那门被我勉强算作专业课程的课程, 我对硬件开发真的是没有兴趣,对于各种门电路,我反正是无语了,要不是那个老师教得还不错,我压根就不会认真学。2016整年我都是在自学另外一门脚本语言——Python,我觉得这才是真正的高级语言。Python包含了无数个库,几乎涵盖了软件领域的各个角落,在我心目中完全能够媲美Java。其实我学习Python,最主要的原因是在Linux下,Python自动化运维能力是其它语言无法比拟的,而我的服务器开发离不开Python,与其学一门效率低的bash shell ,不如学习强大的Python来的有意义。有人说Python是一门黑客的语言,那纯粹是对Python的误读。我不否认Python hacker有, 但是Python能够完成的任务Java不仅能够胜任而且还能做得更高效。用Python做病毒或者木马简直就是不切实际,首先要给客户端安装Python解释器,这本身就是不太可能完成的任务,其次Python是一门解释型语言,我觉得hacker之所以选择Python是因为它的高效开发,一个Python程序员可以在同一时间内完成10个Java程序员的任务,虽然程序执行得比较慢,但是我觉得Python的快速开发完全可以弥补它在运行速度上的劣势,随着未来计算机硬件的不断发展,Python在计算机上的计算也会越来越快,最终在某些领域达到速度能够被忽略的地步。与Python竞争的是Perl,这是一门对字符串处理最为优秀的语言,这是其它任何语言都无法媲美的。
利用课余时间我还自学了一些网页制作等等,不过这些都只能算是设计而不能算软件,html是web的基本元素,要想精通web,html是最最基本的知识,然后 就是 css 样式和javascript,网页制作其实没多大技巧,说白了前段开发就是靠基本的记忆,练习在记忆,实践然后赚钱,但不可否认的是,前段开发确实是达到高薪的捷径,无论是后台开发还是基于其它硬件的开发都是需要付出巨大的努力然后才能收获的过程,而前段开发真的不需要多么高智商,需要的就是掌握各种设计的风格和代码,但前端开发和修图片又是另外一回事, 前段开发是要靠代码实现的一些网页效果,虽然经常会使用到一些图片,但图片的编辑、 ps之类的工作真的不是软件工程的范畴。
至此,我的这篇又臭又长的blog就算结束了,写下这些主要是记录一下我这一年半的一些收获,可以这么说吧