c语言的发展史?

Python016

c语言的发展史?,第1张

C语言诞生于美国贝尔实验室,由D.M.Ritchie以B语言为基础发展而来,在它的主体设计完成后,Thompson和Ritchie用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI c”,截至2020年,最新的C语言标准为2017年发布的 “C17”。

C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。

1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell Laboratory)的研究员Ken Thompson闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP-7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为PDP-7开发操作系统。后来,这个操作系统被命名为——UNIX。

1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。

1971年,同样酷爱Space Travel的Dennis M.Ritchie为了能早点儿玩上游戏,加入了Thompson的开发项目,合作开发UNIX。他的主要工作是改造B语言,使其更成熟。

1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。

1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘记了那个"Space Travel",一门心思地投入到了UNIX和C语言的开发中。随着UNIX的发展,C语言自身也在不断地完善。直到2020年,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。

在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在Alpha、SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。

1977年,Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。

C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商、编译器及其他软件工具生产商、软件设计师、顾问、学术界人士、C语言作者和应用程序员组成。1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。C89在1990年被国际标准组织ISO(International Standard Organization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899: 1990也通常被简称为“C90”。1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。

在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。

发展史:

C语言的祖先是BCPL语言。

1967年,剑桥大学的 Martin Richards 对CPL语言进行了简化,于是产生了BCPL(Basic Combined Pogramming Language)语言。

1970年,美国贝尔实验室的 Ken Thompson。以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。

在1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。

为了使UNIX操作系统推广,1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。

1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。

1990年,国际标准化组织ISO(International Organization for Standards)接受了89 ANSI C 为I SO C 的标准(ISO9899-1990)。

1994年,ISO修订了C语言的标准。

1995年,ISO对C90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。

1999年,ISO有对C语言标准进行修订,在基本保留原来C语言特征的基础上,针对应该的需要,增加了一些功能,尤其是对C++中的一些功能,命名为ISO/IEC9899:1999。

2001年和2004年先后进行了两次技术修正。

目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则有略有差别。

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。

它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。

基本框架就是这,需要其他功能自己添加吧

C语言实现简单的SMTP发送邮件

#include <windows.h>

#include <stdio.h>

#include <WinSock.h>

#include <iostream>

using namespace std

#pragma comment(lib, "ws2_32.lib")

struct Base64Date6

{

unsigned int d4:6

unsigned int d3:6

unsigned int d2:6

unsigned int d1:6

}

// 协议中加密部分使用的是base64方法

char ConvertToBase64 (char c6)

void EncodeBase64 (char *dbuf, char *buf128, int len)

void SendMail (char *email,char *body)

int OpenSocket (struct sockaddr *addr)

int main()

{

char EmailTo[] = "[email protected]"

char EmailContents[] = "From: \"lucy\"[email protected]>\r\n"

"To: \"dasiy\"[email protected]>\r\n"

"Subject: Hello\r\n\r\n"

"Hello World, Hello Email!"

SendMail(EmailTo, EmailContents)

return 0

}

char ConvertToBase64(char uc)

{

if(uc <26)

{

return 'A' + uc

}

if(uc <52)

{

return 'a' + (uc - 26)

}

if(uc <62)

{

return '0' + (uc - 52)

}

if(uc == 62)

{

return '+'

}

return '/'

}

// base64的实现

void EncodeBase64(char *dbuf, char *buf128, int len)

{

struct Base64Date6 *ddd = NULL

int i= 0

char buf[256] = {0}

char *tmp = NULL

char cc = '\0'

memset(buf, 0, 256)

strcpy_s(buf, 256, buf128)

for(i = 1i <= len/3i++)

{

tmp = buf + (i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3)

dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4)

}

if(len % 3 == 1)

{

tmp = buf + (i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = '='

dbuf[(i-1)*4+3] = '='

}

if(len%3 == 2)

{

tmp = buf+(i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3)

dbuf[(i-1)*4+3] = '='

}

return

}

// 发送邮件

void SendMail(char *email, char *body)

{

int sockfd = {0}

charbuf[1500] = {0}

charrbuf[1500] = {0}

charlogin[128] = {0}

charpass[128] = {0}

WSADATA WSAData

struct sockaddr_in their_addr = {0}

WSAStartup(MAKEWORD(2, 2), &WSAData)

memset(&their_addr, 0, sizeof(their_addr))

their_addr.sin_family = AF_INET

their_addr.sin_port = htons(25)

hostent* hptr = gethostbyname("smtp.126.com")

memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length)

printf("IP of smpt.126.com is : %d:%d:%d:%d\n",

their_addr.sin_addr.S_un.S_un_b.s_b1,

their_addr.sin_addr.S_un.S_un_b.s_b2,

their_addr.sin_addr.S_un.S_un_b.s_b3,

their_addr.sin_addr.S_un.S_un_b.s_b4)

// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接

sockfd = OpenSocket((struct sockaddr *)&their_addr)

memset(rbuf, 0, 1500)

while(recv(sockfd, rbuf, 1500, 0) == 0)

{

cout<<"reconnect..."<<endl

Sleep(2)

sockfd = OpenSocket((struct sockaddr *)&their_addr)

memset(rbuf, 0, 1500)

}

cout<<rbuf<<endl

// EHLO

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "EHLO HYL-PC\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"EHLO REceive: "<<rbuf<<endl

// AUTH LOGIN

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "AUTH LOGIN\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Auth Login Receive: "<<rbuf<<endl

// USER

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "[email protected]")//你的邮箱账号

memset(login, 0, 128)

EncodeBase64(login, buf, strlen(buf))

sprintf_s(buf, 1500, "%s\r\n", login)

send(sockfd, buf, strlen(buf), 0)

cout<<"Base64 UserName: "<<buf<<endl

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"User Login Receive: "<<rbuf<<endl

// PASSWORD

sprintf_s(buf, 1500, "XXXXXXXXXXXX")//你的邮箱密码

memset(pass, 0, 128)

EncodeBase64(pass, buf, strlen(buf))

sprintf_s(buf, 1500, "%s\r\n", pass)

send(sockfd, buf, strlen(buf), 0)

cout<<"Base64 Password: "<<buf<<endl

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Password Receive: "<<rbuf<<endl

// MAIL FROM

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "MAIL FROM: [email protected]>\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"set Mail From Receive: "<<rbuf<<endl

// RCPT TO 第一个收件人

sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email)

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Tell Sendto Receive: "<<rbuf<<endl

// DATA 准备开始发送邮件内容

sprintf_s(buf, 1500, "DATA\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Mail Prepare Receive: "<<rbuf<<endl

// 发送邮件内容,\r\n.\r\n内容结束标记

sprintf_s(buf, 1500, "%s\r\n.\r\n", body)

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Mail Receive: "<<rbuf<<endl

// QUIT

sprintf_s(buf, 1500, "QUIT\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Quit Receive: "<<rbuf<<endl

//清理工作

closesocket(sockfd)

WSACleanup()

return

}

// 打开TCP Socket连接

int OpenSocket(struct sockaddr *addr)

{

int sockfd = 0

sockfd=socket(PF_INET, SOCK_STREAM, 0)

if(sockfd <0)

{

cout<<"Open sockfd(TCP) error!"<<endl

exit(-1)

}

if(connect(sockfd, addr, sizeof(struct sockaddr)) <0)

{

cout<<"Connect sockfd(TCP) error!"<<endl

exit(-1)

}

return sockfd

}