I’m currently working on a piece of software for a start-up company. As this is a completely new product, I’m in the unusual situation of being able to choose the technology stack (which effectively means a language and GUI toolkit), subject to it meeting several requirements.
Closed source output: The main source of income for the start-up will be the sale of software licences, so we don’t want someone grabbing the source and using it for free, or launching their own derivative product. No program is truly free from reverse engineering – you can always run a disassembler on the binary – but I need something which is ‘good enough’ (i.e. stops someone less technical than I am). Languages which compile directly to a binary (e.g. C/C++) are the best choice, followed by those which compile to byte code and use a virtual machine (e.g. Java and C#). Scripting languages such as Python and Perl are probably ruled out by this requirement, even though there are options for turning scripts into executables.
The requirement for closed source output also means that I can’t use libraries licensed under the GPL.
Cross-platform support: The majority of customers will be Windows users, so support for that platform is essential. Linux support is also important, as nearly all my software development is done in Ubuntu. OS X support is lower down the priority list, although a lot depends on whether the decision makers at potential customers use Macs, as they may refuse to purchase software which doesn’t run on their hardware. A native look and feel on each platform is a double-edged sword, being easier for users to understand but harder to test and document.
XML libraries: Data from the software will be stored in XML, so the chosen language must have a stable and mature library for reading and writing this format. I don’t think this will be a deciding factor though, as nearly every major language has either built-in support or a binding to libxml.
PDF output: The software has to be able to produce PDF output based on some form of template. At the moment I’m using XSLT and XSL-FO because they work well with XML, but I’m open to using other template formats.
Local data storage: Potential customers we’ve spoken to so far have all stated that, due to the sensitive nature of the data involved, they want to store it on hardware under their control. Unfortunately this rules out developing the software as a web application, which would meet all of the other requirements.
Minimal dependencies: This is desirable rather than essential. Java loses points here as not all customers will want to install a runtime environment. C# scores better as the .NET libraries are likely to be installed already on Windows machines.
So far the only combination of language and GUI toolkit that I’ve found to satisfy all the essentials is Java with Swing. I’m playing around with C++ and various toolkits (GTK, wxWidgets and FLTK), but I think they will fall down on the PDF output requirement.