Home Backend Development PHP Tutorial The Irony of Static Typing in Dynamic Languages

The Irony of Static Typing in Dynamic Languages

Nov 03, 2024 am 06:28 AM

You can also read this article on Medium.

It's always funny when we see how programming languages evolve over time.

One upon a time, when I started my journey in the software development world, dynamic languages such as Python, PHP and JavaScript were appreciated for their flexibility and concise syntax suited for rapid development.

However, as these weakly typed languages evolve, they incorporate features of strongly typed languages, making them closely similar to C and Java:

  • Python: Type hinting capabilities introduced since version 3.5 in 2015, and enhanced in version 3.12 on 2022.
  • PHP: Declared types introduced in version 7 in 2015.
  • JavaScript: Extended by the release of TypeScript in 2012 defined as "JavaScript with syntax for types".

Why this shift ?

In strict-typing languages, we explicitly define the types of variables in our code. The goal is to catch the errors during the development phase before executing the program, and provide a hint to the compiler about the memory size to allocate to these variables.

// C++ example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)
Copy after login
Copy after login

On the other hand, dynamically typed languages such as Python, PHP, and JavaScript allow us to create variables and let the interpreter imply their type during the runtime:

# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)
Copy after login
Copy after login

How explicit-typing is introduced in dynamic languages ?

In the following example, we declare the same function using dynamic and static typing.

Python:

# using the classic syntax:
def add(x, y):
    return x + y
# using explicit typing:
def add(x: int, y:int) -> int:
    return x + y
Copy after login
Copy after login

JavaScript / TypeScript:

// using the classic syntax
function add(x, y) {
    return x + y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x + y;
}
Copy after login
Copy after login

PHP:

// using the classic syntax:
function add($x, $y) {
    return $x + $y;
}
// using explicit typing:
function add(int $x, int $y): int {
    return $x + $y;
}
Copy after login

PHP 8.2 (released in December 2022) push it further by introducing the support for null, true and false as stand-alone types:

public null $nil = null;
public false $false = false;`
Copy after login

Where is the irony ?

Don’t take this article as an objection to these new features, I do acknowledge the advantages of using strictly typed languages. However, using type annotations in Python, for example, doesn’t stop you from changing the types of your variables:

x: int = 0
x = "John" 
print(type(x))   # <class 'str'>
Copy after login

Same for PHP, it will only print a Deprecated warning on the console.

One might ask why the interpreter allows us to execute this code then?
That’s because these languages are built that way: they are dynamically typed by definition. If we remove this characteristic, they won’t be dynamic anymore; they will become strictly typed languages like C , but slower.

Hopefully, you can ask your interpreter to be more rigid by setting strict_types to true in your PHP file:

declare(strict_types=1);
Copy after login

While in python, you can use the 'mypy' package to analyze your code and catch the bugs:

// C++ example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)
Copy after login
Copy after login

You can see 'mypy' as an advisor telling you what you did wrong, but it doesn't stop you from executing your code at your risk.

The Irony of Static Typing in Dynamic Languages

Even if you’re not sure about the type of your variable, you can still use the union operator to reduce the list of accepted types:

The following examples from PHP and Python show how to do it:

# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)
Copy after login
Copy after login

Are we sacrificing code readability?

Ten years ago, I decided to use Python for my PhD because of its simplicity and the ability to prototype new ideas quickly. Then I started to use it also for my other projects.

Now, I find myself reading some weird PEPs and questioning myself if it’s really worth it to complicate my codebase by including these new features.

Let’s look at an example function that prints the items of a dictionary. Here’s the initial version:

# using the classic syntax:
def add(x, y):
    return x + y
# using explicit typing:
def add(x: int, y:int) -> int:
    return x + y
Copy after login
Copy after login

By using the recommendations from PEP 692 introduced in Python 3.12, the code becomes:

// using the classic syntax
function add(x, y) {
    return x + y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x + y;
}
Copy after login
Copy after login

In summary: we created a class that inherits from TypedDict, specified the name and type of each item, and used the Unpack operator to tell “mypy” that the received object is a TypedDict.

As a result, our code doubled in size. It would become even longer if our object had more items.

Fortunately, we can use static typing for some parts of our code and leave the rest as dynamic. Or we can choose not to use it at all if we prefer.

The Irony of Static Typing in Dynamic Languages

When should we use it?

Don’t feel pressured to rewrite your entire codebase just because you learned a new, shiny feature.

These new features are like tools. My advice is to use them wisely:

Use static typing in the following scenarios:

  • When retrieving data from external sources, such as databases, libraries, and APIs.
  • In critical parts of your code where failure is not allowed.
  • When your codebase is prone to frequent bugs.

Avoid using static typing when you are:

  • Designing a prototype to quickly test your idea.
  • Implementing internal logic where type checking will only result in verbose code with and no benefits.
  • Just displaying data on the screen (e.g. plotting charts, images, numbers…).
  • Writing a command line script with no user inputs.

Keep in mind that when it comes to coding, the golden rule is always to strive for simplicity, except if you have a good reason to complicate things.

The above is the detailed content of The Irony of Static Typing in Dynamic Languages. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1267
29
C# Tutorial
1239
24
PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Apr 17, 2025 am 12:06 AM

In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values ​​to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP in Action: Real-World Examples and Applications PHP in Action: Real-World Examples and Applications Apr 14, 2025 am 12:19 AM

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

What are HTTP request methods (GET, POST, PUT, DELETE, etc.) and when should each be used? What are HTTP request methods (GET, POST, PUT, DELETE, etc.) and when should each be used? Apr 09, 2025 am 12:09 AM

HTTP request methods include GET, POST, PUT and DELETE, which are used to obtain, submit, update and delete resources respectively. 1. The GET method is used to obtain resources and is suitable for read operations. 2. The POST method is used to submit data and is often used to create new resources. 3. The PUT method is used to update resources and is suitable for complete updates. 4. The DELETE method is used to delete resources and is suitable for deletion operations.

Explain the difference between self::, parent::, and static:: in PHP OOP. Explain the difference between self::, parent::, and static:: in PHP OOP. Apr 09, 2025 am 12:04 AM

In PHPOOP, self:: refers to the current class, parent:: refers to the parent class, static:: is used for late static binding. 1.self:: is used for static method and constant calls, but does not support late static binding. 2.parent:: is used for subclasses to call parent class methods, and private methods cannot be accessed. 3.static:: supports late static binding, suitable for inheritance and polymorphism, but may affect the readability of the code.

How does PHP handle file uploads securely? How does PHP handle file uploads securely? Apr 10, 2025 am 09:37 AM

PHP handles file uploads through the $\_FILES variable. The methods to ensure security include: 1. Check upload errors, 2. Verify file type and size, 3. Prevent file overwriting, 4. Move files to a permanent storage location.

How does PHP type hinting work, including scalar types, return types, union types, and nullable types? How does PHP type hinting work, including scalar types, return types, union types, and nullable types? Apr 17, 2025 am 12:25 AM

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values ​​and handle functions that may return null values.

See all articles