年终总结:软件开发的知识点

来源:互联网 发布:游戏开发算法面试题 编辑:程序博客网 时间:2024/05/21 11:10

只有掌握了多多的点,才 有可能将之系统成一个面。在建立面之前,我们多多整理一下软件开发里的一些知识点。

软件开发人员越懂的多,那么其开发效率就越高,而且一个软件开发人员最好是懂的很多,无论他是从事哪个层面的开发,底层到高层都要有一定了解。软件涉及到的知识很多,可能并非每个人都能掌握全,我们希望能精一,熟十,知百,这样在自己某个领域才能游刃有余。

以下列举的知识点:

windows系统下里的lib: 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。 如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。如果是某个程序中调用了一个动态库(通过header文件,lib+dll来调用),则对动态库的某个函数的内容修改了,但接口不改,则调用此动态库的程序需重新编译连接吗?如果是通过loadlibary动态加载,需要重新编译连接吗?
我的答案:通过header+lib+dll调用的话需要重新编译连接,但是通过loadlibrary来使用的话,不需要重新编译连接。

dll 和so:在windows下的动态链接库 ,文件类型是PE。obj文件的集合;在linux系统的动态链接库文件,共享库,文件类型是elf。是a文件的集合; windows下的dll和linux下的so还是有一定区别的,一个是PE文件,一个是ELF文件。而且在windows下的dll多了一个导入库的概念,导入库也是lib后缀的文件,但是里面并不包含执行代码,只是描述了dll的导出符号表,又被称为胶水代码,以便于将程序与dll粘在一起。不要把动态链接库和多线程或者多进程搞混。

静态链接库:

编译原理:理解编译,解释。 编译,链接,内存映射。加载。run。

进程和线程:进程可以理解成一个程序。可以理解成独占CPU和内存。进程间通信典型的理解就是程序间的发消息等。一个服务器就可以理解成一个进程。一个客户端可以理解成另一个进程。这样C/S就是进程间通信(通过socket)。而线程就是一个进程间的多任务工作模式,使得一个程序可以同时做多件事情。

cygwin:是一个dll,跑在windows系统上,提供了很多linux下的接口,类似一个adaper;

makefile:文件,用来组织编译,它由make程序来执行;

SDK:software development kit 软件开发包。

JDK JRE :jre是java运行时环境,包括了VM,java库;而jdk包含了jre,并且包含了java开发工具(编译器等)

JNI:System.loadLibary()。在java测调用c层的库。

Framework:本身就是一个程序,有些空缺需要开发人员填写,有些扩展可以让开发人员去扩充进而形成一个更大的软件系统。

交叉编译:在工作机上通过编译器编译出目标机器上的可执行程序来。主要是给手机或者嵌入式的目标机来编译,因为这些设备没有编程和编译的条件。

虚拟机(Apache Harmony,Davilk):它的存在是在OS上加了一个layer,屏蔽了OS的是一些实现,比如linux和windows直接的差异。最典型的当然是java虚拟机,于是我们编程不用考虑目标机器是32位还是64位,因为虚拟机给我们提供的接口是一样的。

JAR文件:class文件的集合。类似c语言里的lib库。

linux shell:linux内核对外提供的一个接口。方便执行一些命令。

Perl:一种语言,动态语言,脚本语言。需要安装perl解释器。

动态语言:如python之类的语言,特点是不需要编译,直接解释执行。需要安装解释器。

静态语言:如c c++ java之类的语言。编译好就是可执行程序,需要OS(虚拟机)支持。

c runtime:就是c语言的运行时库。在windows平台下就是一个dll: msvcrt.dll。它提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间时在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件 (libc.lib,libcmt.lib或Import library msvcrt.lib)链接进来。) C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。

java (android)虚拟机(Apache Harmony,Davilk):在java这种语言的运行机制里,就和上面的c runtime机制不太一样了,因为它是用的虚拟机技术,代码是跑在虚拟机上的,和平台(cpu,OS)无关了。它的库,初始化,线程机制等都被虚拟机来实现了。所以在java里也没有头文件的概念,你要用哪个库,只要import进它的class文件就可以了。虚拟机是认识这个class文件的。它知道里面包含着哪些函数实现。

一个程序的静态和动态:程序就是代码,它是静态的,然后它需要运行起来才能起作用。静态的代码在run起来之前是没有用的,但是我们写代码时是静态的,而同时我们要考虑它run起来的情况,所以要求程序员以动态的思维去写静态的代码。

android的结构:它是基于linux内核的。封装了很多第3方库。


原创粉丝点击