`
canonical
  • 浏览: 372840 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从编写代码到制造代码

阅读更多

    软件开发作为一种工程技术,它所研究的一个重点就是如何才能有效降低软件产品的研发成本。在这一方向上,组件技术取得了空前的成功。它所提供的基本图景是像搭积木一样从无到有的组装出最终的产品。在某种意义上,这是对现代建筑工业的模仿和致敬。新材料,预制件,框架结构,这些建筑学的进展在软件领域被一一复制,建筑工地上的民工自然也成为了程序员们学习的楷模。毕竟,在组件的世界中码代码,基本上也是一种“搬砖”的行为。


    值得庆幸的是,软件开发作为一种智力活动,它天生具有一种“去民工化”的倾向。信息产品有着与物质世界产品完全不同的抽象本质。在物理空间中,建造100栋房屋,必须付出100倍的努力,老老实实的干上100遍。而在概念空间中建造100栋房屋,我们却可以说其他房屋与第一栋一模一样,加点平移旋转变换即可。一块砖填了地基就不能用来盖屋顶,而一段写好的代码却可以在任何可用的场合无损耗的被使用。一栋建好的房屋发现水管漏水要大动干戈,而在完成的软件中补个局部bug却是小菜一碟。在抽象的世界中有效的进行生产,所依赖的不应该是大干,苦干的堆砌,而应该是发现某种可用于推导的原理,基于这些原理,输入信息可以立刻转换为最终的结果,而不需要一个逐步构造的过程。即我们有可能超越组装性生产,实现某种类似于数学的原理性生产。http://canonical.iteye.com/blog/325051


    代码复用是目前软件业中鼓吹降低生产成本的主要口号之一。但是在组件技术的指向下,一般所复用的只是用于构建的砖块,而并不是某种构造原理。即使在所有信息已经确定的情况下,我们仍然不可能从需求立刻得到可执行的产品。很多代码即使我们在想象中已经历历在目,却仍然需要一行行把它们誊写下来。当我们发现系统中已经没有任何组件值得抽象的时候,仍然留下来众多的工作需要机械化的执行。代码复用的理想国距离我们仍然非常的遥远。


    子例程(subroutine)是最早的代码重用机制。这就像是将昨天已经完成的工作录制下来,在需要的时候重新播放。函数(function)相对于子例程更加强大。很多代码看起来并不一样,但是如果把其中的差异部分看作是变量,那么它们的结构就可以统一了。再加上一些判断和循环,很多面目迥异的东西其实是存在着大量共享信息的。面向对象技术是一次飞跃性的发展。众多相关信息被打包到一个名称(类型)中,复用的粒度和复杂度都大大提升。派生类从基类继承,可以通过重载实现对原有代码的细致调整。不过,这种方式仍然无法满足日益增长的复用需求。很多时候,一个名称并不足以标定我们最终需要的代码结构,在实际使用的时候还需要补充更多的信息。类型参数化,即泛型技术,从事后的角度看其实是一种明显的解决方案。根据参数动态的生成基类自然可以吸纳更多的变化。经历了所谓Modern C++的发展之后,我们现在已经非常明确,泛型并非仅仅能够实现类型共变,而是可以从类型参数中引入更丰富的结构信息,它的本质是一种代码生成的过程。http://canonical.iteye.com/blog/57244 认清了这一点,它的扩展就非常明显了

       BaseClass<ArgClass> --> CodeGenerator<DSL>
 

DSL(或者某种模型对象)相对于普通的类型(Class),信息密度要大很多,它可以提供更丰富也更完整的输入信息。而CodeGenerator也不必拘泥于基础语言本身提供的各种编译机制,而是可以灵活应用各种文本生成技术。http://canonical.iteye.com/blog/309395 CodeGenerator在这里所提供的正是根据输入模型推导出完整实现代码的构造原理。


    现在很多人热衷于开发自己的简易代码生成工具,这些工具也许可以在简单的情形下减轻一些体力工作,但是生成的代码一般不能直接满足需求,仍然需要手工执行大量的删改工作。当代码生成之后,它成为一种固化的物质产品,不再能够随着代码生成工具的改进而同步改进,在长期的系统演化过程中,这些工具并不一定能够减少累积的工作量。

       修正过程  ==> CodeGenerator<DSL>

 

为了改进以上代码生产过程,一些人试图在CodeGenerator中引入越来越多的可配置性,将各种变化的可能内置在构造原理中。显然这会造成CodeGenerator的不正常的肿胀。当更多的偶然性被包含在原理中的时候,必然会破坏原理的简单性和普适性。

     输入信息 + 一段用于推导的原理 + 修正补充 = 真实模型
 

必须存在[修正补充]这一项才能维持以上方程的持久平衡。


    为了摆脱人工修正过程,将模型调整纳入到概念世界中,我们需要超越继承机制的,更加强大的,新的技术手段。其实在当前的技术背景下,这一技术已经是呼之欲出了。这就是AOP, Aspect Oriented Programming。http://canonical.iteye.com/blog/34941

      Biz ==[AOP extends]==> CodeGenerator<DSL> 

 

继承仅仅能够实现同名方法之间的简单覆盖,而AOP所代表的技术原理却是在代码结构空间中进行任意复杂的删改操作,它潜在的能力等价于人工调整。


    为了实现上述生产模式,需要对编程语言,组件模型,框架设计等方面进行一系列改造。目前通用的AOP实现和元编程技术其实并不足以支持以上模式。http://canonical.iteye.com/blog/275015
    这一生产模式将会如何演化,也是一个有趣的问题。按照级列理论,我们立刻可以得到如下发展方向:

   Context0 + DSL1 + EXT0 = DSL0  
   Context1 + DSL2 + EXT1 = DSL1  
   ...     

 http://canonical.iteye.com/blog/33824

Witrix平台中BizFlow可以看作是对DaoWebAction的修正模型,但是它本身具有完整的意义,可以直观的被理解。在BizFlow的基础上可以逐步建立SeqFlow,StateFlow等模型。http://canonical.iteye.com/blog/126467

      现在有些人试图深挖函数式语言,利用模式匹配之类的概念,做符号空间的全局优化。但是我们需要认识到通用的机制是很少的,能够在通用语言背景下被明确提出的问题更是很少的。只有在特定领域中,在掌握更多局部信息的情况下,我们才能提出丰富的问题,并作出一定背景下的解答。DSL的世界中待做的和可做的工作很多。http://canonical.iteye.com/blog/147065
      对于程序员而言,未来将变得越来越丰富而复杂,它将持续拷问我们的洞察力。我们不是一行行的编写代码,把需求一条条的翻译到某种实现上,而是不断发明局部的生产原理,依靠自己制定的规则在抽象的空间中不断的创造新的表象。

分享到:
评论
2 楼 night_stalker 2009-03-06  
uda1341 写道
为了摆脱人工修正过程,将模型调整纳入到概念世界中,我们需要超越继承机制的,更加强大的,新的技术手段。其实在当前的技术背景下,这一技术已经是呼之欲出了。这就是AOP, Aspect Oriented Programming。

继承机制其实是一种非常僵化和原始的方式,AOP也只是提供了适合特定模式的描述方式,函数式也并非万能药。

简单举一个例子,就继承而言,继承实际上是一种缩减的表达:
A继承B,A是在B的基础上修改如下函数而得到的。

当我们这样看待继承的时候,一种继承关系就是一种描述,而这种描述本身,也是可以被继承的。


动态语言生成代码比AOP之流容易多了,加上作为一等公民的函数对象,"Write code that writes code"非常容易。

严格的说,Code Generation分为运行时生成和源代码生成。

脚本语言短小,无需编译,利用脚本语言作源代码生成也越来越流行。

很多重复性的工作如翻译已有的接口成另一种语言,集成数据到代码中……都可以利用源代码生成。

举个Ruby生成C源代码的简单例子:

class CGenerator
  def int var, val
    puts "int #{var} = #{val};"
  end
end

c = CGenerator.new
c.instance_eval <<BLOCK
var = 'a'
val = 1
while var != 'z'
  int var, val
  var.succ!
  val += 1
end
BLOCK


结果:

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int h = 8;
int i = 9;
int j = 10;
int k = 11;
int l = 12;
int m = 13;
int n = 14;
int o = 15;
int p = 16;
int q = 17;
int r = 18;
int s = 19;
int t = 20;
int u = 21;
int v = 22;
int w = 23;
int x = 24;
int y = 25;


当然这个例子可能不太实用,不过继续扩展CGenerator,可以给编写带重复性的源代码省下不少工夫。

再高级一点的实践,就是将Code Generator做成MVC的形式,读入数据,处理,然后填入模版,时间所限就不举例了。

有兴趣可以看看 http://www.codegeneration.net/
1 楼 uda1341 2009-03-06  
为了摆脱人工修正过程,将模型调整纳入到概念世界中,我们需要超越继承机制的,更加强大的,新的技术手段。其实在当前的技术背景下,这一技术已经是呼之欲出了。这就是AOP, Aspect Oriented Programming。

继承机制其实是一种非常僵化和原始的方式,AOP也只是提供了适合特定模式的描述方式,函数式也并非万能药。

简单举一个例子,就继承而言,继承实际上是一种缩减的表达:
A继承B,A是在B的基础上修改如下函数而得到的。

当我们这样看待继承的时候,一种继承关系就是一种描述,而这种描述本身,也是可以被继承的。

相关推荐

    Flexsim编程常用代码.pdf

    在FlexSim中,用户可以通过编写代码来实现复杂的功能和逻辑,这些代码通常是C++语言的扩展。 【知识点一】FlexSim中的编程基础和常用对象操作 FlexSim的编程主要使用特定的类和方法,比如FSNode类。FSNode类代表了...

    一个fluent的源程序代码,自己编写的

    一个fluent的源程序代码,自己编写的一个fluent的源程序代码,自己编写的一个fluent的源程序代码,自己编写的一个fluent的源程序代码,自己编写的一个fluent的源程序代码,自己编写的

    STM32+modbus从站代码

    从站需要解析接收到的请求并构造响应。 2. **选择适当的库或开发工具**:STM32开发通常使用Keil uVision或IAR Embedded Workbench,配合HAL库或LL库进行编程。对于Modbus从站,可以使用开源的Modbus库,如Free...

    制造业产供销与往来系统源码-精品源代码 制造业产供销与往来系统源码-精品源代码

    源代码是程序员用编程语言编写的原始指令集合,是软件的基础,通过编译或解释转化为可执行程序。对于学习和定制软件功能来说,源代码具有极高的价值。 在这个制造业产供销与往来系统中,我们可以推测它可能包括以下...

    汇编编写com病毒的代码

    7. **道德问题**:需要注意的是,虽然学习病毒的编写原理可以增强安全意识,但实际制造和传播病毒是非法且有害的。因此,这些知识应仅用于教育和防御目的。 汇编语言编写COM病毒的代码虽然展示了底层编程的技巧,但...

    数控机床G代码解析demo提取G代码中的各种数据

    本教程以“数控机床G代码解析demo”为例,深入探讨如何从G代码程序中提取关键数据,如坐标值X和Y,以便进一步分析和应用。 G代码,也称为RS-274代码,是美国国家标准协会(ANSI)制定的一种标准,被广泛应用于各类...

    JAVA制造业MES生产管理源码

    JAVA制造业MES生产管理系统是工业4.0时代智能化生产的核心组件之一,它主要负责实时监控、调度和优化生产过程。源码的提供对于开发者和企业来说,具有极高的学习和实践价值,可以深入理解MES系统的架构设计与功能...

    PLC 底层源代码

    源码与编程软件的交互意味着用户可以通过图形化界面编写逻辑,然后直接下载到PLC中运行,无需进行额外的代码转换。 6. **MyPLC文件**:压缩包中的"MyPLC"可能是源代码工程文件或相关的文档资料,它包含了实现以上...

    G代码自动生成

    在机械工程领域,尤其是模具制造、精密零件加工以及3D打印中,G代码是不可或缺的工具。G代码自动生成是一种简化编程过程的技术,它通过软件自动创建这些指令,极大地提高了效率和准确性。 在这个项目中,使用Visual...

    源代码、技术文档管理制度

    - **定义**: 源代码不仅包括自行编写的程序代码,还包括相关的开发设计文档、第三方软件、控件及其他支持文件。 - **计算机处理**: 涉及源代码的计算机在转作他用或离开研发部门前,必须彻底清除硬盘中的源代码数据...

    GCode_Interpreterdc_gcode代码_Gcode_G代码_cnc_G代码解析_

    在实际应用中,G代码的灵活性使得CNC系统能够处理各种任务,从简单的切割和钻孔到复杂的三维雕刻和精密零件制造。为了优化效率和精度,程序员需要根据工件材料、刀具类型和设备性能来调整G代码参数。 G代码的解析和...

    标准G代码与标准M代码

    总结而言,G代码与M代码是实现数控加工的前提和基础,通过精确使用这些代码,数控编程人员可以控制机床完成从简单到复杂的各种加工任务。为了充分发挥数控机床的潜力,编写高质量的数控程序,编程人员应当深入学习和...

    G代码解释程序

    将G代码解释程序用C++ Builder编写,意味着开发者利用了C++的强大功能以及C++ Builder的便利性,构建了一个能够读取、解析和执行G代码的程序。这样的程序通常包含以下几个关键部分: 1. **输入解析**:程序需要能够...

    DXF转G代码

    辉达自动化编写的DXF转G代码工具是专为此目的设计的软件,它可以帮助用户将设计的DXF图形转换为适合CNC机床执行的G代码序列。该软件可能具备以下功能: 1. **DXF文件导入**:支持导入标准的DXF格式文件,读取其中的...

    Abaqus仿真模型:多道多层增材制造的动态生死单元代码与热源子热-力顺序耦合关联程序,Abaqus仿真模型:多道多层增材制造动态生死单元代码与热源子热-力顺序耦合关联程序,Abaqus 多道多层增材

    这些仿真模型的应用不仅可以帮助工程师更好地理解增材制造过程,而且可以为实际生产提供指导,从而提高增材制造的精度和效率,降低成本,加快产品从设计到成品的转化周期。 此外,仿真模型在多道多层增材制造中的...

    编写Downloader制造机VC源代码

    "编写Downloader制造机VC源代码"这一标题揭示了我们即将探讨的是一个使用Visual C++(VC)和MFC(Microsoft Foundation Classes)框架编写的下载器(Downloader)程序的源代码。下载器通常是一个软件工具,用于从...

    G代码资料和一个G代码程序

    学习G代码通常从理解基本指令开始,然后逐步深入到更复杂的应用,如循环、子程序和宏编程。资料中的G代码程序可能是实际的CNC加工案例,通过分析和模仿这些程序,学习者可以提升自己的编程能力。 此外,资料可能还...

    G代码查看器源码

    在数控加工中,程序员会编写一系列的G代码指令,这些指令详细描述了工件的加工路径和参数。 源码是程序的基础,包含了所有实现特定功能的代码行。对于“G代码查看器源码”而言,它可能包含以下几个关键部分: 1. *...

    G代码数控代码移动,资源描述3轴数控机床的G代码示例。包含克和米代码,这些代码。.rar

    掌握G代码意味着能够理解和编写自定义的数控程序,这对于制造业特别是精密零件制造领域具有不可估量的价值。通过研究压缩包中的G代码示例,学习者可以深入理解3轴数控机床的工作原理,并提高自己的编程技能。

    Verilog 代码编写

    ### Verilog 代码编写 #### 一、Verilog/VHDL 复习及基本模块的RTL设计流程 在数字IC设计领域,Verilog 和 VHDL 是两种非常重要的硬件描述语言(HDL)。这两种语言用于描述数字系统的逻辑行为,并且能够自动生成...

Global site tag (gtag.js) - Google Analytics