text:
Dear Followers,
Let us get back to the business of art, painting beautiful scenes, writing fiction and non-fiction, creating our dreams; let us get back to what is as close to normal as possible (for me), my followers and especially those on my Face Book page.
I have watched with interest all those running for President of the USA. I continued to sort through the actions, policies and as they dwindled to two, I watched more closely. I supported and voted for the individual of my choice. It does not matter at this point who won or lost, we have a President. In truth, I do not care about the lives of his children other than to wish them well, I do not care what Mr. Trumps wife wears, where she is from, or about her past or his. "Bashing with vulgarity" any person in and out of official offices is wrong. Nonetheless, My FB page has been filled with anti-Trump post for weeks; I had my own entries of course, but I hope with "taste".
This morning I checked my FB page and the first post had a particular vulgar word Trump had used during his campaign. I almost deleted the entire page, I did not faint, my ears did not turn red, and I have heard in all; you do not get my age and maintain your innocence. My finger hovered over the delete button, I thought of the wonderful people whom "had not" chosen to lay in the gutter; they were trustworthy, decent creative people. So, I did not delete!
It is time to get on with the business of living our lives, doing what we do best, and chose not to stoop to levels of vulgarity when voicing our opinions. We all have something to say…I am not speaking of "going" religious or pumping up of the "faith" card, I think you all know me better. I am just saying; let us be decent in our protest and our marches, we do not have to destroy material things and bash good people. This country was built on marches, protest and fighting for one's belief; it is our right as an American to do so, I practice my belief in "freedom of speech" daily. While we are voicing our dislike for a person, place or issue, let us do so with dignity. I am just saying…
Elizabeth Ann Johnson-Murphree 1.22.2017

subset: commoncrawl


text:
Words containing galliardne
Found 1 words containing galliardne. Browse our Scrabble Word Finder, Words With Friends cheat dictionary, and WordHub word solver to find words that contain galliardne. Or use our Unscramble word solver to find your best possible play! Related: Words that start with galliardne
- Scrabble
- Words With Friends
- WordHub
- Crossword


text:
Ivory with Black : Top 10 Hot Corsets Brands Of All Time
Read user reviews on Lubes for Men right here
Ivory with Black - Browse Sleeved Bodystockings, Boy Shorts and Pants, Babydolls, Up to 50 Percent off Lingerie, Floral Lingerie. similar: eliminate monokini bandage monokini ombre monokini leopard monokini white monokini strappy monokini swim Ivory with Black suite strapped monokini caged bra
Ivory with Black : Drawing see here now Underclothing For This Season
decide on the region you're going to be delivery to and also your most well-liked billing currency. There was an error. be sure to attempt yet again later on.
Allover pink and white kiss print. Ruffled edges. Sweetheart neckline. Contrasting black and white stripe print at Centre bust with lace-up detail. Adjustable back again hook closure. Contrasting black and white striped removable halter strap. Sizing & in shape Back hook closure with adjustable sizing. detachable halter strap For added assistance.
Description added data critiques (0) present some skin inside our most up-to-date a single piece! Our new Bare Sided one particular piece, glamorous and intended to increase An important sex attract your Bikini wardrobe! Whether you're wanting to elongate your wonderful Torso or producing a fashionable assertion, this seductive design is all you need to include some really serious bite to the glimpse!
Ivory with Black : How To Look Naughty In Your Suggestive Lingerie
Be the 1st to listen to about our special information, make up strategies, interviews and functions. Enter your details beneath to be and Illamasqua VIP.
Ivory with Black : Teddy nighties Models In Paris
11 critiques "This swimwear Ivory with Black is de facto lovable! It matches any dimensions provided that you tie it tightly more than enough"
It's a beautiful stability – a no-doubt-about-it accurate red that's deep sufficient to become stylish, but brilliant ample to generate an announcement. Sangers could are generally a tiiiny little bit on the warm side, although not enough to hassle even an orange-phobe for instance I'm. in actual fact, this warmish inclination could be what permits Sangers to glimpse lusciously pink instead of infuriatingly fuchsia on me, so I'm certainly not going to complain.
correctly form your entire torso for a smooth glimpse under your preferred outfit with this particular incredible all-in-a single bodysuit from DKNY. presents organization Command and shaping Adjustable...
Artist strategies This formulation presents rapid powerful repay from your initial stroke and it can also be utilized evenly like a lip stain that wears all day. implement having an Angled Eye Liner Brush for a brilliant sharp cupid's bow. supply & returns Delivery
appear and feel alluring Within this ultra cozy modal chemise Seamed cups deliver Ivory with Black raise and moderate modesty Darling keyhole again on plush empire waistband three column, two row hook and eye again closure again adjustable extend straps
during the early 1930s, Elizabeth Arden began to introduce distinct lipstick colors. She motivated other firms to create a range of lipstick shades.[21] inside the 1930s, lipstick was noticed as symbol of Grownup sexuality.
Just about way too hot to deal with, this alluring quantity designs and smooths your seem with its vertical seaming and fitted corset-impressed structure. Zip up the back again and toss it on below a (minus the) leather jacket--you'll be the envy of any place.
Make it a Ivory with Black evening to remeber On this satin and mesh established Sheer, seamed demi underwire cups with side boning Customize the healthy with absolutely adjustable stetch straps 3 column, two row hook and eye back closure Strappy, cage again bikini with cotton panel
on November 23, 2016 Lots of stretch, quite flattering! I'm about my normal bodyweight at the moment and very busty. This is perfect with it getting so stretchy. I'll obtain it while in the black too. Threw the panties from the trash. Way far too small. But selling price remains to be wonderful.
on November seventeen, 2016 Like it but... Just attempted this on soon after receiving my purchase today. It matches effectively ample that I'll continue to keep it, but remaining major busted, the best appears a little strange as my breasts force down the minimal little bit of fabric over the wire and It truly is tricky to get it to remain as many as go over the decreased Portion of the breast.
The supermodel wound up exhibiting off her sheer trousers due to the Driving up of her costume as she exited her auto.
shut starting of a dialog window, which includes tabbed navigation to sign up an account or sign in to an existing account. Both registration and register assistance utilizing google and Fb accounts. Escape will shut this window. Register check in Get started
womens bras hanky panky thongs lace womens hipster briefs blue sheer personal outfits womens grey mesh bodysuit free individuals lace bralettes
on Oct 2, 2016 Sexy and comfy pleasant stretchy materials with an exceptionally cheeky search. The only improvement I can visualize can be to make the laces adjustable.
These bras are generally paired with underwear of all designs, such as bikinis, thongs, and whole briefs in all sizes, together with as well as measurement. Ranging from highly feminine to rather subtle, lace types transform with the current technological know-how and fashion developments.
store by silhouette, dimensions, brand or action for getting just what you require. no matter if you are Doing work out or heading down the aisle, Kohl's has every single bra model, color and dimensions you'll want to be comfortable Ivory with Black and supported.
The presenter unwittingly confirmed off her brown polkadot pants as she crossed her legs before the digicam, giving viewers somewhat more than they bargained for.
on March 31, 2016 Feels terrific On My husband purchased this for me and it's very relaxed on. He had bought a cheap one for me in the past which was very not comfortable. This one particular is great excellent and looks sexy on.
Yay! you might be now following golfing knickers with your eBay Feed.you may acquire electronic mail alerts for new listings.
How am i able to make my work accessible to Ivory with Black the Group, when it is in convention proceedings that aren't on the web and self archiving just isn't permitted?
the center and soul of any biking bottom is its chamois. It's a big Section of the construction and the expense. It might make all the real difference on the experience, so it's essential you end up getting your soulmate right here. these are typically the things to take into account when analyzing the discrepancies concerning knicker-duration bottoms with distinct chamois: air flow and humidity Manage (Tremendous important for Touring).
specified the wide range of brand names and models that we carry at Journelle, odds are you'll don a minimum of a few diverse dimensions - certainly across brands, but occasionally even in various types in the very same brand.
Stretches in all the correct places and snaps back again into position. Access web-sites are correctly lined. If someone does not like this merchandise is most likely bc they absence the curves to do it justice. the most beneficial fitting lingerie I have EVER procured!!!
elegant and comfortable jacquard and lace full cup bra. Cups decorated with silky pattern, surrounded with top rated high-quality lace. The vertical Reduce delivers far better support for entire busted Women of all ages!
crotchless lingerie by peaches and screams
I Ivory with Black went on the factory and noticed how they made them. The perform and depth that goes in to the s extraordinary and genuinely places them a category above other designers.
three) The label had to be accessible for invest in by the general public. for instance, Mr. Pearl (the man guiding Dita von Teese's corsets) is kind of quite possibly the most beneficial and costliest corsetiere in the world, but his corsets are certainly not obtainable to All people, and therefore his title just isn't on this checklist.
Black sheer bra for giant busted Ladies. See by means of black lace tulle on each cup with refined French embroideries.
Erotic, crotchless thong with crafted-in pearl G-string distinctive pearl strand stimulates & arouses sensitivity Single row of forged pearls with a extend strand very, extremely feminine lace appliqué finishes the thong Panty features a three.5'' extremely-small increase for included attractiveness highlighted critique:
on March 31, 2016 Feels Great On My husband bought this for me and it is rather snug on. He had procured a cheap one particular for me before which was very awkward. This one particular is great high-quality and looks sexy on.
view bra garterbelt and thong sets here
often all it's going to take are a few stunning silk knickers or sexy briefs for making you really feel wonderful! in this article at Bedtime Flirt, we can easily tempt you with a fantastic assortment of ladies's panties and lingerie knickers in several fabrics and types to fit your derrière as well as your temper.
on March 25, 2016 cozy and beautiful These panties are produced from Charming, delicate lace. they may have the proper quantity of extend for comfort and ease and a beautiful suit. Tremendous really at the same time.
so that you can be included on this list of high-priced luxury lingerie models, the label has to produce a minimum of bras and panties, the head with the underwear earth.
This Xmas, let your relatives and buddies deck the halls, mantelpiece or maybe the entrance action with beautiful Wintertime bouquets and festive crops
Unfortunately, In spite of winning the war, Britain never completely recovered floor, plus the knickers ban remained set up during most English speaking nations around the world. This ban carries recommended reading on to trigger confusion and chaos, especially for admirers of Tom Jones who don't realize why they have been forced to eliminate their undergarments considering the fact that 1987. Supporters of your Knickers Ban
learn Females's bras, underwear, sleepwear Ivory with Black and a lot more at Kohl's. Our every day bras and underwear are created with comfortable, high-quality products although our shapewear gives slimming support and eye-catching details. whether or not you would like every day staples or lingerie for just a Unique event, Kohl's has your measurement and manufacturer.
This bra's uncommon and delectable hue of carmine red easily can make every complexion surface lively and refreshing. you can adore how the straps on this massive sizing sheer balconette bra...
Fantasy turned fact On this risqué crotchless thong Intriguing keyhole and self-tie satin ribbon on rear four" daringly minimal; measurement taken from dimension S/M Semi-sheer extend lace showcased evaluate:


text:
(no subject)Mar. 13th, 2017 06:39 pm
I really need to start using my LJ more, I've always been very against letting this site die through inactivity, but I'm getting so lazy with updating this year. I just never seem to have the energy for long entries lately :(
( The Vampire Diaries finale )
( The Vampire Diaries finale )


text:
MQPP would like to be your parts supplier for Sterilizers, OR Tables, OR lights & Washing Equipment! 1-877-512-5573
Our Mission: To be the most trusted resource in the sterilization market, dedicated to the advancement of our employees, clients, & suppliers. Our Focus: New & Refurbished Sterilizers & Autoclaves. TRADE-INS WELCOMED!
DOTmed HealthCare
Business News
Media Kit: PDF
Some of the products and services on display at ASTRO 2017
Innovation for mitral valve and coronary artery bypass cardiac surgery
Cuts down on time and costs
Ministry of Health allowed the implant as a last resort for the patient
Maintain a sterile operating field and track outcomes


text:
Brand Label: Benefit Cosmetics
ITEM MOVED TO ARCHIVE: On September 5, 2017 7:15 am, Fashion Stylist Online noted this item may be out of stock at NORDSTROM because it was not referenced in their latest online catalog. If this item is out of stock at NORDSTROM, you may be able to find similar fashions sold there or elsewhere on our Benefit Cosmetics Designer Brand Directory.
Available for Purchase Online at NORDSTROM for $18.00Pin It
What it is: A hydrating, tinted lip balm. What it does: This tinted lip balm conditions and hydrates with mango butter and sodium hyaluronate. Perfect for wearing alone or layering with other lip colors, this kiss of sheer, buildable color gives you the softest, sexiest lips. Shades:- Benebalm (rose tinted)- Posiebalm (poppy pink tinted)- Lollibalm (candy orchid tinted)- Chachabalm (mango tinted)How to use: Glide on bare lips or over your favorite tint. Color(s): benebalm, chachabalm, lollibalm, posiebalm. Brand: BENEFIT. Style Name: Benefit Hydrating Tinted Lip Balm. Style Number: 5421754. Available in stores.
Shop other brand label items from Benefit Cosmetics on FashionStylist.com.
This item was published for sale online by NORDSTROM on September 4, 2017 1:37 pm and last updated by us September 5, 2017 7:15 am.
Editor Picks: The Beauty Items on Your Wishlist
Nails Inc The Soft Metals Nail Polish Collection
Benefit Cosmetics Benetint Cheek Lip Stain 0 13
Bite Beauty Best Redux Makeup
Lancome Juicy Shaker 381 Mangoes Wild 0 22 6 5
Benefit Cosmetics Ka Brow Cream Gel Eyebrow Color
Editor Picks: Beauty Lover's Gift Guide
Givenchy Mister Lash Booster 0 05 Mascara
Blinc Black Lash Primer 0 16 Mascara
Sephora Collection Astonish Lash Trio 3 X Pairs
Obsessive Compulsive Cosmetics After Dark Stained
Gorgeous Cosmetics Colour Pro Blush 0 1 Rose Glow
Editor Picks: Valentine's Day Makeup Must Haves
Sephora Collection Eyebrow Editor 01 Blonde Makeup
Yves Saint Laurent Crayon Yeux Waterproof
Tarte Amazonian Clay Waterproof 12 Hour Concealer
Sephora Collection Show Curl Lash Curler 18 Karat
Givenchy Mister Lash Booster 0 05 Mascara
Editor Picks: Beauty Tools for the New Year New You
Sephora Collection Detox It Out Charcoal Swabs
Sephora Collection Crystal Nail File Pink Case
Sephora Collection Bulls Eye Lash Applicator Lid
Glo Science Tm One Night Stand Travel Smile Kit
Sephora Collection Clean Machine Konjac Sponge
Editor Picks: Gift Guide : Makeup and Holiday Gift Sets
Browse More Fashion Apparel by Benefit Cosmetics (view more)
- $29.00
Benefit Cosmetics Benefit Rockateur Rose Gold
- $20.00
Benefit Cosmetics Benefit Lemon Aid Color Correcting
- $16.00
Benefit Cosmetics Ultra Plush Lip Gloss Coralista
- $32.00
Benefit Cosmetics Benefit Stay Flawless 15 Hour
- $30.00
Benefit Cosmetics Benefit Porefessional Agent
- $24.00
Benefit Cosmetics Benefit Fakeup Hydrating Concealer
- $24.00
Benefit Cosmetics Benefit Fake Up Hydrating Concealer
- $20.00
Benefit Cosmetics Boi Ing Full Coverage Concealer
- $24.00
Benefit Cosmetics Benefit Fake Up Hydrating Concealer
- $20.00
Benefit Cosmetics Boi Ing Full Coverage Concealer
New promo codes and links offering limited time promotions, sales coupons, and special offers on Benefit Cosmetics designer fashions and accessories will be posted on each designer label apparel page. For the latest up to date information on this Benefit Cosmetics Benefit Hydrating Tinted Lip Balm Posiebalm Makeup | Beauty fashion item, including product specifications, ordering options, pricing, shipping details, high resolution pictures, shopper comments, and other sales media, visit the NORDSTROM Online Store.


text: Ok, this time I mean it. The kinks are out. I need a better test suite. Volunteers to write a test suite for the web interface? I can dream, can't I? Changes for 0.43: 0.43 Enhancements: - Allow passing of port when executing SQL from schema creator. - Confirm schema deletion in schema creator. Bug fixes: - Quick hack to fix a problem with Alzabo::MethodMaker when using caching. However, this requires that the caching modules be loaded first, before Alzabo::MethodMaker. A more palatable fix will be in a future release. - Fix a problem with prefetching rows that caused row objects to contain undefined values for certain columns. This only happened if you were prefetching one column. - Fix another problem that left the schema creator still broken.


text:
Download McCabe's Tavern apk 1.407 free for Android smartphone
Posted by Epic Apps - Be Legendary in Entertainment | Oct. 28, 2013 | 0 Comments
Apk file size: 4.6 MB
McCabe's Tavern is your neighborhood Irish pub in Colorado Springs. Come enjoy our popular outdoor patio that is open all year long. Boasting one of the largest selections of domestic and imported beers on tap in Colorado Springs, as well as 23 different Irish whiskeys, McCabe's Tavern gives you an authentic Irish pub experience right in your own Colorado Springs neighborhood.
There is always something fun going on at McCabe's Tavern in Colorado Springs. Make sure you don't miss out on the Colorado Springs local live music, trivia nights, steal tip darts, foosball, Jukebox and European football broadcasts. The Irish restaurant in Colorado Springs, McCabe's Tavern offers a full Irish menu, including corn beef and cabbage and Colorado Springs Sunday brunch available all day Sundays.
For the friendliest Colorado Springs bar and restaurant, McCabe's Tavern is where you want to be. Come on in!
In this app, you'll find:
- Our interactive calendar, with weekly and special events
- Say Cheese, a tab which allows you to take and upload picture of your time spent at McCabe's
- A Listen Up tab, featuring Irish music that is available for purchase
- Perks tab, featuring coupons and discounts for people who have downloaded the app
- Fan Wall tab, where you can leave feedback on your experience and read about other's
- Photo gallery, with pics of our bar and patrons
- Gear store, featuring t-shirts and more
- Newsletter sign-up, where you can receive updates on specials and events
- Tip calculator, QR code scanner and cab caller
- Contact information, including one-touch dialing, GPS directions and more
Epic Apps - Be Legendary part of our Entertainment and have average installs from 100 to 500. Last Update Oct. 28, 2013. Google play rating is 100.0. Current verison is 1.407. Actual size 4.6 MB.


text:
Currently reading
Sherlock Holmes: The Definitive Collection
The Alienist
Progress: 38/498 pages
Reading progress update: I've read 360 out of 695 pages.
Oh, that Mr. Crosbie is a douchebag. He needs a comeuppance in the worst sort of way.
Also, Trollope uses this expression:
"Psha, mamma; pray don't go on in that Goody Twoshoes sort of way."
I had no idea that the expression "Goody Twoshoes" was as old as all that.
And, he named one of his characters "Major Fiasco," which made me laugh out loud.


text:
|Publication number
|Publication type
|Application number
|Publication date
|Jul 9, 1996
|Filing date
|Feb 15, 1995
|Priority date
|Jun 5, 1992
|Fee status
|Also published as
|Publication number
|Anders Hejlsberg, Jeffrey Stock, Peter Kukol, Alex Shtaygrud
|Original Assignee
|Borland International, Inc.
|Export Citation
|BiBTeX, EndNote, RefMan
|Patent Citations (7), Non-Patent Citations (4), Referenced by (78), Classifications (17), Legal Events (9)
|External Links: USPTO, USPTO Assignment, Espacenet
This is a Continuation patent application of Ser. No. 07/894,706, filed Jun. 5, 1992, now U.S. Pat. No. 5,481,708.
A portion of the disclosure of this patent document contains material which is subject to copyright protection. The copyright owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure as it appears in the Patent and Trademark Office patent file or records, but otherwise reserves all copyright rights whatsoever.
The present invention relates generally to the field of computer systems and, more particularly, to systems and methods for compiling source programs, particularly object-oriented ones, into optimized object code.
Before a digital computer may accomplish a desired task, it must receive an appropriate set of instructions. Executed by the computer's microprocessor, these instructions, collectively referred to as a "computer program," direct the operation of the computer. Expectedly, the computer must understand the instructions which it receives before it may undertake the specified activity.
Owing to their digital nature, computers essentially only understand "machine code," i.e., the low-level, minute instructions for performing specific tasks--the sequence of ones and zeros that are interpreted as specific instructions by the computer's microprocessor. Since machine language or machine code is the only language computers actually understand, all other programming languages represent ways of structuring human language so that humans can get computers to perform specific tasks.
While it is possible for humans to compose meaningful programs in machine code, practically all software development today employs one or more of the available programming languages. The most widely used programming languages are the "high-level" languages, such as C or Pascal. These languages allow data structures and algorithms to be expressed in a style of writing which is easily read and understood by fellow programmers.
A program called a "compiler" translates these instructions into the requisite machine language. In the context of this translation, the program which is written in the high-level language is called the "source code" or source program. The low-level or machine language, on the other hand, comprises "object code." Once created, object code (e.g., .obj file) is a separate program in its own right--it includes instructions which may be executed by the target microprocessor. In practice, however, the object code is usually first linked (i.e., combined) with other object code or libraries, which include standard routines.
Compilers are fundamental to modern computing. Translating human-oriented programming languages into computer-oriented machine languages, compilers allow computer programmers to ignore the machine-dependent details of machine language. Moreover, high-level languages are "portable," a feature which permits a single program to be implemented on several different machines, including ones of vastly different architecture. In this instance, the source program is "ported" (transferred) from one machine to another with little or no revision; instead, the program is simply re-compiled for each target machine. Thus, compilers allow programs and programming expertise to be machine-independent.
A compiler performs two basic tasks: analysis of the source program and synthesis of a machine-language program which instructs the computer to perform the task described by the source program. Most compilers are syntax driven, i.e., the compilation process is directed by the syntactic structure of the source program, as recognized by a compiler's parser. The parser builds the structure out of tokens, the lowest-level symbols used to define a programming language's syntax. This recognition of syntactic structure is a major part of the analysis task. Semantic routines actually supply the meaning (semantics) of the program, based on the syntactic structures. The semantic routines generate the target code or, optionally, some intermediate representation thereof.
Ideally, when a compiler translates a description of an application and maps it onto the underlying machine-level instruction set of a target processor, the resulting code should be at least as good as can be written by hand. In reality, code created by straightforward compilation rarely achieves its goal; instead, tradeoffs of slower performance and/or increased size of the executing application are usually incurred. While compilers simplify the task of creating meaningful programs, they rarely produce machine code which is not only the most efficient (smallest) in size but also executes the fastest.
Object-oriented programming languages (OOPL), such as C++, entail even further difficulties. In particular, data encapsulation, inheritance, and polymorphism--the main advantages of OOPL--all increase the difficulty of implementing optimizing techniques. As a result, optimization efforts to date have been largely restricted to straight procedural (e.g., C) compilers.
The present invention recognizes a need for providing an object-oriented development environment with an optimizing compiler. A system of the present invention includes a development environment having an optimizing compiler, a linker, and an interface. Through an interface (either command-line or UI driven), an application or system developer supplies source listings to the compiler. From the source listings (including header and include files), the compiler generates object module(s); these may be linked with other object modules or libraries to generate program executable by a target processor.
The optimizing compiler includes a translator, a code generator, and an optimizer. The optimizer provides code optimization methods for improving the speed and/or shrinking the size of a generated application. Methods of the optimizer include global register allocation, dead code elimination, common subexpression elimination, loop invariant code motion, copy propagation, pointer aliasing, induction variable analysis and strength reduction, loop compaction, structure copy inlining, code compaction, redundant load suppression, intrinsic function inlining, and register parameter passing. Additional C++ optimization methods are provided, including virtual function and base optimization, using thunks for virtual member pointers, and passing classes by value. A new object-oriented calling convention of the present invention is also provided for generating executable programs which rapidly and efficiently access data and methods of objects.
FIG. 1A is a block diagram of a computer system in which the present invention may be embodied.
FIG. 1B is a block diagram of a software system for controlling the operation of the system of FIG. 1A.
FIG. 2A is a block diagram of a development system of the present invention.
FIG. 2B is a block diagram of the optimizing compiler of FIG. 2A.
FIG. 3 is a program listing illustrating the static (i.e., determined at compile time) access of a virtual function.
FIG. 4 is a flowchart illustrating a method of the present invention for passing classes by value.
FIGS. 5A-C are block/schematic diagrams of various memory/CPU register configurations which illustrate an objected-oriented calling convention of the present invention.
FIG. 6 is a flowchart illustrating the object-oriented calling convention of the present invention operative within an executing program (generated by the compiler of FIG. 2B).
FIG. 7 illustrates code generation with and without object-oriented calling convention of the present invention.
The present invention may be embodied on a computer system such as the system 100 of FIG. 1, which includes a central processor 101, a main memory 102, an input/output controller 103, a keyboard 104, a pointing device 105 (e.g., mouse, track ball, pen device, or the like), a display device 106, and a mass storage 107 (e.g., hard disk). Additional input/output devices, such as a printing device 108, may be provided with the system 100 as desired. As shown, the various components of the system 100 communicate through a system bus 110 or similar architecture.
Illustrated in FIG. 1B, a computer software system 150 is provided for programming the operation of the computer system 100. Software system 150, which is stored in system memory 102 and on disk memory 107, includes an kernel or operating system 160 and a windows shell or interface 180. One or more application programs, such as application programs 170 or windows applications programs 190, may be "loaded" (i.e., transferred from storage 107 into memory 102) for execution by the system 100. OS 160 and shell 180, as well as application software 170, 190, include an interface for receiving user commands and data and displaying results and other useful information.
Software system 150 also includes a development system 200 of the present invention for developing system and application programs. As shown, the development system 200 includes components which interface with the system 100 through windows shell 180, as well as components which interface directly through OS 160.
In a preferred embodiment, the system 100 is an IBM-compatible personal computer, available from a variety of vendors (including IBM of Armonk, N.Y.). Operating system 160 is MS-DOS and shell 180 is Microsoft Windows, both of which are available from Microsoft Corporation of Redmond, Wash.; alternatively, the system 100 may be implemented in other platforms, including Macintosh, UNIX, and the like. Development system 200 includes Borland C++, version 3.0, available from Borland International of Scotts Valley, Calif. Application software 170, 190, on the other hand, can be any one of a variety of software applications, including word processing, database, spreadsheet, text editors, and the like.
A. Introduction
The results of optimization are significant to both programmers and end users. Users receive programs optimized for speed, size, or both. Programmers, on the other hand, can write programs in a style that they find most convenient, not in the style that a computer finds most convenient. To achieve these results, optimization methods include techniques to:
1) Decrease the number of processor cycles required by the program;
2) Decrease the number of address calculations performed;
3) Minimize the number of memory fetches; and
4) Minimize the size of the generated object code.
To some extent, these goals may be achieved through "local" optimization. Local optimizations are improvements to small, mostly self-contained blocks of code, such as loops, switches, and "if-else" constructs. Local optimization techniques include elimination of common subexpressions and dead variables, movement of loop-invariant computations, and folding of constants into a single value.
Most programs contain more than just a series of isolated blocks, however. To produce still more efficient code, "global" optimization is required. This type of optimization occurs on a broader scale, with the optimizer seeking inefficiencies that affect multiple blocks. This task is considerably more difficult to achieve because of the more complex data flow analysis that must be performed by the compiler.
An optimizer basically aims at improving an application's speed and shrinking the size of executable files. The prime role of a compiler, on the other hand, is to check the source program's syntax and, if all is in order, generate object code that mirrors the intention of that source code. Being targeted at a particular microprocessor (or family), the object code is dependent on that microprocessor's instruction set and register architecture. Just as a programmer can code a given function in a variety of ways in a high level language, there are many different object code sequences which will achieve the same result. For a given microprocessor, an ideal mapping from source to object code is rarely if ever achieved. Some of these sequences may execute faster, usually at the expense of code size. Others will be smaller in size, but often at the expense of speed. Thus, a compromise often results.
B. Development System
Shown in further detail in FIG. 2A-B, the development system of the present invention includes an optimizing compiler 220, a linker 250, and an interface 210. Through interface 210, the user or developer supplies source listings 120 to the compiler 220. Interface 210 includes both command-line driven 213 and Intergrated Development Environment (IDE) 211 interfaces, the former accepting user commands through command-line parameters, the latter providing menuing equivalents thereof. From the source code 120 and header/include files 230, the compiler 220 "compiles" or generates object module(s) 130. In turn, linker 250 "links" or combines the object modules 130 with libraries 260 (e.g., graphics, I/O routines, startup code, and the like) to generate program(s) 140, which may be executed by a target processor (e.g., processor 101 of FIG. 1). A debugging module 270 may be added, as desired, for eliminating errors in the programs 140.
Shown in further detail in FIG. 2B, the optimizing compiler 220 includes a front end and a back end. In particular, the front end includes a scanner 221 and a parser 223, while the back end includes a translator 224, a code generator 225, and an optimizer 227. In basic operation, the scanner 221 reads a source program and breaks it apart into a sequence of tokens, which include identifiers, delimiters, numbers, operators, and the like. In turn, the tokens are read by the parser 223, which understands the semantics of the source language. Given a formal syntax specification, such as a context-free grammar (CFG), the parser generates an intermediate representation (IR code) of the program, for example, by grouping tokens into units as specified by the syntax being used. In the syntax of the C programming language, for example, the expression A=B+C tells the computer to add the values of B and C together to obtain a new value, which is assigned to A. As shown, the IRcode may be provided to the back end as a derivation tree 271, with the parsed tokens accessible from nodes of the tree.
Next, the IR code is passed to the back end of the compiler for code generation. Upon receiving this (e.g., by receiving a pointer to the expression tree 271), the translator 251 reduces the IR code into a table(s) 273 of triples (i.e., three-address representation) or, more preferably, quadruples (i.e., three-address representation with intermediate values referenced by explicit names). Using appropriate op-code lookup tables, these quads are then mapped by the code generator 225 into the object code performing the specified operations. For an introduction to the general construction and operation of compilers, see Fischer et al., Crafting a Compiler with C, Benjamin/Cummings Publishing Company, Inc., 1991, the disclosure of which is hereby incorporated by reference.
The basic operation of the compiler 220 is enhanced by the optimizer 227, which will now be described. Optimizer 227 provides code optimization methods for improving the speed and/or shrinking the size of a generated application. Preferably, the user controls what kinds of optimization he or she wants the compiler 220 to perform. In this manner, the programmer may program in the style which he or she finds most convenient.
In an exemplary embodiment of the present invention employing command-line interface 213, code optimizations are controlled through an --O command line option, followed by one or more of suboption letters (listed below). For example, --Oaxt turns on all speed optimizations and assumes no pointer aliasing. To disable or turn off optimizations, on the other hand, the user places a minus character before the optimization letter. For example, --O2-- p would turn on all optimizations except copy propagation. As another example, --Od appearing on the command line after an --O2 would disable all optimizations. Some optimizations are also controlled by means other than --O switches. For example, --Z controls redundant load suppression.
Available optimization options in an exemplary command-line embodiment include (with equivalent menuing options also show):
______________________________________Parameter Menu Option/Function______________________________________O2 Options Compiler Optimizations Full Speed Generates the fastest code possible. This is the same as using the following command-line options: -O -Ob -Oe -Og -Oi -Ol -Om -Op -Ot -Ovk- -ZO1 Options Compiler Optimizations Full size Generates the smallest code possible. This is the same as using the following command-line options: -O -Ob -Oe -Os -k- -ZO Options Compiler Optimizations Optimize Jumps Removes jumps to jumps, unreachable code, and unnecessary jumpsOa Options Compiler Optimizations Assume no pointer aliasing Assume that pointer expressions are not aliased in common subexpression evaluationOb Options Compiler Optimizations Dead code elimination Eliminates stores into dead variablesOc Options Compiler Optimizations Common Subexpressions Optimize locally Enables common subexpression elimination within basic blocks only. The -Oc option and the -Og option are mutually exclusiveOd Options Compiler Optimizations No Optimizing Disables all optimizations. Note that this is not the same as -O-, which merely disables jump optimizations.Oe Options Compiler Optimizations Global register allocation Enables global register allocation and variable live range analysisOg Options Compiler Optimizations Common Subexpressions Optimize globally Enables common subexpression elimination within an entire function. The -Og option and the -Oc option are mutually exclusiveOi Options Compiler Optimizations Inline intrinsics Enables inlining of intrinsic functions such as memcpy, strlen, and the like.Ol Options Compiler Optimizations Loop optimization Compacts loops into REP/STOSx instructionsOm Options Compiler Optimizations Invariant code motion Moves invariants code out of loopsOp Options Compiler Optimizations Copy propagation Propagates copies of constants, variables, and expressions where possibleOs Options Compiler Optimizations Optimize for Size Makes code selection choices in favor of smaller codeOt Options Compiler Optimizations Optimize for Speed Selects code in favor of executable speedOv Options Compiler Optimizations Induction Variables Enables loop induction variable and strength reduction optimizationsOx None Enables most speed optimizations. This is provided for compatibility with other compilers (e.g., Microsoft C).Z Options Compiler Optimizations Suppress redundant loads Suppresses reloads of values which are already in registerspr Options Compiler Entry/Exit Code Calling Convention Register Enables the use of the -- fastcall calling convention for passing parameters in registers______________________________________
From the selected option(s) and in conjunction with parser 223, optimizer 227 instructs code generator 225 in the generation of optimized object code. Additionally, a --po option is provided, as described in further detail hereinbelow.
C. Optimization Techniques
Principles of optimization, in accordance with the present invention, will now be described in further detail.
1. Global register allocation
Because memory references are computationally expensive in most systems, references are minimized through the intelligent use of registers. Global register allocation both increases the speed and decrease the size of generated applications. With optimizations enabled, the compiler 220 employs global register allocation when compiling the application.
2. Dead code elimination
Although the developer may never intentionally write code to do things which are unnecessary, the optimizer 220 may reveal possibilities to eliminate stores into variables which are not needed. Using --the Ob option to remove stores into dead variables, the optimizer 227 creates a new variable to take the place of the expression a[j].
______________________________________ int goo(void), a[10]; int f(void) { int i, j; j = i = goo( ); for( j = 0; j < 10; j++) a[j] = goo( ); return i; }______________________________________
This removes the code to store any result into the variable j, thus eliminating the need for it.
Since the optimizer should preferably determine where variables are no longer used and where their values are needed (live range analysis), the developer will typically use --Oe before using --Ob. Moreover, --Ob is preferably used whenever --Oe is used, since --Ob always results in smaller and faster code.
3. Common subexpression elimination
In common subexpression elimination, optimizer 227 finds duplicate expressions within a target scope, with the calculated value of those expressions stored once so as to avoid recalculating the expression. While this optimization may reduce code size, it mainly serves as a speed optimization technique.
The developer should preferably also use global common subexpression analysis if he or she wishes to reuse expressions rather than create explicit stack locations for them. For example, rather than code
__________________________________________________________________________temp = t->n.o.left;if(temp->op == O-- ICON temp->op = O-- FCON). . .the developer could codeif(t->n.o.left->op == O-- ICON t->n.o.left->op == O-- FCON). . .__________________________________________________________________________
and let the optimizer 227 decide whether it is more efficient to create a temporary variable.
If, on the other hand, the developer finds that global common subexpression elimination creates too many temporaries for the developer's code size requirements, he or she can force common subexpression elimination to be done within groups of statements Unbroken by jumps (basic blocks) by turning on local common subexpression elimination via the --Oc command-line option.
4. Loop invariant code motion
Moving invariant code out of loops serves as a speed optimization. The optimizer 227 uses the information about all the expressions in a function gathered during common subexpression elimination to find expressions whose values do not change inside a loop. To prevent the calculation from being done many times inside the loop, the optimizer 227 moves the code outside the loop so that it is calculated only once. It then reuses the calculated value inside the loop.
Loop invariant code motion is used whenever the developer is compiling for speed and the developer has used global common subexpressions. For example, in the code below, x * y * z is evaluated in every iteration of the loop.
______________________________________ int v[10]; void f(void) { int i,x,y,z; for (i = 0; i < 10; i++) v[i] = x * y * z; }______________________________________
The optimizer 227 rewrites the code for the loop as:
______________________________________ int v[10]; void f(void) { int i,x,y,z,t1; t1 = x * y * z; for (i = 0; i < 10; i++) v[i] = t1; }______________________________________
Since unnecessary calculations within the loop are eliminated, substantial speed gains may be realized.
5. Copy propagation
Propagating copies is primarily a speed optimization. Since it does not increase the size of the developer code, it is preferably used even when the developer has enabled --Og. Like loop invariant code motion, copy propagation relies on the analysis performed during common subexpression elimination. Copy propagation means that the optimizer 227 remembers the values assigned to expressions and uses those values instead of loading the value of the assigned expressions. Copies of constants, expressions, variables, and the like may be propagated.
In the following code, for example, the constant value 5 is used in the second assignment instead of the expression on the right side.
______________________________________PtrParIn->IntComp = 5; // 1st assign( *( PtrParIn->PtrComp ) ).IntComp = // 2nd assignPtrParIn->IntComp; // use 5 instead______________________________________
6. Pointer aliasing
While not strictly an optimization, pointer aliasing affects the way the optimizer performs common subexpression elimination and copy propagation. When pointer aliasing is enabled, it allows the optimizer 227 to maintain copy propagation information across function calls and maintain common subexpression information across some stores. Otherwise, the optimizer should preferably discard information about copies and subexpressions in these situations. Since pointer aliasing might lead to errors or bugs which are hard to spot, it is preferably applied only when the developer uses --Oa.
The parameter --Oa controls how the optimizer 227 treats expressions which contain pointers. When compiling with global or local common subexpressions and --Oa enabled, the optimizer 227 will assume that pointer expressions are not aliased in common subexpression evaluation and recognize
*p * x
as a common subexpression, for example, as shown in the following function, foo:
______________________________________ int g, y; int foo(int *p) { int x = 5; y = *p * x; g = 3; return (*p * x); }______________________________________
If not employed correctly, however, an error may result, for example:
______________________________________void goo(void) { g = 2; foo(&g); /* This is incorrect, since the assignment g = 3 invalidates the expression *p * x */______________________________________
--Oa also controls how the optimizer treats expressions involving variables whose address has been taken. When compiling with --Oa, the compiler assumes that assignments via pointers will only affect those expressions involving variables whose addresses have been taken and which are of the same type as the left hand side of the assignment in question.
To illustrate this concept, consider the following function.
______________________________________ int y, z; int f(void) { int x; char *p = (char *)&x; y = x * z; *p = "a"; return (x*z); }______________________________________
When compiled with --Oa, the assignment *p=`a` will not prevent the optimizer 227 from treating x*z as a common subexpression, since the destination of the assignment, *p, is a char, whereas the addressed variable is an int. When compiled without --Oa, the assignment to *p prevents the optimizer from creating a common subexpression out of x*z.
7. Induction variable analysis and strength reduction
Creating induction variables and performing strength reduction are speed optimizations performed on loops. The optimizer 227 employs induction to create new variables out of expressions used inside a loop; these variables are called "induction variables." The optimizer 227 assures that the operations performed on these new variables are computationally less expensive (reduced in strength) than those used by the original variables.
Opportunities for these optimizations are common if the developer uses array indexing inside loops (since a multiplication operation is required to calculate the position in the array which is indicated by the index). For example, in the code:
______________________________________ int v[10]; void f(void) { int i,x,y,z; for (i = 0; i < 10; i++) v[i] = x * y * z; }______________________________________
the optimizer 227 creates an induction variable out of the operation v[i], since the v[i] operation would require a multiplication. The induction variable also eliminates the need to preserve the value of i. Thus with --Ov enabled, the optimizer 227 changes this code to the following:
______________________________________ int v[10]; void f(void) { int i,x,y,z, *p; for (p = v; p < &v[10]; p++) *p = x * y * z; }______________________________________
Preferably, the developer will use --Ov whenever he or she is compiling for speed in source code which contains loops.
8. Loop compaction
Loop compaction takes advantage of the instruction set of 80�86 processors by replacing the code for a loop with an equivalent string move instruction. For example, for the code:
______________________________________ int v[100]; void t(void) { int i; for (i = 0; i < 100; i++) v[i] = 0; }______________________________________
the compiler 220 generates the following machine instructions:
______________________________________mov cx,100mov di,offset DGROUP:-- vpush dspop esmov ax,0rep stosw______________________________________
which benefits from the rep stosw instruction of the 80�86.
Preferably, the developer will use --O1 to compact loops whenever he or she is generating code for speed. Depending on the complexity of the operands, the compacted loop code may also be smaller than the corresponding non-compacted loop.
9. Structure copy inlining
Inlining of structure copies provides substantial optimization when compiling for speed. When the developer enables --Ot, the compiler 220 determines whether it can safely generate code to perform a rep movsw instruction instead of calling a helper function to do the copy. For structures and unions of over 8 bytes in length, performing this optimization produces faster structure copies than the corresponding helper function call.
10. Code compaction
In contrast to structure copy inlining, code compaction provides substantial optimization when compiling for size. In code compaction, the optimizer scans the generated code for duplicate sequences. When such sequences warrant, the optimizer replaces one sequence of code with a jump to the other, thereby eliminating the first piece of code. SWITCH statements contain the most opportunities code compaction.
11. Redundant load suppression
Load suppression is both a speed and size optimization. When --Z is enabled, the optimizer keeps track of the values it loads into registers and suppresses loads of values which it already has in a register. For example, when compiling the following code with --Z enabled (and with copy propagation turned off), the optimizer 227 specifies that the value of *x which has been loaded is pushed into ES:BX instead of reloading the same value:
______________________________________ void f(void) { int *x = 5; goo(*x); }______________________________________
The developer should preferably use this optimization whenever he or she is compiling with the optimizer enabled.
12. Intrinsic function inlining
There are times when the developer would like to use one of the common string or memory functions, such as strcpy() or memcmp(), but he or she does not want to incur the overhead of a function call. By using --Oi, the compiler 220 generates the code for these functions within the developer function's scope, eliminating the need for a function call. At the expense of size, the resulting code executes faster than a call to the same function.
Functions which are inlined when --Oi is enabled include:
______________________________________memchr strcmp strrchrmemcmp strcpy rotlmemcpy strlen rotrmemset strncat fabsstpcpy strncmp allocastrcat strncpystrchr strnset______________________________________
The developer can also control the inlining of each of these functions with the #pragma intrinsic. For example,
#pragma intrinsic strcpy
would cause the compiler 220 to generate code for strcpy in the developer's function.
#pragma intrinsic --strcpy
would prevent the compiler from inlining strcpy. Using these pragmas in a file will override the command-line switches or IDE options used to compile that file.
When inlining, the compiler actually creates a macro which renames the inlined function to a function which the compiler internally recognizes. When inlining any intrinsic function, therefore, the developer should preferably include a prototype for that function before he or she uses it. In the above example, the compiler would create a macro
#define strcpy -- strcpy--
where, the compiler 220 recognizes calls to functions with two leading and two trailing underscores and tries to match the prototype of that function against its own internally stored prototype. If the developer did not supply a prototype or the one supplied does not match the compiler's internal prototype, the compiler should reject the attempt to inline that function and generate an error.
13. Register parameter passing
The command line interface includes a"-- fastcall" calling convention. Functions declared using this modifier expect parameters to be passed in registers. The compiler 220 treats this calling convention (i.e., -- fastcall modifier) as a new language specifier, such as "-- cdecl" and "-- pascal". Functions declared with either of these two language modifiers should not also have the -- fastcall modifier, since they use the stack to pass parameters. Likewise, the -- fastcall modifier should not be used together with -- export and -- loads. The compiler generates a warning if the developer try to mix functions of these types, including inappropriate uses of the -- fastcall modifier. The developer may, however, use functions with the -- fastcall convention in overlaid modules (e.g., VROOMM™ available from Borland International).
A preferred maximum of three parameters may be passed in registers to any one function. The developer should preferably not assume that the assignment of registers will reflect the ordering of the parameters to a function. According to the present invention, the preferred registers used for each parameter type may be summarized as follows:
______________________________________Parameter Type Registers______________________________________character (signed and unsigned) AL, DL, BLinteger (signed and unsigned) AX, DX, BXlong (signed and unsigned) DX:AXnear pointer AX, DX, BX______________________________________
Far pointer, union, structure, and floating point (float and double) parameters are pushed on the stack.
Functions declared with the fastcall modifier have different names than their non--- fastcall counterparts. The compiler prefixes the -- fastcall function name with an "@". This prefix applies to both unmangled C function names and to mangled C++ function names.
D. C++ Optimization Techniques
Optimizer 227 also implements several C++ specific optimizations in a fashion transparent to the programer. In a preferred embodiment, available techniques include virtual function and base optimizations, using thunks for virtual member pointers, and passing classes by value. Additionally, a new calling convention is provided. Each of these will now be described in further detail.
1. Virtual function and base optimizations.
When calling virtual functions or accessing virtual base classes, the compiler 220 binds the function or base class address at compile time whenever it is able to determine statically (at compile time) the true type of the object being accessed. For example, given the sample code:
______________________________________struct foo virtual void func( ); double member; foo( ); foo(foo&); ˜foo( );};extern foo x;extern foo *p;void (foo::*mp)( );void f(foo);void func( ){ x.func( ); // virtual fn bound statically (p->*mp)( ); // member ptr call -> uses thunk f(x); // pass class "x" by value}______________________________________
the compiler 220 generates the following code for x.func:
______________________________________mov ax,offset DGROUP:-- xpush axcall near ptr @foo@func$qv ; static binding of foo::funcpop cx______________________________________
As demonstrated by the example, this method of the present invention generates code which is not only smaller but also faster.
As shown in FIG. 3, the optimization may be extended to arrays which are known to the compiler, such as those declared in the source listing as being an "array" (as opposed to a mere block of memory accessed through a pointer). In the function:
______________________________________struct foo virtual void f( );};struct bar{ foo a[10]; // declare an array of type "foo"};foo x; // declare a global of type "foo"void f(bar *p){ p -> a[0].f( ); // access statically x.f( );}______________________________________
As declared, "a" is known to the compiler to be an array of type "foo". Thus, the access to the virtual function f() may be made statically, i.e., without accessing the function through the dynamic dispatch mechanism (Virtual Dispatch Table) which may be computationally more expensive.
2. Using thunks for virtual member pointers
For pointers to function members of classes, instead of encoding explicitly (in the member pointer value) whether the member being pointed to is a virtual function, the information is implicitly encoded through the use of virtual call thunks. Using the example code shown above, the following code is generated by compiler 220 for the member pointer call (p→*mp)():
______________________________________push word ptr DGROUP:-- pcall word ptr DGROUP:-- mp ; call the thunkpop cx______________________________________
In this instance, the thunk pointed to by the member pointer will appear as:
______________________________________@$vc1$NNN0$1$0$ segment virtual@@$vc1$NNN0$1$0$ label word mov bx,sp mov bx, ss:[bx+2] mov bx, [bx+0] jmp word ptr ds:[bx]@$vc1$NNN0$1$0$ ends______________________________________
In contrast, explicit encoding for the member pointer call would require, for example:
______________________________________mov ax,word ptr DGROUP:-- padd ax,word ptr DGROUP:-- mppush axcmp word ptr DGROUP:-- mp+2,0je short @1@74mov bx,word ptr DGROUP:-- padd bx,word ptr DGROUP:-- mpadd bx,word ptr DGROUP:-- mp+4mov bx,word ptr [bx]mov ax,word ptr DGROUP:-- mp+2dec axadd bx,axmov ax,word ptr [bx]jmp short @1@98@1@74:mov ax,word ptr DGROUP:-- mp+4@1@98:call axpop cx______________________________________
Thus, the method of the present invention employs smaller member pointers. As a result, more efficient calls may be made through them.
3. Passing classes by value
When an argument of type class with user-defined constructors is passed by value to a function, one might pass a reference to a temporary instead, with the caller assuming responsibility for destroying this temporary, if needed. This is illustrated in the following code, generated for the call f(x) in the example above:
______________________________________mov ax,offset DGROUP:-- xpush axlea ax,word ptr [bp-10]push axcall near ptr @foo@$bctr$qr3foo ; create temporarypop cxpop cxlea ax,word ptr [bp-10]push axcall near ptr @f$q3foo ; call fpop cxmov ax,2push axlea ax,word ptr [bp-10]push axcall near ptr @foo@$bdtr$qv ; destroy temporarypop cxpop cx______________________________________
In a preferred embodiment of the present invention, however, Compiler 220 copy-constructs the argument value directly to the stack, with the callee assuming responsibility for destruction of this value, as shown in the following generated code for f(x):
______________________________________sub sp,10 ; make room on stackmov ax,offset DGROUP:-- xpush axlea ax,word ptr [bp-10]push axcall near ptr @foo@$bctr$qr3foo ; create xpop cxpop cxcall near ptr @f$q3foo ; call f (f destroys x later)add sp,10______________________________________
Illustrated with a flowchart 400 in FIG. 4, the steps of this method will now be described in further detail. In step 401, the front end of the compiler 220 recognizes a class argument with a copy constructor. In step 402, a "surrogate" automatic (i.e., stack-based) variable is created. This variable is distinguished from normal automatic variables, by a unique prefix for example, so that the back end will recognize it as a surrogate automatic. In step 403, space is allocated on the stack for the surrogate, with the argument's value copy constructed directly into this allocated space in step 404. In step 405, determination of the offset (i.e., BP offset) of the surrogate within the stack frame is deferred until code actually referencing the surrogate is generated. Step 406 is included to indicated that the callee function preferably assumes responsibility for cleaning up the stack after returning control to the caller; alternatively, the caller may assume this responsibility. In this fashion, the function call overhead (both in terms of code and stack space) is reduced. Moreover, quicker access to the argument inside the called function is afforded as well.
4. Object-oriented calling convention
The present invention includes a new calling convention, "Object Data", providing true "object-oriented" code generation for Intel 80�86-compatible microprocessors and the like. Optimizing the access of object data, the calling convention significantly increases the speed of programs, while reducing code size (e.g., 20 percent or more). While applicable to both 16-bit DOS and Microsoft Windows programs, the calling convention is especially effective in reducing the size of the latter.
To understand the benefits of the Object Data calling convention, it is first helpful to examine the general organization of functionally-oriented programs, for example, as shown in FIG. 5A..for a large memory model on an 80�86-compatible architecture. In traditional, non-object oriented languages, a program basically references two types of variables: global and local. As shown, compilers have placed the global data constructs for an executable program into a data segment of memory 102, with references to individual data members achieved through a data segment or "DS" register of CPU 101. The local variables, on the other hand, are created on the "stack" (last-in, first-out segment of memory 102); references to these data members are achieved through the stack segment or SS register of CPU 101. The general layout of 80�86 architecture (including memory configuration for tiny, small, medium, compact, and huge memory models) is documented in the technical literature. See e.g., Hummel, R., Programmer's Technical Reference: The Processor & Coprocessor, Ziff-Davis Press, 1992; the disclosure of which is hereby incorporated by reference. Additional description is appended herewith in Appendix C, Programmer's Guide: DOS Memory Management (Chapter 9).
Instead of just two data types, object-oriented programming includes three types: global data, local data, and object data. The latter two data types--object data and local data--are the most important: the impetus of "object-oriented programming" is to get developers to focus on the data and functions at the object level, not at the global level. Recognizing this, the present invention provides an "object-oriented memory model" which shifts the focus of a memory model to the objects.
Nonetheless, conventional compilers emit code as if global data and local data were the most important data, with references to object data incurring a substantial penalty. Referring to FIG. 5B, this problem will be illustrated. In a large memory model 540 implemented with conventional technology, for example, whenever the programmer references object data, he or she loads a self-referential pointer to the object (the "this" or "self" pointer, which is implicitly. declared by the language) into the ES:BX register pair for dereferencing the object. Specifically, the "data segment" or high-order word of the pointer is loaded into ES register 543 and the "offset" or low-order word is loaded into BX register 541.
Shown in FIG. 5C, organization of the object-oriented memory model of the present invention will be described. As shown, the "this" pointer is automatically placed into a <data segment addressing register>:<indexing register>pair, such as the DS:SI register pair. Specifically in a preferred embodiment, the segment portion of the address reference is stored in DS register 557, with the offset portion loaded into SI register 555. From the DS:SI register pair, a memory address may be formed for accessing the physical locations of the memory (e.g., an 80�86 20-bit address). In an alternative, less preferred embodiment, the offset may be stored in another indexing register (e.g., DI or BX).
In a preferred embodiment, the calling convention is invoked by default, or at least when object-oriented constructs (e.g., class definitions and object declarations) are encountered by the compiler 220. In the instance where the calling convention has been turned off, one may employ an appropriate identifier or function modifier for instructing the compiler and linker to employ the Object Data calling convention to selected classes and/or their member functions An identifier of"-- fastThis" "-- nearThis" or"-- objectData" is employed for this purpose; case sensitivity may be adapted as required for one's particular environment. When applied to a class, the modifier causes the calling convention to be employed with all member functions of that class. Alternatively, one may apply the modifier to just selected member functions, with the calling convention only employed for those selected ones. Use of the modifier is analogous to the invocation of the C calling convention with "-- cdecl" or the Pascal calling convention with "-- pascal". Unlike the other two, however, -- objectData does not mandate how arguments are passed; thus, it may be used in addition to (not in lieu of) these and other calling conventions, including -- fastcall.
In addition to the above function modifier, a developer may employ pragma statements to achieve selective or global use of -- objectData. For example, the calling convention may be enabled with:
#pragma --po
or disabled with:
#pragma 1'po--
All told, the developer has complete flexibility in controlling the use of the calling convention in his or her program.
Illustrated with a flowchart 600 in FIG. 6, a method for employing the calling convention of the present invention, such as exemplified by an executing application compiled by the development system 200, will now be described. While not actually a required step, step 601 is shown to illustrate that in a segmented architecture, such as the system 100, a default data segment is associated with a particular segment-addressing register. In the Intel 80�86 platform, for example, a program commonly stores the segment address of a particular data segment of memory in the DS register at startup (e.g., ASSUME DS:DGROUP).
Steps 602 and 603 illustrate actual object creation at runtime (similar methodology may be applied for staticly created objects as well). In step 602 an object is instantiated from a defined class, the object including both methods and data members of its class. Access to members may be private, protected, or public as is specified by C++ member access control; see e.g., Ellis M. and Stroustrup B., The Annotated C++ Reference Manual, Addison-Wesley, 1990, the disclosure of which is hereby incorporated by reference. In step 603, the data member(s) of the object are stored in the default data segment in memory 102 (whose segment address has already been loaded into the DS register at startup). Information for accessing methods of the object (e.g., dispatch tables) is preferably stored here as well.
After creation of an object, it may now be accessed by the system; specifically, methods of the object may be called (according to program-specified access control) and data of the object may be accessed (typically, restricted to access by member functions or methods). As shown by step 604, for example, access to the object's methods or data is desired. At step 605, the system prepares for addressing (i.e., accessing) the object. As will be recalled from step 603, the data segment addressing register (DS) already stores the segment address of the object (i.e., high-order word of "this" pointer).
The offset to the object .(i.e., lower-order word of "this" pointer), on the other hand, is dealt with as follows. For accessing a method of the object (i.e., calling a method of the object), the object's offset is loaded into an indexing register, most preferably the SI register. For accessing data of the object, however, the offset is in fact already loaded in SI (as it is to be accessed by a method of the object). Similar instances of SI already being loaded may include member functions calling each other and/or themselves (recursion).
Finally, at step 606, actual access to the object's methods and data members is achieved by deferencing the desired object member with the DS:SI register pair. Accesses to additional data members and/or methods may be conveniently and rapidly accomplished, for example by using based-indexed (such as [BX+SI]) addressing, as desired.
Referring now to FIG. 7, code generation for the -- objectData calling convention will be illustrated. Given the code snipet:
______________________________________// DEMO.CPP// When optimized, to be compiled with -po -ml -Vf -Oclass X int i; long j;public: X( ) {i = 0; j = 0; } init( );};X::init( ){ for(i = 0; i < 25; i++) j += i;}______________________________________
A conventional compiler might generate the following assembler code (e.g., BC++ non --po version):
__________________________________________________________________________ .286p ifndef ??version?debug macro endmpublicdll macro name public name endm$comm macro name,dist,size,count comm dist name:BYTE:count*size endm else$comm macro name,dist,size,count comm dist name[size]:BYTE:count endm endif ?debug V 300h ?debug S "DEMO.cpp" ?debug C E9FC71BD18096A6F686E732E637070DEMO-- TEXT segment byte public `CODE`DEMO-- TEXT endsDGROUP group -- DATA,-- BSS assume cs:DEMO-- TEXT,ds:DGROUP-- DATA segment word public `DATA`d@ label byted@w label word-- DATA ends-- BSS segment word public `BSS`b@ label byteb@w label word-- BSS endsDEMO-- TEXT segment byte public ` CODE` ; ; X::init( ) ; assume cs:DEMO-- TEXT@X@0init$qv proc far push bp mov bp,sp ; ; { ; for(i = 0; i < 25; i++) les bx,dword ptr [bp+6] mov word ptr es:[bx],0 ; *** ES segment overrides here & below jmp short @1@114@1@58: ; ; j += i; ; les bx,dword ptr [bp+6] mov ax,word ptr es:[bx] cwd les bx,dword ptr [bp+6] add word ptr es:[bx+2],ax adc word ptr es:fbx+4],dx les bx,dword ptr [bp+6] inc word ptr es:[bx]@1@114: les bx,dword ptr [bp+6] cmp word ptr es:[bx],25 j1 short @1@58 ; ; } ; pop bp ret@X@0init$qv endp ?debug C E9 ?debug C FA00000000DEMO-- TEXT ends-- DATA segment word public `DATA`s@ label byte-- DATA endsDEMO-- TEXT segment byte public `CODE`DEMO-- TEXT ends public @X@0init$qv-- s@ equ s@ end__________________________________________________________________________
As seen, the inefficient technique of multiple ES segment overrides is employed.
Even with present day optimizing C++ compilers, such as Microsoft C/C++ 7.0, the results of the present invention are not obtained:
______________________________________; compiled with MSC/C++ 7.0 version; Static Name Aliases TITLE DEMO.cpp .8087INCLUDELIB LLIBCEINCLUDELIB OLDNAMES.LIBDEMO-- TEXT SEGMENT WORD PUBLIC "CODE"DEMO-- TEXT ENDS-- DATA SEGMENT WORD PUBLIC "DATA"-- DATA ENDSCONST SEGMENT WORD PUBLIC "CONST"CONST ENDS-- BSS SEGMENT WORD PUBLIC "BSS"-- BSS ENDSDGROUP GROUP CONST, -- BSS, -- DATA ASSUME DS: DGROUP, SS: DGROUPDEMO-- TEXT SEGMENT ASSUME CS: DEMO-- TEXT PUBLIC ?init@X@@RECXXZ ; X::init?init@X@@RECXXZ PROC FAR ; X::init; Line 11 push bp mov bp,sp; this = 6 mov bx,WORD PTR [bp+6] ;this; Line 12 mov es,WORD PTR [bp+8] mov WORD PTR es:[bx],0 ; Loading "this" mov ds,WORD PTR [bp+8] ASSUME DS: NOTHING$F342:; Line 13 mov ax,WORD PTR [bx] cwd add WORD PTR [bx+2],ax add WORD PTR [bx+4],dx inc WORD PTR [bx] cmp WORD PTR [bx],25 ;0019H j1 $F342; Line 14 push ss pop ds ASSURE DS: DGROUP ; *** Must restore DS mov sp,bp pop bp ret 4 nop?init@X@@RECXXZ ENDPDEMO-- TEXT ENDSEND______________________________________
As shown, accessing object data in this fashion with DS requires restoring DS--computationally, a very expensive operation (e.g., 20 or more cycles on a '386 processor).
Code generation in accordance with the present invention, on the other hand, would yield (BC++ --po version):
______________________________________ .286p ifndef ??version?debug macro endmpublicdll macro name public name endm$comm macro nameldist,size,count comm dist name:BYTE:count*size endm else$comm macro name,dist,size,count comm dist name[size]:BYTE:count endm endif ?debug V 300h ?debug S "DEMO.cpp" ?debug C E9FC71BD18096A6F686E732E637070DEMO-- TEXT segment byte public "CODE"DEMO-- TEXT endsDGROUP group DATA, BSS assume cs:DEMO.sub.--TEXT,ds:DGROUP-- DATA segment word public "DATA"d@ label byted@w label word-- DATA ends-- BSS segment word public "BSS"b@ label byteb@w label word-- BSS endsDEMO-- TEXT segment byte public "CODE" ; ; X::init( ) ; assume cs:DEMO-- TEXT@X@2init$qv proc far ; ; { ; for (i = 0; i < 25; i++) ; mov word ptr [si],0 ; *** No overrides required jmp short @1@86@1@30: ; ; j += i; ; mov ax,word ptr [si] cwd add word ptr [si+2],ax add word ptr [si+4],dx inc word ptr [si]@1@86: cmp word ptr [si],25 j1 short @1@30 ; ; } ;@X@2init$qv endp ?debug C E9 ?debug C FA00000000DEMO-- TEXT ends-- DATA segment word public "DATA"s@ label byte-- DATA endsDEMO-- TEXT segment byte public "CODE"DEMO-- TEXT ends public @X@2init$qv-- s@ equ s@ end______________________________________
Thus in contrast to conventional or present-day optimizing techniques, the object-oriented calling convention of the present invention allows an executing program to readily access an object. In particular, since an object's "this" pointer is already set up in DS:SI, one does not have to resort to an ES override (i.e., defeating the processor's normal use of a default segment base in DS) to access an object's methods or data members. Nor does one have to restore from an old DS. Access to virtual methods is particularly improved as the Virtual Dispatch Table, residing as near data, is immediately accessible from the "this" pointer which is stored in DS:SI.
As a further advantage, base-indexed address mode (i.e., [BX+SI] addressing) is preserved for accessing an object's data members and virtual table, thus allowing one to employ this powerful memory reference technique for addressing complex data structures. In addition, since the Object Data calling convention does not mandate how arguments are passed, it may be used in conjunction with other calling conventions, including -- fastcall and C (i.e., -- cdecl) calling conventions.
The calling convention of the present invention is particularly effective in reducing the size of Microsoft Windows programs. Specifically, one may advantageously employ the characteristic of Microsoft Windows that it does not routinely expect DS to be set to. DGROUP. Standard C functions, in contrast, do rely on DS being set to DGROUP:
______________________________________push dsmov ax,DGROUPmov ds,ax ; Computationally expensive!______________________________________
do call, then before returning:
______________________________________pop DS ; Computationally expensive!______________________________________
In the instance of calling the Windows API (e.g., CreateWindow), Windows API functions may be prototyped such that they load their own DS (e.g., -- loadds). In this manner, the computationally expensive segment register loads may be avoided. Other libraries may be prototyped in a similar fashion, as applicable. All told, the object-oriented memory model of the present invention employs Intel 80�86-compatible architecture most efficiently for object-oriented programming, both reducing a program's size and increasing its execution speed.
5. Object-oriented calling convention and multiple inheritance
According to the present invention, for multiple inheritance virtual calls a stub is generated which adjusts the `this` pointer to be the correct one for the called member function. This is called a generic "stub." For example, for:
______________________________________struct X { virtual void f(void) = 0; };struct Y { };struct Z: public Y, public X { virtual void f (void); };void main (void) { Z a; }______________________________________
the following stub is generated:
__________________________________________________________________________mov bx,spadd word ptr ss:[bx+<offset>+<distModifier>],<adjustment>jmp <far or near>ptr <sym>__________________________________________________________________________
For object-oriented code generation (--po), a more efficient stub is generated:
______________________________________ add si,<adjustment> jmp <far or near>ptr <sym>______________________________________
For multiple, virtual inheritance with virtual function calls and a user-specified constructor, the compiler 220 preferably generates a stub to adjust the `this` pointer when the virtual function is called. For example, the following code would need such a stub.
______________________________________struct X { virtual void f(void) = 0; };struct Y { };struct Z: public Y, public virtual X Z( ); virtual void f (void);};Z::Z( ) { }______________________________________
Exemplary instructions generated are:
______________________________________mov bx, sples bx, dword ptr ss:[bx+4] ;; load "this" into es:bxmov ax,.es:[bx-2] ;; load vtable displacementadd ax, 65529 ;; add adjustmentmov bx,spadd as: [bx+4 ], ax ;; add adjustment to "this"imp far ptr @Y@1bar$qv ;; jump to targetSym______________________________________
For object-oriented code generation, this will include:
______________________________________mov ax,[si-2] ;; load vtable pointeradd ax, 65529 ;; add <adjustment> ;; (it's negative)add si,axjmp far ptr @Y@1bar$qv ;; jump to targetSym______________________________________
More preferably, this is achieved in three instructions, as follows:
______________________________________mov bx,[si-2]lea si,[si+bx+65529]jmp far ptr @Y@1bar$qv______________________________________
C++ member pointers to virtual functions may employ a thunk to get the correct virtual function to call. For example, the following code requires a thunk.
______________________________________ struct X { virtual f ( ); }; (X::*p) ( ) = &X::f;______________________________________
The compiler 220 generates a code sequence, such as (here the virtual table is far):
______________________________________ mov bx,sp les bx,ss:[bx+4] les bx,es:[bx+0] jmp dword ptr es:[bx]______________________________________
Alternatively, in object-oriented code generation, a thunk like the following may be generated:
______________________________________les bx,[si+0] ; 0 is the vptrOffsetjmp dword ptr es: [bx] ; 0 is the vtblOffset______________________________________
Attached hereto is an Appendix A containing trace listings of code generation for passing classes by value, which provide a description of the invention operative in a general purpose digital computer system, such as an IBM-compatible personal computer. Also attached hereto is an Appendix B containing additional source listings illustrating code generation employing the object-oriented calling convention of the present invention in the instance of multiple inheritance. Finally, user and programmer guides and additional reference materials providing additional description for the development system of the present invention are appended as Appendix C.
While the invention is described in some detail with specific reference to a single preferred embodiment and certain alternatives, there is no intent to limit the invention to that particular embodiment or those specific alternatives. For example, while methods of the present invention have been illustrated in conjunction with 16-bit registers, those skilled in the art will appreciate that these methods are also operative in architectures of 32-bit, 48-bit, 64-bit, and the like. While the preferred embodiment has been described with reference to an Intel 80�86-compatible architecture, the methods of the present invention may be advantageously applied to other systems, particularly object-oriented ones embodied in segmented architectures. Moreover, those skilled in the art will appreciate that the principles of the present invention may readily be employed in systems having virtual memory addressing schemes (e.g., 80386 and 80486). Thus, the true scope of the present invention is not limited to any one of the foregoing exemplary embodiments but is instead defined by the following claims. v,1-12/2
|Cited Patent
|Filing date
|Publication date
|Dec 15, 1989
|Mar 3, 1992
|At&T Bell Laboratories
|Method of controlling the execution of object-oriented programs
|Oct 23, 1990
|Nov 23, 1993
|International Business Machines Corporation
|System and method for implementing a messenger and object manager in an object oriented programming environment
|May 6, 1992
|Jul 5, 1994
|Microsoft Corporation
|Method for implementing virtual function tables in a compiler for an object-oriented programming language
|Dec 10, 1993
|Aug 16, 1994
|International Business Machines Corporation
|Version independence for object oriented programs
|Dec 12, 1991
|Nov 1, 1994
|International Business Machines Corporation
|Object oriented method management system and software for managing class method names in a computer system
|Apr 9, 1992
|Dec 6, 1994
|Microsoft Corporation
|Method for object construction in a compiler for an object-oriented programming language
|Jun 5, 1992
|Jan 2, 1996
|Borland International, Inc.
|System and methods for optimizing object-oriented compilations
|Chin et al., "Distributed Object-Oriented Programming Systems", ACM Computing Surveys, vol.23, No. 1, Mar. 1991, pp. 91-124.
|Chin et al., Distributed Object Oriented Programming Systems , ACM Computing Surveys, vol.23, No. 1, Mar. 1991, pp. 91 124.
|Liu et al., "Microcomputer Systems: The 8086/8088 Family", Prentice Hall, 1986 pp. 26-39 and 155-160 .
|Liu et al., Microcomputer Systems: The 8086/8088 Family , Prentice Hall, 1986 pp. 26 39 and 155 160 .
|Citing Patent
|Filing date
|Publication date
|Sep 30, 1994
|Feb 25, 1997
|Nec Corporation
|Compiler system for language processing program
|Jul 7, 1995
|Aug 4, 1998
|Sun Microsystems, Inc.
|Method and apparatus for generating executable code from object-oriented C++ source code
|Mar 15, 1996
|Sep 29, 1998
|Institute For The Development Of Emerging Architectures, L.L.C.
|Use of dynamic translation to collect and exploit run-time information in an optimizing compilation system
|May 20, 1996
|Mar 30, 1999
|Sun Microsystems, Inc.
|Using constant selectors for method identification
|Dec 4, 1996
|Mar 30, 1999
|International Business Machines Corporation
|Cooperation of global and local register allocators for better handling of procedures
|May 1, 1998
|Jul 13, 1999
|Sun Microsystems, Inc.
|Method and apparatus for generating executable code from object-oriented source code
|Aug 29, 1995
|Jul 13, 1999
|Silicon Graphics, Inc.
|Cross-module optimization for dynamically-shared programs and libraries
|Mar 28, 1997
|Aug 31, 1999
|International Business Machines Corporation
|Method and system in a data processing system for association of source code instructions with an optimized listing of object code instructions
|May 9, 1996
|Sep 28, 1999
|Sun Microsystems, Inc.
|Compiler dispatch function for object-oriented C
|Apr 4, 1997
|Nov 16, 1999
|International Business Machines Corporation
|Invoking a method in an object-oriented computer program
|May 20, 1997
|Feb 15, 2000
|Inprise Corporation
|System and methods for monitoring functions in natively compiled software programs
|May 29, 1998
|Feb 15, 2000
|Sun Microsystems, Inc.
|Methods, computer program products, and apparatus for initializing global registers
|Mar 20, 1998
|Aug 15, 2000
|Preemptive Solutions, Inc.
|Method for renaming identifiers of a computer program
|Apr 20, 1999
|Aug 22, 2000
|Unisys Corp.
|Computer-implemented object-oriented method for relating objects in a compiler to locations in the source program and to inlined call histories
|Dec 17, 1997
|Oct 10, 2000
|Unisys Corp.
|Object-oriented apparatus and method in a computer system for a programming language compiler to select optimal pointer kinds for code generation
|May 29, 1998
|Dec 5, 2000
|Intel Corporation
|Method for eliminating common subexpressions from java byte codes
|Aug 26, 1998
|Jan 30, 2001
|International Business Machines Corporation
|Method and system for constructing hybrid virtual function tables
|Apr 7, 1997
|Jul 10, 2001
|Hewlett-Packard Company
|User controlled relaxation of optimization constraints related to volatile memory references
|Apr 30, 1998
|Jul 17, 2001
|Hewlett-Packard Company
|Method and apparatus for debugging of optimized code
|May 29, 1998
|Feb 26, 2002
|Sun Microsystems, Inc.
|Unitary data structure systems, methods, and computer program products, for global conflict determination
|Apr 30, 1998
|Aug 13, 2002
|Hewlett-Packard Company
|Method and apparatus for debugging of optimized code using emulation
|Jul 1, 1999
|Feb 18, 2003
|International Business Machines Corporation
|Reduction of object creation during string concatenation and like operations that utilize temporary data storage
|Apr 21, 1999
|Sep 16, 2003
|Hewlett-Packard Development Company, L.P.
|Dynamic optimization of computer programs using code-rewriting kernal module
|Apr 16, 2001
|Oct 14, 2003
|Hewlett-Packard Development Company, L.P.
|User controlled relaxation of optimization constraints related to volatile memory references
|Jun 9, 1998
|Dec 23, 2003
|Intertrust Technologies
|Obfuscation techniques for enhancing software security
|Feb 22, 1999
|Feb 1, 2005
|Hitachi, Ltd.
|Object oriented optimizing code generator with user selection of use or do not use for dynamic generation of functions
|May 26, 2000
|Mar 8, 2005
|International Business Machines Corporation
|Interprocedural analysis and optimization of an object oriented program in the presence of dynamic class loading
|Jan 17, 2001
|Jul 26, 2005
|Texas Instruments Incorporated
|Method of generating profile-optimized code
|Sep 29, 2000
|Feb 14, 2006
|Intel Corporation
|Iterative optimizing compiler
|Jun 26, 2002
|May 2, 2006
|Microsoft Corporation
|Unification-based points-to-analysis using multilevel typing
|Mar 18, 2002
|May 9, 2006
|International Business Machines Corporation
|Initial object capacity determination
|Jun 11, 2002
|Jul 10, 2007
|Intel Corporation
|Methods and apparatus for determining if a user-defined software function is a memory allocation function during compile-time
|Sep 22, 2003
|Aug 14, 2007
|Lsi Corporation
|Method for optimizing execution time of parallel processor programs
|Mar 24, 2004
|May 27, 2008
|International Business Machines Corporation
|Implementing virtual bases with fixed offsets in object oriented applications
|Dec 29, 2003
|Oct 7, 2008
|Transitive Limited
|Method and apparatus for performing native binding to execute native code
|Jun 25, 2004
|Mar 3, 2009
|Panasonic Corporation
|Program converting method and storage medium
|Mar 30, 2006
|Aug 24, 2010
|Oracle America, Inc.
|Mechanism for reducing detectable pauses in dynamic output caused by dynamic compilation
|May 4, 2004
|Nov 16, 2010
|Oracle America, Inc.
|Method and system for analyzing array access to a pointer that is referenced as an array
|Oct 12, 2006
|Sep 6, 2011
|International Business Machines Corporation
|Efficient method of data reshaping for multidimensional dynamic array objects in the presence of multiple object instantiations
|Jan 8, 2007
|Jan 3, 2012
|Microsoft Corporation
|Deep embedding of program languages
|Apr 6, 2008
|Apr 3, 2012
|Fusion-Io, Inc.
|Apparatus, system, and method for converting a storage request into an append data storage command
|Feb 8, 2008
|Apr 10, 2012
|Oracle International Corporation
|System and method for efficiently generating native code calls from byte code in virtual machines
|Apr 6, 2008
|Apr 17, 2012
|Fusion-Io, Inc.
|Apparatus, system, and method for validating that a correct data segment is read from a data storage device
|Feb 13, 2008
|Apr 17, 2012
|International Business Machines Corporation
|Processing of expressions
|Jan 31, 2008
|Oct 2, 2012
|Alcatel Lucent
|Software diversity using context-free grammar transformations
|Feb 7, 2012
|Feb 19, 2013
|International Business Machines Corporation
|Processing of expressions
|Apr 9, 2012
|Mar 5, 2013
|Fusion-Io, Inc.
|Apparatus, system, and method for validating that correct data is read from a storage device
|Dec 31, 2008
|Jun 18, 2013
|International Business Machines Corporation
|Use of name mangling techniques to encode cross procedure register assignment
|Jun 15, 2010
|Jul 30, 2013
|Microsoft Corporation
|Creating text functions from a spreadsheet
|May 31, 2011
|Oct 8, 2013
|Microsoft Corporation
|Static semantic analysis of dynamic languages
|Jan 12, 2011
|Mar 25, 2014
|Google Inc.
|Method and system for optimizing an executable program by selectively merging identical program entities
|Jan 12, 2011
|Apr 1, 2014
|Google Inc.
|Method and system for optimizing an executable program by generating special operations for identical program entities
|May 31, 2011
|Jun 10, 2014
|Microsoft Corporation
|Transforming dynamic source code based on semantic analysis
|May 31, 2011
|Jul 22, 2014
|Microsoft Corporation
|Statically derived symbolic references for dynamic languages
|Sep 13, 2012
|Jan 6, 2015
|Altera Corporation
|Software-to-hardware compiler with symbol set inference analysis
|Dec 31, 2012
|Feb 10, 2015
|Microsoft Corporation
|Extending a development environment
|May 31, 2011
|Feb 9, 2016
|Microsoft Technology Licensing, Llc
|Editor visualization of symbolic relationships
|Jan 17, 2001
|Oct 18, 2001
|Ward Alan S.
|Method of generating profile-optimized code
|Mar 18, 2002
|Sep 18, 2003
|International Business Machines Corporation
|Initial object capacity determination
|Jun 26, 2002
|Jan 1, 2004
|Microsoft Corporation
|Unification-based points-to-analysis using multilevel typing
|Jun 11, 2002
|Apr 22, 2004
|Rakesh Ghiya
|Methods and apparatus for determining if a user-defined software function is a memory allocation function during compile-time
|Mar 24, 2004
|Sep 23, 2004
|Joseph Gil
|Methods for implementing virtual bases with fixed offsets in object oriented applications
|Jun 25, 2004
|Dec 30, 2004
|Matsushita Electric Industrial Co., Ltd
|Program converting method, program and storage medium
|Dec 29, 2003
|Jan 20, 2005
|Alex Brown
|Method and apparatus for performing native binding
|Sep 22, 2003
|Mar 24, 2005
|Nikitin Andrey A.
|Parallel processor language, method for translating C++ programs into this language, and method for optimizing execution time of parallel processor programs
|May 9, 2006
|Aug 9, 2007
|Intertrust Technologies Corp.
|Cryptographic methods, apparatus and systems for storage media electronic rights management in closed and connected appliances
|Mar 30, 2006
|Oct 4, 2007
|Lam Ioi K
|Mechanism for reducing detectable pauses in dynamic output caused by dynamic compilation
|Oct 12, 2006
|Apr 17, 2008
|International Business Machines Corporation
|Efficient method of data reshaping for multidimensional dynamic array objects in the presence of multiple object instantiations
|Feb 8, 2008
|May 29, 2008
|Bea Systems, Inc.
|System and method for efficiently generating native code calls from byte code in virtual machines
|Dec 6, 2007
|Jun 12, 2008
|David Flynn
|Apparatus, system, and method for servicing object requests within a storage controller
|Jan 8, 2007
|Jul 10, 2008
|Microsoft Corporation
|Deep embedding of program languages
|Feb 13, 2008
|Aug 14, 2008
|International Business Machines Corporation
|Processing of Expressions
|Jan 31, 2008
|Dec 25, 2008
|Thompson Gerald R
|Software diversity using context-free grammar transformations
|Apr 6, 2008
|Jun 11, 2009
|David Flynn
|Apparatus, system, and method for converting a storage request into an append data storage command
|Apr 6, 2008
|Feb 4, 2010
|David Flynn
|Apparatus, system, and method for validating that a correct data segment is read from a data storage device
|Dec 31, 2008
|Jul 1, 2010
|International Business Machines Corporation
|Use of Name Mangling Techniques To Encode Cross Procedure Register Assignment
|May 31, 2011
|Dec 6, 2012
|Microsoft Corporation
|Static semantic analysis of dynamic languages
|Sep 13, 2012
|Jan 10, 2013
|Altera Corporation
|Software-to-hardware compiler with symbol set inference analysis
|U.S. Classification
|International Classification
|Cooperative Classification
|European Classification
|Sep 15, 1997
Owner name: NAVY,SECRETARY OF THE,UNITED STATES OF AMERICA, VI
Free format text: CONFIRMATORY LICENSE;ASSIGNOR:MASSACHUSETTS INSTITUTE OF TECHNOLOGY;REEL/FRAME:008682/0854
Effective date: 19951218
|Nov 30, 1999
|Fee payment
Year of fee payment: 4
|Feb 15, 2001
Owner name: BORLAND SOFTWARE CORPORATION, CALIFORNIA
Free format text: CHANGE OF NAME;ASSIGNOR:INPRISE CORPORATION;REEL/FRAME:011497/0345
Effective date: 20010122
Owner name: INPRISE CORPORATION, CALIFORNIA
Free format text: CHANGE OF NAME;ASSIGNOR:BORLAND INTERNATIONAL INC.;REEL/FRAME:011506/0776
Effective date: 19980720
|Dec 9, 2003
|Fee payment
Year of fee payment: 8
|Jan 4, 2008
|Fee payment
Year of fee payment: 12
|Jun 19, 2008
Owner name: CODEGEAR LLC, CALIFORNIA
Free format text: ASSIGNMENT OF ASSIGNORS INTEREST;ASSIGNOR:BORLAND SOFTWARE CORPORATION;REEL/FRAME:021118/0666
Effective date: 20080617
|May 13, 2009
Owner name: WELLS FARGO FOOTHILL, INC., AS AGENT, CALIFORNIA
Free format text: FIRST LIEN PATENT SECURITY AGREEMENT;ASSIGNOR:CODEGEAR LLC;REEL/FRAME:022678/0240
Effective date: 20080930
Owner name: WELLS FARGO FOOTHILL, INC., AS AGENT, CALIFORNIA
Free format text: SECOND LIEN PATENT SECURITY AGREEMENT;ASSIGNOR:CODEGEAR LLC;REEL/FRAME:022678/0250
Effective date: 20080930
|Jan 3, 2013
Owner name: CODEGEAR LLC, CALIFORNIA
Free format text: TERMINATION AND RELEASE OF SECURITY INTEREST IN PATENT COLLATERAL;ASSIGNOR:WELLS FARGO CAPITAL FINANCE, INC., FORMERLY KNOWN AS WELLS FARGO FOOTHILL, INC., AS GRANTEE;REEL/FRAME:029566/0144
Effective date: 20121228
|Oct 12, 2015
Owner name: CODEGEAR LLC, CALIFORNIA
Free format text: RELEASE BY SECURED PARTY;ASSIGNOR:WELLS FARGO CAPITAL FINANCE, LLC (FORMERLY KNOWN AS WELLS FARGO CAPITAL FINANCE, INC. AND WELLS FARGO FOOTHILL, INC.);REEL/FRAME:036771/0305
Effective date: 20151009


text:
Men share the most romantic thing a woman has ever done for them. It was the nicest thing anyone has ever done for me. It was a "My wife planned a surprise dinner on Valentine's eve at what she thought was my favorite.
Here are the most romantic things they've ever done. Just because you get slightly sentimental at times doesn't make you less of a man. with hand- whipped cream and good vanilla) coffee in the bathroom for him (what?..
Whats most romantic thing anyone ever done -- journeyI'm very really sorry for your loss, can't imagine how something like that must feel. Whenever I was working late somewhere, I just never fancied it. Now I have a sweet one. Tell us what you think. From the moment we met I knew she liked me, she came on to me quite a few times.
What's the most romantic thing you've ever done, with your hand???
Whats most romantic thing anyone ever done - tri
He'll say something like "you're so beautiful" or "I love you" but none of the words are as meaningful at that look in his eyes. I recently signed up for a deal site, which is helpful because it prompts me with weird ideas of things to do where we live. Well as we are laying in bed she's kinda lightly brushing her fingers on my shoulder.
Whats most romantic thing anyone ever done traveling fast
It made me smile as he is vegetarian and I am a hardcore chicken fan. I say "It's a surprise. This article was originally published on Cosmopolitan UK. Dirty Car Artist Turns Grubby Cars Into Works Of Art. He gently picked up my dog and carried him into the vet's office. I was trying to find a necklace to wear to hide it and my SO walked over, took the necklace out of my hands, turned me around and said "From the moment I first saw you I knew you were the most beautiful woman I'd ever seen.


text:
You have no items in your shopping cart.
Amazonas COTTON HAMMOCK TOBAGO
Classical comfortable cotton hammock.
Classical comfortable cotton hammock.
Product description for Amazonas COTTON HAMMOCK TOBAGO from our collection of Outdoor Sports & Fashion:
The cotton hammock Tobago by AMAZONAS is made in machine woven cotton hammock with a strong wooden bar.
This natural coloured hammock by AMAZONAS is a price conscious choice if you do not want to spend so much money.
- Size: 2,0 x 0,8 m
- Length: 2,7 m
- Max. load: ca. 120 kg
- Weight: 1,4 kg
Material specifications for Amazonas COTTON HAMMOCK TOBAGO
- Cotton
- Wood pole