Oracle’s Java turns 20 this year. C++ hit the big 3-5 last year, while C is over 40. Microsoft’s C#, the baby of the group, is 15 years old. All of these continue to command a significant following even in the embedded space. All have significant corporate support that helps with their staying power and they have been continually updated with new features. For example C++14 allows units (see "Bjarne Stroustrup Talks about C++14" ), and lambda expressions are now part of Java, C#, and C++.
Of course, new programming languages keep cropping up, including ones designed for embedded applications. Many look to displace existing programming languages, with others targeting new or emerging platforms like IoT or mobile devices. In theory, they try to simplify the programmer’s job and help make applications safer and more secure.
For example, Google Go is a new language from Ken Thompson, Rob Pike, and Robert Griesemer. Ken, as you may know, helped create C. (See "Thompson, Ritchie, And Kernighan: The Fathers Of C".)
Apple’s Swift looks to replace Objective-C, the company’s current programming language. Objective-C has primarily been used for Apple platforms, and Swift is following suit—so if you aren’t interested in those platforms, Swift won’t be, either. This is very similar to Microsoft’s approach for C#, although C# has found some open-source, third-party support.
Swift does not expose pointers and its syntax has moved towards languages like C++ and Java. Object-ive-C syntax was closer to Smalltalk. It supports named parameters for methods, while espousing features like protocols (think Java interfaces), categories, and closures.
Mozilla’s Rust is another general-purpose programming language that targets highly concurrent and safety critical applications. It has a syntax similar to C/C++, but it guarantees memory and thread safety. While Rust uses manual memory management, its control of pointers is worth looking at—especially for embedded applications. Its “boxed pointers” have a unique reference to a heap object that will be deleted when the pointer goes out of scope. There also are “borrowed pointers” designed to prevent dangling references. Data referenced using these pointers cannot be deleted, while a borrowed pointer references it. A “borrow checker” provides compile time checking.
Of course, like almost any practical programming language these days, it has C bindings. What I find interesting are Rust’s trait-based generics and pattern matching support. The latter is not unique, as Scala (see "If Your Programming Language Doesn’t Work, Give Scala A Try" ) and other programming languages have this feature.
Go, Swift, and Rust still have to prove themselves. The bottom line: These and other languages will not have a lot of impact on C, C++, C# and Java in the near term.
C, C++ and Java are still the primary languages for embedded applications, with C leading the charge. The reason is simple: Every processor coming out of the foundry has a set of development tools with a C compiler. Assemblers have essentially disappeared; they still exist, true, but board support packages (BSP) and runtime support are almost always in C these days. Even if a developer uses another programming language, it will need a C interface to gain access to base services.
Sometimes I wonder if we should not give Ada or Lisp a chance. Ada is 35 years old and has built-in multitasking, plus contracts that make most languages look lame when it comes to safety. (See "Ada 2012: The Joy of Contracts".) Its object-oriented support matches that of the newer languages. Lisp has been around for 60 years and is where a lot of the “borrowed” ideas for these other languages came from. Think lambda.