一般编程语言的基础知识

前言

在对MUD开发答疑过程中,发现很多巫师是真的零基础,现学现用还只能依葫芦画瓢,虽然我们经常自我调侃为IT民工,但必须不是纯体力活,还得用脑子,学编程基础知识还是得掌握的。就算不用专门学习算法理论,但基础概念得懂,这里结合网友写的教程汇总整理,方便基础薄弱的同学。

基础知识

编程语言有非常多,LPMUD开发用的LPC语言只是其中微不足道的一种,这么多编程语言又有很多种分类方式。

按级别分类

编程语言按级别分三类:机器语言、汇编语言、高级语言。

计算机的通过高低电压转换来完成运算的,高电压代表,低电压代表0,所有运算都是0和1的不同组合,但这种组合只有机器能读,人类看不懂,属于机器语言

汇编语言是面向机器的程序设计语言,它是为了解决机器语言难以理解和记忆的缺点,用易于理解和记忆的名称和符号表示机器指令中的操作码,这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言;于是汇编语言亦称为符号语言。

高级语言为用户提供了一种既接近与自然语言,又可以使用数学表达式,还相对独立于机器的工作方式。与汇编语言一样,机器也不能直接执行用高级语言编写的程序。除了汇编语言,我们学习的所有语言都属于高级语言。

按编译方式分类

计算机只认识机器语言,不管是汇编语言还是其它高级语言写的代码计算机都不能直接运行,要让计算机运行需要做处理,目前有两种处理方式:编译型和解释型。

 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言称为解释型语言,使用的转换工具称为解释器

LPC语言就是解释型语言,驱动fluffos就是解释器。

按变量类型分类

众多编程语言中有一些语言变量使用前必须先声明类型,如C语言,这属于静态类型语言,相反,在使用时不用提前声明变量类型的语言如PHP语言,属于动态类型语言

除了根据变量声明区分,还有根据变量类型转换区分为强类型定义语言弱类型定义语言,如果一个变量可以赋值不同数据类型的值,就是弱类型定义语言,如php,否则就是强类型定义语言,如C语言,定义一个整型变量i,如果不做强制类型转换,不能将i当做字符转处理。

LPC语言是静态类型语言,强类型定义语言。

根据编程思想分类

主流的编程语言还分为二类:面向过程编程和面向对象编程。面向对象编程有类和对象的支持,如JAVA/C++/PHP,而面向过程编程则没有,如C语言。

LPC语言是面向对象编程语言


语法知识

一般编程语言的基本语法要素,大概有这么几个:关键字、类型、变量、运算符、函数

面向对象语言的类,属于数据类型(可以是语言自带的,也可以用户自定义)。

面向对象语言的对象,属于变量。它是类类型的对象变量,或者对象指针(引用)。

C语言这种非OOP语言,就只能定义结构体类型。结构体变量和结构体指针,扮演了C++的类对象和类(对象)指针的角色。

关键字

关键字在编程语言里属于最简单的,它是具有确定语义的字符串。

它由编程语言本身保留,不能用作变量、类型、函数的名字。

类型和变量

类型和变量在编程语言中属于互相嵌套的两个要素。

定义一个变量,需要知道它的类型。复杂的类型,例如类或结构体,其中又含有成员变量。

类型定义和变量定义互相嵌套,是构成数据结构的基础,也是语法分析的难点之一。

变量,有变量名、变量值、变量的地址。

如果是指针变量,除了名、值、地址之外,还有解引用的值(*p,或者叫指针的内容)。

类型分变量类型、数据类型和函数返回值的类型,一般函数返回值类型要比数据类型多一种void(无返回值)。

运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。运算符是组成表达式的基础,程序里面复杂的逻辑运算,是通过组合不同的运算符实现的。

运算符,有优先级和结合性。在面向对象语言里,运算符还可以重载(overload)。

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

优先级

优先级可以减少小括号的使用,让代码更容易读。

优先级的级数还是比较多的,一些不常用的运算符,记不清的情况下还是加小括号比较好。

括号、类成员、函数调用,都是优先级最高的。

然后是单目运算符,逻辑取反、位取反、指针解引用、取地址、++、--,等等。

接着是乘除模,再是加减。

比较运算的优先级比逻辑运算高,所以代码里常见的语句是这样的:

if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0);

移位运算,实际上相当于是乘法和除法,但是C语言把它的优先级放到加减运算以下了。

结合性

大多数运算符都是左结合。除了赋值运算符系列,单目运算符等少部分是右结合的。

它们的区别就是,操作数的列表(一般也就1个或者2个数)从左到右算,还是从右到左算。

函数

函数是编程语言的核心,是实现算法的基础。类型,是实现数据结构的基础。

编程就是数据结构加算法,也就是类型加函数。

定义在类里的叫成员函数。不在类里的,加static关键字的作用域是文件,不加static的作用域是全局。

C语言没有类,函数的作用域只有文件和全局。

从语法的角度来看,函数就是函数声明加主体语句块。

int add(int a, int b)
{
    return a + b;
}

第一行就是函数声明,如果只声明不定义就以分号结尾。

大括号里的就是主体语句块,即函数体。它是个语句块,与if语句、for语句的主体一样。

函数与for语句的区别就是,for语句是以关键字for开始,函数是返回值+函数名+左小括号开始(然后是参数列表和右小括号)。

在python语言里,函数以关键字def开始,这让函数的解析大大的简化了。

python属于脚本语言,弱类型,返回值类型空出来的那个位置正好可以填个关键字。

语句

语句是命令式编程语言的一个语法单元,表示程序要执行的操作,多条语句组成了函数的主体部分。

语句中可以包含函数调用,包括对其所在函数的递归调用。

常见的语句类型大概有这么几种:

  • 类型定义,一般以class关键字(C是struct关键字)开始,以分号结束。

  • 变量定义,以基本类型的关键字或者自定义的类名开始,中间可以用逗号分隔,也可以跟赋值运算符加初始化表达式,最后以分号结束。

例如:

    int a, b = 1, c = 2 + 3;

类型定义和变量定义,实际上不会产生代码,它们都是给编译器做类型检查,变量作用域检查用的。

但是变量的初始化表达式会产生代码,类的成员函数会产生代码。

  • 函数定义,如果不带函数体就是函数声明。

函数声明也不需要产生代码,也是给各种检查用的。

函数定义会产生代码,代码的主体就是函数体。

  • if、for、while等各种语句,它们是代码的流程控制的关键语句。

这些语句,把汇编的跳转指令封装了,让流程控制更适合人类的思维,从更高级的层面描述流程控制的概念。

  • 最后就是表达式,它是各种其他语句的基础。

表达式,是由运算符、变量、函数调用组成的特殊语句,表达式是运算符及其操作数的序列,它指定一个运算。在C语言中表达式 + ; = 语句

如果完成了表达式的分析,实际上if else、for、while的分析就很简单了。

例如:

for (i = 0; i < a + b * c; i++) {}

它的关键就是3个表达式:初始化、条件、更新,互相之间以分号隔开。

它的主体就是大括号里的语句序列,语句有可能是表达式序列,也可能含有嵌套的for语句、if语句,只要递归分析就行。

京ICP备13031296号-4