<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學生計算機學習社區(qū)

    CowNew開源團隊

    http://www.cownew.com 郵件請聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

    #

    定義一個ActionHandler:

    package com.test;

    import org.jbpm.graph.def.ActionHandler;
    import org.jbpm.graph.exe.ExecutionContext;

    public class MyAction implements ActionHandler
    {

     private static final long serialVersionUID = 1L;

     private String message;

     public String getMessage()
     {
      return message;
     }

     public void setMessage(String message)
     {
      this.message = message;
     }

     public void execute(ExecutionContext executionContext) throws Exception
     {
      System.out.println(message);
     }

    }


    定義一個流程文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <process-definition
      xmlns="urn:jbpm.org:jpdl-3.1"
      name="simple">
       <start-state name="start">
          <transition name="to_state" to="first">
             <action name="action" class="com.test.MyAction">
                <message>Going to the first state!</message>
             </action>
          </transition>
       </start-state>
       <state name="first">
          <transition name="to_end" to="end">
             <action name="action" class="com.test.MyAction">
                <message>About to finish!</message>
             </action>
          </transition>
       </state>
       <end-state name="end"></end-state>
    </process-definition>

    定義流程驅動類:

    package com.test;

    import java.io.IOException;
    import java.io.InputStream;

    import org.jbpm.graph.def.ProcessDefinition;
    import org.jbpm.graph.exe.ProcessInstance;

    public class Main
    {
     public static void main(String[] args) throws IOException
     {
      InputStream stream = Main.class.getResourceAsStream("processdefinition.xml");
      ProcessDefinition processDefinition = ProcessDefinition
        .parseXmlInputStream(stream);
      stream.close();
      ProcessInstance instance = new ProcessInstance(processDefinition);
      while (!instance.hasEnded())
      {
       instance.signal();
      }
     }
    }


    將jbpm***.jar、commons-logging**.jar和dom4j.jar三個包加入classpath就可以了。
    執(zhí)行結果:
    Going to the first state!
    About to finish!
    posted @ 2007-11-16 13:51 CowNew開源團隊 閱讀(2550) | 評論 (0)編輯 收藏

    package com.sample;

    import org.jbpm.graph.def.ProcessDefinition;
    import org.jbpm.graph.exe.ProcessInstance;

    public class Main
    {
     public static void main(String[] args)
     {
      ProcessDefinition processDefinition = ProcessDefinition
        .parseXmlResource("simple/processdefinition.xml");
      ProcessInstance instance = new ProcessInstance(processDefinition);
      while (!instance.hasEnded())
      {
       instance.signal();
      }
     }
    }



    不需要人工參與,不需要持久化狀態(tài),流程一次性短時間內(nèi)運行完成,其實這是把JBPM當成普通的流程圖運行引擎來用了,呵呵,大材小用了,:),不過省的自己寫流程運行引擎了。
    posted @ 2007-11-15 15:29 CowNew開源團隊 閱讀(510) | 評論 (0)編輯 收藏

    本章翻譯人 CowNew開源團隊 周曉

    記號流

    長久以來, 詞法分析器和語法分析器是緊緊耦合在一起的; 也就是說, 你不可以在他們中間做任何事情,也不能修改記號流。但是,用記號流來處理詞法分析器和語法分析器之間的連接的話,會給代碼識別和翻譯帶來極大的幫助。這個想法類似于Java的輸入輸出流,利用輸入輸出流你可以用管道的方式處理多個深加工的數(shù)據(jù)流。

    介紹

    ANTLR識別任何滿足TokenStream接口的記號流對象(2.6以前的版本, 這個接口叫做Tokenizer);也就是說記號流對象要實現(xiàn)以下的方法。

    Token nextToken();

    如圖, 在分析過程中的某一時刻,從詞法分析器(生產(chǎn)者)到語法分析器(消費者)的一般記號流會像是下面的樣子。

    lexer.to.parser.tokens.gif (3585 bytes)

    最普通的記號流是一個詞法分析器,但是想象一下,在詞法分析器和語法分析器中間有一個流的實體,都能做哪些有趣的事情呢。比如說,你可以:

    • 過濾掉不想要的記號
    • 插入一些輔助的記號,幫助語法分析過程識別一些復雜的結構
    • 把一個流分成多個流,把某些感興趣的記號送到不同的流中
    • 把多個記號流合并成一個流,從而“模擬”PCCTS,lex等詞法分析工具的狀態(tài)。

    記號流概念的優(yōu)雅在于它對詞法分析器和語法分析器沒有影響--它們只不過是流的生產(chǎn)者和消費者。流對象是消費者用來生產(chǎn),處理,合并或者分離記號流的過濾器??梢允挂延械脑~法分析器和語法分析器在不修改的情況下合并成一種新的工具。

    這份文檔正式提出了記號流的概念,詳細描述了一些非常有用的流過濾器。

    讓記號通過的記號流

    一個記號流是任何滿足下面接口的對象。

    public interface TokenStream {
    public Token nextToken()
        throws java.io.IOException;
    }

    例如, 一個"沒有操作"或者說僅僅是讓記號通過這里的過濾器是這樣工作的:

    import antlr.*;
    import java.io.IOException;
    class TokenStreamPassThrough
        implements TokenStream {
    protected TokenStream input;
    /** Stream to read tokens from */
      public TokenStreamPassThrough(TokenStream in) {
    input = in;
    }
    /** This makes us a stream */
      public Token nextToken() throws IOException {
    return input.nextToken(); // "short circuit"
    }
    }

    在下面的main()程序中,你使用這個簡單的流對象從詞法分析器中獲得記號,然后語法分析器從流對象中獲得記號。

    public static void main(String[] args) {
      MyLexer lexer =
    new MyLexer(new DataInputStream(System.in));
    TokenStreamPassThrough filter =
        new TokenStreamPassThrough(lexer);
    MyParser parser = new MyParser(filter);
      parser.startRule();
    }

    記號流過濾

    多數(shù)情況下,你希望詞法分析器忽略掉空白符和注釋,然而,你還希望在語法分析器必須使用注釋的情況下重用詞法分析器。這時,你只要為需要注釋和空白符連同普通記號的情況設計一個詞法分析器。然后,當你想忽略空白符的時候,只要在詞法分析器和語法分析器中間加入一個過濾器,過濾掉空白符。

    針對這種情況,ANTLR提供了TokenStreamBasicFilter。你可以在不修改詞法分析器的情況下讓它過過濾掉任何類型的記號。下面TokenStreamBasicFilter的用法的例子中過濾掉了注釋和空白符。

    public static void main(String[] args) {
      MyLexer lexer =
    new MyLexer(new DataInputStream(System.in));
    TokenStreamPassThrough filter =
        new TokenStreamPassThrough(lexer);
    filter.discard(MyParser.WS);
    filter.discard(MyParser.COMMENT);
      MyParser parser = new MyParser(filter);
      parser.startRule();
    }

    可以看到,它比修改詞法分析器的詞法結構要來的有效,你也會這么做的吧,因為這樣你不用去構建一個記號對象。另一方面,采用這種過濾流的方法使詞法分析器的設計更加靈活。

    記號流分離

    有時,在識別階段,你想讓翻譯器忽略但不是丟棄輸入的部分記號。比如說,你想在語法分析時忽略注釋,但在翻譯時又需要注釋。解決辦法是將注釋發(fā)送到一個隱藏的記號流中,所謂隱藏,就是語法分析器沒有對它進行監(jiān)聽。在識別期間,通過動作來檢查這些隱藏的流,收集注釋等等。流分離過濾器有點像棱鏡把白光分離成彩虹。

    下面的圖中示出了把一個記號流分成三個的情況。

    stream.splitter.gif (5527 bytes)

    讓語法分析器從最上面的流中獲得記號。

    用流分離器可以實現(xiàn)很多功能。比如,"Y-分離器"像有線電視Y連接器一樣,復制符號流。如果過濾器是線程安全的而且有緩沖器緩沖,過濾器就可以同時為多個語法分析器提供記號。

    這一節(jié)描述了ANTLR提供的一個叫做TokenStreamHiddenTokenFilter的流過濾器,它工作的時候有點像給一堆硬幣分類,把一分一分的放到一個箱子里,把一角一角的放到另一個箱子里,等等。這個過濾器把輸入流分離成兩個流,一個包含主要記號,另一個被緩沖以便以后可以訪問。因為這種實現(xiàn)方式,無論怎么做,你都無法讓語法分析器直接訪問隱藏流。下面你將會看到,過濾器實際上把隱藏記號交織在主記號中。

    例子

    考慮以下的簡單文法,該文法用來聲明整型變量.

    decls: (decl)+
    ;
    decl : begin:INT ID end:SEMI
    ; 

    比如說有以下輸入:

    int n; // list length
    /** doc */
    int f;

    假定詞法分析器忽略空白符,你用過濾器把注釋分離到一個隱藏流。那么現(xiàn)在如果語法分析器從主記號流中獲得記號,它只會看到"INT ID SEMI FLOAT ID SEMI",注釋在隱藏流中。實現(xiàn)了語法分析器可以忽略注釋,而你的語義動作可以從過濾器中查詢隱藏流中的記號。

    第一次識別出文法規(guī)則decl,begin記號前后沒有對隱藏記號的引用,但

    filter.getHiddenAfter(end)

    返回一個對下面記號的引用

    // list length

    接下來就會訪問到

    /** doc */

    第二次識別出decl

    filter.getHiddenBefore(begin)

    指向

    /** doc */

    的引用

    過濾器實現(xiàn)

    下圖示出記號對象是如何組織記號來模擬兩個不同的流。

    hidden.stream.gif (3667 bytes)

     

    因為記號是假定的,TokenStreamHiddenTokenFilter對象通過鏈表來連接隱藏記號和主記號。過濾器只提供了一個物理上的記號流,通過交織指針維護和管理記號次序。

    因為這個額外的指針需要把記號連接到一起,你必須要用一個叫CommonHiddenStreamToken的特殊記號對象(普通記號對象叫做CommonToken)。前面曾說過,你可以用以下的方法去指定詞法分析器為特定的類制造記號。

    lexer.setTokenObjectClass("classname");

    技術上,如果不請求特殊記號對象,也可以實現(xiàn)同樣功能的過濾器,但這樣實現(xiàn)非常有效率而且它很容易告訴詞法分析器去生成什么種類的記號。進一步說,這樣實現(xiàn)使得它很容易去自動完成包含隱藏流信息的樹結點的創(chuàng)建。

    這個過濾器影響ANTLR的懶惰消費。在識別每一個主記號之后, TokenStreamHiddenTokenFilter必須獲取下一個記號看它是不是一個隱藏記號。因此,這個過濾器在交互程序(比如命令行)下工作的不是很好。

    怎樣使用這個過濾器

    要使用TokenStreamHiddenTokenFilter,僅僅要做的是:

    • 創(chuàng)建詞法分析器,讓它創(chuàng)建鏈接隱藏記號的記號對象。
    MyLexer lexer = new MyLexer(some-input-stream);
    lexer.setTokenObjectClass(
      "antlr.CommonHiddenStreamToken"
    );
    • 創(chuàng)建一個TokenStreamHiddenTokenFilter對象,該對象從上面的詞法分析器中獲得記號。
    TokenStreamHiddenTokenFilter filter =
      new TokenStreamHiddenTokenFilter(lexer);
    • 設置TokenStreamHiddenTokenFilter要隱藏哪些記號,要丟棄哪些記號。例如,
    filter.discard(MyParser.WS);
    filter.hide(MyParser.SL_COMMENT);
    • 創(chuàng)建一個語法分析器,從TokenStreamHiddenTokenFilter而不是從詞法分析器中獲得記號。
    MyParser parser = new MyParser(filter);
    try {
    parser.startRule(); // parse as usual
    }
    catch (Exception e) {
    System.err.println(e.getMessage());
    }

    查看ANTLR指南,在preserving whitespace處有一個完整的例子。

    樹的構建

    最后,在翻譯階段,如果需要這些隱藏的流記號,在遍歷樹的時候,則可以按正常的方式使用。怎么做才能在不打亂樹文法的情況下把隱藏流的信息送給翻譯器呢?很簡單: 用AST結點儲存這些隱藏流記號。ANTLR定義了CommonASTWithHiddenTokens來自動連接隱藏流記號到樹結點; 聯(lián)合一個樹結點,適用于樹結點的方法在這里也適用于訪問這些隱藏記號。你只需要告訴語法分析器去創(chuàng)建這種類型的結點而不是默認的CommonAST類型的結點。

    parser.setASTNodeClass("antlr.CommonASTWithHiddenTokens");

    樹結點作為記號對象的功能被創(chuàng)建。當ASTFactory創(chuàng)建樹結點的時候,樹結點的initialize()方法被調用。從記號創(chuàng)建的樹結點包含隱藏記號,不管在前還是在后,都有著同樣的對隱藏記號的引用。你不需要用這個結點定義,但它工作在很多翻譯任務中:

    package antlr;
    /** CommonAST在初始化時把從記號中獲得
    *  的隱藏記號的信息復制,用來創(chuàng)建結點
    */
    public class CommonASTWithHiddenTokens
    extends CommonAST {
    // 指向隱藏記號
    protected Token hiddenBefore, hiddenAfter;
    public CommonHiddenStreamToken getHiddenAfter() {
        return hiddenAfter;
      }
    public CommonHiddenStreamToken getHiddenBefore() {
        return hiddenBefore;
      }
    public void initialize(Token tok) {
    CommonHiddenStreamToken t =
          (CommonHiddenStreamToken)tok;
    super.initialize(t);
    hiddenBefore = t.getHiddenBefore();
    hiddenAfter  = t.getHiddenAfter();
    }
    }

    注意到這個結點定義假設你用了CommonHiddenStreamToken對象。如果你沒有讓詞法分析器創(chuàng)建CommonHiddenStreamToken對象,就會出現(xiàn)運行時類下行異常。

    垃圾回收問題

    利用對主流記號的引用分隔輸入流,保存隱藏流記號時,GC允許在記號流上工作。在上面的整數(shù)聲明的例子中,當沒有更多的對第一個SEMI記號以及第二個INT記號的引用時,comment記號將會作為垃圾回收的候選人。如果所有的記號是連在一起的,一個單獨的對任意記號的引用會阻止任何記號被回收。這在ANTLR實現(xiàn)不是問題。

    提示

    翻譯時,過濾器在保存空白符和注釋方面做得很好,但在處理輸出和輸入相差很遠的情況下,用過濾器不是一個最好的辦法。例如,有3個注釋散布在一個輸入聲明語句中,你想在翻譯階段合并到輸出聲明語句的頭部。比起察看注釋周圍的每一個分析的記號,更好的辦法是有一個真正實際上分開的流來保存注釋以及一個方法去聯(lián)系分析好的記號的組和注釋流記號的組。你或許想支持像"給我在注釋流上從開始分析到結束分析時最初出現(xiàn)的的所有記號."

    這個過濾器實現(xiàn)了同JavaCC中special記號及其相似的功能。Sriram Sankar (JavaCC之父) 關于特殊記號有一個非常好的想法,在1997的Dr. T's Traveling Parsing Revival and Beer Tasting Festival,出席者認同了泛化記號流的概念?,F(xiàn)在JavaCC特殊記號功能僅僅是另一個ANTLR流過濾器,好處是你不用去為指定哪些記號是特殊的而修改詞法分析器。

    記號流多路技術 (又叫 "詞法分析器多狀態(tài)")

    現(xiàn)在,考慮一下相反的問題,你想合并多個流而不是把一個流分成多個。當你的輸入包含根本上不同的片段,比如說Java和JavaDoc注釋,你會發(fā)現(xiàn)僅用一個詞法分析器去識別所有的輸入片段是很難的。這主要是因為合并各種部分的記號定義會造成二義性詞法語言或者識別出一些錯誤的記號。例如,"final"在某些部分里是一個關鍵字,但在另一個部分里它可能會是一個標示符。同樣,"@author"是一個合法的javadoc注釋里的標記,但在Java代碼中,它是不合法的。

    大部分人為了解決這個問題,為詞法分析器設定了很多狀態(tài),在不同的部分里切換到不同的狀態(tài)來工作(例如,在"讀取Java模式"和"讀取JavaDoc模式"中間切換)。詞法分析器開始是以Java模式工作的,然后在遇到"/**"后切換到JavaDoc模式; "*/"強制切換回Java模式。

    多詞法分析器

    讓一個詞法分析器在多個狀態(tài)下工作可以解決上述的問題,但有一個更好的解決問題的辦法,讓多個詞法分析器協(xié)同工作,生成一個記號流。為什么說這種辦法更好呢?因為分開的詞法分析器更利于重用(不是剪貼粘貼,而僅僅是告訴流的多元管理器去切換不同的詞法分析器,就得到了一個新的詞法分析器)。例如,JavaDoc詞法分析器可以在解決任何有JavaDoc注釋的語言問題時得到重用。

    ANTLR預設了一個記號流叫做TokenStreamSelector,可以用它在多個詞法分析器間進行切換。不同詞法分析器中定義的動作控制這個選擇器切換輸入流??紤]下面的Java代碼片段。

    /** Test.
    *  @author Terence
    */
    int n;

    給出2個詞法分析器,JavaLexer和JavaDocLexer,2個詞法分析器的動作序列可能看起來是下面的樣子:

    JavaLexer: 匹配JAVADOC_OPEN, 切換到JavaDocLexer
    JavaDocLexer: 匹配AUTHOR
    JavaDocLexer: 匹配ID
    JavaDocLexer: 匹配JAVADOC_CLOSE, 切換回JavaLexer
    JavaLexer: 匹配INT
    JavaLexer: 匹配ID
    JavaLexer: 匹配SEMI

    在Java詞法分析器的文法中,你需要定義一個規(guī)則去切換到JavaDoc詞法分析器(把需要切換的詞法分析器記錄在棧中):

    JAVADOC_OPEN
    :    "/**" {selector.push("doclexer");}
    ;

    同樣地,在JavaDoc詞法分析器中定義一個規(guī)則切換回去:

    JAVADOC_CLOSE
    :    "*/" {selector.pop();}
    ;

    選擇器中有一個棧,所以JavaDoc詞法分析器不用知道誰調用了它。

    入圖,選擇器和并2個詞法分析器流,為下游的語法分析器提供單獨的一個記號流。

    stream.selector.gif (5976 bytes)

    選擇器可以為你維護流列表,所以你可以通過名字或者實際對象的引用來切換到另一個輸入流。

    public class TokenStreamSelector implements TokenStream {
    public TokenStreamSelector() {...}
    public void addInputStream(TokenStream stream,
        String key) {...}
    public void pop() {...}
    public void push(TokenStream stream) {...}
    public void push(String sname) {...}
    /** Set the stream without pushing old stream */
    public void select(TokenStream stream) {...}
    public void select(String sname)
        throws IllegalArgumentException {...}
    }

    用選擇器很簡單:

    • 創(chuàng)建一個選擇器。
    TokenStreamSelector selector =
    new TokenStreamSelector();
    • 為流命名(不是一定要命名--在切換的時候你可以用流對象的引用來避免使用哈希表查找)。
    selector.addInputStream(mainLexer, "main");
    selector.addInputStream(doclexer, "doclexer");
    • 選擇哪一個詞法分析器先從字符流中讀數(shù)據(jù)。
    // start with main java lexer
    selector.select("main");
    • 語法分析器可以像用詞法分析器一樣使用選擇器。
    JavaParser parser = new JavaParser(selector);

    詞法分析器共享同一字符流

    在介紹語法分析器如何使用選擇器之前,注意一下這2個詞法分析器都要從同一個輸入流中讀取字符。以前的ANTLR2.6.0版本,每一個詞法分析器都有它自己的記錄行號的變量,輸入字符流變量等等。為了共享同樣的輸入狀態(tài),ANTLR2.6.0代理詞法分析器來處理字符輸入到對象中,LexerSharedInputState可以被n個詞法分析器共享(單線程)。為了讓多個詞法分析器共享狀態(tài),你創(chuàng)建第一個詞法分析器,獲得它的輸入狀態(tài)對象,然后在構建其它詞法分析器并且需要共享輸入狀態(tài)的時候使用它:

    // 創(chuàng)建Java詞法分析器
    JavaLexer mainLexer = new JavaLexer(input);
    // 創(chuàng)建javadoc詞法分析器; 使用
    // java詞法分析器的共享輸入狀態(tài)
    JavaDocLexer doclexer =
      new JavaDocLexer(mainLexer.getInputState());

    分析多元記號流

    就像一個詞法分析器在從不同的輸入片段中生產(chǎn)一個單獨的流會遇到很多麻煩,一個單獨的語法分析器在處理多記號流的時候也會遇到一些麻煩。又是同樣的問題,一個記號在一個詞法分析器中可能是一個關鍵字,在另一個詞法分析器中可能會是一個標示符。把語法分析器分解成子分析器,為每一個輸入片段單獨處理它們的單詞表,這樣做同時也利于語法分析器的重用。

    下面的語法分析器文法用主詞法記號的詞表(用importVocab指定),在遇到JAVADOC_OPEN的時候,它創(chuàng)建并且調用一個JavaDoc分析器去處理接下來在注釋中的記號流。

    class JavaParser extends Parser;
    options {
    importVocab=Java;
    }
    input
    :   ( (javadoc)? INT ID SEMI )+
    ;
    javadoc
    :   JAVADOC_OPEN
    {
            // 創(chuàng)建一個分析器去處理javadoc注釋
    JavaDocParser jdocparser =
              new JavaDocParser(getInputState());
    jdocparser.content(); // 用jdocparser繼續(xù)分析
    }
            JAVADOC_CLOSE
    ;

    你會發(fā)現(xiàn)從2.6.0版本起,ANTLR語法分析器也共享記號輸入流狀態(tài)。當創(chuàng)建"子分析器"時, JavaParser告訴它從同一輸入狀態(tài)對象中獲取記號。

    JavaDoc分析器匹配一串標簽:

    class JavaDocParser extends Parser;
    options {
    importVocab=JavaDoc;
    }
    content
    :   (   PARAM // includes ID as part of PARAM
    |   EXCEPTION
            |   AUTHOR
    )*
    ;

    當子分析器規(guī)則content結束后,控制權自然地返回給它的調用方,也就是Java分析器中的javadoc。

    多記號流超前掃描的作用

    如果語法分析器需要去查看JavaDOc注釋起始位置后的2個記號,那會發(fā)生什么呢?換句話說,以主分析器來看,JAVADOC_OPEN之后的記號是什么呢? 自然是記號 JAVADOC_CLOSE! 主分析器把任何JavaDoc注釋都看作是一個實體,不管這個注釋有多復雜; 它不用去了解注釋記號流內(nèi)部情況,它也不需要這么做--子分析器會去處理這件事情。

    在子分析器中,content規(guī)則后是什么記號呢?是"End of file"記號。子分析器的分析過程不能確定你的代碼中將會調用怎樣的方法。但這不是一個問題,因為一般情況會有一個單獨的記號標示子分析過程的結束。即使因為某種原因EOF被載入到分析過程,EOF也不會出現(xiàn)在記號流中。

    多詞法分析器vs調用另一條詞法規(guī)則

    多詞法分析器狀態(tài)也經(jīng)常被用來處理那些非常復雜的單個記號,比如說嵌入轉義字符的字符串,輸入"\t"應該被識別為一個字符串。針對這種情況,典型的做法是在第一個引號之后,切換詞法分析器到"字符串狀態(tài)"然后在識別完字符串之后切換回"普通狀態(tài)"。

    所以把這種代碼依靠模式做事情的方式叫做"模態(tài)"編程,這通常是一個比較差的方式。在這種復雜記號的情況下,最好是用多個規(guī)則直接指定復雜的記號。這里有一個什么時候該用多記號流和什么時候不該用的黃金規(guī)則:

    復雜的單個記號應該通過調用另一個(protected)詞法規(guī)則來匹配,對一段輸入片段來說應該用多個詞法分析器處理此輸入流并提供給分析器。

    例如,詞法分析器字符串的定義應該僅僅是調用另一個規(guī)則來處理轉義字符的情況:

    STRING_LITERAL
    :    '"' (ESC|~('"'|'\\'))* '"'
    ;
    protected // 不是一個記號; 僅僅被另一個規(guī)則調用
    ESC
    :    '\\'
    (    'n'
    |    'r'
    |    't'
    |    'b'
    |    'f'
    |    '"'
    |    '\''
    |    '\\'
    |    ('u')+
                 HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ...
    )
        ;

    TokenStreamRewriteEngine 簡單的語法制導翻譯

    在很多情況下,你希望在原代碼基礎上修改或者增加一段程序或數(shù)據(jù)文件。ANTLR 2.7.3 介紹了一個(只有Java/C#版本)非常簡單但非常強大的類TokenStream處理以下問題:
    1. 輸出語言和輸入語言相似
    2. 語言元素的相對次序不改變
    參見antlr網(wǎng)站上的
    Syntax Directed TokenStream Rewriting

    將來

    ANTLR 2.6版本為使用記號流提供了基本結構,一旦我們有經(jīng)驗使用它們,今后的版本將會更加強大。

    現(xiàn)在的"隱藏記號"流過濾器解決"忽略但保存空白符"的問題解決的很好,但它在很多情況下不能很好的處理注釋。例如,在真正的翻譯過程中,你想在各種單獨的樹結點上收集注釋(像DECL或者METHOD)而不是把它們分布在樹的各個地方。你迫切需要一個流分離器緩沖注釋到一個隔離的流中,這時你就可以說"給我在識別這個規(guī)則上所用掉的所有注釋"或者 "給我這2個記號之間的所有注釋." 這幾乎是你在注釋翻譯時所需要的所有功能。

    記號流會帶來很多便利。大部分人不經(jīng)常思考關于記號流的事,使得很難去想象可以在其他一些什么地方可以變的更好。讓思想更奔放一些。怎樣處理嵌入語言的輸入片段,就像你所能看到的Java中嵌入SQL(每一個輸入的部分被分開并通過不同的流)。怎么樣分析含有和不含有調試信息的Java .class文件?如果你有一個可以分析不含調試信息的.class文件分析器,你想用這個來分析含有調試信息的.class文件,不要去管這個分析器,為你的詞法分析器新增關于調試信息的結構。然后用一個過濾器分離調試信息記號到另一個流,這樣,對兩種類型的.class文件,原來的分析器都可以正常工作了。

    稍后,我想加一個"視圖",這是真正的另一個查看過濾器的方法。想象一下從一個詞法分析器(根視圖)中發(fā)射出一個未加工的記號流。對它,我可以非常輕松的構建一棵視圖樹。例如,給出一個嵌有SQL的Java程序,你可能想為分析或翻譯在輸入流上建立視圖,會是下面的樣子:

    stream.perspectives.gif (2679 bytes)

    你可以把SQL流或者去掉注釋的Java流交給你的語法分析器處理,分析器中的動作也可以去訪問注釋流。

    將來,我還會增加分析器的另一個功能,去生成記號流(或文本)作為輸出,就像建立了樹一樣。用這樣方式,多傳遞分析變得十分自然和簡單,因為語法分析器也變成了流的生產(chǎn)者。一個語法分析器的輸出可以是另一個語法分析器的輸入。

    Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/streams.html#1 $

    posted @ 2007-11-13 21:25 CowNew開源團隊 閱讀(2019) | 評論 (5)編輯 收藏

        看到CSDN上有很多人在討論漢語言編程,有人把“漢編”罵的狗血噴頭,有人在苦苦支撐自己的“民族特色”。我感覺罵 “漢編”的人們是過于西化了,而苦苦維護“漢編”的人們又過于保守了,那么我就發(fā)表一下我中庸而又和諧的想法:在目前這種結構化的編程語言中,“漢編”是沒有什么意義的,理由我就不說了,很多人已經(jīng)慷慨陳詞了;我認為“漢編”的希望在明天,等到自然語言理論發(fā)展起來的時候,“漢編”將會有自己的用武之地。想一下也許下面的代碼對于中文或者英文來說沒有區(qū)別:

    if you.tired then you.sleep();

    如果 你.累了 那么 你.睡覺

        可是下面的自然語言化的代碼就有意義了:

    if you're tired ,please fall aleep

    累了的話就睡吧/累了就睡唄/如果累了就睡

        想想如果能夠實現(xiàn)用自然語言控制計算機的話,漢語言編程還沒有意義嗎?如果再結合語音識別,那么做為一個純種中國老爺們兒,你是愿意假裝歸國華僑似的對著電腦說“Please format disk c if you receive command 'ok'!”,還是愿意用純種國語說“收到'ok'就把c盤給它格式化嘍”呢???
    好好發(fā)展?jié)h語言的自然語言理論吧。

    posted @ 2007-11-12 09:51 CowNew開源團隊 閱讀(750) | 評論 (9)編輯 收藏

        上午第一個Session:突出重圍,使用軟件工廠和MSF成功打造優(yōu)質的企業(yè)應用。因為昨天聽的一個關于“微軟軟件工廠”的講座,所以來聽這個Session也是為了加深對“微軟軟件工廠”的認識的,來了一個才知道這個Session更多講的是MSF。MSF是微軟提出的一個軟件開發(fā)方法學,我是第一次聽說MSF,通過這個Session我感覺MSF是敏捷開發(fā)與CMMI的一個結合體。由于采用“微軟軟件工廠”以后系統(tǒng)就分為核心模塊開發(fā)和外圍Features的開發(fā)。采用MSF以后核心模塊做不斷的持續(xù)集成,而外圍Features則在核心平臺的每一個版本出來以后再做周期性集成。針對目前很多國內(nèi)項目人數(shù)比較少的現(xiàn)狀,他提出了進行角色合并的方式來組成一個小團隊,比如測試人員和產(chǎn)品經(jīng)理可以合并,但是開發(fā)人員就不能和測試人員合并。
        國內(nèi)軟件企業(yè)面臨的問題:
    (1)、整體軟件業(yè)在快速增長,但主要在外包領域
    (2)、受到國外ISV強烈挑戰(zhàn),沒有掌握標準和話語權。大部分是在做系統(tǒng)集成工作。
    (3)、平臺產(chǎn)品難以外化,成功外化的盜版橫行。自己的平臺自己用,一旦開放就會被盜版。比如WPS就無法維持金山的生存。
    (4)、不重視規(guī)避法律問題。很多商業(yè)項目中大量使用GPL協(xié)議的開源產(chǎn)品。
    (5)、項目管理和開發(fā)流程不規(guī)范,失敗率高盈利率低
    (6)、時間緊任務急,客戶需求多變
    (7)、人員素質參差不齊,缺乏優(yōu)秀團隊模型和技術交流
    (8)、沒有駕馭優(yōu)質企業(yè)應用的經(jīng)驗,上線后問題眾多。比如奧運訂票網(wǎng)站的當級就是一個最生動的例子。
        通過這個Session,我也終于糾正了我昨天的一個錯誤“微軟軟件工廠就是代碼生成”,現(xiàn)在我的認識是“微軟軟件工廠就是基于某些方法論和架構的代碼生成”,并且生成的代碼也是無法用其他手法消除掉的boring代碼。
        上午第二個Session:SilverLight開發(fā)的極速體驗。講師是微軟的美女郭曉穎(偶也系廣大色狼中的一份子),講座風格很有女孩子的特點,不知道是不是她做講座的經(jīng)驗不多,感覺語氣過于平淡,有點令人boring。SilverLight非常容易開發(fā)、調試和部署,可以很容易的自定義控件,并且可以很容易與服務器交互,比如在SilverLight中只要調用被標記為WebMethod的方法就可以很容易的與服務器交互;還可以在SilverLight中調用腳本或者Dom。
        講座結束以后我提問了我最關心的兩個問題:是否可以把自定義的ActiveX控件加入SilverLight(應用場景就是用SilverLight做網(wǎng)銀客戶端);SilverLight是否可以操作本地硬件(應用場景就是用SilverLight做銀行柜員終端顯示技術)。這兩個問題得到的回答都是“NO”,很失望,看來SilverLight是不能用來做銀行相關的這些東西了,也許微軟只是把它定位為一個多媒體的東西吧。
        下午第一個Session:SilverLight1.1CLR內(nèi)核架構。講師是andrew pardoe和美女郭曉穎。這也是我唯一聽的一個英文課程。可能考慮到了在場的大部分是國人,所以andrew的英文發(fā)音挺標準、聽起來不算費勁,而且他還不時的蹦出幾個中國字“你好,我是from。。。來的,不是牛”,呵呵。他主要講了SilverLight的底層CoreCLR的實現(xiàn)內(nèi)幕,不熟悉的讀者可以把CoreCLR想像成運行SilverLight的虛擬機。CoreCLR和代碼實用的是和CLR一樣的代碼,所以GC(垃圾收集)、JIT(實時編譯,呵呵,從JavaHotSpot中學去的技術)都依然是存在的。不過為了減少無用的功能以減小CoreCLR的尺寸以及為了使用沙箱機制來保證應用的安全性,因此移除了正則表達式的編譯、本地代碼調用等功能,并且對于文件系統(tǒng)的訪問也進行了受限處理(這讓我想起了J2ME以及Applet)。由于CoreCLR就是SilverLight的虛擬機,所以客戶端機器無需安裝.Net Framework也能Run SilverLight的應用,這也就是為什么MACOS中也能Run SilverLight了,所以如果有耐心,我們也可以讓SilverLight Run在Unix以及其他操作系統(tǒng)下。目前SilverLight即將支持Linux,不過SilverLight是只能運行在SUSE下的,不能運行在其他的Linux下,看來這也是和Novell合作的結果,剛才查了一下SUSE下是使用MONO實現(xiàn)的CoreCLR。
        這個Session中讓我感到的一個亮點是我們可以用Python(IronPython)以及Ruby(IronRuby)來寫SilverLight(任何能生成CLR的語言都可以用來寫SilverLight),也就是完全可以在運行時動態(tài)運行SilverLight。andrew用的演示Demo就是IronPython寫的一個在線Python命令行界面,在這個界面中敲入Python指令就可以使得SilverLight中的圖形發(fā)生變化,真的是太棒了。
        講座完了以后我同樣問了andrew一個問題:從Tech-Ed的一開始到現(xiàn)在,我們看到的都是用SilverLight寫游戲、寫媒體播放器,那么我們是否可以用SilverLight來寫企業(yè)級應用。也許是andrew只是做CoreCLR底層技術的,所以對這種商業(yè)性的問題也并不是很清楚,所以他的回答是:微軟是一家大公司,而且我們有很多的合作ISV,所以沒有做不到的事情,他還說百度不是用SilverLight做出來企業(yè)級應用嗎(我注:貌似百度的那個視頻播放頻道不是我指的那種企業(yè)級應用)?他的回答比較失望,再次驗證了我的結論:SilverLight只是用來做Game、Player等多媒體應用的東西,微軟沒有打算讓我們用它來做企業(yè)級應用的表現(xiàn)層。   

        下午第二個Session:SoftGrid應用程序虛擬化。這個專題也是我最期待的。本以為SoftGrid是開幕式上鮑爾默演示的那個虛擬Office,聽了以后才明白鮑爾默演示的是升級版的Windows Terminal,只是進行了輸入輸出的重定向。而SoftGrid則是另外一種程序的部署方式。程序以文件的形式保存在SoftGrid服務器中,當用戶要運行程序的時候,只需要下載程序運行所需的最小組件集合(dll等),然后就可以運行了。程序是運行在客戶機的SoftGrid提供的一個虛擬環(huán)境中,這個虛擬環(huán)境模擬了COM、注冊表、字體等關鍵位置的調用,這樣應用程序所做的任何修改都只會影響到這個虛擬環(huán)境,不過對客戶機產(chǎn)生任何修改,這樣就可以輕松運行相沖突的軟件了(比如Office2003是不能和Office97同時安裝的,但是通過使用SoftGrid,我們就可以在一臺機器中同時運行他們)。由于SoftGridClient只是模擬了COM、注冊表、字體等,并不像VMWare、VPC那樣完全模擬以計算機,所以其運行效率非常高。由于它不像Windows Terminal那樣是運行在遠程終端服務器中的,所以可以減小服務器的壓力、提高客戶端的響應,而且不像Windows Terminal那樣受服務器版本的限制大,同時當服務器Down掉或者處于脫機環(huán)境中的時候程序仍然可以運行(再次提醒,程序是Run在客戶端的,而不是運行在服務器端的)。講師給出的一個性能數(shù)據(jù)是:一臺服務器上可以Run 1000個客戶端。
        SoftGrid不是Windows Terminal的終結者,它和Windows Terminal之間是一個互補的解決方案,在某些應用場景下可以發(fā)揮各自的優(yōu)勢來實現(xiàn)組合應用。
        不過SoftGrid進行組件的依賴性判斷不可能是完全準確的(比如有可能是動態(tài)的組件調用或者運行的程序是Java程序),所以如果第一次不是100%下載,那么運行時有可能出錯,而如果第一次是100%下載,則就會大大減慢程序的部署速度。不過SoftGrid只是微軟的一個剛剛起步的技術,希望它未來的發(fā)展不會讓我們失望。也許銀行的圖形前端技術也能用它來實現(xiàn)呢!

        下午第三個Session:通過微軟Office Communications Server2007召開企業(yè)級的音頻視頻和在線會議。這是今年Tech-Ed的最后一節(jié)課,大部分人已經(jīng)提前離開九華山莊了,所以參加課程的人非常少,主講用非常幽默的方式把大家全部集中到了會議室的前邊。由于是第一次接觸OCS(因為錯過了前邊了解OCS的Session,所以我把握住了最后這個機會來了解它)。由于聽課的人中有相當大一部分(聽課的一共才二三十個人,呵呵)不了解OCS,所以主講首先介紹了OCS,正好滿足了我的愿望。OCS是一個非常優(yōu)秀的企業(yè)級的辦公系統(tǒng),可以非常方便的使得員工能夠通過語音、郵件、視頻等各種方式進行交流,而且可以借助于會議預定、預約等功能輕松的進行時間管理。這個Session主要講的就是使用OCS來組建公司內(nèi)網(wǎng)視頻會議系統(tǒng),優(yōu)點多多,無奈我是門外漢,只是概念上有了了解,這里就不獻丑了。最后的一節(jié)課我回答對了問題,得到了我的唯一一個獎品:《Exchange Server2007安裝部署指南》,正好送給我們公司做信息管理的同事:)。
        三天的Tech-Ed就此結束,離開的時候還有點戀戀不舍。我這三天的“報道”也到此結束了,當然我對Tech-Ed的學習還沒有到此結束,不僅因為很多我感興趣的Session由于與我選的其他Session時間沖突造成沒法去學習,而且也因為這三天我接觸了很多好東西,需要進一步了解,這樣我就需要對照著那三大本講義繼續(xù)研究微軟產(chǎn)品好的一些東西。以后我也很可能會把我學習的經(jīng)驗教訓繼續(xù)與大家分享,不過這可不是我的promise呀,我盡力吧!好啦,午夜了,也該休息了,這三天睡眠明顯不足(聽課也比工作更累人,今天早晨都用咖啡來提神了),正好好好利用周六補個覺嘍,明天睡到太陽下山,哈哈,晚安!

    posted @ 2007-11-10 00:19 CowNew開源團隊 閱讀(1385) | 評論 (5)編輯 收藏

        上午第一個Session:微軟IT Exchange Server2007的架構和設計。本來是想去了解一下Exchange的基本應用的,去了以后才知道是講微軟是怎么搭建他們的全球郵件系統(tǒng)的,由于以前沒有用過Exchange,所以聽得云里霧里的。主要的思想就是怎么進行網(wǎng)絡拓撲設計和防火墻、防垃圾郵件服務器的組合。
        上午第二個Session:SharePoint企業(yè)應用集錦。講了SharePoint的三個典型案例:服務型政府門戶、面向知識的文檔管理和IT支持管理,沒感覺有啥特別的。
        中午在“合作伙伴展區(qū)”中看到了博客園的宣傳廣告,呵呵,祝咱們的dudu越來越好,也希望dudu多來關心俺們blogjava的兄弟呀,別把我們忘了,什么.Net開發(fā)者、Java開發(fā)者的,大家都是搞技術的,那些區(qū)別只是對廠商而言的,咱們都是“開發(fā)人員”,不要分那么多小類別,不要搞內(nèi)斗,呵呵。
        下午第一個Session:深入剖析S+S應用。Saas應用的必備的幾個特性:Try before buy(也就是用戶在購買之前可以體驗);pay what I use(用戶只需要購買他需要的服務,減少資源浪費,降低投資);要支持離線應用,并且支持富客戶端的前端表現(xiàn);SIMT(單實例多租用,無需為單個的客戶進行個性化開發(fā),所有的客戶應用都run在同一個平臺下,只是利用其可配置性進行個性化配置)。
        微軟這次大會一直在推薦他們收購的FaceBook,也多次提到Saas的基礎理論--長尾理論,也就是不像以前的那樣只賺富人的錢了,“從1000個窮人那里賺來的錢會和一個富人的錢一樣多,但是也許所有從窮人那里賺來錢的總和也許會比從富人那里賺來的錢的總和還多”,也就是降低軟件使用的價格,使得更多人能買軟件(或者服務)。Saas的生態(tài)系統(tǒng)中有兩個特色的角色:ISV和Saas hoster,ISV在Saas hoster提供的平臺進行應用的開發(fā)為最終用戶服務,而Saas hoster提供平臺、計費交易、監(jiān)控監(jiān)管等服務,這樣兩者雙贏共生,想必微軟是想成為一個Saas hoster,從而把眾多的ISV繼續(xù)團結到它周圍,它繼續(xù)做第四代軟件革命的領導者。微軟的Saas讓我想起了動易CMS和眾多的動易模板提供商之間的關系。
        課中講了微軟給的一個Saas的案例性應用:LitwareHR,這是一個提供人員招聘的服務,企業(yè)可以個性化的進行招聘頁面的定制。實現(xiàn)可配置性的時候使用了元數(shù)據(jù)技術。講師提到了實現(xiàn)可配置性有兩種實現(xiàn)技術:預留字段和元數(shù)據(jù)。預留字段是最傳統(tǒng)也是最土的技術,其可擴展性是受限的,不過效率也許會稍微高一點;采用元數(shù)據(jù)技術(可以在數(shù)據(jù)庫中通過基于DB的擴展鍵值來實現(xiàn)元數(shù)據(jù),也可以使用SQLServer2005提供的XML數(shù)據(jù)類型來實現(xiàn))可以實現(xiàn)不受限的可擴展性。
        實現(xiàn)SIMT可以有三種實現(xiàn)技術:Separated DB,每個用戶一個數(shù)據(jù)庫,這樣數(shù)據(jù)的安全性最好,實現(xiàn)簡單,但是對軟硬件的投資需要非常高;Separated Schema,每個用戶一個表,這樣軟硬件投資會少一些;Shared Schema,用戶共享一個表,通過一個類似于UserId的字段來分辨當前記錄屬于哪個用戶。
        講師還演示了微軟的“軟件工廠”。其實就是代碼生成技術,開發(fā)人員只要簡單配置就可以生成以前需要手工編寫的代碼。個人感覺這東西沒什么,而且我認為“代碼生成器”是最土的一種“復用性”技術,只有萬不得已的時候采用。不過如果“軟件工廠”能發(fā)展起來的話,也許能養(yǎng)活一批專門制造各種不同“軟件工廠模板”的廠商,也許這又是微軟說的“生態(tài)系統(tǒng)”吧。
        下午第二個Session:面向Web.netxt的兵器譜。主要講了SilverLight的優(yōu)勢。SilverLight可以運行在很多主流瀏覽器上,用戶端的操作系統(tǒng)可以是非Windows,而且服務器端也可以支持非Windows操作系統(tǒng)。SilverLight的內(nèi)容是XML格式,可以很容易被搜索引擎收錄到,而Flash則是二進制格式,很難被搜索引擎支持。SilverLight支持DRM(數(shù)字版權管理),這樣就不用擔心像Flash那樣被別人盜用了。SilverLight能夠支持JavaScript、C#、VB.NET、J#等多種語言編寫,容易上手而Flash則支持ActionScript。最重要的,美工人員可以用Expression來進行美工設計,然后生成的工程可以被開發(fā)人員在VS.Net Studio以一個工程的形式被打開以進行程序設計,這樣美工人員和程序開發(fā)人員就可以很好的協(xié)作了,不像Flash那樣要求開發(fā)人員既要懂美工又要懂Development。
        下午第三個Session:基于BizTalk RFID快速構建RFID應用。因為我上大學時候是學物流的,對RFID接觸比較多,所以就來“溫習”一下自己對RFID的知識了。使用BizTalk RFID我們能容易開發(fā)出RFID應用,降低了開發(fā)難度。由于RFID涉及到很多非純軟件技術的東西,所以這里就不介紹了,有興趣可以去搜索“RFID”、“射頻”、“條形碼”等關鍵字:)??雌饋鞡izTalk RFID是微軟新推出的技術,目前還在需要能進行推廣的合作伙伴。
        下午第四個Session:Office Business Application實戰(zhàn):SharePoint在企業(yè)SOA環(huán)境中的應用。演示了一個真實的基于SharePoint的應用,講師也是來自微軟的一個合作伙伴。看了以后感覺微軟的SharePoint、InfoPath、Office之類的系統(tǒng)結合還是非常密切的,用好了的話能輕松解決很多問題,門檻非常低。比如業(yè)務人員可以直接使用Excel錄入數(shù)據(jù),然后可以直接把數(shù)據(jù)發(fā)布到SharePoint中,而SharePoint則會定時把這些數(shù)據(jù)提交到后臺系統(tǒng)。而且我們可以在Excel中嵌入自己用WinForm編寫的界面,完全把Excel做成了一個業(yè)務系統(tǒng)的前臺界面的開發(fā)平臺了,這樣業(yè)務人員只要會用Excel就可以了,不僅可以實現(xiàn)各個企業(yè)的個性化要求,而且可以直接使用Excel的高級功能進行功能擴展,“會用Excel就會操作所有業(yè)務系統(tǒng)”,這一點讓我想起了一個叫“Excel服務器”的產(chǎn)品。在普通程序開發(fā)中,我們復用的是程序代碼;而在SOA中,我們復用的是服務,并且業(yè)務人員就可以將這些服務拼裝起來從而滿足自己的要求。
        晚上是“UC之夜”晚宴,來了美女跳熱舞,呵呵。明天是最后一天,期望明天能學到更多東西:)
    posted @ 2007-11-09 00:08 CowNew開源團隊 閱讀(1371) | 評論 (5)編輯 收藏

        微軟的技術也許不是最好的,但是確實是把技術與商業(yè)化結合最好的公司之一,也是比較具有市場前瞻性的公司;拋棄那些商業(yè)色彩過濃的東西,完全站在技術的視角,微軟也確實是一個值得去仔細研究的公司。正好公司有一個去參加微軟2007技術大會(Tech-Ed)的機會,因此就參加了今年的Tech-Ed。
        早晨6點起床、刷牙、洗臉,6:30打的去首都大酒店,7:20到達首都大酒店,領了人民大會堂的請柬,然后坐班車去人民大會堂,8:10會開始安檢、入場。
        9:10分大會開始。微軟CEO 鮑爾默(據(jù)說是比張飛脾氣還大,直接和蓋茨拍桌子的主兒)致開幕詞,主題是《Dynamic IT》,核心思想就是:目前的IT系統(tǒng)發(fā)展已經(jīng)進入了一個新階段了,大部分力量投入在舊系統(tǒng)的維護和整合上,因此我們必須去適應這種形勢,用Dynamic的技術去建設Dynamic的和諧IT。
        鮑爾默演講中還穿插的以百度的一個新版音樂網(wǎng)站演示了SilverLight技術,微軟把SilverLight放到這么重要的位置來推薦,可以看到微軟對SilverLight的推廣決心,看來Flash要被小小的動搖一下了。SilverLight這種Smart Client技術確實是不錯的技術,希望能幫助我們更容易開發(fā)、部署出功能更強的系統(tǒng)。看來這是合久必分呀,C/S發(fā)展到B/S,然后又回歸到了以Smart Client為基礎的C/S,終于令人惡心的Web開發(fā)技術早晚淘汰了!
        老鮑講完了以后,微軟大中華區(qū)的首席技術官做主題演講,他主要講了微軟現(xiàn)在主推的三項技術:基于Office套件的辦公一體化;Open XML;虛擬化?;贠ffice套件的辦公一體化還是那一套綜合利用Live Meeting、Outlook什么的實現(xiàn)無紙化、更高效的辦公;Open XML就沒啥新鮮的了,還美其名曰“咱們的文檔幾百年后的后人也能閱讀”;虛擬化大部分也很老套,不過令我感覺震撼的是新的遠程應用程序部署模式:程序可以將Office之類的應用程序直接在服務器端“推送”到客戶端,并且只是放一個幾十KB的文件而已,根本不用在客戶端安裝程序,所有程序都運行在遠程服務器中,但是如果單獨是這一點并不新奇,因為Citrix metaframe早就實現(xiàn)類似技術了,它的亮點是用戶可以直接打開和保存客戶端上的文件,而不像metaframe那樣只能打開和保存在服務器上的文件。
        11點大會結束,坐車去九華山莊,12點到達九華山莊(離著名的小湯山很近)分會場,1點就餐完畢。因為下午2點課程才開始,所以就在會場里邊轉悠,在本次大會的贊助合作伙伴的展臺前看一下,重點看了一下K2和Bussiness Objects。以前沒有聽說過K2,它是一家美國公司,專業(yè)做工作流開發(fā)工具的,開始進軍中國市場,看來今后這種專業(yè)提供技術解決方案的公司會越來越多的,中國的IT終于該上一個臺階了,不要再繼續(xù)當世界軟件工廠了,要擁有自己的核心技術!也許你沒聽說過Bussiness Objects,但是不能沒聽說過水晶報表,是微軟把這個小弟親手扶植起來的,看來OEM的力量強大呀(當時投靠Borland的那些控件廠商跟錯了隊伍了呀,很多挺好的技術沒有得到發(fā)揚?。?br />     14:00至15:15去聽了關于SCVMM的講座(俺們的盆盆講的)。主要講了微軟的虛擬化技術,SCVMM(System Center virtual Machine Manangement)是System Center重要的組成部分,應該是由VirtualPc發(fā)展起來,不過針對Windows平臺進行了更多個性化的定制,這樣能夠更緊密的和Windows聯(lián)系(劣勢當然就是不再支持Linux之類的系統(tǒng))。使用虛擬化技術可以減少硬件的投入、提高硬件的資源利用率,更容易的管理。SCVMM還有一個很貼心的功能:自主化服務。使用這個功能,企業(yè)的員工完全可以根據(jù)自己的需要在服務器上自助化的創(chuàng)建虛擬機,而且用完了可以刪除,這樣完全不需要公司的硬件運維人員操心了。SCVMM提供的P2V功能可以將一臺物理機遷移為一臺虛擬機。
        15:30至16:45去聽了關于S+S(軟件加服務)的講座。S+S的三劍客:Saas、SOA和Web2.0。用主講的話說:微軟“豪賭”S+S。計算機發(fā)展的第一個階段是提供單獨軟件;第二階段是提供IT托管;第三個階段將是提供服務的階段。微軟收購FaceBook也是基于發(fā)展S+S的策略,未來的Office將提供單機版和在線Office兩種版本,使用在線Office我們只需要在用的時候按月付費就可以,不用了就不用交錢。而且基于S+S還將形成新的軟件生態(tài)系統(tǒng),每個人都可以輕松發(fā)布服務和利用其他人提供的服務。像CRM、OA之類的應用完全可以做到以服務的形式購買,只要滿足個性化定制的可擴展性就可以,這樣也可以養(yǎng)活一些專業(yè)做個性化定制的廠商。用主講的話說:可以把眼光放在S+S,未來的一流IT企業(yè)一定會有S+S的公司。講座中還演示了一個未來IT生活的片段,家庭中一切設備都能互聯(lián)互通,看電視的時候能在屏幕中看到自己有新郵件,可以直接把在電腦上看的東西切換到車載設備中,片段中還出現(xiàn)了被微軟曾經(jīng)主推但是不溫不火的平板電腦。
        17:00至18:15聽了關于LINQ的講座。這是一個純編程技術的講座。聽了這個講座使我不再認為LINQ只是一個內(nèi)嵌的ORM。LINQ分為三個部分:LINQ TO SQL、LINQ TO Entity和LINQ TO XML。LINQ TO SQL是一個內(nèi)嵌的ORM,在語言級別支持類似于SQL語句的東西;LINQ TO Entity是一個很有意思的技術,感覺和Java中的Quaere和joSQL類似,也就是我們可以用SQL語句的形式對數(shù)據(jù)進行過濾,比如我們要查找一個類中所有方法名長度大于10的方法,那么只要寫類似于下面的語句就可以:select m.name from MyClass.getMethods() as m where m.name.length>10(注意這個代碼只是示例性的,LINQ語法不是這樣的),不知道這個東西是不是從Java的joSQL借鑒過去的;LINQ TO XML也是可以以更加直觀的方式操作XML,并且可以和LINQ TO SQL、LINQ TO Entity很好的結合。偶對LINQ沒感覺有啥新奇,因為這些東西在Python中用lambda早就可以實現(xiàn)了,不過還是很佩服微軟的學習與融會貫通精神,LINQ確實能提高基于.Net的傻瓜化開發(fā)效率。比較奇怪的是主講竟然對C#3.0中新增的lambda和匿名類(都是為LINQ而生的)感到特別振奮,天哪,這兩個技術已經(jīng)在Java、Python等語言中出現(xiàn)三百多年了。:)。這里沒有別的意思,只是感嘆一下,希望微軟的擁躉們不要拍磚。
        未來還有兩天的會程,希望能吸收到更多有用的東西。
    posted @ 2007-11-07 23:14 CowNew開源團隊 閱讀(1631) | 評論 (7)編輯 收藏

    《自己動手寫開發(fā)工具》系統(tǒng)地介紹了SWT、Draw2D、GEF、JET等與Eclipse插件開發(fā)相關的基礎知識,并且以實際的開發(fā)案例來演示這些知識的實戰(zhàn)性應用,通過對這些實際開發(fā)案例的學習,讀者可以非常輕松地掌握Eclipse插件開發(fā)的技能,從而開發(fā)出滿足個性化需求的插件。
    本書以一個簡單而實用的枚舉生成器作為入門案例,通過該案例讀者能學習到擴展點、SWT、JET等Eclipse插件開發(fā)的基本技能;接著對Eclipse插件開發(fā)中的基礎知識進行了介紹,并且對屬性視圖的使用做了重點介紹;最后以兩個具有一定復雜程度的插件(Hibernate建模工具和界面設計器)為案例介紹了SWT、Draw2D、GEF、JET等技術的綜合運用。

    電驢下載地址:http://www.verycd.com/groups/@u2105483/204642.topic

    HTTP下載地址:
    http://www.cownew.com/Soft/ShowSoft.asp?SoftID=16

    http://www.cownew.com/Soft/ShowSoft.asp?SoftID=10
    posted @ 2007-11-04 12:34 CowNew開源團隊 閱讀(830) | 評論 (0)編輯 收藏

    《自己動手寫開發(fā)工具--基于Eclipse的工具開發(fā)》
    本書系統(tǒng)地介紹了SWT、Draw2D、GEF、JET等與Eclipse插件開發(fā)相關的基礎知識,并且以實際的開發(fā)案例來演示這些知識的實戰(zhàn)性應用,通過對這些實際開發(fā)案例的學習,讀者可以非常輕松地掌握Eclipse插件開發(fā)的技能,從而開發(fā)出滿足個性化需求的插件。.
    本書以一個簡單而實用的枚舉生成器作為入門案例,通過該案例讀者能學習到擴展點、SWT、JET等Eclipse插件開發(fā)的基本技能;接著對Eclipse插件開發(fā)中的基礎知識進行了介紹,并且對屬性視圖的使用做了重點介紹;最后以兩個具有一定復雜程度的插件(Hibernate建模工具和界面設計器)為案例介紹了SWT、Draw2D、GEF、JET等技術的綜合運用。..
    本書不僅適合于Eclipse插件開發(fā)初學者學習,對于有一定相關開發(fā)經(jīng)驗的開發(fā)人員也具有很高的參考價值。

    ChinaPub地址:http://www.china-pub.com/computers/common/info.asp?id=36806


    目錄:

    第2章  Eclipse插件開發(fā)
    2.2  簡單的案例插件功能描述
    2.3  插件項目的建立
    2.3.1  建立項目
    2.3.2  調試方式運行插件項目
    2.4  改造EnumGeneratoreNewWizardPage
    2.4.7  取得界面控件值的方法:
    2.5  開發(fā)枚舉項編輯向導頁
    2.5.1  初始化
    2.5.2  相關環(huán)境數(shù)據(jù)的處理
    2.5.3  代碼生成
    2.6  編寫代碼生成器
    2.7  功能演示、打包安裝
    第3章  插件開發(fā)導航
    3.1  程序界面的基礎-SWT/JFace
    3.1.1  SWT的類庫結構
    3.1.2  SWT中的資源管理
    3.1.3  非用戶線程中訪問用戶線程的GUI資源
    3.1.4  訪問對話框中的值。
    3.1.5  如何知道部件支持哪些style?
    3.2  SWT疑難點
    3.3  異步作業(yè)調度
    3.4  對話框
    3.4.8  自定義對話框及配置保存與加載
    3.5  首選項
    3.6  Eclipse資源 API 和文件系統(tǒng)
    3.6.1  資源相關接口的常見方法
    3.6.2  方法中force參數(shù)的意義
    3.6.3  資源相關接口的方法使用示例
    3.6.4  Eclipse中沒有當前項目
    3.7  Java項目模型
    3.7.1  類結構
    3.7.2  常用工具類
    3.7.3  常用技巧
    3.7.4  設定構建路徑實戰(zhàn)
    3.7.5  如何研讀JDT代碼
    3.8  插件開發(fā)常見問題
    3.8.1  InvocationTargetException異常的處理
    3.8.2  Adaptable與Extension Object/Interface模式
    3.8.3  千萬不要使用internal包
    3.8.4  打開視圖
    3.8.5  查找擴展點的實現(xiàn)插件
    3.8.6  項目nature
    3.8.7  透視圖開發(fā)
    3.8.8  關于工具條路徑
    3.8.9  Eclipse的日志
    第4章  屬性視圖
    4.1  基本使用
    4.1.1  IPropertySource接口說明
    4.1.2  對象實現(xiàn)IPropertySource接口
    4.1.3  對象適配成IPropertySource對象
    4.2  屬性視圖高級話題
    4.2.1  屬性分類
    4.2.2  復合屬性
    4.2.3  常用屬性編輯器
    4.2.4  自定義屬性描述者
    第5章  開發(fā)Hibernate插件
    5.3  實體模型文件創(chuàng)建向導
    5.4  模型的定義和模型文件處理
    5.5  實體屬性描述者
    5.6  實體編輯器
    5.6.1  字段的編輯
    5.6.2  編輯器基類
    5.6.3  實體編輯器核心配置界面
    5.6.4  多頁實體編輯器
    5.7  代碼生成
    5.7.1  代碼生成器接口
    5.7.2  代碼生成器配置文件
    5.7.3  代碼生成向導
    5.7.4  公共工具類CommonUtils
    5.8  Hibernate代碼生成器
    5.8.1  命名策略
    5.8.2  工具類
    5.8.3  代碼生成的JET代碼
    第6章  基于GEF的界面設計工具
    6.1  GEF簡介
    6.1.1  Draw2D
    6.1.2  請求與編輯策略
    6.1.3  視圖與編輯器
    6.1.4  GEF的工作過程
    6.2  系統(tǒng)需求
    6.2.1  界面設計工具的分類
    6.2.2  功能描述
    6.3  構建模型
    6.4  實現(xiàn)控制器
    6.4.1  窗體和組件的控制器
    6.4.2  編輯策略
    6.4.3  命令對象
    6.5  窗體文件創(chuàng)建向導
    6.6  組件加載器
    6.7  編輯器
    6.8  代碼生成和構建器
    6.8.1  代碼生成
    6.8.2  構建器
    6.8.3  為項目增加構建器
    6.9  實現(xiàn)常用組件
    6.9.1  標簽組件
    6.9.2  按鈕組件
    6.9.3  復選框
    6.9.4  編輯框
    6.9.5  列表框
    6.10  使用演示
    《自己動手寫開發(fā)工具》

    posted @ 2007-11-02 17:34 CowNew開源團隊 閱讀(1521) | 評論 (9)編輯 收藏

        現(xiàn)在大部分軟件開發(fā)書籍都是講解某個技術如何用,很少有講實戰(zhàn)的,即使有實戰(zhàn)案例的講解,也是講解網(wǎng)上購物、聊天室之類已經(jīng)被人寫爛了的系統(tǒng)的開發(fā),最可怕的是書中的實現(xiàn)代碼慘不忍睹,使得讀者很容易被誤導,至于如何進行合理的架構設計就更無從談起;少數(shù)從國外引進的高端技術書籍又大談特談各種在天上飛來飛去的理論,“看的時候心潮澎湃,看完之后一臉茫然”,讀者不知道如何將這些理論應用到實際的開發(fā)過程當中。本書就嘗試著打破這種局面,把一個真實的系統(tǒng)搭建從頭講起,不僅包含具體的實現(xiàn)技術,也包含一些架構方面的設計思想。
           這是一本以Java開發(fā)語言為載體來講解企業(yè)級信息系統(tǒng)開發(fā)的書,其中涉及到了Hibernate、Struts、Spring、JSP、Swing、JDBC等很多技術,而且案例系統(tǒng)的搭建過程中也較合理的使用了面向對象理念進行系統(tǒng)設計,但是書中不可能詳細講解這些技術的使用,讀者可以根據(jù)需要參考這些技術相關的參考資料。

           序言部分介紹了開發(fā)框架等的概念;第1、2、3、4章介紹了正則表達式、AOP、自定義JSP標簽等基礎知識;第5章給出了案例系統(tǒng)的需求文檔;第6章基于Spring技術搭建了案例系統(tǒng)的Remoting部分;第7章構建了一個基于MDA理念的元數(shù)據(jù)引擎;第8章對案例系統(tǒng)中用到的枚舉異常類、工具類等做了介紹;第9、10、11、12章基于Spring、Hibernate等技術搭建了事務、DTO生成器、權限控制、日志記錄、多數(shù)據(jù)庫支持等基礎模塊;第13、14章開發(fā)了登錄服務、Swing客戶端基礎模塊以及數(shù)據(jù)選擇器等自定義Swing控件;第15章實現(xiàn)了列表界面、編輯界面和編輯界面的基類;第16章搭建了Web客戶端的登錄界面、主菜單等基礎模塊,并開發(fā)了JSP用的數(shù)據(jù)選擇器等自定義標簽;第17章則以前面章節(jié)搭建出的基礎框架為基礎實現(xiàn)了第5章中的需求文檔所要求的功能。

       《J2EE開發(fā)全程實錄》是國內(nèi)J2EE研究領域里具有里程碑意義的一部作品。作者以通俗易懂的語言將J2EE企業(yè)級系統(tǒng)架構設計、開發(fā)過程中的看似高深的技術與原理娓娓道來,使得讀者在不經(jīng)意間隨著作者的思路一起參透高深的技術理念。閱讀完本書我才發(fā)現(xiàn)架構設計、設計模式、元數(shù)據(jù)編程、AOP、分布式開發(fā)這些看似高深的理論完全可以很輕松的用來改善系統(tǒng)架構的設計,而Spring 、Hibernate、Struts、Swing、XML這些看似孤立的技術也可以有機的結合起來搭建一個高度靈活的系統(tǒng)架構。相信對于想深入學習基于J2EE技術的企業(yè)級系統(tǒng)架構設計與開發(fā)技術的讀者來說,《J2EE開發(fā)全程實錄》將是一本不可多得的寶典。

    詳細地址:http://www.china-pub.com/computers/common/info.asp?id=35167
    電子版下載地址:http://soft.hackbase.com/page/2007-07-11/01750187507.Html

    posted @ 2007-11-02 17:31 CowNew開源團隊 閱讀(809) | 評論 (4)編輯 收藏

    僅列出標題
    共30頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
    主站蜘蛛池模板: 一级毛片aa高清免费观看| av永久免费网站在线观看| 国产精品亚洲αv天堂无码| 波多野结衣免费一区视频 | 在线综合亚洲中文精品| 成人免费无码精品国产电影| 任你躁在线精品免费| 亚洲男女一区二区三区| 亚洲av手机在线观看| 99久久久国产精品免费蜜臀| 亚洲AV无码成人网站在线观看| 亚洲国产美女精品久久久久∴| 成年在线观看免费人视频草莓| 国产精品免费视频观看拍拍| 亚洲一区二区三区国产精品无码| 四虎永久免费地址在线观看| 日韩午夜理论免费TV影院| 牛牛在线精品免费视频观看| 亚洲春色另类小说| 亚洲日韩v无码中文字幕| 在线免费观看污网站| 午夜视频免费在线观看| 午夜在线亚洲男人午在线| 亚洲免费中文字幕| 亚洲精品福利视频| 4338×亚洲全国最大色成网站| 成人一a毛片免费视频| 亚洲成人免费在线| 精品久久久久久国产免费了| 亚洲狠狠婷婷综合久久| 亚洲欧洲精品国产区| 精品亚洲一区二区| 亚洲欧洲精品成人久久奇米网| 成人免费无码大片A毛片抽搐| 91禁漫免费进入| 黄网站色视频免费在线观看的a站最新| 国产精品无码亚洲一区二区三区| 亚洲一级免费毛片| 亚洲黄色网站视频| 久久久久久亚洲精品中文字幕| 亚洲欧洲精品成人久久奇米网 |