Programming was done on punch cards, which had to be physically written in binary by humans by hand. Programming was tedious, error-prone and tied to specific machine hardware. With the introduction of high level programming languages, hardware manipulation was replaced with expressive text, making code portable, readable and reusable. This evolution demonstrates that the core aim of a programming language is abstraction. In other words, to bridge the gap between human conceptual thinking and low-level computer logic, thus enabling efficient and scalable problem-solving.
No language is capable of optimising for speed, developer ergonomics, safety and flexibility all at the same time. So, different domains have different priorities. Systems programming wants raw speed and low level memory control (C/C++). Web programming wants fast deployment and dynamic execution (Javascript). Data science wants high level mathematical readability (Python). The variety exists so developers are able to pick the right tool for the specific purposes and performance needs of their environment.
Firstly, Python uses spaces and tabs to organize code instead of curly brackets. Moving code around or copying snippets can easily break your formatting and cause annoying indentation errors.
Secondly, due to the fact that Python interprets code line-by-line at runtime, it is much slower than compiled languages like C++. In Computer Science Olympiads, this slow speed often causes correct solutions to fail simply because they run out of time.
Thirdly, the standard workflow requires running the entire program through the interpreter every time rather than compiling it directly into a standalone .exe file.
It would be much better if Python had an official, built-in option to compile code directly into a fast .exe file and gave users a way to avoid simple formatting errors.
To start creating a new programming language, you begin by defining its core syntax, type system, and execution model.
The first step is to write a formal grammar which defines the structure of keywords, operators and data structures for the lexer and parser. Then you define the core concepts, such as imperative or declarative language, statically typed or dynamically typed language, how does it handle memory and etc. Then you write a compiler or interpreter that turns that high-level syntax into something the machine understands: executable machine code, bytecode or abstract syntax trees.