They are languages to use after bad habits have been learned. Thus I suggest that Every pure beginner start with QuickBasic or Assembly. This may seem strange, listing those two languages in the same sentence but I will show why it is not so.
Armed with the boon of Retrospective Foresight many people say this or that language is bad because it instills bad programming habits. This is not true. By human nature any language that is chosen as first will have bad programming habits as a part of it. This is because creating misconceptions and then reordering them with experience is an essential part of learning.
Misconceptions exist because the schema, the set of knowledge which the person contains on a certain subject (here programmaing) is entirely undeveloped. To function, as the brain is wont to do, certain assumptions and groupings will be made, erronous and not truly correct connections that are only available because the schema for a topic is so devoidly underdeveloped. There is not enough for the brain to work with to create an accurate understanding or picture of it all. This can only be rectified with knowledge and experience.
QuickBasic is a good enviroment to learn "programming thinking" because it is among the most forgiving languages out there and it is limiting in just the right way to forestall grevious misconceptions attempting to learn a language as C# first would. It as well is equipped with everything required to pick up and go with virtually nonexistant fuss. Many high level language constructs - those that a beginner should be exposed to anyway - are there. You can start with graphics right away and there exist a large amount of resources to get you started. This is the path suggested for one who wishes to become a high level techniques programmer. Visual Basic is no good but I suppose Darkbasic might be okay as it follows in the same vein as QuickBasic.
Assembly is suggested as an alternative because of its authoratarian nature, you must be specific and accurate or you will die. In fact programming in assembly is virtually the same as writing a formal proof in an axiomatic system. One is forced to learn the workings of the machine and become close to the machine. There is less room than most languages for the development of grevious misconceptions due to the explicit and tight nature of it all. This is suggested for those who wish to go the low level or engine programmer path.
After Quickbasic learning a language like OCaml would be suggested. Some say Haskell is good as well but I know nothing of it.