势在必行的编程
在计算机科学中,命令式编程是使用更改程序状态的语句的软件编程范式。与自然语言中的命令式情绪相同的方式几乎相同,一个命令程序由计算机执行的命令组成。当务之急的编程重点是描述程序如何逐步运行,而不是对其预期结果的高级描述。
该术语通常与声明性编程相比使用,该术语侧重于该程序应完成的工作,而无需指定程序应如何实现结果的所有细节。
程序编程
程序编程是一种命令式编程,其中通过一个或多个程序(也称为子例程或功能)构建程序。这些术语通常被用作同义词,但是程序的使用对必应程序的出现以及它们的构建方式产生了巨大影响。重大的程序编程将状态变化本地化为程序或仅限于从程序中返回的明确论点和返回,这是结构化编程的一种形式。自1960年代以来,总体上已经促进了结构化的编程和模块化编程,以提高提高命令计划的可维护性和整体质量的技术。面向对象的编程背后的概念试图扩展这种方法。
程序编程可以视为迈向声明性编程的一步。程序员通常可以通过查看程序的名称,参数和返回类型(以及相关评论),即应该做什么,而不必查看其如何实现结果的细节,就可以告诉您。同时,仍然需要一个完整的程序,因为它可以在很大程度上修复要执行的语句及其执行顺序。
理由和命令编程的基础
用于为几乎所有计算机构建程序的编程范式通常遵循命令式模型。数字计算机硬件旨在执行机器代码,该代码是计算机本地的,通常以命令式的样式编写,尽管使用其他范式的低级编译器和解释器对于某些架构(例如LISP机器)存在。
从这个低级的角度来看,程序状态由内存内容定义,语句是计算机本机语言中的指示。高级命令式语言使用变量和更复杂的语句,但仍遵循相同的范式。食谱和过程清单虽然不是计算机程序,但也是熟悉的概念,其样式与命令性编程相似。每个步骤都是指示,物理世界占有国家。由于命令编程的基本思想在概念上既熟悉又直接体现在硬件中,因此大多数计算机语言都是命令性的。
在命令式范式中,分配语句对位于内存中的信息进行操作,并将结果存储在内存中以备后用。此外,高级命令式语言允许评估复杂表达式,这可能包括算术操作和功能评估的组合以及将结果值分配给内存的。循环语句(如循环时,循环时进行循环,并且用于循环)允许多次执行一系列语句。循环可以执行其包含预定义的次数的语句,或者可以重复执行它们,直到满足某些条件为止。有条件的分支语句允许仅在满足某些条件时执行一系列语句。否则,将跳过语句,并且执行顺序从下面的语句中继续。无条件的分支语句允许将执行顺序转移到程序的另一部分。这些包括跳跃(以多种语言为单位称为goto ),交换机和子程序,子例程或过程调用(通常在调用后返回到下一个语句)。
在开发高级编程语言的早期,该块的引入实现了程序的构建,其中一组声明和声明可以被视为一份声明。除了引入子例程之外,这使得复杂的结构能够通过层次分解为简单的程序结构表达。
许多命令性编程语言(例如Fortran , Basic和C )是汇编语言的抽象。
命令和面向对象的语言的历史
最早的命令式语言是原始计算机的机器语言。在这些语言中,说明非常简单,这使硬件实现更加容易,但阻碍了复杂程序的创建。由John Backus从1954年开始在国际商务机器(IBM)开发的Fortran是第一个消除机器代码在创建复杂程序中提出的障碍的主要编程语言。 Fortran是一种编译的语言,允许命名变量,复杂表达式,子程序和许多其他功能,现在在命令式语言中常见。接下来的二十年来,许多其他主要的高级命令式编程语言的发展。在1950年代后期和1960年代后期,为了使数学算法更容易表达,甚至是某些计算机的操作系统目标语言。 Mumps (1966)将当务之急的范式带到了逻辑上的极端,根本没有任何陈述,纯粹依靠命令,甚至在使if及其命令彼此独立的程度上,仅由固有变量连接,只有一个名为$的内在变量连接。测试。 Cobol (1960)和Basic (1964)都试图使编程语法看起来更像英语。 1970年代,帕斯卡(Pascal)由尼克劳斯·沃思(Niklaus Wirth)开发, C是由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室(Bell Laboratories)工作时创建的。 Wirth继续设计Modula-2和Oberon 。为了满足美国国防部的需求,让·伊奇比亚(Jean Ichbiah)和霍尼韦尔( Honeywell)的一个团队于1978年开始设计ADA ,此前为期4年的项目来定义该语言的要求。该规范最初于1983年发布,并于1995年,2005年和2012年进行了修订。
1980年代,人们对面向对象的编程的兴趣迅速增长。这些语言在样式上是必要的,但添加了支持对象的功能。 20世纪的最后二十年来,有许多此类语言的发展。 Smalltalk -80最初由Alan Kay于1969年构想,由Xerox Palo Alto研究中心( PARC )于1980年发行。从另一种面向对象的语言的概念中汲取灵感- Simula (这被认为是世界上第一种面向对象的编程语言,在1960年代开发) - Bjarne Stroustrup设计了C ++ ,这是一种基于C的面向对象的语言。 C ++的设计始于1979年,首次实施于1983年完成。在1980年代和1990年代后期,借着面向对象概念的著名语言是Perl ,由Larry Wall于1987年发布。 Python ,由Guido Van Rossum于1990年发行; Visual Basic和Visual C ++ (包括Microsoft Foundation Class Library (MFC)2.0),由Microsoft分别于1991年和1993年发布; PHP ,由Rasmus Lerdorf于1994年发行; Java , James Gosling ( Sun Microsystems )于1995年, JavaScript , Brendan Eich ( Netscape )和Ruby ,由Yukihiro“ Matz” Matsumoto撰写,均于1995年发行。Microsoft's.Net Framework (2002)是其核心,其核心是其核心,其核心是其核心。它的主要目标语言是在其上运行的VB.NET和C# ;但是,Microsoft的F# (一种功能性语言)也在其上运行。
例子
Fortran
Fortran (1958)被公布为“ IBM数学公式翻译系统”。它是为科学计算而设计的,而无需弦乐处理设施。除了声明,表达和陈述外,它还支持:
它成功了:
- 编程和调试成本低于计算机运行成本
- 它得到了IBM的支持
- 当时的申请是科学的。
但是,非IBM供应商还编写了Fortran编译器,但语法可能会使IBM的编译器失败。美国国家标准研究所(ANSI)于1966年开发了第一个Fortran标准。1978年,Fortran 77成为1991年的标准。Fortran90支持:
COBOL
Cobol (1959)代表“以商业为导向的语言”。操纵符号。很快就意识到符号不需要是数字,因此引入了字符串。美国国防部影响了Cobol的发展, Grace Hopper是主要贡献者。这些陈述是英语和冗长的。目标是设计一种语言,以便管理人员可以阅读程序。但是,缺乏结构化陈述阻碍了这一目标。
COBOL的发展受到严格控制,因此方言并没有出现需要ANSI标准。结果,直到1974年才更改15年。1990年代版本确实做出了相应的更改,例如面向对象的编程。
阿尔戈尔
Algol (1960)代表“算法语言”。它对编程语言设计产生了深远的影响。它来自欧美编程专家委员会,它使用了标准的数学符号,并具有可读的结构化设计。 Algol首先使用Backus -Naur形式来定义其语法。这导致了语法指导的编译器。它添加了以下功能:
Algol的直接后代包括一个分支机构的Pascal , Modula-2 , Ada , Delphi和Oberon 。在另一个分支上,有C , C ++和Java 。
基本的
Basic (1964)代表“初学者的通用符号指令代码”。它是在达特茅斯学院(Dartmouth College)开发的,供所有学生学习。如果学生没有继续使用更强大的语言,那么学生仍然会记住基本的语言。在1970年代后期制造的微型计算机中安装了基本口译员。随着微型计算机行业的发展,该语言也是如此。
- “新”命令创建了一个空的板岩
- 立即评估的陈述
- 语句可以通过使用行号进行编程
- “列表”命令显示了程序
- “运行”命令执行了程序
但是,对于大型程序而言,基本语法太简单了。最近的方言增加了结构和面向对象的扩展。 Microsoft的Visual Basic仍被广泛使用,并产生图形用户界面。
C
C编程语言(1973)之所以出名,是因为BCPL被B替换为BCPL, AT&T Bell Labs称为下一个版本。其目的是编写UNIX操作系统。 C是一种相对较小的语言 - 很容易编写编译器。它的增长反映了1980年代的硬件增长。它的增长也是因为它具有装配语言的设施,但使用了高级语法。它添加了高级功能,例如:
C允许程序员控制存储数据的哪个区域。全局变量和静态变量需要存储最少的时钟周期。该堆栈自动用于标准变量声明。堆内存返回到指针变量malloc()
功能。
- 全局和静态数据区域位于程序区域上方。 (从技术上讲,程序区域称为文本区域。这是存储机器指令的地方。)
- 全球和静态区域存储在(外部)上声明的全局变量
main()
功能。全球变量可见main()
以及源代码中的所有其他功能。
- 全球和静态区域存储在(外部)上声明的全局变量
- 使用的本地变量使用
static
前缀也存储在全球和静态数据区域中。与全局变量不同,静态变量仅在函数或块中可见。静态变量始终保留其价值。一个示例用法将是功能int increment_counter(){ static int counter = 0; counter++; return counter;}
- 使用的本地变量使用
- 堆栈区域是位于顶部内存地址附近的连续内存块。放置在堆栈中的变量是从上到下填充的。堆栈指针是一种特殊的用途寄存器,可以跟踪填充的最后一个内存地址。通过汇编语言推动说明将变量放入堆栈中。因此,这些变量的地址是在运行时设置的。堆栈变量丢失其范围的方法是通过POP指令。
- 本地变量声明没有
static
前缀(包括正式参数变量)称为自动变量,并存储在堆栈中。它们在函数或块内部可见,并在退出函数或块时失去范围。
- 本地变量声明没有
- C提供
malloc()
库功能以分配堆内存。用数据填充堆是一个附加的复制功能。存储在堆中的变量在经济上使用指针传递给功能。没有指针,整个数据块必须通过堆栈传递到该功能。
- C提供
C ++
在1970年代,软件工程师需要语言支持将大型项目分解为模块。一个明显的功能是将大型项目物理分解为单独的文件。一个不太明显的功能是将大型项目从逻辑上分解为抽象数据类型。当时,语言支持混凝土(标量)数据类型,例如整数编号,浮点数和字符字符串。具体数据类型作为其名称的一部分具有其表示形式。抽像数据类型是混凝土数据类型的结构- 分配了新名称。例如,可以调用整数列表integer_list
.
在面向对象的术语中,抽像数据类型称为类。但是,班级只是一个定义。没有内存分配。当记忆分配给类时,它称为对象。
通过结合对课程的需求和安全功能编程的需求,开发了面向对象的命令式语言。以面向对象的语言的功能分配给类。然后将分配的函数称为方法,成员函数或操作。面向对象的编程是在对象上执行操作。
面向对象的语言支持语法来建模子集/超集关系。在集合理论中,子集的一个元素继承了超集中包含的所有属性。例如,学生是一个人。因此,一组学生是一组人的子集。结果,学生继承了所有人共有的所有属性。此外,学生具有其他人没有的独特属性。面向对象的语言使用继承模型子集/超集关系。到1990年代后期,以对象为导向的编程成为主要的语言范式。
C ++ (1985)最初称为“ C with Classect”。它旨在通过添加语言模拟的面向对象的设施来扩展C的功能。
面向对象的模块由两个文件组成。定义文件称为标题文件。这是一个简单的学校应用程序中的C ++标头文件:
// grade.h
// -------
// Used to allow multiple source files to include
// this header file without duplication errors.
// See: https://en.wikipedia.org/wiki/Include_guard
// ----------------------------------------------
#ifndef GRADE_H
#define GRADE_H
class GRADE {
public:
// This is the constructor operation.
// ----------------------------------
GRADE ( const char letter );
// This is a class variable.
// -------------------------
char letter;
// This is a member operation.
// ---------------------------
int grade_numeric( const char letter );
// This is a class variable.
// -------------------------
int numeric;
};
#endif
构造函数操作是具有与班级名称相同名称的函数。当调用操作执行时,它将执行new
陈述。
模块的另一个文件是源文件。这是一个简单的学校应用程序中的C ++源文件:
// grade.cpp
// ---------
#include "grade.h"
GRADE::GRADE( const char letter )
{
// Reference the object using the keyword 'this'.
// ----------------------------------------------
this->letter = letter;
// This is Temporal Cohesion
// -------------------------
this->numeric = grade_numeric( letter );
}
int GRADE::grade_numeric( const char letter )
{
if ( ( letter == 'A' || letter == 'a' ) )
return 4;
else
if ( ( letter == 'B' || letter == 'b' ) )
return 3;
else
if ( ( letter == 'C' || letter == 'c' ) )
return 2;
else
if ( ( letter == 'D' || letter == 'd' ) )
return 1;
else
if ( ( letter == 'F' || letter == 'f' ) )
return 0;
else
return -1;
}
这是一个简单的学校应用程序中的人类课程的C ++标头文件:
// person.h
// --------
#ifndef PERSON_H
#define PERSON_H
class PERSON {
public:
PERSON ( const char *name );
const char *name;
};
#endif
这是一个简单的学校应用程序中的人类班级的C ++源文件:
// person.cpp
// ----------
#include "person.h"
PERSON::PERSON ( const char *name )
{
this->name = name;
}
这是一个简单的学校应用程序中学生课的C ++标头文件:
// student.h
// ---------
#ifndef STUDENT_H
#define STUDENT_H
#include "person.h"
#include "grade.h"
// A STUDENT is a subset of PERSON.
// --------------------------------
class STUDENT : public PERSON{
public:
STUDENT ( const char *name );
~STUDENT();
GRADE *grade;
};
#endif
这是一个简单的学校应用程序中学生课的C ++源文件:
// student.cpp
// -----------
#include "student.h"
#include "person.h"
STUDENT::STUDENT ( const char *name ):
// Execute the constructor of the PERSON superclass.
// -------------------------------------------------
PERSON( name )
{
// Nothing else to do.
// -------------------
}
STUDENT::~STUDENT()
{
// deallocate grade's memory
// to avoid memory leaks.
// -------------------------------------------------
delete this->grade;
}
这是一个用于演示的驱动程序程序:
// student_dvr.cpp
// ---------------
#include <iostream>
#include "student.h"
int main( void )
{
STUDENT *student = new STUDENT( "The Student" );
student->grade = new GRADE( 'a' );
std::cout
// Notice student inherits PERSON's name
<< student->name
<< ": Numeric grade = "
<< student->grade->numeric
<< "\n";
// deallocate student's memory
// to avoid memory leaks.
// -------------------------------------------------
delete student;
return 0;
}
这是编译所有内容的制造商:
# makefile
# --------
all: student_dvr
clean:
rm student_dvr *.o
student_dvr: student_dvr.cpp grade.o student.o person.o
c++ student_dvr.cpp grade.o student.o person.o -o student_dvr
grade.o: grade.cpp grade.h
c++ -c grade.cpp
student.o: student.cpp student.h
c++ -c student.cpp
person.o: person.cpp person.h
c++ -c person.cpp