Smalltalk
My favourite programming language is Smalltalk. It's an old language, but still one of the best. I like Smalltalk because:
- It is a pure Object Oriented language - meaning that everything is an Object and every operation that is performed is done by sending a message to an object. This is as opposed to most mainstream modern languages like C++, Java, C#, Python. Ruby however is one modern language that is also a pure Object Oriented language.
- Its syntax makes it very expressive. Smalltalk uses a fairly different syntax to most modern languages. This syntax, in particular keyword-selectors, makes it easy to write code that says very clearly what it does.
- Simpleness - Smalltalk is a very small language. With only six reserved words it's certainly one of the simplest. It does't need any more because it get most of its features as library functions.
- Closures from the start - most modern languages either don't have closures or have them tacked on as an afterthought. To have a nice clean, consistent language you want closures to be used throughout the standard libraries and to have a nice syntax. Ruby is another language that does a pretty good job in this regard.
- Extensibility - By having a simple language with closures you get excellent extensibility. So where some new languages have recently added features like foreach as a feature of the language, Smalltalk's equivalent isn't part of the language but rather part of the standard library. This means that you can add your own such mechanisms and they look and feel consistent with those in the standard library.
- Development environment - Smalltalk has always had a very advanced development environment. IDEs for many other languages are catching up and probably even have some ideas that Smalltalk could borrow. That said though there are still things that Smalltalk tends to do better in this regard, like editing code in the debugger and continuing.
- Resumable exceptions - In most modern languages, when an exception is thrown, the stack is unwound straight away and the handler invoked. This makes it impossible for the handler to do things like resume. Being able to resume allows more flexibility