Programming Languages

Programming languages are the mutual-languages of computers, frameworks and the human-programmers. Programming languages are helpful, in the sense that they allow us to write software programs, without knowing what language a computer speaks and understands. You write the programs in minimal programming languages, just like writing instructions for a task given to a human. If you have to instruct a person to do something, you tell them about the possible steps they need to take from step 1, to step 5, to step 10 and so on. Computers have no knowledge of the steps required to perform a task, which is why they follow as they are instructed. A programming language makes it easy, to instruct a computer to perform a task. A programming language ensures that the programs written are easier for the programmers to read, understand and debug, while getting executed in the same language that the machine understands — which is the machine language.

Programming languages contain symbols, expressions, data and control structures that are used to write programs which instruct the computer machine to perform a set of tasks in order to generate results for a particular operation. The symbols and expressions in the programs help the compiler/linker to understand how to start the program and how much memory does a program require before starting. Depending on the level and paradigm of the language, a programming language supports the programmer in,

  1. Writing efficient programs to perform a task
  2. Controlling the machine/framework for various operations such as network management, or memory management etc.
  3. Writing more software for a particular machine
  4. Running simulations for scientific purposes
  5. Generating reports in various formats

Programming languages are always being created, new languages come with a different syntax, semantic, purpose and the platform of target. C#, Java, JavaScript... Python, C++, Haskell, and many more are yet to come and many have been forgotten due to the their complex language structure, and less language features, which is why most enterprises could not afford to use them. But as a computer science (or related, or equivalent field) student, there is no limitation or barrier that is going to stop you from learning a programming language and trying it out for your various test projects — hello world ones. You will find a table of suggested programming languages based on their difficulty level, you can start your learning process from there.

Levels of programming languages

Primarily programming languages are differentiated by the level of their access on machine and their simplicity and use in the terms of "reusable" programs. It also defines the programs and services that can be written in each of the programming language as well as dictating the amount of reusability they offer in terms of portable programs. By levels, programming languages are differentiated in two different levels,

  1. Low-level programming languages
  2. High-level programming languages

How a CPU works is a question to be answered in the system architecture course or tutorial, however you need to know that a computer is an electronic device that generates corresponding output for a particular set of inputs. Level of the programming languages define the access of the programs over machine hardware, and the services and features they can provide to the programmers of that language.

Low-level programming languages

A low-level programming language is the language that focuses on keeping the machine in running state. Low-level programming languages have a primary focus and goal of managing the instructions directly for the CPU. This is why low-level programs are less portable, much more machine-oriented and highly efficient. Low-level programming languages are able to directly communicate with the CPU and this is why they can directly execute instructions that are directly bound to a particular family of CPUs. Mostly low-level languages are defined to be the machine and Assembly language, which is true as other languages have some high-level features too and thus are not pure low-level languages.

Provided the amount of control they provide on the machine, they are typically difficult to learn because it is not easy to understand the machine architecture easily. Machine architecture is a collection of the CPU, RAM and IO instructions to be performed and has to take into account all of the processes that have to undergo to perform a particular task.

There was once a quote that I read on Quora, which said,

C is Assembly language with a better syntax.

Which is true in all the cases, you can control a machine with C language and C lets you go down to the machine-level and directly execute Assembly instructions and it also — at the same time — lets you write good and readable programs with good data structures and control structures such as loops and conditions.

High-level programming languages

High-level programming languages, in simple definition would be the language in which your apps are developed. High-level programming languages sit on top of the low-level languages and offer more features, that increase the value of a low-level programming language for the programmers. Think of when C++ started to roll out, and brought the object-oriented programming to C world. C++ was a high-level language (it still is, and it always will be!) and which offered more features and abilities to write programs on top of the same low-level (C language) code.

High-level languages are easier to build, easier to learn, easier to develop and easier to port on different platforms. The concept of cross-platform is tightly packed with high-level approach of programming. This is why, C language is also considered a high-level language because the same hello world program from C can be compiled for x86, x64 or other CPU architectures. Take the following C program for instance,

#include <stdio.h>

// Main function for a my-age-is program.
int main() {
    int age = 25;
    print("My age is less than %d.\n", age);
    return 0;
}

This program will run on a mobile, desktop, server, 32-bit, x64 architecture and anywhere that the compiler can target. In this sense, C programs are high-level. I will discuss more of high-level languages in the topics of their own.

High-level languages such as Python, C++, or Java support good learning practices and which is why they are used in Academics to teach programming basics to the students. High-level languages often have better support of tooling, such as the IDE, framework, samples and guiding material such as books and video tutorials.

Concepts needed to understand a programming language

A programming language is a very broad concept, in the sense that it comprises a complete grammar, symbols, syntax, semantics and other elementary reasonable structures that define how you communicate with the computer. These concepts are necessary for you to learn before you can program something useful in that language. Yes, it does take time and is a very long process, but as time goes you will master all of them and be able to program some software in a language.

Paradigms

Programming languages are further divided the paradigm or orientation they have toward the approach of software development. Programming paradigms define the overall usage of the programming language. There are several programming paradigms that I am going to discuss along with their benefits and some downfalls that they have. Following are only a few of the programming paradigms that you need to have a basic concept of.

  1. Object-oriented programming
  2. Event-driven programming
  3. Functional programming
  4. Service-oriented programming
  5. Data-driven programming

And much more...

The programming paradigm defines the overall structure of the language, how the language is developed, how modules and programs are written and how they are executed.

Purpose of the language

Purpose of the language is set before the language is created and published. There are many programming languages set fire just to serve a specific purpose. No, I am not talking only about the Assembly language (to support machine level control, while providing mnemonics in the language) or SQL language (to query the data from database, and to define the structure of the data).

There are languages that are defined for data science projects, such as the language R. Then there are some languages that are tightly bound to machine learning, such as the BrainScript. There are some languages that are general purpose, such as Visual Basic by Microsoft. Some languages are created as a hobby, or fun only, such as the BrainFuck language, then there are some projects that start for personal use and then gain a public interest such as Python, or C++.

Platform of the language

Every language has a platform, which it targets. Low-level languages are compiled or translated down to target a particular CPU architecture and then execute those statements. Then, the high-level languages come in, and they primarily do not target a specific architecture. For example, Java programs do not target a specific architecture, they target the JVM, which in turn targets a specific platform. Same is true for C# programs, because the C# programs target the .NET framework, which in turn would target the Windows platform and down the hallway to machine.

This is the reason why you need to understand the platform of a language, before trying to implement it as your learning path.

Platform dependence

Platform dependence means the dependence of a programming language on the core services and features provided in a platform, operating system or device. For instance, the CUDA programming API developed by NVIDIA is only available to be run on NVIDIA graphics cards, and will not work on AMD (or other) graphics cards. In most cases, it is a downside of a programming language or API, because it cannot be ported on different platforms or hardware and thus it requires a lot of work by the development team as they need to write new drivers and software programs for other hardware. Not just this, it also means that a program written for one platform will break or maybe cause damage to other machines/hardware/platforms, and/or the data stored on those platforms.

While there are some downsides of a platform dependent programming language, or API, there are a lot of benefits as well. The languages that are platform dependent typically explore more features offered by a particular machine. In this case, imagine that same CUDA driver, it would have more performance and features on the NVIDIA compute, and would generate high-quality graphics too because the programmers will know what features are available and what can be looked forward for and what to ignore.

Low-level languages are more platform dependent, which is why they have better performance, and they make the maximum use of the core features and services provided by the machine as compared to high-level languages. High-level languages can also utilize the features of a hardware, but that is rare and also requires some prior information of the architecture, and design of the machine before their code can be translated for that machine, otherwise it will give out several errors. Platform independence leads to other very information concepts in programming, such as,

  1. Graphical applications
  2. Networking frameworks
  3. Cross-platform application development
  4. Portable APIs

Writing these frameworks for a single platform, or machine will not be an efficient task because it leads to a very complex and bloated framework and set of library tooling to develop the same application on every platform.

Beginner-friendly programming languages

If you are merely a beginner in computer programming and want to learn and understand which programming language you should learn, then chances are you will never find out which of the languages you should start with. There are several languages in different programming paradigms, levels and platforms and trust me the choice of a programming language heavily depends and relies on the choice that you much, such as whether you want to build software on Windows, or Linux, or you want to build mobile applications or low-level network oriented services.

Following are my recommendations, that you can start learning but remember, they are my preference-based recommendations and include somewhat experience in those languages too.

Language Level Beginner-friendly Cross-platform Major Platform Programming Paradigm Memory-management Frameworks Support My Rating
C language Low level Yes Yes Linux Structured, Imperative Manual Basic Level ⭐ ⭐ ⭐ ⭐
C++ Language Low/High No Yes Windows, Linux Object-oriented, General Purpose, Functional Manual Huge community support ⭐ ⭐ ⭐ ⭐ ⭐
Python High level Yes Yes Linux, Windows, macOS Imperative, General Purpose Automatic Huge community support ⭐ ⭐ ⭐ ⭐ ⭐
Java High Yes Yes Windows Object-oriented Automatic Good community support ⭐ ⭐ ⭐ ⭐
C# High Yes Yes Windows, Linux Object-oriented, Functional, General Purpose Automatic, Manual Huge community support ⭐ ⭐ ⭐ ⭐ ⭐

I will keep adding more languages and their information to this table and will keep you updated. If you feel I missed your favorite language, just let me know.

If you feel confused about my explanation and rating of the language, please wait till the time when I publish a separate topic on each of them and explain why I feel so, and also you will get the separate section to learn that programming language.

Sadly, this chapter does not have any topics to share.