[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

What would your ideal language be like...

         A friend asked me this, "If you could design a language, what 
would it be like?" question, and I wrote up a response. I'm just an 
undergraduate electrical engineering major, but I learned to program in 
elementary school and have continued with a passion ever since. The biggest 
monolithic project I've ever written was 7000 lines of C code.
         I say all this to preface the fact that I'm no expert, not a 
working programmer(yet), and not an academic(although I have asperations 
:). But this is what I've had gripes with, and some is based on 
speculation, but what I tried to do is approach the question not by looking 
at specific concepts(typing, object orientation, functional, etc.) but by 
trying to say what I want those concepts to help me DO. Since things seem 
to be kinda slow around here, I just figured I would allow my ignorance to 
start a nice long discussion :).

> > If you could design a language, what would it be like?
>         Ah, I have thought about this a lot. Honestly, syntax is not 
> DRAMATICALLY important to me(s-expr's would suffice, but something more 
> would be nice too. I'm not for or against infix, prefix, and even postfix).
>         I know what principles it would embody. I'll list them below:
>         Say It Once - any piece of information, from low-level details, 
> to the highest architectural ones, should be able to be said "once". If I 
> have to put the same information in two different places, one of them 
> will get out of sync with the other, and then bugs happen.
>         Do It Once - typing, I don't care whether its strong or weak, 
> anal or lax, or whatever the current fad is. I want to write code that 
> will work on the widest variety of "datatypes"(whatever those are) and 
> the compiler still catch errors in usage(not to favour operator 
> overloading, but "sort" for instance, should only require the ability to 
> iterate, compare(greater than), and swap, nothing more, any "structure" 
> you can do that too, should be sortable. period.)
>         Self Documenting - I like the idea behind Doxygen, and 
> CWeb(Knuth's little toy), and the ilk, but its almost against the "say it 
> once" thing. I should be able to make "smart comments", that are used to 
> automatically make documentation, dare I say it, or even the User Manual.
>         Help the Compiler - Abstractions are nice, but there are times 
> when we know things about our code that the compiler doesn't(perhaps this 
> is Contract stuff ala Eiffel), and we should be able to tell the compiler 
> constraints about our code, and it optimize accordingly AND check to make 
> sure we're doing what we say(detecting any violations of our "statement 
> of intent"). We all know that our code is compiled, why pretend 
> otherwise. I'm not saying violate any separation of concerns or anything 
> about the underlying CPU model, but nonetheless, we should be able to 
> make "meta statements" about our code that compiler understands.
>         Metaprogramming - Programs that manipulate programs. This should 
> not be hard. Reflection is an example. 90% of LISP is an example, but it 
> should just Not Be Hard to do this(C can sorta, but you have to be a wizard).
>         Dependencies and Namespaces - should be simple to deal with. 
> People just don't build monolithic applications, so why should compilers 
> assume everything is in house. Java's package system(based on DNS, a good 
> idea, and yet... a mistake, because its too centralized) is a good start 
> in this... it's really simple and for the most part It Just Works.
>         Standard Libraries - Java's stdlib's are an example of people who 
> delight in overabundance. While C's libraries could be far more 
> extensive. I think I would prefer a "conceptual" standard library. Assume 
> that user code will, in cases, override the standard library, but certain 
> concepts, like networking, parsing, streams, graphics, gui's, file 
> handling,  threading, file types(like loading a gif, xml, database), and 
> "data structures"(lists, hashes, trees, sorting, serialization, etc.) 
> should be "conceptual" unified in a standard "interface" that can be 
> adapted for later use. My XML parser in C uses my own file-handling code, 
> and later on, I adapted  it to do networking in 15 minutes, but only my 
> code benefited. It would be nice if you could override the built-in's(no 
> difference between built-in and user code), so that code written 
> elsewhere can and should use the built-in's but benefit from your stuff 
> if you reuse their code.
>         Garbage collection - Yeah, I want it, but I would also like to 
> have fine tuned control over it(no collection now, collect some stuff 
> here). If the language were "reflective"(imprecise use) enough perhaps 
> have it in the stdlib and be able to override it. Same with your 
> allocators, often times, if you know something about WHAT you're 
> allocating you can get better performance. Speed is not the be-all 
> end-all, but when you get ready to optimize for speed, the language could 
> help you by not necessarily requiring you to "butcher" your code. 
> Built-in profiling... that would be nice too.
>         Separation of concerns and exception Handling - Not sure how to 
> do it right, but SOC is a cool idea, its similiar to stuff like in CWeb. 
> The idea of writing code that does NO error handling and then writing it 
> elsewhere. I like lexically separating Error handling, in C, extensively 
> handling errors often obfuscates the algorithm. Something I potentially 
> like is writing a tag on the end of a function that perhaps intercepts 
> function calls and handles errors, or something that can catch errors at 
> the end using contracts. I'm pretty sure I don't like Exception Handling 
> the way its done in Java.
>         Support for evolution - A "program" is never finished, we just 
> get tired of typing. The tools that come with the compiler should assume 
> that I intend to "fork" previous pieces of code I've written and rework 
> it, and maybe back-port it. People do this all the time, why pretend we don't?
>         Multithreaded - It should be able to be multithreaded,  and have 
> the tools to support it.
>         Embeddability - Embedded systems are cool, and honestly, 
> everywhere. The language should be able to be plunked down into a 
> microcontroller, so handling hardware level stuff(like interrupts) should 
> just not be a big deal.
>         Simple - It should be simple. :). All of this stuff I mentioned 
> should be tucked away in a clean, orthogonal language. Some parts of the 
> implementation may be hard. But parsing the langauge should be 
> simple(context free grammer at the most). The semantics should be just be 
> simple. I think most of this can be done simply. I think one of C's and 
> Scheme's strong points is its simplicity. I think its Java's weak 
> point(this is a relative thing. Its a huge win over C++ who is manages to 
> score dead last in this category. Maybe ADA, APL, or VHDL could top it...)
>         That's just the language, but I spoke of tools, and now I'm going 
> to really talk about them.
>         I want an IDE. Makefiles are dandy, Ant is amusing, but frankly, 
> I was happy when I progressed to a GUI environment. I like just popping 
> up a dialog and including stuff. I can and do learn these things when I 
> have too, but, honestly, Smalltalk integrating a GUI, and LISP 
> intergrating a REPL are steps FORWARD not back.
>         I want my code to be hypertext. I like that. I want to click on a 
> function see its documentation, definition, prototype and everything. I 
> want to see what code calls my code, I want to see what code my code 
> calls. I want to follow the graph, I want to play with it.
>         Actually, I wouldn't mind if I could literally choose to switch 
> to "graphically" programming. Altera's VHDL compiler lets you interface 
> "schematics" with VHDL. I like that. Do the structural parts of your 
> program graphically(link this to that this way) and then do the guts in 
> text. Be able to switch... start it graphically then maybe edit it 
> textually, and then view it graphically. LabView is a HORRIBLE way to do 
> Visual programming, but Altera _almost_ gets it right.
>         Make and configuration and version management should be at least 
> supported, but preferably truly INTEGRATED into the language. I should be 
> able to send you a tarball of files in a directory tree(from a windows 
> box) and you(on your *bsd, *nix, whatever) system fire up(maybe 
> independently written) your compiler and it should be able to compile. 
> I'm not neccessarily advocating source portability between operating 
> systems, but if you stay in the stdlib it should Just Work. Configuration 
> code should be integrated in with your system. The compiler can help it. 
> Version control would be nice too. I think you could get a really cool 
> system by making these things truly cooperate.
>Interesting programming languages to me...
>         ML - Cool take on strong typing
>         Eiffel - Contracts
>         Forth(innovative way of using postfix, also the standard 
> "two-stack" model, control flow stack separated from "parameter stack").
>         Lisp    \  Macros, higher order functions, code/data what's the 
> difference
>         Scheme  /  Scheme's approach to math, forced tail-recursion 
> opitimization. Simplicity.
>         C - Simple semantics. Purity :). It may screw up, but honestly, 
> there's not a lot to it.
>         Java - package system mostly
>         Prolog - I like backtracking. I wish
>         QuickBASIC - had a good IDE, and was a very good basic. Alas, MS 
> couldn't stop there, and they "fixed" it by turning it into VB. At least, 
> with the name change I can list it and you guys know the difference
>         Assembly language - :)
>         Smalltalk - as long as I'm naming names :).
>         Larry Wall - Perl's okay, but honestly, I enjoy his 
> philosophizing on programming more than his language :).
>Languages that I mostly dislike
>         C++
>         Ada
>         VHDL(VHDL is derived from Ada, so I feel very sure I would hate 
> Ada by implication)
>         Pascal
>         x86 assembly - I've seen many architectures, this one is truly 
> baroque.
>Cool tools
>         CWeb
>         Doxygen
>         Subversion ...
>Other notes.
>         OO is overrated
>         Regex's are overrated :)
>Closing Comments
>         You asked for it, I hope you enjoyed this. I would love to 
> continue this discussion with anyone who wants to, so please read this. 
> If anyone knows of this language I have described, send me to it. If 
> anyone thinks any or all of this is full of crap let me know. Also, if 
> you're truly interested, the MIT Lightweight Languages Workshop has a 
> mailing list, and I'm on it. Its currently kinda quiet, but I think I'm 
> going to repost Marc's message and get them going again...
>                                                         Matt Estes