编程语言-c语言入门编程
本来想休息一下,想想还是趁热打铁,效果好一点。 不然又不知道什么时候能进入状态。 这篇我想谈谈自己对编程语言的理解。 可能有点搞笑,一个才刚入门或者说处于一个业余爱好
本来想休息一下,想想还是趁热打铁,效果好一点。 不然又不知道什么时候能进入状态。
这篇我想谈谈自己对编程语言的理解。 可能有点搞笑,一个才刚入门或者说处于一个业余爱好者的人谈自己对编程语言的理解,乍一看是挺奇怪的。 但是我想凡事都有个第一次嘛,况且是一个言论自由的时代,发表发表自己的看法我想应该是不会犯法的。嘻嘻。
为什么我会想到对编程语言的理解呢? 事实上本来打算写对java语言理解的,但是那样逼格不够哈哈,其实也不全是啦,如果有看过汇编的,学习过c系语言,用过脚本语言的,我想应该都有一种感悟,那就是带着镣铐舞蹈。。 逛csdn我想都是或多或少从事技术方面的工作,自认知道泛型或者说模板的概念,我想表达的也是这样的一种意思,不针对某一种具体的语言,而是针对所有语言。 (突然想到那句话:我不是针对谁,我是说在座的各位都是辣鸡哈哈哈,玩游戏时听到的开个玩笑)。
在过去的大半年时间里,指的是从大一下到现在,我内心深处始终有一个信念支撑我看各种理论的书籍,各种底层也好,高层也好,网络编程也好。 硬件构成也好的书籍。 那个信念就是: 我一定要搞清楚,一个二进制串,如何趋势一个电路发生改变,一串虚拟的,二进制串如何 改变 实实在在存在的 看得见,摸得着的硬件电路的?? 当然那时候还不会用二进制串这个词,那时候用的是程序,代码。 尽管花了一部分的时间(之所以说一部分,因为还有很多其它的任务在并行运行,比如学习专业知识,练习专业知识,必要的娱乐游戏,以及暑假兼职等,并且大多数时候处于一个较低的权重), 但是依然没有得到我想要的答案。 因为这里面涉及的知识与内容真的不是说自己花花时间与精力,况且还是一个文科生的情况下能够较快吸收的。 尤其是哪些硬件的构成原理等等等等,复杂的要死,并且就算自己看了理论,没有实践依然是得不到很好的理解的。
不过在这途中,我依然收获到了很多。 比如汇编的一些基本知识。汇编的过程等等。计算机的发展,计算机的硬件构成。 虽然这些都停留在一些理论层次上,但是有时间与机会我一定会去好好实践一下(虽然这种可能性很小,毕竟要搞钱养家,要生活) 。 另外的一些机缘巧合,简单的接触了一些其它的语言体系。 c系就不说了,大学语言的基础入门课,但是究竟入没入门就见仁见智了。 c++,朋友在学,没用过,但是数据结构课上用的是c++。 机缘巧合下在一个微软组织的一个比赛中中使用了c#,有过一定的接触,虽然最后胎死腹中~~。 结缘巧合下去企业见识了一下电商平台,解除了ecshop为基础的php为语言写的开源电商平台。 另外平时练习的时候也写jq,js写的不要不要的。 python被人工智能的大风潮给顶的云里雾里的,自己自然也看过一些教学视频。 java作为本土语言,自然不多说。
but,我想说以什么语言入门还真不太重要。 只是说它能产生的价值,则必须更具当时当地的市场环境进行估值了。 这是没有办法的事情。 我觉得 真正要入门的 语言还非汇编不可,可以不用学很深,但是必须得去用用,体验体验。 我觉得这也是作为一个当代程序员应有的职业素养。 汇编语言说:我很丑,但是我很温柔。 嘿嘿。
按照书中的说法:汇编语言对于我们理解底层具有重要的意义; 一些程序的引导程序依然用汇编来写; 一些对程序执行实践比较严苛的场景依然用汇编来写,也必须用汇编来写。 至少第一点对我们来说是至关重要的。 说到汇编,自然要提到汇编指令。 由于我是个菜鸟,没有资格在这里具体提有哪些指令,各自的使用注意事项,各自的使用场景等等。 同时也不是我能进行探讨的。 但是书本上都有,写的很全,很仔细。 尽管如此,我们纵观全书,依然没有一个较好的例子来说明如何以一个虚拟的东西去改变一个实际的东西,于是我草率的得出了一个不太恰当的结论: 汇编语言所代表的及其语言,以c语言为代表的高级语言,它们并没有什么本质的区别。 但是它们的区别依然很大(什么?大在哪? 只可意会不好言传哈哈)。
作为一个有学习强迫症的骚年,自然不会善罢甘休。 于是看看硬件的东西,晶体管啥的,电容啥的,电感啥的。 好家伙,更懵逼了。 但是我偶然翻笔记的时候发现:ISA(指令集体系):软硬件的接口。 这不正是我一直以来的所追求的么?随即了解到一个知识,恐怕有生之年都不能研究了。。。 那就是:指令集体系是芯片开发者,也就是cpu的作者给设计的,嵌入到单片机中的,一套微指令。 还是个虚拟的。 也有办法去看看软硬件交互的地带编程语言,那就是门电路编程语言,逻辑电路,时序电路啥的。 傻傻分不清楚。 可是要知道现代芯片都是超大规模集成电路,动则上千万乃至数十亿的电子原件。 算了还是乖乖读书吧。 。 看看以后有没有机会弄个模拟的,迷你的来练习练习。
好像又严重偏题了。 这是为什么呢? 权当上面的是一个背景知识介绍吧。 况且我内心深处也将它当成一种背景知识介绍。也不算严重偏题,那就中等偏题吧!
事实上,在编程语言的发展史上,有一些比较重要的事情,也是有必要交代的事件。 大体为:汇编语言的产生,编译技术的产生,操作系统的产生,编程语言的产生。 从时间线上来说: 20世纪50年代,汇编语言产生。 1952年,第一个编译器产生,由此引发的有: 相继出现批处理系统,fortran语言及fortran语言编译器,lisp语言,cobol语言。 20世纪60年代,结构化程序设计开始发展,我想这也是计算机能够发展这么快至关重要的原因,相继出现了 unix,c语言。 此时语言已经趋于成熟。1975年出现的Yacc,好像是一种比较成熟的编译技术,更加助力编程语言的发展。 之后的事情就不说了。 要知道到现在,挂上名的编程语言好像有九百种之多,是什么使得编程语言发展的如此迅猛?是爱吗? 是责任吗? 都不是,是编译技术和伴随的如工业基础的进步,网络的发展等。 这么多语言我们要去都学是会累死的,并且得不到应有的效果。 但是不可否认前辈在这方面所花的时间精力和心血,为我们学习和生活带来了极大的便利。 我看到某书导言中认为十分不错的话:电子信息系统设备功能越来越复杂,系统的集成度越来越高,要求未来的设计者应该具备更扎实的理论基础 和 更宽广的专业视野。 好的时代并不是说我们可以坐享其成,而应该是对自我要求更加高,当然现在有一个直接的导火索就是工资的问题,也一定程度推动学习的积极性。
编程技术又是一个专门的技术门类,设计的知识可比我们学的编程知识复杂的多得多了,并且密密麻麻的不好看,贼难受。 尽管自己看过多遍,依然如初恋般纯洁~~。 辛运的是自己可以更新一些之前的见解, 就是以前认为认为编译器的前端,也就是预处理,词法扫描,语法扫描,和一部分编译器后端,无非就是用到正则。 现在看来得刷新了。 它虽然用到了正则,但是绝不仅仅是正则。 词法扫描真正核心的应该是:Token,网络中的令牌,可以理解为标识符吧。 而语法分析则是基于Token的正则的嵌套。 具体的可以看书了解,或者查资料。 这也是我们用ide它能智能的定位非运行时的语法错误的原因。 至于其它的如代码优化,连接等则是自己万万没法触碰的,但是可以远观,虽然没有办法亵玩嘻嘻。
之前提到了既然低级语言与高级语言并没有本质上的差别,那么我们何必纠结自己是什么入门呢? 何必去纠结还有哪些语言想要学但是没学,哪些语言好,哪些语言不好呢? 既然这些语言再众多语言中竞争成功,并被大众所熟知,那么它一定是有自己独特的,其它语言所不具备的独特优势。 自然我们学起来也很轻松愉快。 既然都是戴着镣铐跳舞,那么何不放上几曲dj,配上自己的佳人,尽情舞蹈~~~
一本正经的胡说八道了一通,希望多年后我看到当年自己的言论时能够发声感叹: 嗯~这小伙子不错,年轻人有想法好事情。嘿嘿嘿。
最后:因为这个想法是由java而来,自然由Java来结束好一点。有始有终。
最近几年,互联网的井喷式发展,人们追求的是一种简单易用的,高效的语言。 被称作动态语言。 而java原因则属于静态语言,所谓的静动,是指java程序在写好后,所有的变量类型已经确定了。 针对于此,在j2ee1.5的时候引入了反射机制,极大的扩展了它的功能。,很多优秀的框架也是基于此。
今天在练习的时候的想到的三者有趣的关系:汇编技术中的汇编语言(面向指令), 编程中的高级编程语言(面向过程如:c),编程中的高级语言(面向对象,如:c++,java,c#)。
问题由来: 由于最近在补java的基础,拿了一部分时间看源码。 会发现一个奇怪的问题。 源码分为两种,一种去追它的方法,一直追一直追,会发现它通过本身的一些语句也好,算法也好,逻辑控制也好,jvm交互控制也好最终实现该 块(方法感觉不够全)。 而另外一种就是:追吖追呀追呀,本来以为多神奇个东西,并且它确实也很神奇的东西,最终给你一个 Native声明。 好处是你不用再追了,从逻辑上说服自己我已经看完了所有的代码,我是大神了! 坏处是这种地方多了,给我造成了反正最后都是要跑到native那去了,那要这么多的属性和类干什么呢???? 要不就直接将源码包中所有的native方法给提出来,那样就可以说自己精通Java了。 为什么会出现这种情况呢? 可不可以不要native啊? native里面是c,我去看它的时候他会不会又以同样的方式对待一个如此勤奋的少年的一腔热血呢? 如果它以这种方式对待了,我该怎么呢?、
看看上面三者的关系: 面向指令,面向过程,面向对象。 它们分别代表了编程语言的某一个技术标准或者规范吧。 它们之间的通信时怎样呢? java 与 c之间,我想时通过大家熟知的jni。 根据直觉:c应该也是要转化为指令级语言的,毕竟软硬件的接口为指令集,指令集的等价为机器语言,机器语言的近义词为汇编语言。 因此它们之间必然时要存在一个转换的。 通过什么呢? 通过编译语言!!! 没注意吧, 编译语言多么神奇的东西,不是汇编语言哦。之前可一直没将它当作一门语言对待。 甚至不知道是不是有这么个说法,但是在我的知识体系里,我是要将它注册并通过的。 如果有错的话,那就错下去吧,反正这辈子是搞不了研究了嘿嘿嘿。
好,回过头来看看为什么要用native 。 从多数的答案来看,这是因为c比java的执行速度快! 并且它是面向过程的,更适合用来处理方法块的执行吧。 可以不用native吗? 想想应该是可以的,所谓万本归源嘛,低级语言和高级语言都没有本质差别,何况都为高级语言的两种语言了。 我们不应该纠结这个问题,因为有了编译语言,不考虑效率的情况下,不管我们写成啥,最后能达到效果,理论上都是可行的。
接下来看看java处理了什么问题? 记得很早以前就听说了所谓的程序员鄙视链,其中就有说 学汇编的看不起学c的,学c的看不起学java的。 这里就针对后一条来说,我认为不存在谁看不起谁。 语言基本机制不同,所处理的对象和使用的场景不同。 不是说谁的语言难一些谁就能看不起谁的。 它们的大体意思是,很多基础的底层都是c做的,java就是基于它们进行的延伸这样。。。 诚然,谁不是站在前人以有的经验上学习升华,如果什么都要自己的从头再来,那人类别想进步了。 。。 曾经一度我也这样认为,就是越底层的认为它价值越高,重要性越大,越高层的作用就不行。
说个实话,我的感觉哈,除了本土实现的一些方法外。 java就是在做包装。 但是这个包装绝不是拿个小盒子给包围进去,这个包装涉及到了复杂的设计模式,考虑到了扩展性,健壮性,安全性,全面性。 甚至包含了一些优化机制。 这样的包装我想也不是哪个底层程序员突然灵机一动,一拍脑门就能实现的吧! 并且它包装的不仅精美,量还很大。 可以看到java的扩展基础包,扩展包中所覆盖的内容,门类。 绝不是某个单单的大牛能够设计的,其成品必然是很多绝顶聪明的,具有实干精神的,甚至具有一定完美主义强迫症的知识分子的成果,或者说一个十分成熟的公司的产品。 更加不用说它的迁移性了,其实也就是那几个版本的jvm,但是这本身就很酷了。 very cool。
说到这里,好像才把我想要说的说完了。 总之吧,不要太过在于语言的具体门类。 保持一个敬畏的心,坚持学习,虚心学习。不断积累相信会有所作为的。