“想入门编程,应该学那种语言?” 这类问题在五湖四海,世界各地,应当都是比较月经的。 给出的回答呢, 有的会直接告诉你去学Python,有的呢会给一些比喻,说编程语言就像画家手里的笔,有毛笔,钢笔……,有的会给出一个技术栈的图表,告诉你如果你要做XXX,那就学XXX,如果做XXX就学XXXX。 感觉呢这些建议,也都不错,但是通常都比较简略,结果明确,但缘由一般不会展开太多解释。纯新手可能似懂非懂,将信将疑。
自上而下,由整体到具体的理解一个事物,效率往往比从具体到整体要高,更容易明白自己所处的位置, 更容易入门。 可惜,对于程序员在开发领域归纳总结,融汇贯通来说, 可能是十几,二十年后的事情了。所以在分析编程语言优劣,或者选一个语言写具体的Hello World之前, 我们最好对“编程语言”有一个更整体全面的了解。
学习编程语言是在学什么
百度百科——编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
维基百科——编程语言是一种规则, 这种规则,可以把文字, 或者图形元素(可视化编程语言)转化为机器码。编程语言是一种计算机语言,用于在计算机上实现各种算法。
百度的定义显然说了啥但好像又啥都没说。-_-|| 。维基百科的则准确了很多。编程其实就是把你写的一段文字(代码)按照特定的规则, 转换成机器码(机器能够运行的指令),用于在计算机上实现算法(如显示2个输入数字中最大的)。你要学习的其实就是这种规则,比如当我需要在屏幕上显示 Hellow World时。按照不同语言的规则,我需要这样写出这样的文字。
c语言
printf("\nhello world!");
php语言
echo "hello world!";
java语言
System.out.println("Hello World!");
看上去有些差别,但又有些相似。实际上目前主流的高级语言如Java ,C#,javascript,Python 他们的基础语法规则是非常近似的。 无论先学哪个入门,后面的切换成本,基本是几小时搞定。当你学会一门语言, 除了学会了具体关键字,语法之外,更主要的是你会沉淀下来一种对编程语言模式的理解。当你理解了一种语言中的 变量, 函数,控制结构(顺序,分支,循环),迁移其他语言时,你会发现在其他语言中,这些概念也是存在且完全适用的。
伪代码是一种脱离具体语言的,体现编程思维的描述方式, 相同层次的语言,编程思维是共通的。如显示2个输入数字中最大的问题的编程思路。
变量A等于输入的第一个数字
变量B等于收入的第二个数字
如果 变量A大于 变量B
屏幕显示变量A
否则
屏幕显示变量B
上面的算法思想, 在各种语言中都是可以实现的。仅仅变量定义的方式,判断分支的书写方式略有差别。所以,对于入门来说,学习一门编程语言,通常都狭义的指编程语言本身(基本不涉及第三方类库框架等), 你所学到的语法细节切换成本是很低的,各个语言差不太多,而真正沉淀的是你在编写过程中逐渐熟悉领会的,编程思路。即组合使用,变量,函数,控制结构(如果/那么/循环)等要素,解决具体的算法问题的能力。
IDE与编译原理
在纠结良久终于选定了学哪一门语言之后,可能开始接触到的第一个东西是IDE, 例如学Python可能是用PyCharm,我之前学Basic用的是Visual Basic。 IDE的含义是“集成开发环境”, 名字虽然很准确, 但当时还是小白的我其实是非常困惑的, 压根搞不清楚IDE与编程语言之间的关系。也搞不清楚,写完代码后在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.其他工具插件 通常会具有集成其他插件的能力,如集成版本管理。可以直接把你的代码上传云端,进行版本控制。或者统计分析,写了多少代码,是否编写规范等。
通过以上对IDE 的介绍可以看出, 编程语言是一种规则,准确的说是一种规范。举例来说其中可能存在一条, 当你写了一行printf(hello),之后就在屏幕上显示hello。所以规则是稳定不变的。而你过程中要到的工具,IDE的各个组成部分都是可以替换的。只要编译器符合语言的标准规范即可,因此会有多种编译器存在,其性能特点可能会有一些差异。
广义的编程语言
想入行的同学经常会说,我想学Java 该怎么学, 我想学Python该怎么学。这其实通常来说不太准确。狭义来说,你只需要花几天,老手可能是几小时几十分钟,去看下这个语言的语法规则,如何定义变量,如何写判断,循环,如何调用方法。然后做一些算法问题练习,比如对10个数字排排序。写个猜数字的游戏,基本就算学会了。但这可能跟你的期望不一致,你说的学Java 可能是觉得你学会了Java 就可以写出一个像WOW那样的游戏 :-),或者像QQ那样的聊天工具,或者像淘宝那样的网站,而学会了语言之后你仍然会觉得无从下手,只会在命令行控制台中做点简单的输入输出。那么这中间的gap究竟在哪里呢?是因为——技术栈。
——图片来源于知乎回答“互联网”技术栈
就是说,要规范专业的做一个能支持一定访问量的互联网站点(如淘宝),会涉及上面大部分的技术内容。这远超“编程语言”定义的范围。其中很大一部分是语言无关的,例如运维,工具,中间件中的分支内容。其中后端中的语言分支之下是语言相关的,而前端中如果不考虑移动端Android Ios, 对于Web来说其实只有HTML,CSS,Javascript三种语言,angularjs以及VUE,属于属于Javasciprt 语言中的不同框架,但差异较大。
综合以上涉及的语言类型主要分为以下几类
命令式
关注步骤细节, 如查询一堆数字中最大的一个, 需要写循环、判断、 定义变量进行比较,最终得到结果。计算机的算法过程完全由你定义。通常学习的Java javascrfipt PHP C都可以理解为这一类语言。
结构化查询——声明式
多用于结构化数据库查询(“数据库”是为了解决程序存储,查询数据问题,想象一个图书管理程序),SQL语言。 取得最大数字如下, 你并不需要关心它的具体算法。
SELECT max(num) FROM table
标记语言
HTML,XML,CSS等属于标记语言,用于定义布局,没有逻辑。 严格来说不属于编程语言。如HTML标记语言规定 <Table>表示一个表格 ,其中的<tr>表示表格的一行, 编写人按照HTML的标准编写,浏览器按照HTML的标准处理渲染, 最终就会在屏幕上显示一个表格。
回到写一个淘宝上,淘宝需要有web页面,所以你要学习HTMLCSS,JS,需要有数据库存储商品, 所以需要学习数据库工具如MYSQL,并能够编程使用他,能够增删改查数据。需要有后台服务器,用于给页面提供动态内容, 动态的生成HTML,所以需要学习Web服务器如何编写,可以选择的语言有很多, 如果选择了一种如Java, 也不需要从头造轮子, 那就要接着学习Java 的Web框架,如Spring。如果你选择用PHP语言写Web服务器, 那就无法使用Java 的Spring框架了。 对应的PHP也会有自己的Web框架。所以特定语言第三方框架的学习成本才是切换语言的最主要成本。
总结
如果你是想入门学一门语言,那具体学哪种其实真的不算是个重大抉择,主要是为了建立编程思想。
如果你是想进行特定领域的开发, 那你一定要首先搞清楚技术栈, 在该领域中使用的主流语言,工具。然后针对性的学习。如果你志向于开发游戏客户端,那学习互联网的技术栈,就是南辕北辙了。
先到这里, 希望对初入门的同学能有所帮助。