精华内容
下载资源
问答
  • 可重定位代码 是什么意思呢? 顾名思义,可重定位 就是 可以重新定位 的意思。 我们都知道,在写代码时,代码里的各种跳转代码/指令,比如C语言里的goto,汇编里的jmp、jz等等,它们都是跳到某一地址,然后在该...

    可重定位代码 是什么意思呢?

    顾名思义,可重定位 就是 可以重新定位  的意思。

    我们都知道,在写代码时,代码里的各种跳转代码/指令,比如C语言里的goto,汇编里的jmp、jz等等,它们都是跳到某一地址,然后在该地址继续往下执行代码 的意思,我们写的代码时用的内存空间是逻辑空间,但是代码在实际运行时,用到的却是货真价实的物理地址空间。

     

    既然如此,那么在程序编译时,就需要有一个从  逻辑地址空间到    物理地址空间  的映射,如果这个映射做得不好,那么就会影响代码的正确执行。

     

    打个比方,下面有一段代码:

        AAAA;(假设这里是代码的起始地址0)

     

     

        ...        (中间经略过了187个地址)

     

     

        XXXX;(假设这一行的逻辑地址是188)

    circle:

       YYYY;(那么这一行就应该是189)

       ZZZZ;(190)

       MMM;(191)

     

    goto circle;(又跳到circle,也就是地址为189那里)

     

     

    因为操作系统给进程分配的内存的起始位置是无法确定的,换句话说,也就是程序 在运行时实际的物理起始位置是不确定,所以不能在编译时就把地址给写死,否则,如果实际运行时物理空间起始位置与编译时写死的起始地址  不一致的话,程序就会出问题。

     

    举个栗子,就拿上面的代码来讲,假设编译时,按照起始地址为0,给每一行代码都定死了地址(地址为右边括号里的数字),然而在实际运行这段程序时,系统可能给这个进程分配的 物理地址 起始地址为 2000,那么当代码执行到 goto circle;这一句时,本应该跳到的地址为2189,但是因为编译时已经把调转地址给写死了,实际却跳到地址189,至于这个189是哪一个进程的什么代码我们不知道,但可以肯定得是,这已经跳出了自己的物理空间,跳到别人的物理空间执行别人的代码去了,毫无疑问这样会出问题的。

     

    为了解决这个问题,科学家们就把心思放在编译这一步骤上。

     

    如果我们编译时,涉及  地址跳转,某个地址对应信息的读取、写入   等等之类与地址有关的操作,代码里所有地址都采用动态调整的方式,也就是可以根据操作系统实际给进程分配的  实际物理内存 的起始位置 ,而进行调整的话,那么代码就不会出错啦。

     

    同样拿上面的例子来说,假设运行该代码时,系统给这个进程分配的 物理地址 起始位置为 2000,而代码自动根据这个起始位置调整自己的地址,那么代码实际上是:

        AAAA;(假设这里是代码的起始地址2000)

     

     

        ...        (中间经略过了187个地址)

     

     

        XXXX;(假设这一行的逻辑地址是2188)

    circle:

       YYYY;(那么这一行就应该是2189)

       ZZZZ;(2190)

       MMM;(2191)

     

    goto circle;(又跳到circle,也就是2189那里)

     

     

    这样的话,代码的执行就不会出错啦。

     

    这种可以使地址平移的代码就叫做可重定位代码,它是在加载的时候,也就是系统给进程确定了物理地址时,才生成绝对地址的。

     

    重定位是由操作系统安排的。在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。 它是实现多道程序在内存中同时运行的基础。

     

    实际上使得代码可重定位方式有两种,分别是动态重定位与静态重定位。

    1、静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。
    2、动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。

     

    这里不讲述第2种,能理解第1种就可以啦。

    展开全文
  • 就我看来,一段程序,最该关注的逻辑...辑表现”的意思,就是如何用程序清晰地体现你的逻辑。每个程序的目标都解决某个特定的问题,解决问题便有思路,这个思路用程序表现出来便是逻辑。与初中 高中证明数...

    就我看来,一段程序,最该关注的是“逻辑表现”,次要的“性能”等问题的优化。当然,肯定也会有需要追求性能的场景,不过这并不是“追求”出来的,而是在大量经验累计情况下做出的正确决策。就算在那种情况下,“逻辑表现”还是非常重要的。

    “逻 辑表现”的意思,就是如何用程序清晰地体现你的逻辑。每个程序的目标都是解决某个特定的问题,解决问题便有思路,这个思路用程序表现出来便是逻辑。与初中 高中证明数学题一样,逻辑清晰,并把它表达出来是最终的目标,而现在也只是把原本写在纸上的文字,通过代码表现出来而已。

    写代码,其实 也是用一种特殊的语言——程序语言,而不是文字来表达一段意思。我们平时写文章需要注意分段,分层,分条理,写程序也是一样。可能由于水平有限,你一时还 无法写出华丽俊秀的文字,但是写文章的首要目标还是“清晰”,要让别人明白你的意思。写程序也是一样。在写程序时,你不应该总想着用什么技巧,追求这些技 巧所带来的好处。

    老赵承认,每个技巧都是有其作用的,否则就是“笑话”,谈不上“技巧”。不过有得往往就有失,某段技巧必然有其缺陷。例如在之前“数组元素交换”一题中,有朋友认为应该不使用额外变量来交换两个元素,也就是:

    array[j] = array[i] + array[j];
    array[i] = array[j] - array[i];
    array[j] = array[j] - array[i];

    他认为,这段代码节省了额外的空间,在内存紧张的情况下很有必要。但是老赵认为,这里的损失了可读性。对于一段标准的交换代码,每个人都知道它的目的,而正在读这篇文章的您,是否可以立即反应出上面三行代码的作用?

    在编程领域有一个道理被广为传播:make clean code fast远比make fast code clean要容易,这里clean无疑是“清晰”的意思。因为代码清晰,我们可以找出其性能瓶颈,然后有针对性地加以优化。要知道把一个调用10000次 的过程优化了20%,比调用10次的过程优化80%(假设两个过程原本消耗接近)要明显的多。

    就拿那位朋友的观点,内存紧张时该怎么办。可能他的做法的确有所节省吧(不过高级语言中的“节省”,对于最终编译后的结果又是两码事)。不过在内存 紧张的时候,首要做的应该还是设法探究最耗费资源的地方时什么,然后加以优化。因此,可能会对某个问题重新设计其数据结构,例如压缩数据存放方式,共享数 据空间等等,而不是设法节省一个字长的内存。那么如何可以能方便瓶颈的发现呢?

    清晰。

    当然,上面这段代码并非不可使用,只是如果您真要这么做,请把它封装为一个子方法:

    private void Swap(int[] array, int i, int j)
    {
        array[j] = array[i] + array[j];
        array[i] = array[j] - array[i];
        array[j] = array[j] - array[i];
    } 
    

    一旦你把这段逻辑给分离了,在代码里只适用Swap方法了,那么程序也会一下子变得清晰起来。而且在这时候,这三行代码也变得容易理解了,别人也可以一眼看出它的作用——因为方法名已经说得很清楚了:交换。

    所以,我们在写程序的时候,不如仔细想想,如何把变量名、方法名或参数名取得清楚一些,如何把程序的逻辑表现地清晰一些,如何把你的意图更好的告诉别人。

    剩下的细节优化,什么内联子过程……就统统交给编译器去处理吧。

    转载于:https://www.cnblogs.com/lori/archive/2011/05/19/2050710.html

    展开全文
  • 我很佩服我们头,他在不看代码的情况下,就靠分析程序运行时的输入和输出,就能够知道那段代码是什么意思。这是值得我们学习的。实际上程序的输入和输出就是为了业务处理,要弄清楚代码逻辑,从分析输入和输出开始...

    “分析代码中的业务逻辑”,是逆向工程的一个子集,在大型系统开发/维护过程中,已经成为一个程序员的必经之路。

    在软件开发领域,所谓的“逆向工程”是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技
    术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。 

    众所周知,我们使用了几十年的软件系统的开发方法,都是在围绕:可行性研究与计划,需求分析,概要设计,详细设计,实现,集成测试,确认测试,使用和维护这几个阶段在进行,这其中就包含了“需求分析”和“该要设计”。对于程序员来说,“需求分析”和“概要设计”是指导后面的“详细设计”,“实现”的依据。它们虽然作为软件系统商业机密的组成部分,不允许被外传,但是在公司团队内部,它们对相关项目的程序员来说是开放的。既然,程序员是“实现”阶段的执行者,手里有源代码,又能够看到“需求分析”和“概要设计”,那何来逆向工程呢?

    实际的情况是,开发中的好多阶段,例如:可行性研究与计划,需求分析,概要设计,详细设计都被弱化了,特别是对于那种已经完成了首个版本开发且已经上线的系统,通过迭代来引入新功能时,开发几乎就直接进入“实现”阶段了。

    加之开发和维护过程中的人员流动因素,可想而知,经过多个这样的迭代,就会出现“需求分析”和“概要设计”的真空,开发人员要弄清楚前几个迭代的业务逻辑,就只能从分析代码入手,从分析整个系统的运行行为入手,来还原之前的“需求分析”和“概要设计”,进而确保新功能的实现能够很好的衔接现有功能。

    因此,作为一个程序员,直接分析原有代码,导出其中的业务逻辑,是工作中一条绕不开的路。既然绕不开,就直视它,根据项目特点,找到分析代码,导出业务逻辑的特定方法。作为一个程序员,会成长成什么样子,由很多因素决定。但对于我来说,我希望能够在程序员的这条路上走得再远一些。

    参考:

    软件逆向工程

     

    展开全文
  • java中dao是什么意思

    千次阅读 2020-12-22 18:05:36
    DAO (DataAccessobjects 数据存取对象)指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。 对外提供相应的接口 在面向对象设计过程中,有一些"套路”用于解决特定...

    DAO 模式

    DAO (DataAccessobjects 数据存取对象)是指位于业务逻辑和持久化数据之间实现对持久化数据的访问。通俗来讲,就是将数据库操作都封装起来。

    对外提供相应的接口

    在面向对象设计过程中,有一些"套路”用于解决特定问题称为模式。

    DAO 模式提供了访问关系型数据库系统所需操作的接口,将数据访问和业务逻辑分离对上层提供面向对象的数据访问接口。

    从以上 DAO 模式使用可以看出,DAO 模式的优势就在于它实现了两次隔离。

    • 1、隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。
    • 2、隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO 接口的新实现类即可,原有 MySQ 实现不用修改。这符合 "开-闭" 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。

    一个典型的DAO 模式主要由以下几部分组成。

    • 1、DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。

    • 2、DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
    • 3、实体类:用于存放与传输对象数据。
    • 4、数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。
    • DAO 接口:

      public interface PetDao {
          /**
           * 查询所有宠物
           */
          List<Pet> findAllPets() throws Exception;
      }

      DAO 实现类:

      public class PetDaoImpl extends BaseDao implements PetDao {
          /**
           * 查询所有宠物
           */
          public List<Pet> findAllPets() throws Exception {
              Connection conn=BaseDao.getConnection();
              String sql="select * from pet";
              PreparedStatement stmt= conn.prepareStatement(sql);
              ResultSet rs=    stmt.executeQuery();
              List<Pet> petList=new ArrayList<Pet>();
              while(rs.next()) {
                  Pet pet=new Pet(
                          rs.getInt("id"),
                          rs.getInt("owner_id"),
                          rs.getInt("store_id"),
                          rs.getString("name"),
                          rs.getString("type_name"),
                          rs.getInt("health"),
                          rs.getInt("love"),
                          rs.getDate("birthday")
                          );
                      petList.add(pet);
              }
              BaseDao.closeAll(conn, stmt, rs);
              return petList;
          }
      }

      宠物实体类(里面get/set方法就不列出了)

      public class Pet {
          private Integer id;    
          private Integer ownerId;    //主人ID
          private Integer storeId;    //商店ID
          private String name;    //姓名
          private String typeName;    //类型
          private int health;    //健康值
          private int love;    //爱心值
          private Date birthday;    //生日

      连接数据库

      public class BaseDao {
          private static String driver="com.mysql.jdbc.Driver";
          private static String url="jdbc:mysql://127.0.0.1:3306/epet";
          private static String user="root";
          private static String password="root";
              static {
                  try {
                      Class.forName(driver);
                  } catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  }
              }
              
          public static Connection getConnection() throws SQLException {
              return DriverManager.getConnection(url, user, password);    
          }
          
          public static void closeAll(Connection conn,Statement stmt,ResultSet rs) throws SQLException {
              if(rs!=null) {
                  rs.close();
              }
              if(stmt!=null) {
                  stmt.close();
              }
              if(conn!=null) {
                  conn.close();
              }
          }
          
      
          public int executeSQL(String preparedSql, Object[] param) throws ClassNotFoundException {
              Connection conn = null;
              PreparedStatement pstmt = null;
              /* 处理SQL,执行SQL */
              try {
                  conn = getConnection(); // 得到数据库连接
                  pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象
                  if (param != null) {
                      for (int i = 0; i < param.length; i++) {
                          pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
                      }
                  }
              ResultSet num = pstmt.executeQuery(); // 执行SQL语句
              } catch (SQLException e) {
                  e.printStackTrace(); // 处理SQLException异常
              } finally {
                  try {
                      BaseDao.closeAll(conn, pstmt, null);
                  } catch (SQLException e) {    
                      e.printStackTrace();
                  }
              }
              return 0;
          }
          
      }

       

    展开全文
  • 什么是业务逻辑?

    千次阅读 2011-11-04 09:37:10
    但是什么样的算是业务逻辑如:上传一个文件,上传代码算是一个业务逻辑吗? 数据库操作增加时需要判断,和一些其它这算业务逻辑吗?(我觉得算) 但是hibernate又提供了一个离线查询对象(DetachedCriter),提供这...
  • 注解是什么意思

    2019-06-02 11:08:25
    前言: 注解: *注解:说明程序的(给计算机看) *注释:用文字描述程序的。(给程序员看) ...通过注解开发人员可以在不改变原有代码逻辑的情况下在源代码中嵌入补充信息。 *概念描述: *JDK1....
  • 在好吧,我想我得解释一下-开始被-1扇耳光了,可能在我不知道逻辑和按位否定之间的区别的前提下。在问题,问题中的代码坏了。里面有个虫子。如果你检查一下Brainfuck应该如何工作,它会在[]括号内循环,而当前的...
  • 【C语言】!!是什么意思

    千次阅读 2019-10-30 10:34:32
    在C语言中 ! 本来是逻辑运算符逻辑非的意思逻辑操作符一般将其操作数视为条件表达式,返回结果为Bool类型 ... 0x04) 此行代码意思就是将arr数组的 第三位去判断是否1 (arr[2] & 1 )=...
  • 在好吧,我想我得解释一下-开始被-1扇耳光了,可能在我不知道逻辑和按位否定之间的区别的前提下。在问题,问题中的代码坏了。里面有个虫子。如果你检查一下Brainfuck应该如何工作,它会在[]括号内循环,而当前的...
  • linux下写脚本时-gt或-lt是什么意思

    千次阅读 2020-07-02 12:46:26
    Linux下有一些判断比较的逻辑,下面解释一下相关关键字的意思: -gt大于的意思。 -eq等于的意思du。 -ne不等zhi于的意思。 -ge大于等于的意思。 -lt小于的意思。 -le小于等于的意思。 下面一段代码: ...
  • <div><p>logic层的cmd入口 <p>// 初始化自增id配置...代码大概看的懂,不太懂为啥这样做(业务逻辑吧),有相关话题文档么,</p><p>该提问来源于开源项目:alberliu/gim</p></div>
  • 这个运算符还是学习python最基础内容时候最先了解的,今天小编在运行代码时候,在这个位置踩了坑,大家一起来看看吧~ 前言: 今天在运行之前写的一个Python脚本时,发生了一个奇怪的现象(我怎么老遇到奇怪的现象~...
  • 在好吧,我想我得解释一下-开始被-1扇耳光了,可能在我不知道逻辑和按位否定之间的区别的前提下。在问题,问题中的代码坏了。里面有个虫子。如果你检查一下Brainfuck应该如何工作,它会在[]括号内循环,而当前的...
  • AMD 每个模板代表的意思是什么? 在主模块中 require() 参一 [] 表示:【注入】其它子模块,主模块需要【依赖】其它子模块。这就是所谓的 依赖注入 参二 回调函数。作用:处理主模块中所有的业务逻辑。其代码;和...
  • ;(function(){ //这应该一个某系统的插件js //具体功能代码。。。 })(); ...从语法上来开,Javascript中分号表示语句结束,在开头加上,...叹号是逻辑运算符,“非”的意思,常见这种写法 if(!true){};而将运算符加
  • 题目分析:作者暂时...Java 注解附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。 2. 题目拓展 暂无 ...
  • matlab中绿色的代码的英文一次性总投资与美元平均费用(DCA)投资的比较 与同行一起讨论一次性投资而不是随时间分散投资的话题。 我记得两个傻瓜都读过书,一次过一次总支出就超过了DCA的66%。 一次性投资和DCA都有...
  • c#中两个问号(??)是什么意思

    千次阅读 2016-03-28 11:23:02
    a??1 等价于 a==null?1:a c#里面看到?,就联想到null.... //如果int, 不能赋null值... 这在一些应用场景能简化代码,比如我们经常遇到DateTime类型的数据,在DB层和逻辑层传递时常有非空判断以及最小值(C#和sqlserve
  • 在集成电路的可重用dao设计方法学中,IP核,全称知识产权核(英语:intellectual property core),指某一方提供的、形式为逻辑单元、芯片设计的可重用模块。IP核通常已经通过了设计验证,设计人员以IP核为基础...
  • 学vue中,看到个例子里面有一句代码不明白,count = count || 1 这个要怎么理解才对?||符号不是用于逻辑真假上的吗? ``` <!DOCTYPE html> <title> 07 - Vue内置指令-事件指令-v-on指令-点击事件 ...
  • 是非颠倒(逻辑非操作符) "!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真。好比小华今天买了一个杯子,小明说:"杯子是白色的",小亮说...看看下面代码,变量c的值是什么: var a=3; var b=5; var
  • 是非颠倒(逻辑非操作符) "!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真。好比小华今天买了一个杯子,小明说:"杯子是白色的",小亮说:...看看下面代码,变量c的值是什么: var a=3; var b...
  • python 相信刚接触Python的你一定...殊不知这段代码的意义并不是一定要存在于执行代码中,而是在日常工作中,为了调试某个模块的正确性,我们往往会在当前模块下直接写一个 if __name__ == '__main__' ,测试逻辑写...
  • 各个版本翻译的文字不太一样,意思就是一个方法的代码篇幅过长,那么就会囊括了过多的处理逻辑; 而前辈们多年的开发经验总结之后告诉我们:一个方法职责越单一,则代码可维护性以及可读性就会高,总之就是好处...
  • Android 天气APP(十四)修复UI显示异常、优化业务代码逻辑、增加详情天气显示 Android 天气APP(十五)增加城市搜索、历史搜索记录 Android 天气APP(十六)热门城市 - 海外城市 Android 天气APP(十七)热门城市 -...
  • 什么是代理? 从字面意思来看,代理比较好理解,无非就是代为处理的意思。举个例子,现在哪吒有女助理了,所以很多事情都不用我自己去处理了,比如说去银行排队取钱,那么我就可以叫我的女助理去代替我取钱并交给我...
  • 示例一和示例二,主要是来讲解TransactionScope 是什么,为什么要用TransactionScope。示例三(重要)则是优化写法,增加代码的灵活性和可读性。 【示例一】 现在,你要写个入库接口,大致意思就是: 勾选一条...
  • 先按经验理解为“当haxe支持宏时”,但看代码逻辑又发现这个解释与代码不符,想了下猜测“当haxe进行预编译(宏处理)阶段有效”。就像C++先做预编译(宏处理),再执行编译过程那样,#if macro的代码在haxe做预...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 469
精华内容 187
关键字:

代码逻辑是什么意思