zoukankan      html  css  js  c++  java
  • 学习笔记对程序的又一次理解

    对程序的又一次理解

    编程人员眼中的计算机无非就是CPU和存储器, 貌似每天忙忙碌碌的我们其实都只在做同一件事情---操作数据.每天的工作只是将组织好的数据交给CPU去做累加运算, 然后再取得结果而已. 计算机对我们而言, 只是一大堆门电路和存储器的集合, 就像算盘一样, 它只是一台机器或一种工具, 仅此而已. 而我们的工作就是要通过这个工具快速的从大量数据中获取结果并以各种方式呈现给用户.

    所以有 ”程序 = 数据结构 + 算法” 之说, 算法就是解决问题的方法. 而数据结构就是在计算机内部的数据的表示和数据之间关系的表示(数据结构 = 数据表示 + 数据间关系的表示). 记住, 我们的工作就是操作数据, 当面对一个实际问题时, 首先要做的就是分析数据, 确定数据及数据之间的关系(逻辑关系); 其次, 需要分析针对该数据所可能执行的操作(设计算法). 再次, 需要以某种存储结构在计算机中表示数据及数据间的关系(物理存储). 然后, 根据存储结构的存储方式和设计好的算法在计算机中实现该算法(编写代码). 最后, 利用编写好的代码来处理数据得到结果.

     

    数据的逻辑结构与数据存储无关, 目前常用的有四种逻辑结构: 集合结构(散列结构)、线性结构、树形结构和图形结构. 这也是大学中数据结构这门课的主线, 而数据的存储结构则分为顺序存储结构和链式存储结构. 逻辑结构和存储结构是不相关的, 每种逻辑结构都可以采用不同的存储结构来实现. 值得注意的是, 顺序存储结构是指采用一片连续的空间来顺序存储数据的方式, 而链式存储结构是指采用不连续的多个存储单元分块存储数据, 并采用指针或引用将各个片段连接起来的存储方式; 这里说的是存储方式, 而不是具体的实现或某种结构.

    真正的存储结构是指物理存储, 指数据在内存或硬盘上的存储位置. 比如: 数据在硬盘上存放在多个连续的簇中, 才是顺序结构, 而数据分散在硬盘中的很多不连续的簇中, 并采用指针或引用链接各块才是链式存储结构(硬盘中好像是通过索引来链接各块的). 所以说数组在逻辑上连续的, 在物理上是不连续的(如: 大小为100000的数组是不太可能有连续的内存单元的). 严格说来, 数组是属于逻辑结构的, 但是由于数组中元素的关系通过位置来体现的特性, 我们在开发过程中通常用数组来模拟顺序存储方式. 类似的, 通常采用链表来模拟数据结构的链式存储方式.

    由于计算机内存资源属于稀缺资源, 所以不可能无休止的肆意使用内存. 在传统的C, C++等高级语言中, 内存空间的使用和回收都是由程序员自己来控制的. 这样虽然在效率上有一定优势, 同时也比较灵活, 但这种方式提高了编程的复杂度, 对程序员有着较高的要求. 由于程序员水平参差不齐, 在团队开发中容易造成未知bug和安全隐患. 于是便出现了托管内存技术, 由程序来控制内存空间的申请、回收等操作. 而编写这些程序或软件系统的公司通常都是业界顶级的软件公司, 如微软公司推出的.Net Framework平台以及在该平台上的C#托管编程语言.

    .Net Framework框架图, 看过很多遍, 直到今天才发现, 其实我一直没太懂. 今天从众多图中抽了3张图来总结下自己对.Net Framework框架的理解.

    这张图看过很多遍, 一直不知道它用来表征什么. 个人的理解是, 它表明了这么一种编写软件的方式或者说表明了.Net平台下开发软件的思想和规范. 真正的.Net Framework框架只包含两部分, 即公共语言运行时(CLR: Common Language Runtime) 和 框架类库(FCL: Framework Class Library)两部分.

    可以设想自己是一个软件项目经理, 很不凑巧的是手里面的程序员有精通VB、VC++和C#的程序员各一名, 那么如何来使这些程序员写作开发同一个项目呢? 以往不可能的任务, 在.Net Framework下就成为可能, 并且这些程序员按照自己精通的方式去开发项目:

    第一层: 程序员使用自己熟悉的方式去完成各自的模块, 这些模块可能使用不同的开发语言.

    第二层: 但是采用不同语言开发的话, 又是如何将这些代码整合的呢? 通过公共语言规范(CLS: Common Language Specification)来实现, 公共语言规范从各种编程语言中抽象出公共部分并以Com组件的方式对各种编程语言提供支持. 另外, 通用类型系统(CTS: Common Type System) 也是.Net平台的重要特性之一, 它提供了.Net标准的数据类型和准则集. 严格来讲, CLS是CTS的子集. 不同编程语言的模块, 在这一层通过Com组件转化为CLS所支持的语言, 即微软中间语言MSIL(Microsoft Interspace Language), 而相关数据类型则转化为CTS所使用的类型(如: int转化为System.Int32类型, string转化为System.String类型等).

    第三层和第四层, 则是.Net最重要的组件, 这些开发组件是程序员需要和能操作的东西, 每一个开发组件都代表一种应用程序的开发方向, 是某类应用程序的框架. 如果说前两层只是不同编程语言如何实现统一的过程的话, 这两层则是利用.Net提供的各种组件, 进行具体的开发过程.

    第五层和第六层, 才是真正的.Net Framework框架. 之前所做的工作都可以认为是在.Net各种开发组件支持下进行编码的过程. 从这两层开始就是程序员完成编码后的汇总调试和运行阶段. 当程序代码执行生成操作(Build)时, 公共语言运行时(CLR)将会连接框架类库(FCL), 提取需要的类库然后编译成为微软中间语言(MSIL: Microsoft Interspace Language)表示的代码. 其中, 针对API(Windows Application Interface)调用级别的功能均有FCL来完成, 如: 控制台处理、文件处理、数据库处理、网络处理、桌面处理和Web处理等. 而CLR则类似于Java的虚拟机, 用来不同平台的系统下提供运行.Net应用程序的环境. 当然为了维护微软操作系统的市场利益, 微软显然还不愿意让其他系统能够很容易的运行.Net程序, 不过这只是个市场策略问题而不是技术问题. 框架类库FCL中的内容如下图:

     

    最后当程序运行时, 再由CLR中的JIT(just in time)编译器进行二次编译, 将中间语言编译为机器码并执行程序. 在程序的开发阶段, 代码经过第一次编译(Build操作)并转换为中间语言后便保存起来, 当运行改程序时, 则由JIT负责二次编译. 所以.Net编译结束的.exe文件其实是中间语言表示的代码文件. 当双击程序运行时, 才会经由JIT将中间语言解释为机器码并执行. 执行过程如下图:

     

    关于C#语言的数据类型, 如下图:

     

    个人闲暇的类库理解, 望指点!

  • 相关阅读:
    tiger-complier 问题记录 类型检查
    leetcode 854. K-Similar Strings
    FPO优化简介
    [转载]深入解析结构化异常处理
    再看链接-WIN
    管道控制Telnet
    管道 简介与简单使用
    Detours 简介与简单使用
    netStat逆向分析
    Fport逆向分析以及C++实现
  • 原文地址:https://www.cnblogs.com/cs_net/p/1826558.html
Copyright © 2011-2022 走看看