关于程序语言与操作系统的个人理解

程序编写原则:

   用最简单的语法,构建比较高效的代码。

      不要迷恋那些复杂的语法和技术,极度不建议采用带有二义性语法。最好采用各种语言通用的语法结构,采用最简单的语句,除非只有痛过构建特殊语法才能提高性能。

      if ( a == b && b > 100)

         当你不确定 逻辑运算与比较运算谁优先时,那么

      if ( (a == b) && (b > 100))

         更加清晰,出错的概率就越小。这样的书写并不会改变编译后的代码,但是增加可阅读性。

      不要采用一些复杂的处理技术,这些技术有可能对操作系统、编译器或某些特定的运行环境具有依赖性。

   采用统一的程序编写风格。

   采用统一的技术处理方式。

   采用统一的编程语言,降低团队协作风险,降低团队协作成本。

   一个函数只做一件事情,提高函数的通用性,降低代码的耦合性,提高代码的可维护性。

汇编语言:可以无限制地访问内存单元、寄存器以,仅仅受硬件的限制。

C语言:基本也可以访问任意内存单元,但是堆栈、寄存器等是编译器管理的。语言本身并不提供直接访问这些存储单元的方法。

C++:是C和面向对象语言的混合,如果抛开其C语言的特性,面向对象语言本身对于内存进行了更多自动化的管理,减少程序员出错的概率,这是通过编译器实现的,而不是C++编译出来的程序与C语言有多大的不同,而是C++编译器在内存分配及控制方面比C语言编译器复杂得多,一旦编译完成,编译器就退出了控制角色,因此C++程序一样可以任意访问内存,只是编译器会在编译时检查你的代码访问内存是否符合面向对象语言的规定。

 

内存就是数据,一切都是数据。代码也是数据,函数是一个有意义代码段的入口,只要有函数地址,只要在约定的寄存器或堆栈存放合适的数据,那么可以从任意代码调用该函数。

函数可以作为参数:因为函数就是 一个内存地址。

函数可以作为返回值:因为函数就是 一个内存地址。

数据可以被执行:只要数据包含的就是一个可执行函数代码,当然前提是操作系统规定了该数据存放的内存页是可执行的。

 

系统调用:  操作系统为了便于其他程序能使用自己,就给其他程序打开了一个窗口,应用程序就是利用操作系统的这些函数对硬件行为进行定制的,应用程序不能直接操作硬件,只能利用操作系统实现了的功能,通常应用程序对内存数据逻辑处理比较复杂。

操作系统API:是操作系统自己的外壳,是对系统调用的封装,因为直接进行系统调用是很麻烦的,很多的操作系统外壳程序也必须利用API来进行系统调用,操作系统API不仅仅是对系统调用的封装,而且做了更多的程序逻辑处理,是对内核功能的补充,API是操作系统比较稳定的接口,而系统调用是随操作系统升级而变化的,因此我们编写程序通常是直接面对操作系统API,就是调用API来完成所有与操作系统的交互。

SDK: 我们编写程序,通常要采用工具,而这些工具的价值就是提供一些函数库,让我们编写程序更佳容易,否则我们所有的都要调用原生API来做,那么工作量很大,当然我们可以直接调用原生API实现自己的功能。Borland C++/ Delphi/ VC++ 都有自己的库,如MFC/VCL。

编译器:通常编译器要将一些源代码变成通用的代码段,而这些代码段就是编译器支持库,SDK中就包含了这些代码库。还有编译器通常对于库文件的格式有要求,其实如果希望编译器比较通用,就可以让编译器能尽可能解析多种文件格式。但是为了保护壁垒,工具开发者通常不让自己的编译器能使用别人的库,Borland公司就可以让C++可以使用Delphi(Object Pascal)编译出来的库代码。

 

C语言中对地址的引用是通过指针,C++是则通过对象名,当然也可以通过变量地址,只是不推荐这样操作。所谓函数调用的地址传递,就是将地址值复制到参数存储单元(寄存器或栈,这取决于编译器,如果是库调用,那么就取决于被调用函数的参数约定),

 

宏定义:

  #define SETBIT(b,bit)  b & 1<< bit

   宏定义是在预编译时处理的,因此不会处理代码,而是简单的替换,这与函数调用不同。

   SETBIT(a+b, 3) 会得到  a+b & 1<< 3

   因此在定义有参数的宏时,必须给参数加上括号,

  #define SETBIT(b,bit)  (b) & 1<< (bit)

 

引用:

   int &a = b   // 定义了b的别名,a和b指同一个内存地址。

   int &a = * new int;

   delete &a;

 

数据类型

   整型 int  ,short int,long int ,byte ,char

   浮点数  float, double

   枚举enum,实际上存储单元就是一个字节或整数,只是这个数据是在固定的几个值中的一个,并不是存储限制,定义枚举类型,是方便编译器检查程序是否符合规定。

   联合union,其实是一个字节或多个字节的别名,一个数据区可以定义为多个别名,将多个字节拆分成不同的字节或位进行解析。当多个程序片段必须要共享某个内存,采用联合是比较合适的。

   结构体Struct, 是对一个存储块的数据的定义。

   string, 字符串,是对象范畴,只有面向对象的程序语言才有,C语言是没有的,通常是存放内存堆中,痛过malloc来申请内存。string必须以“\0”结束,否则程序无法判断字符串长度。

   char[],是c语言处理字符串的方式。通常同时有char[]数组的有效长度。

   链表、Set、Map、Directory、HashTable、BTree

 

   编译器会对类型进行检查,以保证类型的一致性,但是高级语言基本都容许进行类型的强制转换,这是为了构建复杂程序的方便性。强制类型转换是具有风险的,因此程序员自己必须保证程序的健壮性,编译器对强制类型转换后的数据无法进行检查,因为内存中到底存储了什么内存,只有程序员自己清楚。强制类型转换是一个地址操作,将某个地址开始的N个字节看作新设定的类型值。多少个字节,依赖转换后的类型,例如如果强制转换成String,那么这个String应该有“\0”结尾符号。

 

类:

   采用类方法,将一部分数据保护起来,让其他人不能随意更改该部分数据,这样就减少程序的耦合性,减少了内存管理的相互干扰。这部分数据就是类对象。

 

int &getx(){return x}//返回&x

classA.getx() = 10;  // x=10

对象的定义,构造函数

   C++

     ClassA   ca(10,10);//编译器管理对象

     ClassA   *ca = new ClassA(10,10); // 程序员自己管理&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值