Although Java and JavaScript are the most popular all around programming languages today, the C programming language remains the language of choice for high performance computing after almost 45 years of mainstream use.
C was originally developed by Dennis Richie at Bell during the late 60s and early 70s. It emerged during the development of the Unix operating system which—like C—has survived the test of time, especially in its Linux incarnation.
C became immediately popular because it balanced power and usability. At the time of C’s inception, low-level “close-to-the-metal” coding required tedious Assembly language, while business processing typically used the verbose COBOL language, which was far slower and less capable of operating-system level computation. C offered a higher-level abstraction than assembly language, but still allowed direct manipulation of memory structures through pointers. C provided a huge boost in programmer productivity for system and scientific programming and for high speed computing.
C++ emerged from the C language foundation, becoming the first widely used object oriented programming languages. Although Java, C# and other similar “managed” languages have become fast enough to offer an alternative to C for high speed computing, most operating systems and compilers remain written in C or C++.
The initially cryptic C syntax conventions, such as increment operators (++), braces ({}) and other idioms have become standard features across a whole family of languages including Java, JavaScript, C#, Perl, and others.
However, C is not without blemishes. In James Iry’s hilarious “history of computing,” he wrote, “Dennis Ritchie invents a powerful gun that shoots both forward and backward simultaneously. Not satisfied with the number of deaths and permanent maimings from that invention he invents C and Unix.” C, while powerful, empowered the programmer to create bugs that simply were not possible with higher level languages. Most critically, C’s pointer-based memory management system could create catastrophic failures as well as security issues such as buffer overflow attacks. And the C++ object-oriented idioms are considered generally inferior to those in Java or Python. Therefore, it’s not surprising that there have been attempts to create a C replacement language.
The aptly named D programming language was first released in 2001, but did not achieve a 1.0 release until 2007. It borrowed much of C++ syntax but added support for functional programming, parallelism and concurrent programming. However, D has experienced relatively poor adoption.
Around 2007 a team of engineers at Google—including Ken Thompson, who worked on UNIX and C with Richie—developed the Go programming language. Go is a C-like language with improvements for readability, productivity and performance—especially around parallelism and concurrency. Similar to Java and many dynamic languages, Go performs garbage collection which can lead to some unpredictability in response time and possible problems for real-time applications. Nevertheless, Go is widely adopted inside of Google and externally. It is fast to execute and fast to compile, and it has been battle-hardened within Google.
Rust was developed around the same time at Mozilla. Similar to Go, Rust is syntactically a C-like language, but where Go emphasizes speed, Rust is oriented more toward memory safety and predictable performance. Rust performs no garbage collection and emphasizes manual memory management.
Similar to Go, Rust is explicitly designed to support concurrent programming tasks. Dropbox recently rewrote part of their Go-based “magic pocket” system in Rust to reduce the memory footprint of key components.
Go and Rust don’t represent the only leading edge of language development. However, most other emerging languages are JVM based—such as Kotlin and Scala—or dynamic languages which optimize programmer productivity at the expense of ultimate run time performance. Where runtime performance considerations are paramount, Go and Rust are emerging as valid successors to C.