C语言是菜鸟和大神的分水岭
作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程。不管别人如何抨击,如何唱衰,C语言就是屹立不倒;Java、C#、Python、PHP、Perl 等都有替代方案,它们都可以倒下,唯独C语言不行。
程序是在内存中运行的(我们将在《载入内存,让程序运行起来》一节中详细说明),一名合格的程序员必须了解内存,学习C语言是了解内存布局的最简单、最直接、最有效的途径,C语言简直是为内存而生的,它比任何一门编程语言都贴近内存。
所谓内存,就是我们常说的内存条,就是下图这个玩意,相信你肯定见过。

图:内存条
所有的程序都在拼尽全力节省内存,都在不遗余力提高内存使用效率,计算机的整个发展过程都在围绕内存打转,不断地优化内存布局,以保证可以同时运行多个程序。
不了解内存,就学不会进程和线程,就没有资格玩中大型项目,没有资格开发底层组件,没有资格架构一个系统,命中注定你就是一个菜鸟,成不了什么气候。
以上这点我有深刻的体会!工作期间我曾专注于网站开发,虽然能够设计出界面漂亮、体验良好的网页,但是对内存泄漏、多线程、共享内存等底层概念一窍不通,感觉和周围同事的差距很大,这让我非常郁闷,不知道如何突破。我曾多次尝试学习内存和线程,也找了很多资料,但是无论如何都啃不懂,到头来还是一头雾水。
离职后我全职运营C语言中文网,于是决定再次系统、深入、全面地学习C语言,并结合C语言去了解一些内存知识,这个时候我才发现,原来C语言就是为内存而生的,C语言的设计和内存的布局是严密贴合的,我因为学习C语言而吃透了内存,了解了计算机内存是如何分布和组织的。
C语言无时无刻不在谈内存,内存简直就是如影随形,你不得不去研究它。
至关重要的一点是,我能够把内存和具体的编程知识以及程序的运行过程结合起来,真正做到了学以致用,让概念落地,而不是空谈,这才是最难得的。
另外一个惊喜是,攻克内存后我竟然也能够理解进程和线程了,原来进程和线程也是围绕内存打转的,从一定程度上讲,它们的存在也是为了更加高效地利用内存。
从C语言到内存,从内存到进程和线程,环环相扣:不学C语言就吃不透内存,不学内存就吃不透进程和线程。
我感觉自己瞬间升华了,达到了一个新的高度,之前的很多谜团都解开了,和大神交流也没有障碍了。
「内存 + 进程 + 线程」这几个最基本的计算机概念是菜鸟和大神的分水岭,也只有学习C语言才能透彻地理解它们。Java、C#、PHP、Python、JavaScript 程序员工作几年后会遇到瓶颈,有很多人会回来学习C语言,重拾底层概念,让自己再次突破。
C语言是菜鸟和大神的分水岭的更多相关文章
- 从菜鸟到大神:Java高并发核心编程(连载视频)
任何事情是有套路的,学习是如此, Java的学习,更是如此. 本文,为大家揭示 Java学习的套路 背景 Java高并发.分布式的中间件非常多,网上也有很多组件的源码视频.原理视频,汗牛塞屋了. 作为 ...
- Go 语言从新手到大神:每个人都会踩的五十个坑(转)
Go语言是一个简单却蕴含深意的语言.但是,即便号称是最简单的C语言,都能总结出一本<C陷阱与缺陷>,更何况Go语言呢.Go语言中的许多坑其实并不是因为Go自身的问题.一些错误你再别的语言中 ...
- 菜鸟到大神之多图预警——从 RAID 到分布式系统中的副本分布
我们知道,在面对大规模数据的计算和存储时,有两种处理思路: 垂直扩展(scale up):通过升级单机的硬件,如 CPU.内存.磁盘等,提高计算机的处理能力. 水平扩展(scale out):通过添加 ...
- C语言简单实现链栈基本几个功能(适合新手看,大神可指正)
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- ruby大神与菜鸟的代码区别
之前Brand类 has_and_belongs_to_many :categories, index: true 现在在Category类 增加 has_and_belongs_to_many ...
- 前端自学vs跟大神系统学?你看着办
前端自学vs跟大神系统学?你看着办 一名广告专业学生,在大三的时候对于广告行业的前景不是很看好,转而自学web前端,刚开始接触的前端语言是html(html应该不算编程语言),上手很容易,在w3csh ...
- [OC笔记]@property之个人理解,大神轻拍
/** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...
- wire与reg的区别?转载大神!
本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...
- 兄台息怒,关于arguments,您的想法和大神是一样一样的----闲聊JS中的apply和call
JavaScript提供了apply和call两种调用方式来确定函数体中this的指向,表现出来的特征就是:对象可以'借用'其他对象的方法.之前的几篇博客回顾了一些Web控件的一些开发方法,我们聊了如 ...
随机推荐
- PTA 1003 Emergency
问题描述 As an emergency rescue team leader of a city, you are given a special map of your country. The ...
- 查询避免Unknown column ‘xxx’ in ‘where clause
问题: 单从字面理解,我们很容易得出列名称不存在的结论, 但是,很多时候并不是列名出错造成的,而是由于拼凑sql语句时对字符类型数据没有用引号引起来造成的. 例子: 例如: String sql=& ...
- tensorflow expand_dims和squeeze
有时我们会碰到升维或降维的需求,比如现在有一个图像样本,形状是 [height, width, channels],我们需要把它输入到已经训练好的模型中做分类,而模型定义的输入变量是一个batch,即 ...
- Iptables防火墙(未完)
来自深信服培训第二天下午课程 软防跟硬防 Linux包过滤防火墙概述 netfilter 位于Linux内核中的包过滤功能体系 称为Linux防火墙的"内核态" iptables ...
- 题解【洛谷P1083】[NOIP2012]借教室
题面 二分到哪一个申请人要修改订单,可以差分\(+\)前缀和达到\(\Theta(n)\)的\(\text{check}\). 具体细节见代码. #include <bits/stdc++.h& ...
- Day5 多线程 锁
synchronized保证操作原子性 这是因为对变量进行读取和写入时,结果要正确,必须保证是原子操作.原子操作是指不能被中断的一个或一系列操作. 通过加锁和解锁的操作,就能保证3条指令总是在一个线程 ...
- redis的linux安装
1.下载安装包 [root@localhost opt]# yum install wget [root@localhost opt]# wget http://download.redis.io/r ...
- RabbitMQ使用注意事项
用ConnectionFactory创建的TCP连接要复用,因为创建新的TCP连接比较耗时. IModel(信道)是轻量级的,可以用时创建. channel.BasicQos(0, 1, false) ...
- 对json 数据的处理
今天一个任务是,从一个指定接口中获取 json 字符串,并将其中指定的数据,以列表的形式表示出来. 唯一注意:json 字符串,需要先转换成 json 对象. var json对象= eval('( ...
- centos7解压压缩zip文件
一.安装支持ZIP的工具 yum install -y unzip zip 二.解压zip文件 unzip 文件名.zip 二. 压缩一个zip文件 zip 文件名.zip 文件夹名称或文件名称