大学不教php,为什么大学普遍只教学生 C 语言?

news/2024/7/7 21:28:11

“大学只教C语言,需不需要自学一些其他的技术?”

“大学里为什么不教 PHP,Swift 或者 Python 这些真正实用的语言?”

... ...

在知乎上经常可以看到这样的问题。这也不能单纯怪学生们浮躁,现在工业界的技术日新月异,在以 Github 为中心的开源社区以及针对各种语言平台的包管理软件的带动下,大大小小眼花缭乱的框架和新兴语言百花齐放,好不热闹。反观科班的计算机教育,依然是几十年不动的 C 语言,和十年前相比唯一变化就是开发工具从 Turbo C 升级到了 VC 6.0。

我们都知道对于计算机科学这个学科,实践一直以来都是一个非常重要的环节。所以大学之所以十年如一日的以 C 语言为中心教学, 最根本的原因是,计算机科学的核心课程的实践环节都可以靠,并且主要是靠C语言完成。

这个部分,是大多数学校所欠缺的。什么意思呢?  大多数学校都选择性忽视了核心课程的实践环节,最终导致了学生们对 C 语言的偏见。

那到底是怎么个实践法儿? 我举几个例子:

数据结构,都不说难的,各种链表,各种链表增删查改,队列,双端队列,栈,用栈模拟递归,基本的树形结构,基本树形结构的递归和非递归遍历,各种排序,检索算法,是不是都得用C语言实现一遍?各种字符串操作,性能比较,模式匹配,KMP,BM这些算法是不是也得尝试 一下自己写出来?这些看起来是进阶部分的练习,其实恰恰才是最基本,最核心的要求。

等你学了一些更加 Fashion 的语言后你会发现,用 C 来实现数据结构是最简单,最清晰,也是最容易的。

操作系统,大多数人会觉得这特么课根本不可能有啥可执行的实践吧? 其实是有的,有这么一个项目:NachOS:http://homes.cs.washington.edu/~tom/nachos/,以linux的进程为载体,实现了一个最基本OS的逻辑, 千行级别的代码,是千,不是千万,很容易看懂。 看懂了然后呢? 就可以自己做一个bash,解析用户的输入,可以自己做一个文件系统,自己做一套基于自己的文件系统上的搜索算法,自己做进程模型,实践各种进程切换的算法。当然,都是靠C语言(NachOS 源码是 C++ 的,不过并没有多少 C++ 的特性,基本就是 C with class,基本会C语言都能看懂)。

计算机网络,这就更别说了,linux 上到处都有为 C 语言开发的网络操作库,不论是做个简易 TCP 客户端,或者请求个简单的网页, 尝试把 HTTP 报头打印出来看看,或者用 libpcap 做个 sniffer ,抓抓包。或者自己构造个 RST 包,看看能不能切断一个正在进行的 TCP 链接。 只有亲自写代码去完成这些场景,才能够真正理解课本里面的概念。才能算学好了这门课,这些自然也是靠 C 语言。

计算机图形学,这简直就是 C 语言的天下!看一下 OpenCV,OpenGL。两者都有对 C 语言非常有好的接口,不论是撸个三维的地形,迷宫,还是针对摄像头,搞个实时人脸检测,都不难,并且都只需要纯 C 语言基础 + 对应的库的接口, 不需要任何 GUI 相关的编程知识。如果不做这些练习,那课本里那些“光线跟踪”、“背景剔除”、“形态学运算” 对你来说就永远都只是个模糊的名词而已。duang!C 语言又立一攻。

编译原理,能写个语言的解释器是编译原理的基本要求,这很重要,而且这并不难,但从来不受重视(反正考试不考……)。一般编译原理的课程大作业都是些一个表达式求值的计算器,然后止步于此。但其实再往前走一步,其实在此基础上加个变量表,再引入递归下降的思想,就已经是一个解释器的雏形。在此基础上添加对 if  或者 for 这些控制流的语句也是水到渠成的事。曾几何时,用 C 语言写个简单的 BASIC 解释器几乎是人见人爱的活动,资料一找一大堆。

说了这么多,还是那句话。作为科班学生,学好 C 语言,学好其他 CS 核心课程,是最重要的,并且也是最花时间的,当然也是日后会给你最丰厚回报的。别没事儿就整动态语言,移动开发那些花花肠子。

------------

想看更多内容? 可以关注我的知乎


http://www.niftyadmin.cn/n/3571268.html

相关文章

mysql的三方Infobright数据仓库BRIGHTHOUSE引擎

Infobright是MYSQL三方专用数据分析引擎,专门针对亿级以上的数据查询,而且查询速度是MYSQL的MyISAM,InnoDB的5~60倍,该引擎可以说是每个字段都建立了各种索引, 下载地址 https://www.infobright.org/ 安装与使用:http:…

java 长按事件,RecyclerView 点击事件和长按事件

在Adapter适配器中设置public void onBindViewHolder(Adapter.MyHolder holder, int position) {holder.img.setImageResource(list.get(position).getImg());holder.tv1.setText(list.get(position).getName());holder.tv2.setText(list.get(position).getText());holder.line…

ios 获取沙盒文件名_iOS沙盒机制

沙盒机制每个应用都有自己独立的存储空间应用不能翻过围墙去访问别的存储空间应用请求的数据都要进行权限检查,如果不符合,就不会被放行ios app只能在自己的沙盒目录下读取文件,在沙盒中,bundle container存放的是应用的bundle&am…

Lintcode: Unique Paths

C dp 递推式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 初值&#xff1a;dp[i][j] 1&#xff0c;i0 or j0 空间优化&#xff1a;省掉一维 1 class Solution {2 public:3 /**4 * param n, m: positive integer (1 < n ,m < 100)5 * return an integer6…

swoole替代php-fpm,能否使用swoole http server 替代php-fpm ?

我在本机上使用swooleyii2 bacic 模板测试。 fpm qps在300&#xff0c;swoole可以到500。但是有个问题是压测时swoole把整整4GB的空闲内存都吃光了&#xff0c;很明显这是worker执行的时候出现了内存泄露&#xff0c;因为结束之后内存并没有降下来&#xff0c;杀死进程后才释放…

qt 将数字显示到文本框_qt实现串口通信时候,把文本框的数据以16进制的形式发送的问题...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼qt实现串口通信时候&#xff0c;把文本框的数据以16进制的形式发送的问题1、我在网上找了函数&#xff0c;把数据转换为16进制&#xff0c;//字符串转换成16进制数据0-Fvoid porttest::StringToHex(QString str, QByteArray & …

LAMP之三:挂载NFS的Discuz论坛

一、 实验说明 1、通过DNS服务器实现负载均衡 2、为web服务器挂载NFS网络文件系统&#xff0c;保证两台web服务器数据的同步 3、实验平台环境 1&#xff09;两台Apache服务器做负载均衡 2&#xff09;一台cgi服务器挂载NFS网络文件系统&#xff0c;实现数据同步 3&#xff09;一…

解决php的failed,解决failed-to-open-stream:-HTTP-request-failed!

当使用php5自带的file_get_contents方法来获取远程文件的时候&#xff0c;有时候会出现file_get_contents(): failed to open stream: HTTP request failed!这个警告信息。google或者baidu一下&#xff0c;好多这样的问题&#xff0c;解决的方法都是修改php.ini&#xff0c;把a…