Alright, I\'m confused by all the buzzwords and press release bingo going on.
Here's another simple view based on how you describe an application you want to develop.
Do you want it to have the highly granular UI capabilities you expect from a workstation (e.g. Windows) application, with a fairly complete set of controls (listbox, combobox, grid, etc.)?
Flex gives you that.
Do you want to deliver it to run in most browsers (i.e. anywhere Flash is installed/installable)?
Flex gives you that, because it runs in the Flash virtual machine.
Do you also want to be able to offer it to run in the OS, not in a browser (with minimal coding changes?)
Flex can give you that, by allowing you run it, not in the Flash VM, but instead in the Adobe AIR VM (which has versions for Windows, Mac, and Linux) which provides wrappers for common OS resources like the filesystem, OS dialog-box UI components (e.g. "Open/File/ etc.)
Are you OK using javascript as the development language? You need to be, because it's the only language supported, in the form of ActionScript, which is a proper superset of javascript - it accepts javascript code directly.
So the partioned pieces are:
A runtime environment, either the Flash browser plugin, or the AIR runtime (the native OS equivalent).
Actionscript as the development language.
A bunch of libraries of controls and other resources, i.e. the typical Window, Frame, Combobox, Listbox, Image container, TextBox, TextArea, a wysiwyg-y RichTextArea, etc.) These are the province of Flex.
With the above resources alone, you can use the free command-line compiler to build applications in the same fashion as you would with any other command-line-compiler language with libraries.
Then, if you want a fancy IDE, there's Flex Builder, which is a set of extensions to good-ol' Eclipse (for several hundred $$). Or there are several other IDE's that are more or less equivalent.
Flash is a Runtime Environment - you use the Flash Authoring tool to make some Flash content, and the Flash player processes your content, executes the scripts, and draws the appropriate pictures onto the screen.
Flex is a Development Framework - you use the Flex development tools to define how your component-based content should work, and then Flex generates the Flash content for you. You could have made the same thing with the Flash Authoring tools, but using Flex may let you avoid reinventing some wheels.
In functional terms, Flash is an extremely versatile runtime; it gives you lots of freedom to do anything you want. But if you're building a loan simulator, you probably don't need the freedom to define precisely how all the pulldown menus and screen transitions work. Probably you'd rather that you could just use premade components for that stuff so you can concentrate on the loan stuff. Flex lets you do that, with the cost that it may turn out to be a lot of work if you decide that you do need a lot of freedom to change all the fine details.
Flashdeveloper has been mentioned as a free tool to develop flex applications. I just want to add a free tool to design applications (create an MXML file using a designer): designview. It's available directly on the adobe website, it's an air application that is basic but that give the possibility to take a look freely and easily to the possibilities of flex.
What is the difference between Flex and Flash?
The way I keep it clear in my mind and explain it to others is as follows:
Choose the right tool for what you want to create.
If you want to write an APPLICATION using Flash technology, use Flex.
If you want to create an ANIMATION using Flash techology, use traditional Flash.
Flex is optimized for application construction (but you can create primitive animations using states) and it compiles into a SWF.
Flash is optimized for animation construction but you can also create applications with some extra work, and it compiles into a SWF.
Once you have your SWF you can play in your Flash player, although Flex requires Flash 9 or higher.
In conclusion
Application -> Flex -> SWF
Animation-> Flash -> SWF
Hope this helps.
Following up on this, I found a very useful article on the subject:
Adobe Flash and Flex—Which Makes the Most Sense for Your Project?
The Flash Integrated Development Environment (IDE), otherwise known in its current version as Flash CS3, is an ideal tool for developing character animation or linear animation projects. These are projects that require little coding and can be effectively implemented with the Flash IDE timeline.
In other words, Flash CS4 is very tightly bound to the timeline - good for linear sequences or animations. While one can add loops and interactivity in the form of jumping to new points on the timeline, it is limiting for projects which cannot easily be mapped out in terms of progression over time.
It is, in simplistic terms, an animation tool with very powerful interactive features - creating and composing new elements on the fly, and jumping around on the timeline allows one to create applications, and the Flash CS4 IDE makes this relatively easy, but it's not a great platform for application style software.
Flex was built as an answer to that - while it makes use of the same elements and exposes the code, it is not bound to a timeline, and has more in common with object oriented programming languages than animation languages.
The Flex Builder IDE includes both the programming IDE, as well as a GUI designer for quickly building interfaces, and a few other tools for developing applications that run on the flash player.
Flex is a free and open source framework based on ActionScript to develop SWFs and AIR applications. Flex Builder (now renamed to Flash Builder as of version 4, to avoid the confusion) is a commercial IDE from Adobe to develop SWF/AIR using the flex framework. While flash (CS3) is good for animation related stuff, flex is good for application/ui related stuff. Adobe positions flex as an RIA (Rich Internet Application) framework.