Programing

I would like to propose a new programming language.  I feel that each of the most common programming languages (java, c/c++, and the various scripting languages) bring something different to the table.  However, each also has what I see as faults which make programming in those languages frustrating.  Do I think I can solve every problem with one tool?  No.  Do I think I can develope the ultimate and perfect programming language?  No.  But I'll certainly try my best to do both as much as physically possible.  With that in mind, read on.

Background

Restrictions: Syntax or Freedom

Most of the most popular languages have restrictions which seem to be quite unnecessary.  C and C++ have an enormous number of syntax rules, and compiler rules.  Compile time errors like circular references are frustrating and needless.  Of course many of these rules have historical reasons for existing, but history is just that, there are ways to work around these problems.  Of course when it comes to complex and confusing syntax rules, scripting languages take the cake.  Every scripting language seems to have its own set of syntax rules, many of which are specific to a degree that is entirely unnecessary, yes they make interpreting the script easier, but people don't script for speed of execution, they script for speed of coding and editing.  Constantly encountering syntax errors because you constantly encounter syntax problems that you may or may not understand how to current defeats that purpose.  On the other hand, Java is fairly straightforward, simple, and extremely restrictive in a different way.  Java is a great language, with a ton of incredibly useful and well structured, from an ease of programming perspective, libraries.  However, Java also makes a lot of demands about what you can and cannot do with your programing.  If you're using Java, it has to be high level work and it has to be the way Java wants things done.  This aspect of Java probably drives the old C programers crazy, of course the Java programers probably can't understand why C syntax is so restrictive.  I can't understand why I have to choose between the two.  Why can't I have a language capable of low level work, but with an easy to understand and use syntax and a nice suite of easy to use libraries, sorry but STL is not as easy to use as a java.util.

Slow to Run or Slow to Build

With all programing languages, and this is just a matter of fact, there is a trade-off between build time and execution speed.  Scripting languages, which are interpreted, are meant to be edited quickly and easily, run immediately, but not as fast or efficient.  Compiled languages, like C, run fast and efficient but the long compile times mean that editing, running, and editing again is not as easy.  Furthermore scripting languages have the possibility of editing the code while the application is running, while compiled languages clearly do not.  Java tries to bridge this gap by partially compiling and then interpreting.  This means there is a compile time, though maybe not as bad as in C/C++, but the programs are also not quite as fast, though faster than most scripting languages.  At the begining I said that this trade-off was  matter of fact, but does it have to be?  Why can't we have the best of both worlds?

A New Language

Fast to Run and Fast to Build

What if there was a language that could be compiled and intereted?  Not partially compiled and partially interpreted, like Java, but either fully compiled or fully interpreted depending on the needs of the programer at the time.  If you know you are going to be editing a lot just run it without compiling.  If the code is stable and you want it to run quickly, compile it.  If part of the program is stable, and another part is in flux, why not compile the stable part and interpret the unstable part?  This would truely be the best of both worlds.  One language for all your core code class, and the same language, syntax, and libraries for all your scripting tasks.

Easy Syntax

Syntax should be simple and straitforward, with only as many restrictions as absolutely neccesary.  It is better for the compiler to have to do a little extra work to make the lives of all the programers easier than for all the programers to have to do extra work to make the compiler's life easier.  Someone interested in optimising performance will probably know, or should be able to find out, the best ways to write efficient code, there is no need for the compilers or interpreters to enforce syntax rules for the sake of efficiency.  Also, if an error message doesn't have an obvious solution, then it shouldn't exist.  C and C++ messages are riddled with compile time errors that are arcane to all but the most devout followers of those languages.  Java, on the other hand, usually has errors that someone new to the language can understand.  Finally, don't restrict syntax unless you have to.  There is no reason that whitespace should be enforced except where absolutely necessary for the intention of the programer to be clear, likewise with parentheses and other separators.  There is no reason not to have a language with simple, unrestrictive syntax and understandable errors.

High Builds on Low

In Java high-level is all you get.  The reason for this is code compatability.  If you keep programers from messing around under the hood to much you can ensure that all programs function the same at the low level, which means there will be inter compatability.  In C or C++ sometimes adding a new library can break your old code.  This is a problem, but can be controlled to a degree with namespaces in C++ or class/packages in Java.  On the other hand, there are often situations in which low level control is essential to the task at hand.  There have been times while programing in Java that I have had ideas that would make my programs better but could not implement them because they required functionality that I had no control over.  Instead, high-level functionality should build on low level functionality, and in such a way that programers can code at a low level if they need to, similar to how it is done in C++, but with more structure as in Java.  Furthermore, there isn't really a reason to limit what programers can do.  Give programers power over operators and syntax even, as much as possible, while of course containing that power to packages that can be used for the whole program or just one part.  I believe in giving programers more than enough rope to hang themselves, rope is useful, don't take it away just because it can be used for ill.  Instead provide the programers with an environment that discourages hangings, let the environments hold the reigns, give the language all the power it can have.

On the other hand, the advantage of Java is that the high-level is great.  The libraries are realitively straightforward to use and well documented.  So when I say high should build on low, I don't mean merely that low should be there, but also the high level functionality should be as complete, uniform, and easy to use as the Java libraries.  Afterall, despite the lack of low level control, I still program in Java, and mostly because it's so easy.

Environment, Compilers, Interpreters

There are two real reasons why I program in Java more than C++, though I still enjoy an occasional C programing binge; pointers are fun, in a masochistic way.  The first is the libraries, as I've mentioned.  The second is eclipse.  I don't know if there is an environment out there for C++ that is as great as eclipse, but I haven't seen one.  If there were, it's entirely possible I would switch back to C++, though I'd still miss the Java libraries and standards quite a bit.  Environments can make or break a language.  The quality and ease of use of compilers, interpreters, and code writing tools can have a drastic effect on whether programing is fun and easy or frustraing and endless.  Likewise, environments can provide an excelent place to enforce the kinds of standards that Java enforces, rather than enforcing them at the language description level.  In this way, programers can be guided toward good standards and styles with the ability to step around when they need to, rather than feeling like the have to fight the language sometimes to get the kind of functionality they want.

Community

Did I mention that I liked the Java libraries.  Well they would be nothing without the Java community and website.  Tutorials abound.  Just like the environments that are available for a language, the community built around a language can have a profound effect on its success or failure, as well as on its ease of use.  Likewise the existence of multiple communities can have an effect, but usually a bad one.  The creation and maintinence of a single language based community is an essential part of developing a truely successful modern programing language.  There needs to be one place to go to look up tutorials, classes, packages, environments, and to chat it up with fellow programers in that language.  The more a language maintains a sense of central unity the more standardized it is, and the more compatable its parts will be.

Implementation and Wishlist

Basic Level

Class Level

Community

Compilers and Interpreters

Environment Basics

Environment Advanced