A programming language is a system of notation for writing computer programs.
There are millions of programming languages out there, which can be categorized in many ways: Object-oriented, functional, imperative, declarative, event-based, logic-based, high-level, etc. Most languages nowadays fit into multiple categories.
Why study Programming Languages?
Programming languages reduce complexity. A programming language is low level when its programs require attention to the irrelevant.
The most low-level language known is Assembly. A simple comparison with higher-level languages show us how useful is to a programmer to use a higher-level language:
Instructions ⇒ Expressions

Calling Conventions ⇒ Functions

malloc ⇒ Garbage Collection

All of these are features that the languages provide to you to avoid programmers thinking about non-relevant stuff when working on high-level projects like a web server.
Understanding the programming languages you work with will make you a better software engineer.
Knowing which programming language to use for which tasks will make you a better software engineer.
Knowing about the features of programming languages will allow you to extend existing languages and define new languages yourself.
In this course, we will:
A compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).
The name "compiler" is primarily used for programs that translate source code from a high-level programming language to a low-level programming language (e.g. assembly language, object code, or machine code) to create an executable program.
Compilers, even though they can be extremely fast, are too complex and hard to program. As a result, in this course, we will instead program an interpreter.
An interpreter is a computer program that directly executes instructions written in a programming or scripting language, without requiring them previously to have been compiled into a machine language program. An interpreter generally uses one of the following strategies for program execution: