什么是代碼生成?
  代碼生成,就是code generation,想必大家都不會陌生。我們使用visual studio等開發工具的時候,很多代碼框架都是自動生成。初步的印象就是,代碼生成可以減少重復工作。但是,如果更加深入的去看,就會看到,其實不僅代碼框架可以自動生成,連編譯器都可以認為是代碼生成器—從高級語言到機器語言(這個過程太自然了,以致于我們已經不認為是代碼生成了)。所以,代碼生成有不同的層次,最低級的是ide那樣的函數框架,其次是mfc那樣的工程向導,再高級的一點應該是 idl這樣的接口定義語言,再再然后是向微軟提出的dsl(domain specific language)。
  為什么要有代碼生成?
代碼生成的級別,反映了抽象的級別。因為我們有一個很抽象的領域模型,但是與可以執行的代碼中間還有一段很長的過程。如果沒有代碼生成,就需要我們人工不斷的填補這個空白。為了提高我們的開發的效率和速度,必須能快速有效的把領域模型轉化為執行代碼,代碼生成于是應運而生。
代碼生成可以有很多級別,因為一個抽象層可能不能一下子到位的轉化到最底層,所以需要分步驟地,先轉換到中間一層,在如此一層層的往下,代碼生成也是在一層層間進行。
  最近把想了很久的jsp和xaml給親手試驗了一把,對代碼生成概念的理解又深入了不少。
  jsp的代碼生成
1.有一個簡單的html頁面hello.htm,內容如下:
hello world!
這個沒有什么稀奇的,用ie瀏覽就出個”hello world!”的文字而已。
2.如果我把hello.htm改名為hello.jsp會怎樣?
答案是,用ie瀏覽的時候,還是出”hello world!”的文字,沒有任何變化!
  3.但是看問題不能光看表面啊,我們注意到tomcat的work的n級子目錄下有了hello_jsp.java和hello_jsp.class兩個文件。打開一看:
…
public final class hello_jsp extends org.apache.jasper.runtime.httpjspbase
    implements org.apache.jasper.runtime.jspsourcedependent {
…
out.write("hello world!");
…
  現在jsp經過了編譯,以servlet的方式運行的!每次修改.jsp文件后,tomcat都會重新生成.java文件,并編譯成.class然后運行。下次訪問時,沒有更改jsp,就直接運行.class。從而提高了運行的速度,而不再是解釋執行的!服務端腳本于是同時兼具了編寫簡單和運行快速的特點!
  如果在.jsp文件里嵌入java代碼段呢?那很簡單,就是在out.write()之后的某個位置原樣插入那些代碼段!原來這些代碼段是運行在這樣的代碼環境里的!你終于明白什么對象和方法可以用了吧!
  以前看過asp.net的代碼,跟jsp也是類似的原理的代碼生成。
  xaml的代碼生成
  微軟的winfx的avalon,現在叫做windows presentation foundation,用xaml來描述界面布局,而使用code behide技術來分離頁面和代碼。等等,xaml不僅僅可以用來描述界面布局,還可以用來定義程序的框架。
  一個簡單的窗口描述(mypage.xml)
<window xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
      xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
      x:class="myspace.mypage"
      text="mypage"
/>
編譯后的代碼生成(mypage.g.cs)
namespace myspace {
public partial class mypage: system.windows.window, …{
….
  因為有code behide技術,你可以把代碼寫在另一個文件里,不像jsp那樣跟html混在一起(當然jsp可以通過jsp:usebean等分離代碼)。
code behide代碼(mypage.xml.cs)
namespace myspace {
public partial class mypage
…
  你看,同一個類在兩個文件里定義了!要在以前,這可能是要出問題的!但是,現在微軟居然為了這修改了c#的語言規范,引入了partial class的概念,允許一個類在兩個不同的文件里定義!
  剛才說過了,xaml不僅僅是界面布局的描述,還可以描述應用程序。比如
  定義一個應用程序(myapp.xml)
<navigationapplication xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
                       xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
                       x:class="myspace.myapp"
                       startupuri="a.xaml" 
               startingup="appstartingup">
</navigationapplication>
  生成的代碼(myapp.g.cs)
namespace myspace {
public partial class myapp : system.windows.navigation.navigationapplication {
…
code behide(myapp.xml.cs) 
namespace myspace{
public partial class myapp
…
  可以看到xaml不僅僅是界面描述語言了,而是一種新的程序模型了,通過聲明的方式來寫軟件,這就是抽象的含義!
| 
 
 | 
新聞熱點
疑難解答