计算机编程入门先学什么最好?

2023-10-27

看完其他知友的回答,我认为他们的观点过于局限,并没有真正切中问题的要害。

我们不妨换个角度,站在更高一层来看这个问题「计算机编程入门先学什么最好?」

计算机入门最应该学的是 Linux,而非任何的编程语言。

这篇文章4600字,有点长,如果你能耐心看完,或许会给你带来更多的思考。

1. 为什么?

任何编程语言都只是一门工具,一门让人能够与计算机“交流”的工具。人学习编程最重要的是要学习解决问题的思想、方法,其次才是使用编程语言解决生活中的问题。

「计算机为什么会诞生?编程语言为什么会诞生?」,归根结底,这些事物的出现只不过是帮助人们更好地解决生活中的问题。你知道世界第一台(电子)计算机发明的原因是什么吗? 第一台计算机的诞生是因为「战争」,1943年,二战后期,M 国人在研制武器过程中迫切想要解决「快速得出新武器的射程和检测模拟运算表」这个难题,随后投入建造了第一台电子计算机 ENIAC(埃尼阿克)。
ENIAC

三年后(1946年),ENIAC 建成并投入使用,人们在“计算”领域得到新的突破,这标志着人类文明进程进入了新的阶段,ENIAC 也是人类在电子计算上的首个里程碑,人类就此进入计算机时代。

随着计算机发展,人类对计算机的应用不满足于只将其单纯地用于计算。随着键盘、鼠标、显示屏、操作系统、计算机网络……这些东西的出现与发展,计算机也从「专用」逐渐演进到「通用」,计算机慢慢进入人们的生活。

2. 编程语言的出现

要让计算机为人类工作,必须要将人类的意图告诉计算机,我们不可能直接使用英语、汉语这些自然语言与机器沟通。人们跟 ENIAC “沟通”的方式是人们手工搬动开关和插、拔电缆。虽然计算一个运算表仍旧很费力,但是这远比之前的器械式计算机快了非常多。

人们发现计算机开关的插拔可以抽象成二进制中的“0和1”,随后人们将德国数学家莱布尼兹提出的「二进制计数法」(二进制最早起源可以追溯到中国的《易经》,感兴趣的可以去了解。)引入到计算机当中。计算机拥有了真正意义上的语言——机器语言,也可称二进制语言。

当时的工程师跟计算机交流使用的是一串串「0和1」组成的数,复杂而难学,记忆和排查问题都异常困难。随后出现了相比机器语言更抽象的汇编语言(助记符语言),有了助记符,人类能够更好地记忆与计算机交互的「指令」,汇编语言的出现进一步简化了编程过程,降低了编程难度,此时人们可以更高效地跟计算机打交道了。

但是,随着计算机架构的不同,使用的汇编指令就会有差异,人们想着能否发明一门「通用的编程语言」呢?随后,高级语言诞生了,高级语言是对汇编语言的再一次抽象,高级语言更方便人们使用,更易于记忆,更通用,人们跟计算机的“沟通”也变得更高效了。

自高级编程语言出现后,这半个多世纪里,世界上的高级编程语言已经有了上百乃至几百种。无论是什么样的高级编程语言,最终都会被编译成机器语言,以此实现人与机器的交互。

由此可见,学习编程语言只不过是让我们更好、更容易地与计算机交流,让计算机帮助我们解决现实中遇到的问题。编程语言只是一门我们与计算机沟通的语言,如同我们跟 M 国人交流,我们需要学习一门共通的语言,可以是中国人学习英语,也可以是 M 国人学习汉语。所以,我们不应该局限于学习什么样的编程语言,如果没有从根本上解决问题,那么问题永远无法被解决。

如果要学习计算机编程入门,最应该学习如何使用计算机的命令。如同图形化编程,将一个个代码块、功能模块拼接起来后可以解决某个问题、闯过某个关卡。同样我们可以使用计算机命令来控制计算机帮助我们完成某些事情,解决某个问题,计算机命令也像编程语言的发展一样,是不断对底层封装、抽象得来的,也是我们与计算机“沟通”的一种方式。

为什么应该学习 Linux 而不是学习 Dos 命令呢?这个是我从通用性和易用性出发,如果感兴趣你也可以去了解 Dos 的命令,Dos 是 Windows 电脑的通用命令。如果你不知道什么是 Linux,那么可以简单跟你科普一下,Linux 几乎构筑了当今整个互联网世界,常见的路由器、智能电器、安卓手机、自动驾驶汽车、通讯系统、操作系统、网站、各种程序应用……无一例外地、或多或少地都使用了 Linux 内核或其衍生的系统。

Linux 命令行是我们与计算机或者说操作系统沟通的一个外壳(Shell),我们将简单易懂的命令输入到 Shell,Shell 会将我们的命令传给操作系统,操作系统与计算机交互后,又会将结果返回到命令行中。Shell 在某种程度上可以看作一个翻译家,帮助我们更好地去使用计算机。使用 Linux 后,你或许会体会到:图形界面能做的,命令行也能做;命令行能做的,图形界面却无能为力。这句话虽不是绝对的正确,但却反映了命令行的精髓和巧妙之处。之前我写过一篇文章谈 GUI 和 CLI, 感兴趣可以读一读:

为什么有人坚信人类不可能基于 GUI 的操作方式,发明出比「命令式编辑器」效率更高的开发环境?

学好 Linux 后(特指命令行),学习任何一门编程语言都是水到渠成的事。我举一些例子:

3. ShellScript 编程语言

当你学习完 Linux 命令,你会接触 Shell 编程,你会想将这些简单而又经常重复使用的命令写到一个文件里,方便下一次使用。ShellScript 脚本编程语言就是由此而来,不知不觉你已经学习了一门编程语言。ShellScript 灵活而简单,只要拥有使用命令行的基础,学习 ShellScript 就是非常简单了。

4. VimScript 编程语言

在学习写 Shell 脚本的过程中,必不可少的工具就是编辑器,通过编辑器编写代码,然后保存成文件。Linux 中可用的命令行编辑器也不少,比如 Vi、Nano、Vim、Emacs、Neovim……

我相信使用 Linux 必定会接触 Vi 编辑器,然后是 Vim 编辑器,再深一点会接触 Neovim。当你认识到 Vim 是「编辑器之神」后,你的编程观念会更近一步。你会发现,编辑器原来也拥有「属于自己的编程语言」。当你想优化 Vim 编辑器的工作流时,你会除了可以使用内置选项、别人编写好的插件外,你还可以使用 VimScript 这个专属于 Vim 编辑器的编程语言,来实现一些自定义功能、逻辑以此来实现一个更加顺手的代码编辑器。

5. Lisp 与 Elisp 编程语言

如果你接触了 Emacs 这个被程序员称为「神的编辑器」的强大编辑器,那么你一定会使用 Elisp 这门语言。因为 Elisp 是专属于 Emacs 的编程语言,相信每个入坑 Emacs 的程序员,或多或少就是想品味这个「古老的编程语言」,享受函数式编程的快感,想要使用 Org 这个强大的 Emacs 组件,我当初也是因为这些原因入坑 Emacs。Emacs 强大到无所不能,比如煮咖啡、当作视频播放器、音乐播放器、浏览器、玩游戏……Emacs 与操作系统只是一核之差。因此,许多程序员将 Emacs 戏称为「隐藏在编辑器之中的操作系统」。

在这里插入图片描述

Lisp 作为世界上第二古老的高级编程语言,诞生于1958年,世界第一老的高级编程语言 Fortran 只比它老一年而已。这个编程语言如同魔法一般,神奇而强大,在而后的半个多世纪里衍生出了十几种「方言」。

现在看来 Lisp 更像是一个编程语言家族,不断演进而且繁荣。Lisp 这门编程语言与人工智能(Ai)相伴相生,在上世纪60年代起,Lisp 语言就被用于人工智能编程,随后衍生出的多种方言也在某个领域深耕,比如 Emacs Lisp 就是为 Emacs 而生的 Lisp 方言。虽然现在人工智能的主力编程语言是 Python,但是丝毫不影响 Lisp 的历史地位,即便在某些领域默默退出历史舞台,但在另一些领域又再一次熠熠生辉。如果说要评选编程语言中的经典,那么 Lisp 必占一席。

所以,如果想品味 Lisp 这门具有一定魔法色彩、古老而繁荣的高级编程语言,推荐你从 Elisp 学起,从使用 Emacs 编辑器开始。当使用了一段时间后你就会慢慢喜欢上 Elisp 这门有趣的编程语言、感受一下跟现代高级编程语言有所区别或者没有的「逆波兰表达式」。

在这里插入图片描述

6. Lua 编程语言

如果你更喜欢「现代一点的 Vim」,那么 Neovim 一定不要错过。Neovim 从0.5版本起,官方将 Lua 这门编程语言作为 Neovim 的一等语言,提供丰富的 API 接口。虽然 Neovim 是 Vim 的一个分支,但随着 Neovim 社区不断壮大,Neovim 开始追寻更广阔的天空,既继承了 Vi 和 Vim 优秀的基因,也向着强大、易用、现代化发展。

如果做游戏开发的程序员,一定对 Lua 不陌生,这是一门简单易学、小巧灵活、易扩展的脚本语言。如果想为 Neovim 开发插件,如果想写游戏逻辑,那么你一定会接触和使用 Lua 这门编程语言的。

7. C 编程语言

当然,如果想要深入理解计算机,那么 C 语言是必学的,这是通往计算机世界的必经之路。因为目前市面上绝大多数计算机教材、经典书籍都使用 C/C++ 语言来描述,Linux 内核也是用 C 语言来写的,当你真正想去了解操作系统,了解 Linux 的编程哲学、设计哲学,那么此时就需要一定的 C 语言基础了。当然这一步,一定要放在拥有 Linux 使用经验后,否则你会学得异常吃力。

当你学成了 C 语言后,你会对许多高级编程语言的设计、原理有更深的理解,C 语言当之无愧是你打开编程世界大门的第二把钥匙。有一句话是这样讲的:一生二,二生C,C生万物。万物源于 C,对这样评价,C 语言确实是实至名归。

8. Go 编程语言

有许多编程语言一开始都是由 C 语言写出来的,随后才实现自举,不再依赖于 C 语言,比如我最喜欢的编程语言——Go。如果感兴趣也可以了解一下这门被称为“21世纪的C”的编程语言,我写有一篇文章介绍过,感兴趣可以读一读:
同样是巨头的语言,为什么中国是 Go 最热的国家,而 C# 越来越少?

9. Rust 编程语言

这是一门跟 C/C++ 比肩的现代的系统级编程语言,这一门语言几乎与 Go 在同一时期诞生。都是新时代的编程语言,它跟 Go 的定位还是不一样的。感兴趣的朋友也可以去了解一下这门语言,这门语言有可能在将来取代 C++ 这门,或许在不久地将来这门语言也会像 C++、Java 一样火气来的,只是时间的问题罢了。如果想学一门比较新的语言,Rust 兴许值得你去投资,它代表了未来的无限可能。

10. 总结

经过我这一番举例说明,你应该明白我为什么推荐你编程入门先学 Linux 了吧。编程语言迟早都会接触,基础的东西才是恒古不变的,如同九层之台起于垒土,掌握了 Linux 命令的使用,学习 ShellScript、C/C++、Java、Python、Go、Lua……众多编程语言都只是水到渠成的事情。当你使用一个 Linux 命令久了,你会思考如果使用其他编程语言要怎么实现这个功能,有了一个靶子,学习编程语言才会有的放矢。

希望这篇我写了半天的文章能给你一些启发,学习编程语言很容易,学习编程的思想才是一直探索的星辰大海。

转载规则:在转载文章上方标注原文链接、原作者,大家可以自由转载。也希望我写了半天的科普内容能被更多人看见。感谢能读到这里的读者,希望我的文章能给你一些启发。

》》》往期回顾:

哪种编程语言学习难度最低?

英语不好,想要学习编程,只背编程用到的几个单词可以吗?

Go语言如何入门,求入门书籍推荐?

编程能够带来食物和水吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机编程入门先学什么最好? 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • Xvfb 冻结初始化 GLX 扩展

    我正在尝试运行无头 Xvfb 服务器来捕获 Amazon EC2 micro 上的屏幕截图 但它在 GLX 上陷入了困境 我使用此脚本安装了 GLX Xvfb 和所有库 https gist github com joekiller 414
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • GAN网络的重新学习的一些内容记录

    20211130 本篇文章属于自己在学习过程中的一些内容记录 正是因为对这些内容不理解 才有了这篇文章 同时会记录一些自己的思考 对与错请仔细斟酌 0 引言 经过了一年多 上次专门研究GAN是去年的时候 学习了基础的原理 也记录了一些文章
  • 架构-负载均衡

    互联网常见的分布式加构分层 1 客户端层 浏览器 APP 小程序 等 2 反向代理层 Nginx 3 站点层 web server 4 服务层 service dubbo webservic 5 数据层 DB 这五个分层的负载均衡策略 1
  • typescript版本的扫雷游戏设计(思路+代码)

    思路 生成图片矩阵 点击格子 如果 第一次 且 新游戏 生成除该格子外的雷图 统计数字 如果 该格子是雷 爆炸 否则 如果 格子数字是0 深度搜索0区域 加入展示区域 如果格子已经打开 忽略 如果格子标识旁边有雷 把该格子加入展示区域 打开
  • 动画程序时长缩放是什么意思_修手机的朋友说:安卓机这样设置,感受跟苹果一样的过渡动画...

    众所周知 IOS系统的过渡动画是出了名的丝滑 因为就在安卓系统挤破脑袋追求流畅时 苹果工程师竟然反其道而行的降低了手机响应频率 这就导致iPhone的使用者在不同页面和软件切换时能明显感知到一个从慢到快的过程 这项功能在原厂的安卓系统上是没
  • 值得一看的技术类书籍

    1 linux 书 Debug Hacks中文版 深入调试的技术和工具
  • C语言开发MicroPython模块(向module添加type)

    MicroPython向module添加type的方法 以及向type添加function的方法都是按照定义好的固定框架进行添加 module添加type的代码格式如下 include stdint h include stdio h in
  • M2芯片安装Anaconda和pytorch

    记录安装过程中遇到的问题 希望帮助到同样用mac的朋友 1 安装好Anaconda后 在启动台无法打开navigator 解决办法 终端输入 which anaconda navigator 返回navigator所在位置 command
  • SpringCloud Stream @EnableBinding注解过时

    EnableBinding源码中明确声明 该注解在从3 1版本开始被弃用 推荐我们使用函数编程的方式 我将给出一个生产者和消费者的使用案例 生产者案例 yml配置 server port 8801 spring application na
  • 最最最详细的springboot项目中集成微信扫码登入功能.步骤代码超级详细(OAuth2)

    说到登录注册 就会想到先要注册一个用户名 在进行登入 但是现在大多数的网站都集成了微信登入 不需要注册 给你一个二维码 微信一扫直接登录 这确实是十分便捷的 所以我们会尽量在项目中实现这一功能 减少用户操作 提高用户产品体验 由于微信是腾讯
  • MIPS架构下linux软浮点研究

    转自 http blog sina com cn s blog 67b113a10100zxx3 html 在嵌入式领域 为了节省成本和减少功耗 很多芯片都是没有浮点运算模块的 一般该模块叫做FPU float process unit 这
  • 爬虫写得好,牢饭吃到饱?

    先说一条新闻 一家专注大数据的数据服务提供商公司巧达科技 因为大量使用爬虫访问其他公司接口获取数据 整个公司被抓 最后不光管理者 干活的程序员也被抓了 很多学python的同学都接触过爬虫 即便是没接触过应该也听过 看到这种新闻你会不会心里
  • MySQL管理常用工具介绍

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 e选项可以在Mysql客户端执行SQL语句 而不用连接到MySQL数据库再执行 对于一些批处理脚本 这种方式尤其方便 示例 2 mysqladmin mysql
  • 第一启富金:两大利空压顶 黄金受压收跌

    第一启富金官网显示 全球最大黄金上市交易基金 ETF 截至01月19日持仓量为976 21吨 较上日持平 本月止净增持0 55吨 香港第一金 投资者的注意力仍集中在美联储1月25日至26日的会议上 此前美联储官员暗示 他们将在3月开始加息以
  • Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)

    目录 一 概述 1 介绍 2 讲述 二 上传 三 下载 四 jrebel的使用 五 多文件上传 给我们带来什么收获 一 概述 1 介绍 Spring MVC的文件上传下载是指在Spring MVC框架中实现文件的上传和下载功能 文件上传是指
  • 【Python基础】深拷贝,浅拷贝和赋值

    浅拷贝 在含有多层对象的字典 列表 集合中 浅拷贝只拷贝父对象 不会拷贝父对象内部的可变子对象 语法 copy copy 深拷贝 只要被拷贝对象含有可变子对象 程序就会重新申请一块内存空间把被拷贝对象的值复制一份存放到该内存空间中 语法 c
  • 前端面试话术集锦第 15 篇:高频考点(React常考进阶知识点)

    这是记录前端面试的话术集锦第十五篇博文 高频考点 React常考进阶知识点 我会不断更新该博文 1 HOC 是什么 相比 mixins 有什么优点 很多人看到高阶组件 HOC 这个概念就被吓到了 认为这东西很难 其实这东西概念真的很简单 我
  • JAVA基础day04

    package com atguigu exer 1 创建一个名为TestArray的类 在main 方法中声明array1和array2两个变量 他们是int 类型的数组 2 使用大括号 把array1初始化为8个素数 2 3 5 7 1
  • redis优化-5.redis主从复制问题处理

    1 读写分离 1 1复制数据延迟 Redis复制数据的延迟由于异步复制特性是无法避免的 延迟取决于网络带宽和命令阻塞情况 比如刚在主节点写人数据后立刻在从节点上读取可能获取不到 需要业务场景允许短时间内的数据延迟 对于无法容忍大量延迟场景
  • 动态规划系列之「最长递增子序列的个数」

    673 最长递增子序列的个数 给定一个未排序的整数数组 找到最长递增子序列的个数 示例 1 输入 1 3 5 4 7 输出 2 解释 有两个最长递增子序列 分别是 1 3 4 7 和 1 3 5 7 示例 2 输入 2 2 2 2 2 输出
  • 计算机编程入门先学什么最好?

    看完其他知友的回答 我认为他们的观点过于局限 并没有真正切中问题的要害 我们不妨换个角度 站在更高一层来看这个问题 计算机编程入门先学什么最好 计算机入门最应该学的是 Linux 而非任何的编程语言 这篇文章4600字 有点长 如果你能耐心