Tuesday, June 26, 2007

A simple compiler In my last post I played a little with Harpy to generate code from what looked like assembly language. So the next logical step is to make a compiler. And I mean a real machine-code compiler, not some wimpy byte-code nonsense. To make life simple (it is a simple compiler, after all) I'm going to start by generating code that uses the stack all the time. So all operands will live on the stack and all operations on them will push and pop the stack. Of course, the code generated from such a compiler will make any serious compiler writer weep. The CodeGen type in Harpy is the monad used during code generation. It allows you to keep some extra information around besides the generated code; it gives you access to a state monad. I will use the state to keep track of the current stack depth. (We will see why soon.)
type StackDepth = Int
type Gen = CodeGen () StackDepth ()

addDepth :: StackDepth -> Gen
addDepth i = do
    d <- getState
    setState (d+i)
The addDepth function changes the current stack depth by grabbing the old one, adding the argument and storing it back. The getState and setState functions don't generate any code, they just manipulate the state available in the CodeGen monad. With that out of the way, let's implement code generation for addition.
gadd :: Gen
gadd = do
    pop  ebx
    pop  eax
    add  eax ebx
    push eax
    addDepth (-1)
It pops the two operands off the stack, adds them, and pushes the result. The net effect on the stack is that it has one word less on it (I count my stack depth in words), so there's also a call to addDepth. Subtraction and multiplication are very similar.
gsub :: Gen
gsub = do
    pop  ebx
    pop  eax
    sub  eax ebx
    push eax
    addDepth (-1)

gmul :: Gen
gmul = do
    pop  ebx
    pop  eax
    imul InPlace eax ebx
    push eax
    addDepth (-1)
On the i386 (signed) division and remainder is computed with the idiv instruction. It divides the EDX:EAX 64 bit number with the given operand. So we must convert a 32 signed number to a 64 bit signed number, this is simply done by moving EAX to EDX and then shifting right 31 steps. This will copy the sign bit into every bit of EDX. Depending of if we want the quotient or remainder we need to push EAX or EDX.
gquot :: Gen
gquot = do
    gquotRem
    push eax
    addDepth (-1)

grem :: Gen
grem = do
    gquotRem
    push edx
    addDepth (-1)

gquotRem :: Gen
gquotRem = do
    pop  ebx
    pop  eax
    mov  edx eax
    sar  edx (31 :: Word8)
    idiv ebx
To put a constant on the stack we simply push it and increment the remembered stack depth.
gconst :: Int -> Gen
gconst c = do
    push (fromIntegral c :: Word32)
    addDepth 1
OK, so now for something more interesting. Assuming we are generating code for a function, we also want to access the arguments to the function. Where are the arguments? Well, according to the IA32 calling conventions the caller pushes the arguments on the stack, so we'll follow those. First we have a bunch things on the stack, how many is kept track of in the stack depth in the CodeGen monad, and then the arguments follow in order, pushed right-to-left. So to get an argument we compute the offset, convert it to a byte offset, and push that word on the stack.
-- Get the Nth argument
gargN :: Int -> Gen
gargN n = do
    d <- getState
    let o = 4 * (d + n)
    mov  eax (Disp (fromIntegral o), esp)
    push eax
    addDepth 1
When generating code for a function we should not clobber any callee-save registers, so to be on the safe side we save all used registers on function entry and restore them on function exit. On function exit we also return the result in EAX.
savedRegs = [ebx, edx]

-- Push all register we'll be using, except eax.
gprologue :: Gen
gprologue = do
    mapM_ push savedRegs

-- Pop return value to eax, restore regs, and return
gepilogue :: Gen
gepilogue = do
    pop  eax
    mapM_ pop (reverse savedRegs)
    ret
OK, so that was a lot of stuff, let's put it together for a test.
testGen = conv_Word32ToWord32 () (length savedRegs + 1) $ do
    gprologue
    gargN 0
    gconst 1
    gadd
    gepilogue

main = do
    test <- testGen
    print (test 10)
The testGen function generates the prologue, push argument, push 1, add, and the epilogue. The conv_Word32ToWord32 (from my previous post) converts the machine code to a Haskell function. We also have to give the start value of the stack depth. The stack initially contains the return address and the saved registers, so that's the number we pass. Running this gives 11, as it should. OK, so let's actually write a compiler and not just a code generator. Here is a data type for integer expressions.
data Exp
    = Con Int
    | Arg Int
    | BinOp BOp Exp Exp
    deriving (Show)

data BOp = Add | Sub | Mul | Quot | Rem
    deriving (Show)
We have constants, arguments (variables), and a few binary operators. It's all easily translated to machine code.
translate :: Exp -> Gen
translate (Con c) = gconst c
translate (Arg n) = gargN n
translate (BinOp op x y) = do translate x; translate y; binop op
  where binop Add = gadd
        binop Sub = gsub
        binop Mul = gmul
        binop Quot = gquot
        binop Rem = grem
For simplicity, let's compile only functions of one argument for now.
compileIOW32 :: (Exp -> Exp) -> IO (Word32 -> Word32)
compileIOW32 f = conv_Word32ToWord32 () (length savedRegs + 1) $ do
    gprologue
    translate (f (Arg 0))
    gepilogue 
This function takes an Exp->Exp function, by giving this function the argument Arg 0 we get an expression to translate. We tack on the usual prologue and epilogue. So let's try it.
main = do
    let fun x = BinOp Add x (Con 1)
    test <- compileIOW32 fun
    print (test 10)
Which prints 11. But yuck, writing BinOp etc. isn't nice. Let's make some instances.
instance Eq Exp
instance Ord Exp

instance Num Exp where
    x + y  =  BinOp Add x y
    x - y  =  BinOp Sub x y
    x * y  =  BinOp Mul x y
    fromInteger i = Con (fromInteger i)

instance Enum Exp
instance Real Exp

instance Integral Exp where
    quot x y = BinOp Quot x y
    rem x y = BinOp Rem x y
And give it a whirl:
main = do
    let fun x = (x+1) * x `quot` 2
    test <- compileIOW32 fun
    print (test 10)
And this prints 55, as expected. Not bad, a compiler from (a tiny subset of) Haskell functions to machine code in a few pages. But I do admit being embarrassed about generating such incredibly poor code. But there's always future blog posts to rectify that.

Labels: , ,

46 Comments:

Blogger Mike Kucera said...

Seeing compilers and language tools written in Haskell always makes me jealous. I got to write some parsers and an interpreter in Haskell in school but I haven't touched the language since. Now I work on Eclipse which is all Java. The sheer amount of code required to do this stuff in Java is mind-boggling. The visitor pattern alone on our AST requires hundreds of lines of boilerplate code. I miss Haskell, its such an elegant language.

4:52 PM  
Blogger warren said...

But you can't get anything done in Haskell. You can't talk to Oracle on AIX or parse HTML created in 1994 or some shit, which is crucial for every single application any software company ever creates, especially compilers.

Besides, REFACTORING! Writing thousands of lines of boilerplate code is fantastic because of refactoring. Now shut up and like it, it's the enterprise standard!

6:06 PM  
Blogger horia314 said...

@warren : Yea, but that's not really Haskell's fault is it?

I guess if you could gather 30 or so programmers, with enough language knowledge and some free time you could get interfaces to whatever you wanted.

Same goes for Lisp and all those other nice languages people hear about only in tales.

Too bad most programmers are haters, and don't contribute to libraries for struggling languages :|

9:45 PM  
Blogger Adizzle said...

This is so deja vu for me, because in my Programming Languages class at UCSB, we wrote a compiler in Haskell. It compiled from a fake Pascal-like language into a stack-based language. Similar to what you are doing above, however I couldn't grok monads so I didn't use them.

Still want to go back and learn those tricky "monad" thingies.

11:17 PM  
Blogger dsfgsdfgsdfgds said...

看房子,買房子,建商自售,自售,台北新成屋,台北豪宅,新成屋,豪宅,美髮儀器,美髮,儀器,髮型,EMBA,MBA,學位,EMBA,專業認證,認證課程,博士學位,DBA,PHD,在職進修,碩士學位,推廣教育,DBA,進修課程,碩士學位,網路廣告,關鍵字廣告,關鍵字,課程介紹,學分班,文憑,牛樟芝,段木,牛樟菇,日式料理, 台北居酒屋,日本料理,結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,台北住宿,國內訂房,台北HOTEL,台北婚宴,飯店優惠,台北結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,住宿,訂房,HOTEL,飯店,造型系列,學位,牛樟芝,腦磷脂,磷脂絲胺酸,SEO,婚宴,捷運,學區,美髮,儀器,髮型,牛樟芝,腦磷脂,磷脂絲胺酸,看房子,買房子,建商自售,自售,房子,捷運,學區,台北新成屋,台北豪宅,新成屋,豪宅,學位,碩士學位,進修,在職進修, 課程,教育,學位,證照,mba,文憑,學分班,網路廣告,關鍵字廣告,關鍵字,SEO,关键词,网络广告,关键词广告,SEO,关键词,网络广告,关键词广告,SEO,台北住宿,國內訂房,台北HOTEL,台北婚宴,飯店優惠,住宿,訂房,HOTEL,飯店,婚宴,台北住宿,國內訂房,台北HOTEL,台北婚宴,飯店優惠,住宿,訂房,HOTEL,飯店,婚宴,台北住宿,國內訂房,台北HOTEL,台北婚宴,飯店優惠,住宿,訂房,HOTEL,飯店,婚宴,結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,台北結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,台北結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,台北結婚,婚宴場地,推車飲茶,港式點心,尾牙春酒,居酒屋,燒烤,美髮,儀器,髮型,美髮,儀器,髮型,美髮,儀器,髮型,美髮,儀器,髮型,小套房,小套房,進修,在職進修,留學,證照,MBA,EMBA,留學,MBA,EMBA,留學,進修,在職進修,牛樟芝,段木,牛樟菇,關鍵字排名,網路行銷,关键词排名,网络营销,網路行銷,關鍵字排名,关键词排名,网络营销,PMP,在職專班,研究所在職專班,碩士在職專班,PMP,證照,在職專班,研究所在職專班,碩士在職專班,SEO,廣告,關鍵字,關鍵字排名,網路行銷,網頁設計,網站設計,網站排名,搜尋引擎,網路廣告,SEO,廣告,關鍵字,關鍵字排名,網路行銷,網頁設計,網站設計,網站排名,搜尋引擎,網路廣告,SEO,廣告,關鍵字,關鍵字排名,網路行銷,網頁設計,網站設計,網站排名,搜尋引擎,網路廣告,SEO,廣告,關鍵字,關鍵字排名,網路行銷,網頁設計,網站設計,網站排名,搜尋引擎,網路廣告,EMBA,MBA,PMP
,在職進修,專案管理,出國留學,EMBA,MBA,PMP
,在職進修,專案管理,出國留學,EMBA,MBA,PMP
,在職進修,專案管理,出國留學

住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,住宿,民宿,飯宿,旅遊,美容,美髮,整形,造型,美容,美髮,整形,造型,美容,美髮,整形,造型,美容,美髮,整形,造型,美容,美髮,整形,造型,美容,美髮,整形,造型,美容,美髮,整形,造型,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,設計,室內設計,裝潢,房地產,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,進修,在職進修,MBA,EMBA,住宿,民宿,飯店,旅遊,美容,美髮,整形,造型,設計,室內設計,裝潢,房地產,進修,在職進修,MBA,EMBA,羅志祥,周杰倫,五月天,蔡依林,林志玲,羅志祥,周杰倫,五月天,蔡依林,林志玲,羅志祥,周杰倫,五月天,蔡依林,羅志祥,周杰倫,五月天,蔡依林

6:53 AM  
Blogger nasha said...

Why was there no follow on bankruptcy then? The bailout of AIG FP went to (wow power leveling) hedge funds that bound credit swaps on Lehman failing or others betting on rating (wow power leveling) declines. AIG has drained over 100 billion from the government. Which had to go to (wow power leveling) those who bet on failures and downgrades. Many of whom (power leveling)were hedge funds. I-banks that had offsetting swaps needed the money from the AIG bailout or they would have been caught. Its an (wow powerleveling) insiders game and it takes just a little bit too much time for most people to think (wow gold) through where the AIG 100 billion bailout money went to, hedge funds and players, many of whom hire from the top ranks of DOJ, Fed, Treasury, etc. ZHANG XIAO CHEN

6:05 AM  
Blogger kiloi said...

puma shoes
chaussures pumacheap polos
polo shirts
ralph lauren polo shirtssport shoes
ugg boots
mp4
trade chinalacoste polo shirts
chaussure puma femmewedding dressestennis racket
cheap handbags
HAIR STRAIGHTENERS

2:04 PM  
Blogger kiloi said...

nike tnEnter the necessary language
translation, up to 200 bytes winter, moves frequently in Chinanike chaussures showing that the deep strategy of the Chinese market. Harvard Business School, tn chaussures according to the relevant survey data show that in recent years the Chinese market three brands, Adidas, Li Ning market share at 21 percent, respectively,

2:05 PM  
Blogger kiloi said...

mens clothing men's sweate, cheap columbia jackets, lacoste sweater, ralph lauren polo shirts,ski clothing. Free Shipping, PayPal Payment. Enjoy your shopping experience on mensclothingstore.us

2:05 PM  
Blogger miyuki said...

Cheap Brand Jeans ShopMen Jeans - True Religion Jeans, Women JeansGUCCI Jeans, Levi's Jeans, D&G Jeans, RED MONKEY Jeans, Cheap JeansArmani Jeans, Diesel Jeans, Ed hardy Jeans, Evisu Jeans, Jack&Jones Jeans...

4:27 AM  
Blogger ed-hardy-shirts said...

There are ed hardy shirts
,pretty ed hardy shirt for men,

ed hardy womens in the ed hardy online store

designed by ed hardy ,
many cheap ed hardy shirt ,glasses,caps,trouers ed hardy shirts on sale ,

You can go to edhardyshirts.com to have a look ,you may find one of ed hardy clothing fit for you
Top qualitymen's jacket,
These cheap jacket are on sale now,you can find
north face jackets inmage on our web

Do you wannaghd hair straighteners for you own , we have many
cheap ghd hair straightenersin style and great,you can choose one from these
hair straighteners
Authentic chaussure puma
chaussure sport

8:06 AM  
Blogger ed-hardy-shirts said...

And chaussure nike shoes
Come here to have a look of our Wholesale Jeans
Many fashionMens Jeans ,eye-catching
Womens Jeans ,and special out standing
Blue Jeans ,you can spend less money on our
Discount Jeans but gain really fine jeans, absolutely a great bargain.
www.crazypurchase.com
China Wholesale
wholesale from china
buy products wholesale
China Wholesalers
http://weddingdressseason.com

8:06 AM  
Blogger j said...

Modern tennis racquet in the manufacturing sector have been in use for close to the aerospace industry and military-industrial material products. Over the past two decades, metal materials and chemical materials to upgrade the high level of tennis racket manufacturer has laid a solid foundation. In today's big brands have more than tennis: Head junior tennis racket,Wilson tennis racquet, Wilson tennis racket,Head tennis racket,Babolat tennis racket......
ed hardy clothing
ed hardy clothes
ed hardy shirts
ed hardy t-shirts
ed hardy sunglasses
ed hardy mens
ed hardy womens
Wholesale Handbags
Cheap Handbags
Womens Handbags
Cheap Purses
Designer Handbags

10:22 AM  
Blogger j said...

Ralph Lauren Polo is the most famous sports shirt.Burberry Polo Shirt is the most well-known in France jerseys. The north face jacket is a winter essential goods.Columbia jacket and spyder jacket let people have more choice of clothes. Different brands have different design styles, but all it attracts us.
cheap tennis racquet
tennis racquet discount
cheap tennis racket
discount Tennis Racket

10:23 AM  
Blogger polo shirt said...

God bless you!I really agree with your opinions.Also,there are some new fashion things here,gillette razor blades.gillette mach3 razor bladesfor men.As for ladies,gillette venus razor blades must the best gift for you in summer,gillette fusion blades are all the best choice for you.

4:35 AM  
Blogger polo shirt said...

fantastic!God bless you!Meanwhile,you can visit my China Wholesale,we have the highest quality but the lowest price fashion products wholesale from China.Here are the most popular China Wholesale products for all of you.Also the polo clothing is a great choice for you.

4:36 AM  
Blogger polo shirt said...

Wonderful!You can find the father who desire fashionable eg,uggs fashion,you can enjoy uggs online here, intellectual polo shirt simultaneously.

4:36 AM  
Blogger polo shirt said...

Do not mean bad.Thank you so much!Men's polo shirts was the shirt of choice for diverse groups of teenagers.Brightly coloured polo shirts can make you look like a Day-glo dirigible.

4:36 AM  
Blogger polo shirt said...

Perfect!!You are a outstanding person!Have you ever wore chaussures puma, puma CAT,Puma shoes store gives some preview of puma speed cat,puma basket, puma speed, puma speed and other puma shoes. These puma sport items are at store recently and available for anyone.

4:37 AM  
Blogger polo shirt said...

Wonderful!!You can find the father who desire fashionable, intellectual cheap polos simultaneously, you can find a psychologist to study the most harmonious of families should be pink mens clothing, so do not want to take the mature route for the father, buy cheap polos, the learn from such a walk in between the formal and casual styling, refined style to create a sense of mild authority.

4:37 AM  
Blogger polo shirt said...

Awesome!!!Best wishes for you !!wholesale polo shirts is the father of the summer should be prepared to most commonly used item, it has both style and shape of polo clothing, and vest with a random function, so that in the short-sleeved apply to both on many occasions, the pink and black color men's polo shirts brought into effect, lightweight cotton, linen texture to demonstrate masculine temperament and sense of fashion exhaustively. polo shirts for sale

4:38 AM  
Blogger polo shirt said...

Thank you so much!!polo shirt men'ssweate,cheap polo shirts cheap columbia jackets, lacoste sweater, ralph lauren polo shirts,ski clothing. Free Shipping, PayPal Payment. Enjoy your shopping experience on mensclothingus.com.We have mens polo shirts.

4:38 AM  
Blogger haitao said...

cheap hair straighteners
chi hair straightener
chi flat iron

new polo shirts
cheap Lacoste polo shirts
cheap Lacoste polo shirts

cheap handbags
cheap bags
puma chaussures
chaussures puma
chaussure puma

Men's North Face
Women's North Face


hair straighteners
sexy lingerie store
cheap ugg boots
tattoo wholesale
men's clothing
women's clothing


2009 nike shoes
new nike shoes
Women's max
Men's max 93
nike shox
Nike air force
Nike air max 2003
nike air max ltd
nike air max tn
Nike air rift
Nike air Yeezy
nike airmax
Nike air max 90
Nike air max 97
nike birds nest shoes
nike dunk
nike RT1 shoes
nike SB
nike shox shoes
Nike shox OZ shoes
Nike shox R2 shoes
Nike shox R3 shoes
Nike shox R4 shoes
Nike shox R5 shoes
Nike shox TL3
nike trainers lovers

tennis rackets
Wilson tennis rackets
HEAD tennis rackets
Babolat tennis rackets

8:52 AM  
Blogger Kevin said...

牙醫,植牙,矯正,紋身,刺青,創業,批發,皮膚科,痘痘,中醫,飛梭雷射,毛孔粗大,醫學美容,seo,關鍵字行銷,關鍵字自然排序,網路行銷,關鍵字自然排序,關鍵字行銷seo,關鍵字廣告,部落格行銷,網路行銷,seo,關鍵字行銷,關鍵字廣告,關鍵字,自然排序,部落格行銷,網路行銷,網路爆紅,牛舌餅婚紗台中婚紗,腳臭,腳臭,腳臭,腳臭,中古車,二手車,中古車,二手車,高雄婚紗,減肥,瘦身 ,搬家,搬家公司,服飾批發,團體服,街舞

8:46 AM  
Blogger fdg said...

http://iblog99.edublogs.org/
http://iblog99.blog126.fc2.com/
http://iblog99.blogsome.com/
http://www.soulcast.com/iblog99/

3:50 PM  
Blogger J&amp;D said...

視訊|影音視訊聊天室|視訊聊天室|視訊交友|視訊聊天|視訊美女|視訊辣妹|免費視訊聊天室

自慰器|自慰器

網頁設計|網頁設計公司|最新消息|訪客留言|網站導覽

免費視訊聊天|辣妹視訊|視訊交友網|美女視訊|視訊交友|視訊交友90739|成人聊天室|視訊聊天室|視訊聊天|視訊聊天室|情色視訊|情人視訊網|視訊美女
一葉情貼圖片區|免費視訊聊天室|免費視訊|ut聊天室|聊天室|豆豆聊天室|尋夢園聊天室|聊天室尋夢園|影音視訊聊天室||

9:59 AM  
Blogger 花蓮租車 said...

花蓮吉安慶修院,花蓮景點,花蓮旅遊,花蓮,鯉魚潭,花蓮太魯閣,砂卡礑,合歡山,九曲洞,七星柴魚博物館,花蓮碼頭,瑞穗牧場,台東景點,安通溫泉,花蓮旅遊景點,立川漁場,太魯閣,太魯閣豁然亭,台東旅遊景點,七星潭,花蓮海洋公園,新光兆豐農場,磯崎海水浴場,鯉魚潭,太魯閣,七星潭,六十石山,松園別館,秀姑巒溪泛舟,馬太鞍,南安瀑布,知卡宣,牛山,林田山

7:20 AM  
Blogger 花蓮租車 said...

花蓮租車公司,花蓮旅遊租車,花蓮,租車,花蓮租車公司,花蓮旅遊,花蓮租車公司,行易花蓮租車,租車網,花蓮旅遊租車,花蓮租車,花蓮,花蓮,租車,花蓮 租車,泛舟,花蓮租車,泛舟,花蓮溯溪,花蓮泛舟行程,花蓮溯溪旅遊,租車,花蓮一日遊,租車,花蓮旅遊,花蓮租車網,花蓮租車旅遊網,花蓮一日遊,花蓮租車公司,花蓮 旅遊 租車,花蓮 租車,花蓮,花蓮租車網,租車,花蓮 租車,花蓮租車,花蓮美食,花蓮租車,花蓮租車,花蓮租車,花蓮旅遊,花蓮租車,花蓮租車,租車,花蓮租車,花蓮租車,花蓮租車,花蓮旅遊,花蓮租車,花蓮租車,花蓮 租車,旅遊,花蓮,租車,花蓮旅遊,花蓮,租車,旅遊,地圖,花東,租車

7:21 AM  
Blogger 花蓮租車 said...

花蓮旅遊景點,花蓮,花東,租車,花蓮 租車,花東旅遊,花蓮租車公司,花蓮旅行社,花蓮租車網,花蓮行程,花蓮地圖,花蓮租車公司,租車,花蓮租車旅遊網,花蓮 租車,花蓮旅遊租車,花蓮租車資訊網,旅遊景點,租車旅遊,租車公司,租車網,花蓮包車,花蓮旅遊,租車 花蓮,花蓮旅遊網,賞鯨,花蓮旅遊租車,租車,花蓮租車旅遊,花蓮租車公司,花蓮租車旅遊資訊網,花蓮租車旅遊,旅遊,花蓮旅遊景點,花東旅遊,花蓮泛舟,租車旅遊,花蓮租車,賞鯨,花蓮泛舟,花蓮溯溪,花蓮旅遊,租車,花蓮租車,花蓮租車,花蓮租車,花蓮租車,花蓮一日遊,花蓮租車公司,花蓮租車,花蓮租車,花蓮一日遊,花蓮租車,花蓮旅遊地圖,花蓮租車,花蓮行程,花蓮租車

7:21 AM  
Blogger 花蓮租車 said...

花蓮旅遊景點,花蓮,花東,租車,花蓮 租車,花東旅遊,花蓮租車公司,花蓮旅行社,花蓮租車網,花蓮行程,花蓮地圖,花蓮租車公司,租車,花蓮租車旅遊網,花蓮 租車,花蓮旅遊租車,花蓮租車資訊網,旅遊景點,租車旅遊,租車公司,租車網,花蓮包車,花蓮旅遊,租車 花蓮,花蓮旅遊網,賞鯨,花蓮旅遊租車,租車,花蓮租車旅遊,花蓮租車公司,花蓮租車旅遊資訊網,花蓮租車旅遊,旅遊,花蓮旅遊景點,花東旅遊,花蓮泛舟,租車旅遊,花蓮租車,賞鯨,花蓮泛舟,花蓮溯溪,花蓮旅遊,租車,花蓮租車,花蓮租車,花蓮租車,花蓮租車,花蓮一日遊,花蓮租車公司,花蓮租車,花蓮租車,花蓮一日遊,花蓮租車,花蓮旅遊地圖,花蓮租車,花蓮行程,花蓮租車

7:21 AM  
Blogger bing shen said...

1
http://www.12hot.com

1)
polo shirts

polo shirts supplies.wholesale polo shirts with great price. 12hot.com offers lot of 10 polo shirts and lot of 20 polo shirts. 12hot.com offers classic fit polo shirts.polo clothing All our shirts made in original factory.

2)
spyder jackets

12hot.com offers spyder jackets :
MENS' Spyder white&red REMOVEABLE CAP and SLEEVES SKI SUIT JACK
MEN'S SPYDER GRAY REMOVEABLE CAP SLEEVES SKI SUIT
MEN'S SPYDER BLACK REMOVEABLE CAP SLEEVES SKI SUIT JACKET
MEN'S SPYDER BLUE REMOVEABLE CAP SLEEVES SKI SUIT Jacket
MEN'S SPYDER WHITE REMOVABLE CAP&SLEEVES SKI SUIT Jacket
MEN'S SPYDER RED NEW STYLE SKI SUIT Jacket

3)
north face jackets

north face jackets,north face jacket. Here is a black The North Face Women's mountain jacket .

4)
Women's Sky Blue The North Face Original Twinset Parka/Jacket

This is a style of sky blue The Women's North Face outdoor and mountaineering apparel .The North Face offers advanced fabrics and technologies for all-weather performance and protection during demanding outdoor action. The design adds darts at the elbow, allowing for easier arm movement and a full range of motion. The internal wind skirt effectively keeps snow and wind out.
100% Omni-Tech!
100% SATISFIDE YOU!

2
http://www.polocart.com

1)
polo shirts

new polo shirts,polo shirts,polo shirt,Ralph Lauren polo shirts,polos .Paypal payment. we have best price.Welcome to wholesale Lacoste polo shirts

3
http://www.polosales.com/

1)
cheap polo shirts

Buy cheap polo shirts,polo shirt,lacoste polo shirts,ralph lauren polo shirts,wholesale polo shirts

4
http://www.superpolos.com/

1)
Lacoste Polo Shirts

Retail and Wholesale Lacoste Polo Shirts Cheap Lacoste Polo Shirts Polo Shirts Cheap Polo Shirts at cheap price with PayPal free shipping



6
http://www.bootsboots.co.uk

ugg boots

UGG short Boots
UGG 5245 tall Boots
UGG 5325 classic Boots
UGG 5359 womens Boots
UGG 5815 tall Boots
UGG 5819 womens Boots
UGG 5825 short Boots

7
http://www.chiflatiron.us

chi flat iron

chi flat iron
InStyler rotating hot iron with a heat resistant carrying bag
New BLUE CAMO CHI Camo Colletion 1" flat iron
New CHI Turbo 2 Big Flat Iron
New GREEN CAMO CHI Camo Colletion 1" flat iron
Black CHI Ceramic Flat Iron Original Farouk Hair Straightener
8
http://www.thehairstraighteners.com

CHI hair straightener

Very Cheap! www.thehairstraighteners.com is a professional supplier to supply CHI hair straightener Welcome to wholesale hair straighteners at www.thehairstraighteners.com.
CHI Straightener Blue Camo
CHI Straightener Green Camo
CHI Straightener Pink Camo
Original CHI Hair Straightener
CHI Turbo Big 2-Inch Hair Straightener


9)
http://www.jacketscart.com
jacketscart

spyder jackets
new discount spyder women's insulated ski jacket in orange
2009 new women's syder jackets insulated in white and red
women's discount spyder ski jacket insulated in red
women's cheap spyder ski suit insulated in pink
brand new men's spyder ski jackets in gray

8:08 AM  
Blogger Kayla said...

Cell phones from simple communication became a full-featured entertainment terminal . Can be said that cell phone china new milestone in the industry. This fully demonstrates that, cheap cell phones entertainment has become the most sought after consumer applications and has become the focus of the mobil phones market.

4:22 AM  
Blogger Kayla said...

Present-day society, the rapid development of science and technology makes cell phones wholesale is no longer a simple phone communications equipment only. Wholesale cell phones have many features, entertainment, scalability, and so have a good expression of the discount cell phones will be to maximize the effectiveness of multimedia technology.

4:23 AM  
Blogger crystal said...

Perfect!! You are a outstanding person! Do you want to wear stunning discount wedding dresses and join the party wearing beautiful cheap prom dresses?? Or you want all people's eyes can't move from you? The evening formal dresses are the best gift for you!

5:03 AM  
Blogger crystal said...

Fantastic! God bless you! Meanwhile, we have the highest quality but the lowest price fashion cheap wedding dresses. Here are the most popular designer wedding dresses and lace wedding dresses for all of you. Also the cheap evening dresses is a great choice for you. Let you dream come ture!!

5:04 AM  
Blogger crystal said...

Do not mean bad.Thank you so much! I just want to show some fashion wedding dress to all of you. I like wedding dresses, because wedding for a girl, it is the most special day in her life. Do you want to have the beautiful wedding dresses in perfect day??

5:04 AM  
Blogger crystal said...

Best wishes for you! May be you are interested in party cocktail dresses, and you may need cheap bridesmaid dress for you special Occasions. We can provide cheap cocktail dresses, cheap flower girl dresses even the plus size wedding dresses. You can choose that you like!

5:04 AM  
Blogger theprophet said...

sneakers shoes She continued,
"Why...? Don't you need someone to pose as your girlfriend this year?" Then he answered, "No, there is no need for that anymore......"
Before he can continue, he was interrupted, discount nike shoes"Oh yes! Must have found a girlfriend! nike shox r4 You haven't been searching for one for the past years, right?" The man looked up, as if he has struck gold, his face beamed and looked directly at the drunken girl. tn dollarHe replied, "Yes......you are right! I haven't been looking for anyone for the past years."
With that, the man darted across the floor and out the door, cheap nike shoesleaving the lady in much bewilderment. He finally realized that he has already found his dream girl, and she was.....the Vancouver girl all along! The drunken lady has said something that awoken him.
All along he has found his girl.nike tennis shoes That was why he did not bother to look further when he realized she was not coming back. It was not any specific girl he was seeking! cheap nike shoxIt was perfection that he wanted, and yes.....perfection!!
Relationship is something both parties should work on. Realizing that he had let away someone so important in his life, he decided to call her immediately. His whole mind was flooded with fear.free shipping shoes He was afraid that she might have found someone new or no longer had the same feelings anymore..... For once, he felt the fear of losing someone.
As it was Christmas eve, the line was quite hard to get through, especially an overseas call. He tried again and again, never giving up. Finally, he got through......precisely at 1200 midnight. He confessed his love for her and the girl was moved to tears. nike shoes It seemed that she never got over him! Even after so long, she was still waiting for him, never giving up.
He was so excited to meet her and to begin his new chapter of their lives. He decided to fly to Vancouver to join her. It was the happiest time of their lives! nike discount shoes But their happy time was short-lived. Two days before he was supposed to fly to Vancouver,cheap puma shoes he received a call from her father. She had a head-on car collision with a drunken driver. nike shox shoes She passed away after 6 hours in a coma.
The guy was devastated, as it was a complete loss. Why did fate played such cruel games with him? He cursed the heaven for taking her away from him, denying even one last look at her! How cruel he cursed! How he damned the Gods...!!nike free shoes How he hated himself....for taking so long to realize his mistake!! That was in 1996.
The moral of this story is :
Treasure what you have...
Time is too slow for those who wait;
Too swift for those who fear;
Too long for those who grief;
Too short for those who rejoice;
But for those who love...
Time is Eternity.
For all you out there with someone special in your heart, cherish that person, cherish every moment that you spend together that special someone, for in life, anything can happen anytime. buy shoes onlineYou may painfully regret, only to realise that it is too late.

8:51 AM  
Blogger happyhope said...

Your blog is very wonderful, and I like it very much. And welcome to my blog. We have the same opinions on something.

Do you know the famous polo cotton shirt? Do you want to be a fashion chaser? Follow me and you can chase the most popular spyder. it can help you increase your attraction.

My friends and I also want to buy excellent babolat tennis, and I know there is a perfect store recently, which sells perfect tennis classic.In order to play the game and search the place where can buy the wilson tennis racquet, we find many places, and finally, we find babolat tennis equipment.

would you want to be more attractive? If your answer is "Yes", you can wear spyder wear, you really need a pair of polo waterproof jacket
. They can make you become the focus.

prince tennis accessories
discount tennis racquets
wilson tennis racquets
head racquets
babolat racquets
wilson racquet
women's polo hoodies
men's polo shirts
spyder jacket
women's jacket
ralph lauren t shirt
polo women shirts
black polo
spyder ski

6:40 AM  
Blogger Peejay Li said...

I would like to be the supporter of yours. Thank you for sharing such a nice article.
chaussures puma
puma speed cat
Nike Tn Chaussures
requin tn
nike shox
puma shoes
puma CAT
puma basket
puma speed
baskets puma
puma sport
puma femmes
puma shox r4 torch
nike air max requin
nike shox r3
shox rival r3
tn plus
chaussures shox
nike shox r4 torch
air max tn requin
nike tn femme
pas cher nike
tn chaussures
nike rift
nike shox nz
chaussures shox
nike shox rival
shox rival
chaussures requin
jeans online
cheap armani jeans
cheap G-star jeans

7:14 AM  
Blogger Sneakers hobbies said...

we have lots of polo shirts
Abercrombie Fitch clothing
Abercrombie Fitch hoodile
ralph lauren shirts
Columbia Jacket
north face jackets
spyder ski jacket
polo shirts
polo shirt
spyder jackets
mens jacket
mens spyder jackets
spyder jackets for cheap
spyder ski jacket
womens spyder jackets
ralph lauren
spyder jackets cheap
spyder jackets for men
cheap spyder jackets
north face jackets
discount spyder jacket
the north face jacket
ralph lauren polo shirts on sale
discount ralph lauren polo shirts
ralph lauren polo shirts
ralph lauren polo wholesale
north face jackets
north face jacket
Columbia Jacket
ralph lauren jacket
Abercrombie Fitch hoodies
Abercrombie Fitch clothing
abercrombie fitch
abercrombie fitch
welcom to our store.

1:53 AM  
Blogger chochet007 said...

結婚相談所
カップリングパーティー
ウェディングドレス
募金
税理士
インプラント
カラコン
ボイストレーニング
債務整理
民事再生
自己破産
過払い金
任意整理
リサイクルショップ
オフィス家具
治験
店舗デザイン
債務整理
過払い
新宿 マッサージ
タイ古式マッサージ
広島 不動産
婚活
お見合いパーティー
マカ
格安航空券 国内
バイク便
税理士 東京
青梅市 不動産
配線工事
性病検査キット
高級賃貸
メンズ バッグ
新築 敷金0 礼金0
へアスパ
レコメンデーション
新宿 ネイル
体験ダイビング
六本木 バー
天然石 ビーズ
幼稚園先生
太陽光発電 神奈川
賃貸伊丹市
チラシ制作
お見合いパーティー
経営革新計画
春日 賃貸
サイト買収
エステ 神戸
大規模改修
ゴルフコンパニオン
バーチャルオフィス@東京

2:28 PM  
Blogger apple said...

Very good!I like the blog , Thanks .
polo hoodies, spyder jacket, cheap spyder jacket, the north face jackets, polo shirts, ed hardy hoodies, polo long sleeves shirts, norther face jacket, POLO jacket, ed hardy boots, ed hardy shoes, ed hardy jacket, ed hardy ugg boots, Babolat Tennis Racquets, Tennis Racquets, nike shoes, puma shoes, nike air max, nike shox nz,
spyder jackets,
discount spyder jacket,

1:53 PM  
Blogger season said...

Your article is very good.I like it very much.
Once upon a time, there was a mouse father.He wanted to marry his daughter to the greatest person in the world.But, who was the greatest person in the world?Oh!
puma ferrari shoes
cheap nike shoesThe sun! He must be the greatest person in the world.The mouse father went to talk to the sun."Hello! Mr. Sun.
puma shoes
ferrari shoes
I know you are the greatest person in the world.Would you marry my daughter?""What? I'm not the greatest person in the world. The greatest person is the cloud.If he comes out, I’ll be covered."
nike shox nz
Ugg Boots
The mouse father went to talk to the cloud. “Hello! Mr. Cloud. I know you are the greatest person in the world. Would you marry my daughter?”
nike 360 air max
nike shox shoes
“What? I’m not the greatest person in the world. The greatest person is the wind.If he comes out, I’ll be blown away.”
cheap puma shoes
puma drift cat
The mouse father went to talk to the wind. “Hello! Mr. Wind. I know you are the greatest person in the world.Would you marry my daughter?” “What? I’m not the greatest person in the world. The greatest person is the wall. If he comes out, I’ll be stopped.”
cheap nike shox
nike air max 360
The mouse father went to talk to the wall. “Hello! Mr. Wall. I know you are the greatest person in the world. Would you marry my daughter?” “What? I’m not the greatest person in the world. The greatest person is YOU, the mouse.” “The greatest person in the world is … mouse?” “Yes, the greatest person in the world is mouse. See? If mouse comes out, I’ll be bit!”
nike air max
pumas shoes
The mouse father was very happy. He finally knew mouse was the greatest person in the world. He would marry his daughter to the handsome mouse next door.
cheap jeans
cheap levis jeans
ed hardy jeans

7:03 AM  
Blogger apple said...

Very good!I like the blog , Thanks .
polo hoodies, spyder jacket, cheap spyder jacket, the north face jackets, polo shirts, ed hardy hoodies, polo long sleeves shirts, norther face jacket, POLO jacket, ed hardy boots, ed hardy shoes, ed hardy jacket, ed hardy ugg boots, Babolat Tennis Racquets, Tennis Racquets, nike shoes, puma shoes, nike air max, nike shox nz,
spyder jackets,
discount spyder jacket,
ghd hair straighteners,
cheap ghd hair straighteners,
ugg boots,
cheap ugg boots,

12:39 PM  
Blogger nike said...

Truely a nice blog and thanks for your great work. By the way, welcome to our websites: cheap adidas shoes and ghd hair straightners. Every men like sport, then, it is quite important to have a pair of right sports shoes to make you fully enjoy the sports. We provide nike sport shoes , cheap sport shoes, puma cat shoes, cheap nike shox shoes, cheap nike max shoes, shox shoes, nike shox r4running shoes which are brand new and in perfect condition but on discount.
All of the shoes, including the popularferrari shoespuma running shoes, nike tn dollar,which is the representative shoes of nike air max tnshoes are authentic and original of top quality. For people like running and playing basketball and other field sports, nothing would be more suitable than the puma shoes and nike shox nz basketball shoes. In addition to the shoes mentioned above, you may also be interested in the cheap adidas shoes , JORDAN WOMEN SHOES and nike running shoes, puma shoes , Nike Air Max Tn shoes and so on. The Nike air max series are specially designed and made for runners. It is the professional NIKE WOMEN SHOES for running . Wholesale and retail are both acceptable to us. Welcome to our site and free to look! Thank you and wish you a nice day. Good Luck!Everybody like beauty, which is quite commen, especailly womens. Welcom to our store which is focused on sellingghd hair straighteners mk4and hair straightners. For women, especially the young girls, this pink ghd hair straightenersis the best choice. ghd hair straightnersis famouse for the pretty outlook and the top quality. The price of this cheap ghd hair straightenersis acceptable and rational.
The ghd iv styler hair straightener is the newest product with a nice outlook and top quality.ghd mk4 hair straightener, purple ghd hair straighteners is beautiful, favourite by girls. ghd hair straightnersis necessary for you. It will be not difficult to you to become beautiful.

12:32 AM  

Post a Comment

<< Home