聊到编程入门,大家最纠结的一个问题就是:到底该学哪门语言?这个问题在五湖四海、世界各地,几乎成了每个月都会出现的“月经贴”。给出的回答呢,有的直接告诉你学Python,有的会打比方说编程语言就像画家手里的笔,有毛笔、钢笔……还有的会甩出一张技术栈图表,告诉你如果要做XXX,那就学XXX,如果做YYY,那就学YYY。感觉这些建议都不错,结果明确,但缘由通常不会展开太多。纯新手听完,似懂非懂,将信将疑。

自上而下、由整体到具体地理解一个事物,效率往往比从具体到整体要高,更容易明白自己所处的位置,也更容易入门。可惜,对程序员来说,能把开发领域的各种知识归纳总结、融会贯通,可能是十几、二十年后的事了。所以,在分析编程语言优劣,或者选一个语言写具体的“Hello World”之前,最好对“编程语言”有一个更整体、更全面的了解。

学习编程语言是在学什么

百度百科说,编程语言是一种计算机和人都能识别的语言,能让程序员准确地定义数据和行为。维基百科则更准确:编程语言是一种规则,能把文字或图形元素转化为机器码,用于在计算机上实现各种算法。百度那个定义,说了等于没说,而维基百科讲得就很实在。编程,其实就是把你写的一段文字(代码),按照特定的规则转换成机器码(机器能运行的指令),用于在计算机上实现算法,比如显示两个输入数字中最大的那个。你要学的,就是这种规则。

举个例子,当需要在屏幕上显示“Hello World”时,不同语言的规则会让你写出这样的文字:

c语言

  printf("\nhello world!");

php语言

  echo "hello world!"; 

ja va语言

  System.out.println("Hello World!");

看上去有些差别,但又有些相似。实际上,目前主流的高级语言,如Ja va、C#、Ja vaScript、Python,它们的基础语法规则非常近似。无论先学哪个入门,后面的切换成本基本是几小时就能搞定。当你学会一门语言,除了学会具体关键字、语法之外,更主要的是你会沉淀下来一种对编程语言模式的理解。当你理解了变量、函数、控制结构(顺序、分支、循环),迁移到其他语言时,会发现这些概念依然存在且完全适用。

伪代码是一种脱离具体语言、体现编程思维的描述方式。相同层次的语言,编程思维是共通的。比如显示两个输入数字中最大的那个:

变量A等于输入的第一个数字
变量B等于收入的第二个数字
如果 变量A大于 变量B 屏幕显示变量A
否则 屏幕显示变量B

上面的算法思想,在各种语言中都能实现,只是变量定义的方式、判断分支的书写方式略有差别。所以,对入门来说,学习一门编程语言,通常狭义地指语言本身(基本不涉及第三方类库框架等)。你学到语法细节的切换成本很低,各个语言差不太多,而真正沉淀下来的,是你在编写过程中逐渐熟悉领会的编程思路——即组合使用变量、函数、控制结构(如果/那么/循环)等要素,解决具体算法问题的能力。

IDE与编译原理

在纠结良久终于选定了学哪一门语言之后,可能第一个接触到的就是IDE。比如学Python可能会用PyCharm,学Basic的可能用Visual Basic。IDE的含义是“集成开发环境”,名字很准确,但对小白来说其实很困惑,搞不清楚IDE与编程语言之间的关系,也搞不清楚写完代码后,点那个绿色小三角(运行)到底发生了什么。IDE可以方便开发,但也会影响新手对编程语言的理解,很难理解“集成开发环境”到底集成了什么。

——上面是Python的Hello World,IDE为PyCharm

IDE大概集成了这样几种东西:

1. 文本编辑器:用于编写文本,像上图写“print Hello World”的地方。编程其实就是在编写一段文字,保存成一个文件。简单文本编辑器如Windows中的记事本,也能用来编程,但IDE中的文本编辑器会提供很多额外功能,比如文本着色、智能提示(敲pr会自动提示print),这些快捷功能是语言相关的。当然也提供保存、查找、替换等常见功能。

2. 编译器、连接器:对于非脚本语言(最终生成独立的可执行程序,如C),编写好的程序文件无法直接被运行。例如Windows中,典型的可执行文件扩展名为EXE,这是一种特定格式(PE文件格式)。编译器与连接器的作用,就是将程序文件最终转化为EXE文件。编译器针对不同CPU将程序文件编译为对应的CPU指令,连接器则平台相关,将编译后的中间文件组装成约定格式,如Windows EXE。

3. 解释器:对于脚本语言,解释器能直接执行由文本编辑器编写完成的程序文件。比如点击上图的运行,实际是运行了“python ./a.py”,其中的“python”可以理解为解释器。

4. 调试器:提供了一个可视化调试器,可以直接点击按钮进行调试操作,而不是在黑洞洞的命令行上敲命令。

——gdb调试界面

5. 其他工具插件:通常具有集成其他插件的能力,比如集成版本管理,可以直接把代码上传云端进行版本控制,或者统计分析写了多少代码、是否编写规范等。

通过以上介绍可以看出,编程语言是一种规则,准确地说是一种规范。比如存在一条规则:当你写了一行“printf(hello)”,之后就在屏幕上显示hello。规则是稳定不变的,而过程中用到的工具、IDE的各个组成部分,都是可以替换的。只要编译器符合语言的标准规范即可,因此会有多种编译器存在,其性能特点可能会有一些差异。

广义的编程语言

想入行的同学经常会说“我想学Ja va该怎么学”“我想学Python该怎么学”,这其实通常不太准确。狭义来说,你只需要花几天(老手可能是几小时甚至几十分钟),去看一下这个语言的语法规则——如何定义变量、如何写判断和循环、如何调用方法,然后做一些算法练习,比如对10个数字排排序、写个猜数字的游戏,基本就算学会了。但这可能跟你的期望不一致。你说“学Ja va”,可能是觉得学会了Ja va就能写出像《魔兽世界》那样的游戏,或像QQ那样的聊天工具,或像淘宝那样的网站。而学会了语言之后,你仍然会觉得无从下手,只会在命令行控制台中做点简单的输入输出。那么,这中间的gap究竟在哪里呢?原因在于——技术栈。

——图片来源于知乎回答“互联网”技术栈

要规范专业地做一个能支持一定访问量的互联网站点(如淘宝),会涉及上面大部分的技术内容,这远超“编程语言”定义的范围。其中很大一部分是语言无关的,例如运维、工具、中间件中的分支内容。后端中的语言分支之下是语言相关的,而前端中如果不考虑移动端Android、iOS,对Web来说其实只有HTML、CSS、Ja vaScript三种语言。AngularJS以及Vue,属于Ja vaScript语言中的不同框架,但差异较大。

综合以上,涉及的语言类型主要分为以下几类:

命令式:关注步骤细节。比如查询一堆数字中最大的一个,需要写循环、判断、定义变量进行比较,最终得到结果。计算机的算法过程完全由你定义。通常学习的Ja va、Ja vaScript、PHP、C都可以理解为这一类语言。

结构化查询——声明式:多用于结构化数据库查询(“数据库”是为了解决程序存储、查询数据问题,想象一个图书管理程序),比如SQL语言。取得最大数字如下,你并不需要关心它的具体算法:

SELECT max(num) FROM table

标记语言:HTML、XML、CSS等属于标记语言,用于定义布局,没有逻辑,严格来说不属于编程语言。比如HTML标记语言规定“

”表示一个表格,其中的“”表示表格的一行,编写人按照HTML的标准编写,浏览器按照HTML的标准处理渲染,最终在屏幕上显示一个表格。

回到“写一个淘宝”的问题上。淘宝需要有Web页面,所以你要学习HTML、CSS、JS;需要有数据库存储商品,所以需要学习数据库工具如MySQL,并能够编程使用它,能够增删改查数据;需要有后台服务器,用于给页面提供动态内容,动态生成HTML,所以需要学习Web服务器如何编写。可选择的语言有很多,如果选择了一种如Ja va,也不需要从头造轮子,那就要接着学习Ja va的Web框架,如Spring。如果你选择用PHP语言写Web服务器,那就无法使用Ja va的Spring框架,对应的PHP也会有自己的Web框架。所以,特定语言第三方框架的学习成本,才是切换语言的最主要成本。

总结

如果你是想入门学一门语言,那具体学哪种真的不算是个重大抉择,主要是为了建立编程思想。如果你是想进行特定领域的开发,那你一定要首先搞清楚技术栈,在该领域中使用的主流语言、工具,然后针对性地学习。如果你志向于开发游戏客户端,那学习互联网的技术栈,就是南辕北辙了。先到这里,希望对初入门的同学能有所帮助。

本文转载于:https://blog.csdn.net/qq_25148525/article/details/124451541 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

联系方式: bd@zhengruan.com
网站备案号:苏ICP备2026018738号-1