Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π² Python

ΠΠ²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ

Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π² Python

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ упоминания ΠΎ подсказках Ρ‚ΠΈΠΏΠΎΠ² Π² языкС программирования Python появились Π² Π±Π°Π·Π΅ Python Enhancement Proposals (PEP-483). Π’Π°ΠΊΠΈΠ΅ подсказки Π½ΡƒΠΆΠ½Ρ‹ для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° ΠΈ автодополнСния Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ риски появлСния Π±Π°Π³ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим основы Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Python ΠΈ Π΅Π΅ Ρ€ΠΎΠ»ΡŒ Π² динамичСски-Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкС, эта информация Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

Випизация Π² Python

Для обозначСния Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сами Ρ‚ΠΈΠΏΡ‹:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² python-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ абстрактныС Ρ‚ΠΈΠΏΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС стоит массив Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.

ΠŸΡ€ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ абстрактныС Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Python.

Π’Π°ΠΊΠΆΠ΅ Python позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ свои Generic-Ρ‚ΠΈΠΏΡ‹.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ TypeVar ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ любого Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ. НапримСр:

На мСстС KeyType ΠΈΠ»ΠΈ ValueType ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹.

Π—Π°Ρ‡Π΅ΠΌ это Π½ΡƒΠΆΠ½ΠΎ

ЦСль β€” ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, это позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ количСство Π±Π°Π³ΠΎΠ², ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ написаниС ΠΊΠΎΠ΄Π° ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ качСство.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ‰Π΅:

Однако, Π² ΠΎΠ±ΠΎΠΈΡ… случаях ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ошибка, Ссли ΠΊΠ»ΡŽΡ‡ age Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈ этом ΠΈΠΌΠ΅Ρ‚ΡŒ строковый Ρ‚ΠΈΠΏ. Валидация Ρ‚ΠΈΠΏΠΎΠ² добавляСт Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ строк ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΡ€ΠΈ большом количСствС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π½Π΅ΠΌΠ°Π»ΠΎ мСста Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

ИспользованиС Pydantic ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€ΠΈ этом Ρ‚ΠΈΠΏ автоматичСски помСняСтся Π½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ.

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π±ΠΎΠ»Π΅Π΅ строгая типизация ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ бСзопаснСС. Однако, использованиС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… возмоТностСй Pydantic ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄. Π’Π°ΠΊ, мутация Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ способна привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ значСния ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ нСпонятСн. НапримСр:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ созданный User послС Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π­Ρ‚ΠΎ Π²Π΅Π΄Π΅Ρ‚ ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ Π±Π°Π³Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»ΡƒΡ‡ΡˆΠ΅ всСгда ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ.

Π’Π°ΠΊΠΆΠ΅ сСйчас Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ FastAPI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, благодаря Pydantic, позволяСт быстро ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²Π΅Π±-прилоТСния с автоматичСской Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠ΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ эндпоинт /item автоматичСски Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ входящий json ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ модСль.

Π’Π°ΠΊΠΆΠ΅ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ количСства Π±Π°Π³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ mypy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ статичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° Π½Π° соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ². Π—Π° счСт этого Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Π±Π°Π³ΠΎΠ² ΠΈΠ»ΠΈ нСсоотвСтствий Ρ‚ΠΈΠΏΠΎΠ² Π² функциях.

И ΠΊΠ°ΠΊ бонус для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ лСнится Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ. MonkeyType Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ автоматичСски ΠΏΡ€ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎ всСх функциях, хотя послС запуска этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ ΠΈ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ оказались распознаны Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ.

НововвСдСния Python 3.9.0

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π² языкС Python. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Python становится Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π²ΡŒΡŽ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΈ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π³Π»ΡƒΠΏΡ‹Ρ… ошибок. Π₯ΠΎΡ€ΠΎΡˆΠ΅Π΅ описаниС Ρ‚ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ быстрСС Π²Π»ΠΈΡ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит, ΠΈ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒΡΡ Π² Π·Π°Π΄Π°Ρ‡ΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ использовании ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ удаСтся Π² нСсколько Ρ€Π°Π· ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ количСство строк ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ «утиная» типизация Π² Python

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π²Π°ΠΌ расскаТСм ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ², ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°Π·Π½Ρ‹Ρ… языках, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ подсказках.

Π’ Python ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² выполняСтся Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ Python β€” язык с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, ΠΎΠ½ Π½Π΅ заставляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π½Π°ΠΉΡ‚ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого, Python ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инструмСнтами ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² вмСстС с собствСнным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ.

БущСствуСт Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… стоят ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ языки программирования:

Π―Π·Ρ‹ΠΊΠΈ со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ выполняСтся Π²ΠΎ врСмя компиляции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, систСма Ρ‚ΠΈΠΏΠΎΠ² языка заставляСт явно ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Β«Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…Β» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ использованиСм.

Π’ΠΎΡ‚ ряд языков программирования со статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ: Scala, Java, C++ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. НапримСр, объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ строкового Ρ‚ΠΈΠΏΠ° Π² языкС Scala выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π―Π·Ρ‹ΠΊΠΈ с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ

Π’ этих языках ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ выполняСтся Π²ΠΎ врСмя выполнСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, систСма Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ языка Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ явного объявлСния Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ использованиСм. К языкам программирования с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ относятся Python, JavaScript, Ruby ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

НапримСр, пСрСмСнная строкового Ρ‚ΠΈΠΏΠ° Π² языкС Python опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ myCar Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ type() ΠΈ β€˜isinstance() Π² Python

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π²Ρ‹Π΄Π°Π΅Ρ‚ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° β€˜int’. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ my_var являСтся цСлочислСнным, ΠΈ функция type() опрСдСляСт Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ isinstance(‘ obj ‘,’ class ‘) Π² языкС Python ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ( ‘obj’ ) экзСмпляром класса ( ‘class’ ). ВозвращаСтся Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ( True ΠΈΠ»ΠΈ False ).

НСявная («утиная») типизация Π² Python

Π’ Python дСйствуСт популярный ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ: «Если это выглядит ΠΊΠ°ΠΊ ΡƒΡ‚ΠΊΠ°, ΠΏΠ»Π°Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡƒΡ‚ΠΊΠ° ΠΈ крякаСт ΠΊΠ°ΠΊ ΡƒΡ‚ΠΊΠ°, Ρ‚ΠΎ это, вСроятно, ΠΈ Π΅ΡΡ‚ΡŒ ΡƒΡ‚ΠΊΠ°Β». ΠŸΠΎΠΏΡ€ΠΎΡΡ‚Ρƒ говоря, Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ класса Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния, Π½ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства, Ρ‚ΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ.
Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ это Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Подсказки Ρ‚ΠΈΠΏΠΎΠ² ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ mypy

Π£ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Python, Π΅ΡΡ‚ΡŒ свои ΠΌΠΎΡ‰Π½Ρ‹Π΅ прСимущСства, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдостатки. Одним ΠΈΠ· нСдостатков являСтся Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ошибок выполнСния (runtime error) ΠΊΠΎΠ³Π΄Π° Python Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ прСобразования Ρ‚ΠΈΠΏΠΎΠ². Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π±Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠΎΠ΄Π° становится всС Ρ‚Ρ€ΡƒΠ΄Π½Π΅ΠΉ Π½Π°ΠΉΡ‚ΠΈ.

Подсказки Ρ‚ΠΈΠΏΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Python начиная с вСрсии 3.5. А Π±ΠΎΠ»Π΅Π΅ старыС вСрсии ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· подсказок Ρ‚ΠΈΠΏΠΎΠ² ΠΈ модуля mypy.

Данная функция ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для вычитания цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ.

mypy β€” это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ статичСских Ρ‚ΠΈΠΏΠΎΠ². Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Python ΠΈΠ»ΠΈ Π½Π΅ΡΠ²Π½ΡƒΡŽ (Β«ΡƒΡ‚ΠΈΠ½ΡƒΡŽΒ») Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ с подсказкой самого Ρ‚ΠΈΠΏΠ°.

Для Π½Π°Ρ‡Π°Π»Π° Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сам ΠΌΠΎΠ΄ΡƒΠ»ΡŒ mypy:

Π”Π°Π»Π΅Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ mypy_example.py Π½Π° своСм локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π­Ρ‚ΠΎ простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа Π² качСствС Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅, Π° послС β€˜->’ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ являСтся цСлочислСнным (β€˜int’). Но хотя функция Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (int), возвращаСтся строка β€˜Subtracted two integers’.

ЗапуститС ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ПослС этого Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ошибка, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π° нСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ β€˜intΒ», Π° выдаСтся β€˜str’).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния. Π—Π°ΠΌΠ΅Π½ΠΈΠΌ строковоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ.

ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π›ΠΈΠΊΠ±Π΅Π· ΠΏΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² языках программирования

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ содСрТит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Ρ‚Π΅Ρ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ Π·Π»ΠΎΠΌ, Lisp β€” бСстиповым языком, Π° C β€” языком со строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

Π’ ΠΏΠΎΠ»Π½ΠΎΠΉ вСрсии находится ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС всСх Π²ΠΈΠ΄ΠΎΠ² Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°, ссылками Π½Π° популярныС языки программирования ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сначала ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ТСлания ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ.

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ вСрсия

Π―Π·Ρ‹ΠΊΠΈ программирования ΠΏΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ принято Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… лагСря β€” Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ (бСстиповыС). К ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ относятся C, Python, Scala, PHP ΠΈ Lua, Π° ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ β€” язык ассСмблСра, Forth ΠΈ Brainfuck.

Π’Π°ΠΊ ΠΊΠ°ΠΊ «бСстиповая типизация» ΠΏΠΎ своСй сути β€” проста ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±ΠΊΠ°, дальшС ΠΎΠ½Π° Π½ΠΈ Π½Π° ΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ Π½Π΅ дСлится. А Π²ΠΎΡ‚ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΅Ρ‰Π΅ Π½Π° нСсколько ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
БтатичСская: C, Java, C#;
ДинамичСская: Python, JavaScript, Ruby.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
Бильная: Java, Python, Haskell, Lisp;
Блабая: C, JavaScript, Visual Basic, PHP.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
Явная: C++, D, C#
НСявная: PHP, Lua, JavaScript

Π’Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС эти ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ язык C ΠΈΠΌΠ΅Π΅Ρ‚ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ»Π°Π±ΡƒΡŽ ΡΠ²Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° язык Python β€” Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ Π½Π΅ΡΠ²Π½ΡƒΡŽ.

Π’Π΅ΠΌ-Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ языков со статичСской ΠΈ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π₯отя забСгая Π²ΠΏΠ΅Ρ€Π΅Π΄ скаТу, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ я Π²Ρ€Ρƒ β€” ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, Π½ΠΎ ΠΎΠ± этом ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ вСрсия

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ вСрсии Π’Π°ΠΌ показалось нСдостаточно, Ρ…ΠΎΡ€ΠΎΡˆΠΎ. НС зря ΠΆΠ΅ я писал ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ? Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΡ€Π°Ρ‚ΠΊΠΎΠΉ вСрсии просто Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ всю ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π° подробная Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ слишком Π΄Π»ΠΈΠ½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ смог Π΅Π΅ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ, Π½Π΅ Π½Π°ΠΏΡ€ΡΠ³Π°ΡΡΡŒ.

БСстиповая типизация

Π’ бСстиповых языках программирования β€” всС сущности ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ просто ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ Π±ΠΈΡ‚, Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

БСстиповая типизация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ присуща Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ (язык ассСмблСра, Forth) ΠΈ эзотСричСским (Brainfuck, HQ9, Piet) языкам. Однако ΠΈ Ρƒ Π½Π΅Π΅, наряду с нСдостатками, Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСимущСства.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°
НСдостатки
Бильная бСзтиповая типизация?

Π”Π°, Ρ‚Π°ΠΊΠΎΠ΅ сущСствуСт. НапримСр Π² языкС ассСмблСра (для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Ρ…86/Ρ…86-64, Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π΅ знаю) нСльзя Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² рСгистр cx (16 Π±ΠΈΡ‚) Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· рСгистра rax (64 Π±ΠΈΡ‚Π°).

mov cx, eax ; ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ассСмблирования

Π’Π°ΠΊ получаСтся, Ρ‡Ρ‚ΠΎ Π² ассСмлСрС всС-Ρ‚Π°ΠΊΠΈ Π΅ΡΡ‚ΡŒ типизация? Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ этих ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ нСдостаточно. А Π’Π°ΡˆΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Вас.

БтатичСская ΠΈ динамичСская Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ (static) Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ‚ динамичСской (dynamic) Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° этапС компиляции, Π° Π½Π΅ этапС выполнСния.

НСкоторым людям ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ статичСская типизация слишком ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° (Π½Π° самом Π΄Π΅Π»Π΅ Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΡ‚ этого Π΄Π°Π²Π½ΠΎ избавились с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ). НСкоторым ΠΆΠ΅, Ρ‡Ρ‚ΠΎ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки β€” это ΠΈΠ³Ρ€Π° с ΠΎΠ³Π½Π΅ΠΌ, Π½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΈΡ… Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚? НСуТСли ΠΎΠ±Π° Π²ΠΈΠ΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΡˆΠ°Π½ΡΡ‹ Π½Π° сущСствованиС? Если Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ статичСски, Ρ‚Π°ΠΊ ΠΈ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков?

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ
ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ
ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π₯ΠΎΡ€ΠΎΡˆΠΎ, самый Π²Π°ΠΆΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ β€” удобство описания ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ прСдставим сСбС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ β€” Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° функция поиска ΠΏΠΎ нСскольким массивам (ΠΈΠ»ΠΈ спискам) β€” ΠΏΠΎ массиву Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΏΠΎ массиву вСщСствСнных ΠΈ массиву символов.

Как ΠΆΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΅Π΅ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ? РСшим Π΅Π΅ Π½Π° 3-Π΅Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… языках: ΠΎΠ΄Π½ΠΎΠΌ с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π΄Π²ΡƒΡ… со статичСской.

Алгоритм поиска я Π²ΠΎΠ·ΡŒΠΌΡƒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… β€” ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€. Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ искомый элСмСнт, сам массив (ΠΈΠ»ΠΈ список) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ индСкс элСмСнта, ΠΈΠ»ΠΈ, Ссли элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ β€” (-1).

ДинамичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (Python):

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, всС просто ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ список ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ…ΠΎΡ‚ΡŒ числа, Ρ…ΠΎΡ‚ΡŒ списки, Ρ…ΠΎΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ массивы Π½Π΅Ρ‚. ΠžΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС β€” Ρ€Π΅ΡˆΠΈΠΌ эту-ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° Π‘ΠΈ!

БтатичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (Π‘ΠΈ):

Ну, каТдая функция Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ· Python, Π½ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΡ… Ρ‚Ρ€ΠΈ? НСуТСли статичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΎ?

И Π΄Π°, ΠΈ Π½Π΅Ρ‚. Π•ΡΡ‚ΡŒ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ программирования, ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ сСйчас рассмотрим. Она называСтся ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ язык C++ Π΅Π΅ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ:

БтатичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, C++):

Π₯ΠΎΡ€ΠΎΡˆΠΎ! Π­Ρ‚ΠΎ выглядит Π½Π΅ сильно слоТнСС Ρ‡Π΅ΠΌ вСрсия Π½Π° Python ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π’Π΄ΠΎΠ±Π°Π²ΠΎΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для всСх массивов, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для 3-Π΅Ρ…, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ!

Π­Ρ‚Π° вСрсия ΠΏΠΎΡ…ΠΎΠΆΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ β€” ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ»ΡŽΡΡ‹ статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ»ΡŽΡΡ‹ динамичСской.

Π—Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ρ‡Ρ‚ΠΎ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ красивСС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² языкС Haskell). Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΡƒΠΆΠ΅), ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ) ΠΈΠ»ΠΈ макросы.

Π‘Ρ‚Π°Ρ‚ΠΈΠΊΠ° Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅

Π’Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ статичСскиС языки ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Бильная ΠΈ слабая Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π―Π·Ρ‹ΠΊΠΈ с сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ сущности Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² выраТСниях ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… автоматичСских ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. Π’Π°ΠΊΠΆΠ΅ ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «языки с строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉΒ». Английский Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для этого β€” strong typing.

Π‘Π»Π°Π±ΠΎ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ всячСски ΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ программист смСшивал Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ компилятор сам ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ всС ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ. Π’Π°ΠΊΠΆΠ΅ ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «языки с нСстрогой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉΒ». Английский Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для этого β€” weak typing.

Π‘Π»Π°Π±ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ часто ΠΏΡƒΡ‚Π°ΡŽΡ‚ с динамичСской, Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ. ДинамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ слабо ΠΈ сильно Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.

Однако ΠΌΠ°Π»ΠΎ, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΈΠ΄Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строгости Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. Часто Π·Π°ΡΠ²Π»ΡΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ссли язык статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚ΠΎ Π’Ρ‹ смоТСтС ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ мноТСство ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ошибок ΠΏΡ€ΠΈ компиляции. Они Π’Π°ΠΌ Π²Ρ€ΡƒΡ‚!

Π―Π·Ρ‹ΠΊ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ. И ΠΏΡ€Π°Π²Π΄Π°, Ссли компилятор вмСсто сообщСния ΠΎΠ± ошибкС Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ строку ΠΊ числу, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Π²Ρ‹Ρ‡Ρ‚Π΅Ρ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°ΠΌ Ρ‚ΠΎΠ»ΠΊ, Ρ‡Ρ‚ΠΎ всС Β«ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΒ» Ρ‚ΠΈΠΏΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π½Π° этапС компиляции? ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ β€” слабая статичСская типизация Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ сильная динамичСская! (Ну, это ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅)

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ-ΠΆΠ΅ Ρƒ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ плюсов? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ выглядит, ΠΎΠ΄Π½Π°ΠΊΠΎ нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ярый сторонник сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ слабой Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ прСимущСства.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅?

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ
ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Π°ΠΆΠ΅ Π΄Π²Π°.

НСявноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Π² ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Ρ… ситуациях ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…

Ух… Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ я Π±ΡƒΠ΄Ρƒ дальшС ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎ Β«ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅Β» Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚ однозначная ситуация ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…?

ΠžΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Π°Ρ ситуация, это ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ опСрация Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ сразу понятна. Π’ΠΎΡ‚ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ слоТСниС Π΄Π²ΡƒΡ… чисСл β€” однозначная ситуация. А ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ числа Π² массив β€” Π½Π΅Ρ‚ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ создастся массив ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ массив, с Ρ‚Π°ΠΊΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ элСмСнтами ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ число прСобразуСтся Π² строку, Π° Π·Π°Ρ‚Π΅ΠΌ Π² массив символов).

ΠŸΠΎΡ‚Π΅Ρ€Ρ Π΄Π°Π½Π½Ρ‹Ρ… это Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅. Если ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ вСщСствСнноС число 3.5 Π² Ρ†Π΅Π»ΠΎΠ΅ β€” ΠΌΡ‹ потСряСм Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π° самом Π΄Π΅Π»Π΅ эта опСрация Π΅Ρ‰Π΅ ΠΈ нСоднозначная β€” ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅? Π’ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ сторону? Π’ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ? ΠžΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Π½ΠΈΠ΅ Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части?).

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹Ρ… ситуациях ΠΈ прСобразования с ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… β€” это ΠΎΡ‡Π΅Π½ΡŒ, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ. НичСго Ρ…ΡƒΠΆΠ΅ этого Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Ρ‚.

Если Π²Ρ‹ ΠΌΠ½Π΅ Π½Π΅ Π²Π΅Ρ€ΠΈΡ‚Π΅, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ язык PL/I ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ просто ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ Π’Π‘Π•ΠœΠ˜ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…! Π­Ρ‚ΠΎ просто Π°Π΄!

Π›Π°Π΄Π½ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вспомним ΠΏΡ€ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅. Π•ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ языки? Π”Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Pascal Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число Π² вСщСствСнноС, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π΅ΡΡ‚ΡŒ Π² C#, Groovy ΠΈ Common Lisp.

Π›Π°Π΄Π½ΠΎ, я Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ плюсов слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² сильном языкС. И Π΄Π°, ΠΎΠ½ Π΅ΡΡ‚ΡŒ ΠΈ называСтся ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ конструкторов.

Π― поясню Π΅Π³ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ языка Haskell.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Π΅ конструкторы появились Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ наблюдСния, Ρ‡Ρ‚ΠΎ Ρ‡Π°Ρ‰Π΅ всСго бСзопасныС нСявныС прСобразования Π½ΡƒΠΆΠ½Ρ‹ ΠΏΡ€ΠΈ использовании числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ².

И это сдСлано Π² Haskell, благодаря Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρƒ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° 1 Π½Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ Π½ΠΈ Ρ†Π΅Π»ΠΎΠ΅, Π½ΠΈ вСщСствСнноС, Π½ΠΈ комплСксноС. Π­Ρ‚ΠΎ ΠΆΠ΅ просто число!

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ спасаСт этот ΠΏΡ€ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ использовании ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с числовыми Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ, Π° это лишь Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠ° айсбСрга.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ балансированиС Π½Π° Π³Ρ€Π°Π½ΠΈ, ΠΌΠ΅ΠΆΠ΄Ρƒ сильной ΠΈ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Но ΠΏΠΎΠΊΠ° ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ баланс Π½Π΅ Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ язык, поэтому я большС склоняюсь ΠΊ сильно Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языкам (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Haskell, Java, C#, Python), Π° Π½Π΅ ΠΊ слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ C, JavaScript, Lua, PHP).

Π›Π°Π΄Π½ΠΎ, ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС?

Явная ΠΈ нСявная Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π―Π·Ρ‹ΠΊ с явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ программист Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚. Английский Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для этого β€” explicit typing.

Π―Π·Ρ‹ΠΊ с нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π’Π°ΠΌ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΈ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠΎΠ² Π½Π° компилятор ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Английски Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для этого β€” implicit typing.

По-Π½Π°Ρ‡Π°Π»Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ нСявная типизация Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½Π° динамичСской, Π° явная β€” статичСской, Π½ΠΎ дальшС ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Ρ‚Π°ΠΊ.

Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠ»ΡŽΡΡ‹ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΈ ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ Π΅ΡΡ‚ΡŒ Π»ΠΈ языки с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΎΠ±ΠΎΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²?

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ
ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ
Явная типизация ΠΏΠΎ-Π²Ρ‹Π±ΠΎΡ€Ρƒ

Π•ΡΡ‚ΡŒ языки, с нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ нСобходимости. Настоящий Ρ‚ΠΈΠΏ выраТСния транслятор Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ автоматичСски. Один ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… языков β€” Haskell, Π΄Π°Π²Π°ΠΉΡ‚Π΅ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для наглядности:

* Бпасибо int_index Π·Π° Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ошибки.

Π₯ΠΌ. Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, это ΠΎΡ‡Π΅Π½ΡŒ красиво ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ. Π—Π°ΠΏΠΈΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго 18 символов Π½Π° ΠΎΠ΄Π½ΠΎΠΉ строчкС, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹!

Однако автоматичСский Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ² довольно слоТная Π²Π΅Ρ‰ΡŒ, ΠΈ Π΄Π°ΠΆΠ΅ Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΊΡ€ΡƒΡ‚ΠΎΠΌ языкС ΠΊΠ°ΠΊ Haskell, ΠΎΠ½ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ справляСтся. (ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ привСсти ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°)

Π•ΡΡ‚ΡŒ Π»ΠΈ языки с явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ нСявной ΠΏΠΎ-нСобходимости? Кон
Π΅Ρ‡Π½ΠΎ.

НСявная типизация ΠΏΠΎ-Π²Ρ‹Π±ΠΎΡ€Ρƒ

Π’ Π½ΠΎΠ²ΠΎΠΌ стандартС языка C++, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌ C++11 (Ρ€Π°Π½Π΅Π΅ назывался C++0x), Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятор вывСсти Ρ‚ΠΈΠΏ, исходя ΠΈΠ· контСкста:

НСплохо. Но запись ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ Π½Π΅ сильно. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (Ссли Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Π½Π΅ Π±ΠΎΠΉΡ‚Π΅ΡΡŒ, Π³Π»Π°Π²Π½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ запись благодаря автоматичСскому Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΎΡ‡Π΅Π½ΡŒ сильно сокращаСтся):

Π£Ρ… Ρ‚Ρ‹! Π’ΠΎΡ‚ это сокращСниС. Π›Π°Π΄Π½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π΄ΡƒΡ…Π΅ Haskell, Π³Π΄Π΅ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²?

И ΠΎΠΏΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π΄Π°, благодаря ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову decltype Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с auto:

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ эта Ρ„ΠΎΡ€ΠΌΠ° записи Π½Π΅ сильно Ρ…ΠΎΡ€ΠΎΡˆΠ°, Π½ΠΎ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (templates / generics) нСявная типизация ΠΈΠ»ΠΈ автоматичСский Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ² творят чудСса.

НСкоторыС языки программирования ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ классификации

Π― ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ нСбольшой список ΠΈΠ· популярных языков ΠΈ Π½Π°ΠΏΠΈΡˆΡƒ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ β€œΡ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΉβ€.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ я Π³Π΄Π΅-Ρ‚ΠΎ ошибся, особСнно с CL, PHP ΠΈ Obj-C, Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ языку Ρƒ Вас Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ β€” Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ОкСй. Π£ΠΆΠ΅ скоро Π±ΡƒΠ΄Π΅Ρ‚ свСтло ΠΈ я Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ большС Π½Π΅Ρ‡Π΅Π³ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ. Ой ΠΊΠ°ΠΊ? Π’Π΅ΠΌΠ° бСздонная? ΠžΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ нСдосказано? ΠŸΡ€ΠΎΡˆΡƒ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π›ΠΈΠΊΠ±Π΅Π· ΠΏΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² языках программирования

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ содСрТится вСсь Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π±Π°Π³Π°ΠΆ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ динамичСская типизация Π½Π΅ показалась Π²Π°ΠΌ сущим Π·Π»ΠΎΠΌ.

Π’ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ располоТСно Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСх Ρ„ΠΎΡ€ΠΌ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ†Π°ΠΌΠΈ ΠΊΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ссылками Π½Π° извСстныС всСми языки программирования ΠΈ наглядными ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ

Π‘ΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с сокращСнным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π° послС ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠΉ вСрсии.

БокращСнная вариация

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ языки программирования ΠΏΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ дСлят Π½Π° Π΄Π²Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ стороны: Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ (бСстиповыС). К ΠΏΠ΅Ρ€Π²ΠΎΠΉ сторонС ΠΌΠΎΠΆΠ½ΠΎ отнСсти C, Python, Scala, PHP ΠΈ Lua, Π° ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ язык ассСмблСра, Forth ΠΈ Brainfuck.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ «бСстиповая типизация» Π² сущности – Ρ‡Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎ проста, Ρ‚ΠΎ Π² дальнСйшСм ΠΎΠ½Π° Π½Π΅ раздСляСтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹. ВмСсто этого Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π΅Ρ‰Ρ‘ нСсколько Π²ΠΈΠ΄ΠΎΠ²:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

БтатичСская: C, Java, C#;

ДинамичСская: Python, JavaScript, Ruby.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

Бильная: Java, Python, Haskell, Lisp;

Блабая: C, JavaScript, Visual Basic, PHP.

Явная типизация – языки Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ разнятся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… / Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ / ΠΈΡ… Π΄ΠΎΠ²ΠΎΠ΄ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ явно.

НСявная типизация – языки этой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ пСрСносят эту Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° компилятор / ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

НСявная: PHP, Lua, JavaScript

По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ языков со статичСской ΠΈ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Однако опСрСТая события, сообщу, Ρ‡Ρ‚ΠΎ Π² этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ я Π²Ρ€Ρƒ, Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΠ± этом Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

РазвСрнутая вариация

Π’ Ρ‚ΠΎΠΌ случаС Ссли ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² сокращСнной Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ Π’Π°ΠΌ оказалось ΠΌΠ°Π»ΠΎ, Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Π’Π°ΠΊ ΠΊΠ°ΠΊ для этого я ΠΈ написал Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½Π½ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ Π½Π΅Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ вСсь ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», развСрнутая, скорСС всСго, получится чСрСсчур длинная, Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ смоТСт Π΅Ρ‘ ΠΎΡΠΈΠ»ΠΈΡ‚ΡŒ Π½Π΅ Π½Π°ΠΏΡ€ΡΠ³Π°ΡΡΡŒ.

БСстиповая типизация

Π’ бСстиповых языках программирования – всС сущности ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ очСрСдностями Π±ΠΈΡ‚, Ρ€Π°Π·Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

Вакая типизация свойствСнна Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ (язык ассСмблСра, Forth) ΠΈ эзотСричСским (Brainfuck, HQ9, Piet) языкам. Но ΠΈ Ρƒ Π½Π΅Ρ‘ Π½Π°Ρ€Π°Π²Π½Π΅ с Π½Π΅Π΄ΠΎΡ‡Ρ‘Ρ‚Π°ΠΌΠΈ, присутствуСт ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ достоинств.

Достоинства

НСдостатки

Бильная бСстиповая типизация?

Π”Π°, Ρ‚Π°ΠΊΠΎΠ΅ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² языкС ассСмблСра (для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Ρ…86/Ρ…86-64, Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½Π΅ знаю) Π½Π΅ слСдуСт Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² случаС Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² рСгистр cx (16 Π±ΠΈΡ‚) Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· рСгистра rax (64 Π±ΠΈΡ‚Π°).

mov cx, eax ; ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ассСмблирования.
Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² ассСмблСрС всС-Ρ‚Π°ΠΊΠΈ Π΅ΡΡ‚ΡŒ типизация? Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ количСство ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Но Π’Π°ΡˆΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ зависит, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Вас.

БтатичСская ΠΈ динамичСская Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ (static) Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ‚Π»ΠΈΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ динамичСской (dynamic) ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²ΠΈΠ΄ΠΎΠ² происходят Π½Π° этапС сбора Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ Π½Π° этапС осущСствлСния.

НСкоторыС люди ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ статичСская типизация излишнС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° (Π½Π° самом Π΄Π΅Π»Π΅ Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΡ‚ этого Π΄Π°Π²Π½ΠΎ избавились ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π½Π΅ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ). НСкиС ΠΆΠ΅ Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки β€” это рискованныС дСйствия, Π½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ особСнности ΠΈΡ… ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚? НСуТСли ΠΎΠ±Π° Π²ΠΈΠ΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΡˆΠ°Π½ΡΡ‹ Π½Π° сущСствованиС? Если Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ статичСски, Ρ‚Π°ΠΊ ΠΈ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… языков?
Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” Π½Π° этапС сбора Π΄Π°Π½Π½Ρ‹Ρ…. А это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ трСбуСтся постоянно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, Π½Π΅ пытаСмся Π»ΠΈ ΠΌΡ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒ число Π½Π° строку (ΠΈ Π»ΠΈΠ±ΠΎ Π²Ρ‹Π΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π»ΠΈΠ±ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅).

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ провСдСния. Из ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° ясно, Ρ‡Ρ‚ΠΎ статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки Ρ‡Π°Ρ‰Π΅ всСго быстрСС динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€ΠΈ Π½Π΅ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… условиях, прСдоставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ошибки ΡƒΠΆΠ΅ Π½Π° этапС компиляции.

УскорСниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ IDE (отсСиваниС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ подходящих ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ).

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π“Π»Π°Π²Π½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ – ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎΡΡ‚ΡŒ излоТСния ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ – Π½Π°ΠΌ потрСбуСтся функция поиска ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ спискам – ΠΏΠΎ массиву Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΏΠΎ массиву вСщСствСнных ΠΈ массиву символов.

Каким ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠΌ Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ? Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 3-Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков: ΠΎΠ΄ΠΈΠ½ с динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… со статичСской.

Алгоритм поиска Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтарных – ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€. Ѐункция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ искомый элСмСнт, сам массив (ΠΈΠ»ΠΈ список) ΠΈ впослСдствии Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ индСкс элСмСнта, ΠΈΠ»ΠΈ, Ссли элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ – (-1).

ДинамичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (Python):

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, всС элСмСнтарно ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ список ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ числа, списки, Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ массивы Π½Π΅Ρ‚. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ. А Π·Π½Π°Ρ‡ΠΈΡ‚, слСдуСм дальшС ΠΈ Ρ€Π΅ΡˆΠΈΠΌ эту ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° Π‘ΠΈ!

БтатичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (Π‘ΠΈ):

Допустим, любая функция ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎ сходна вСрсии ΠΈΠ· Python, Π½ΠΎ ΠΎΡ‚Ρ‡Π΅Π³ΠΎ ΠΆΠ΅ ΠΈΡ… Ρ‚Ρ€ΠΈ? НСуТто статичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΎ?

НСльзя Π΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ мноТСство Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ программирования, ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΈΡ… ΠΌΡ‹ сСйчас обсудим. НазываСтся ΠΎΠ½Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π° язык C++ Π΅Π΅ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ сохраняСт. Рассмотрим Π½ΠΎΠ²ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ:

БтатичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, C++):

Π₯ΠΎΡ€ΠΎΡˆΠΎ! Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ выглядит Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, Ρ‡Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° Python, Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для всСх массивов, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для 3-Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ!

Π”Π°Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½, ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ»ΡŽΡΡ‹ статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠ»ΡŽΡΡ‹ динамичСской.

Π Π°Π΄ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ всСгда Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ Π»ΡƒΡ‡ΡˆΠ΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅ΠΉ ΠΊΠ°ΠΊ Π² языкС Haskell. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ программирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΡƒΠΆΠ΅), ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ) ΠΈΠ»ΠΈ макросы.

Π‘Ρ‚Π°Ρ‚ΠΈΠΊΠ° Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ статичСских языков ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ:

C# ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ псСвдо-Ρ‚ΠΈΠΏ dynamic.

Haskell β€” динамичСская типизация обСспСчиваСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Data.Dynamic.

Delphi β€” посрСдством ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Variant.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΈΠ΅ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ:

Common Lisp β€” Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ².

Perl β€” с вСрсии 5.6, довольно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎ.
Π˜Ρ‚Π°ΠΊ, ΠΈΠ΄Π΅ΠΌ дальшС?

Бильная ΠΈ слабая Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π―Π·Ρ‹ΠΊΠΈ с сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π½Π΅ Π΄Π°ΡŽΡ‚ ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ сущности Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² выраТСниях ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ автоматичСскиС прСобразования. Π˜Ρ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «языки со строгой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉΒ», с английского Β«strong typingΒ».

Π‘Π»Π°Π±ΠΎ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² максимально ΡΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ программист сочСтал Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ компилятор сам ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ всС ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ. Π˜Ρ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «языки с нСстрогой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉΒ», с английского Β«weak typingΒ».

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΡΠ»Π°Π±ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с динамичСской, Ρ‡Ρ‚ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ДинамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ слабо ΠΈ сильно Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ ΠΌΠ°Π»ΠΎ, ΠΊΡ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΡ‚Ρ€ΠΎΠ³ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ. НСоднократно ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли язык статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Ρ‚ΠΎ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ»ΠΎΠ²ΠΈΡ‚ΡŒ большоС количСство ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ошибок ΠΏΡ€ΠΈ компиляции. Они ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ Π’Π°ΠΌ Π²Ρ€ΡƒΡ‚!

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, язык Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ. А Ссли компилятор вмСсто сообщСния ΠΎΠ± ошибкС Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡ‚ΡŒ строку ΠΊ числу, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Π²Ρ‹Ρ‡Ρ‚Π΅Ρ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠ°ΠΊΠΎΠΉ Π½Π°ΠΌ Ρ‚ΠΎΠ»ΠΊ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ всС Β«ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΒ» Ρ‚ΠΈΠΏΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π½Π° этапС компиляции? Блабая статичСская типизация Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ сильная динамичСская! (Ну, это ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅).
Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Ρƒ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅Ρ‚ плюсов? вСроятно Ρ‚Π°ΠΊ ΠΈ выглядит, Π½ΠΎ Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ я ярый сторонник сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ ΠΌΠΎΠ³Ρƒ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ слабой Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ свои прСимущСства.

Π₯ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅? Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ.

Достоинства сильной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ прСимущСства! А Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ»ΡŽΡΡ‹ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΡΠΈΠ»ΡŒΠ½ΡƒΡŽ?

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Π°ΠΆΠ΅ Π΄Π²Π°.

НСявноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ситуациях ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π΄Π°Π½Π½Ρ‹Ρ….

Ух… Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ, дальшС ΡΠΎΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎ Β«ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅Β». Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚ опрСдСлённая ситуация ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…?

ΠžΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Π°Ρ ситуация – это трансформация ΠΈΠ»ΠΈ опСрация, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ сразу понятна. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, слоТСниС Π΄Π²ΡƒΡ… чисСл – опрСдСлённая ситуация. А ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ числа Π² массив β€” Π½Π΅Ρ‚ (ΠΌΠΎΠΆΠ΅Ρ‚, создастся массив ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ число трансформируСтся Π² строку, Π° послС Π² массив символов).

ΠŸΠΎΡ‚Π΅Ρ€Ρ Π΄Π°Π½Π½Ρ‹Ρ… это Π΅Ρ‰Π΅ элСмСнтарнСй. Если ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ вСщСствСнноС число 3.5 Π² Ρ†Π΅Π»ΠΎΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΠΎ сути, такая опСрация Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ нСопрСдСлённая – ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅? Π’ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ сторону? Π’ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ? ΠžΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ?).

Врансформация Π² Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ситуациях ΠΈ трансформация с ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… – это ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΠ»ΠΎΡ…ΠΎ. НичСго Ρ…ΡƒΠΆΠ΅ этого Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅Ρ‚.

Если Π²Ρ‹ ΠΌΠ½Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² это Ρ‚ΠΎ, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ язык PL/I ΠΈΠ»ΠΈ просто ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° прСобразования ΠΌΠ΅ΠΆΠ΄Ρƒ Π’Π‘Π•ΠœΠ˜ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…!

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ нСявноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. Π•ΡΡ‚ΡŒ Π»ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ языки? Π”Π°, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Pascal. Π’Ρ‹ смоТСтС ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π΅Π»ΠΎΠ΅ число Π² вСщСствСнноС, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ этого ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π΅ΡΡ‚ΡŒ Π² C#, Groovy ΠΈ Common Lisp.

Π― Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ плюсов слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² сильном языкС. Он называСтся ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ конструкторов.

Π― ΠΏΠΎΠΊΠ°ΠΆΡƒ Π΅Π³ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ прСкрасного языка Haskell.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Π΅ конструкторы ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈΡΡŒ Π² ΠΈΡ‚ΠΎΠ³Π΅ наблюдСния, Ρ‡Ρ‚ΠΎ Ρ‡Π°Ρ‰Π΅ всСго бСзопасныС нСявныС измСнСния Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ использования числовых Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ².

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ pi + 1, Π½Π΅ хочСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ pi + 1.0 ΠΈΠ»ΠΈ pi + float(1). Π₯очСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ просто pi + 1!

И это Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ Π² Haskell, ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° 1 Π½Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°. Π­Ρ‚ΠΎ Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠ΅, Π½ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅, Π½ΠΈ всСстороннСС. Π­Ρ‚ΠΎ ΠΆΠ΅ просто число!

БСзусловно, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‘ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ использования ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с числовыми Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°ΠΌΠΈ, Π° это лишь Π½Π°Ρ‡Π°Π»ΠΎ.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ исходом Π±ΡƒΠ΄Π΅Ρ‚ соблюдСниС баланса, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π½Π° Π³Ρ€Π°Π½ΠΈ, ΠΌΠ΅ΠΆΠ΄Ρƒ сильной ΠΈ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Но Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΉ баланс Π½Π΅ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ язык, поэтому я склоняюсь ΠΊ сильно Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языкам (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ Haskell, Java, C#, Python), Π° Π½Π΅ ΠΊ слабо Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ C, JavaScript, Lua, PHP).

Π›Π°Π΄Π½ΠΎ, ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС?

Явная ΠΈ нСявная Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСская типизация ΠΏΠΈΡ‚ΠΎΠ½

Π―Π·Ρ‹ΠΊ с явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ программист Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ заявляСт. Π‘ английского ΠΎΠ½ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«explicit typingΒ».

Π―Π·Ρ‹ΠΊ с нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ дСйствуСт, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, прСдлагая Π’Π°ΠΌ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΈ пСрСвСсти ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° компилятор ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π‘ английского ΠΎΠ½ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«implicit typingΒ».

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ, каТСтся, Ρ‡Ρ‚ΠΎ нСявная типизация Ρ€Π°Π²Π½Π° динамичСской, Π° явная – статичСской, Π½ΠΎ Π² дальнСйшСм ΠΌΡ‹ ΠΏΠΎΠΉΠΌΡ‘ΠΌ, Ρ‡Ρ‚ΠΎ это Π½Π΅Π²Π΅Ρ€Π½ΠΎ.

Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‚ΡŒ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠ»ΡŽΡΡ‹ Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, Π° Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ языки с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Ρ‚Π΅Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²?

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

БущСствованиС Ρƒ Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сигнатуры (ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, int add(int, int)) Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ осущСствляСт функция.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΄Π΅Π»Π°Π΅Ρ‚ записи ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ значСния содСрТится Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ это.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ

УмСньшСниС записи – def add (x, y) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ int add( int x, int y).

Π‘Ρ‚ΠΎΠΉΠΊΠΎΡΡ‚ΡŒ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π°ΠΌ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ссли Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ врСмСнная пСрСмСнная Π±Ρ‹Π»Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Ρ‚ΠΎ Π² явно Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкС ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° трСбуСтся ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ Ρ‚ΠΈΠΏ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠžΡ‚Ρ‡Ρ‘Ρ‚Π»ΠΈΠ²ΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΠΊΠ°ΠΊ плюсами, Ρ‚Π°ΠΊ ΠΈ минусами, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π½Π°ΠΉΡ‚ΠΈ способы комбинирования этих Π΄Π²ΡƒΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ²!

Явная типизация ΠΏΠΎ Π²Ρ‹Π±ΠΎΡ€Ρƒ

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ языки, с нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ указания Ρ‚ΠΈΠΏΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Настоящий Ρ‚ΠΈΠΏ выраТСния транслятор Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ автоматичСски. Haskell являСтся Ρ‚Π°ΠΊΠΈΠΌ языком. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅ понятно ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, это ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΈ красиво выглядит. Вся функция Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго 18 символов Π½Π° ΠΎΠ΄Π½ΠΎΠΉ строчкС, Π² Ρ‚ΠΎΠΌ числС ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹!
Но автоматичСский Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ² достаточно слоТная Π²Π΅Ρ‰ΡŒ, ΠΈ Π΄Π°ΠΆΠ΅ Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΊΡ€ΡƒΡ‚ΠΎΠΌ языкС ΠΊΠ°ΠΊ Haskell, ΠΎΠ½ пСриодичСски Π½Π΅ справляСтся. (для наглядности ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°)

Π•ΡΡ‚ΡŒ Π»ΠΈ языки с явной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ нСявной ΠΏΠΎ нСобходимости? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ.

НСявная типизация ΠΏΠΎ-Π²Ρ‹Π±ΠΎΡ€Ρƒ

Π’ Π½ΠΎΠ²ΠΎΠΌ Π½ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π΅ языка C++, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌ C++11 (Ρ€Π°Π½Π΅Π΅ назывался C++0x), Π±Ρ‹Π»ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚ΡŒ компилятор вывСсти Ρ‚ΠΈΠΏ, исходя ΠΈΠ· контСкста:

ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Однако запись сТалась минимально. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (Ссли Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Π½Π΅ Π±Π΅Π΄Π°, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ запись, благодаря автоматичСскому Π²Ρ‹Π²ΠΎΠ΄Ρƒ):

Ого, Π²ΠΎΡ‚ это сокращСниС! Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ Π² Haskell, Π³Π΄Π΅ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²?

И Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· я ΠΎΡ‚Π²Π΅Ρ‡Ρƒ, Π΄Π°. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова decltype Π² объСдинСнии с auto:

ΠœΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта Ρ„ΠΎΡ€ΠΌΠ° записи Π½Π΅ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠ°, Π½ΠΎ Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (templates / generics) нСявная типизация ΠΈΠ»ΠΈ автоматичСский Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ² творят Π½Π΅Π²ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠΌΠΎΠ΅.

НСкоторыС языки программирования ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ классификации

Π― ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡŽ Π²Π°ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ популярных языков ΠΈ Ρ€Π°ΡΠΏΠΈΡˆΡƒ ΠΈΡ… ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ Β«Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈΒ».

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

C# – сохраняСт Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ особого псСвдо-Ρ‚ΠΈΠΏΠ° dynamic с вСрсии 4.0. А Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ содСйствиС нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ посрСдством dynamic ΠΈ var.

Π‘++ – послС стандарта C++11 ΠΎΠ±Ρ€Ρ‘Π» ΠΎΠΏΠΎΡ€Ρƒ нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ посрСдством ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов auto ΠΈ decltype. БохраняСт Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Boost (boost::any, boost::variant). Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Π² сСбС Ρ‡Π΅Ρ€Ρ‚Ρ‹ ΠΊΠ°ΠΊ сильной, Ρ‚Π°ΠΊ ΠΈ слабой Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ.

Common Lisp – стандарт ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ², благодаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΊΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ для статичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ².

D – Ρ‚Π°ΠΊΠΆΠ΅ осущСствляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ нСявной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ.

Delphi – осущСствляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ динамичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ особого Ρ‚ΠΈΠΏΠ° Variant.

Π•ΡΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ я Π³Π΄Π΅-Ρ‚ΠΎ ΠΌΠΎΠ³ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ, Π² особСнности с CL, PHP ΠΈ Obj-C, Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Π»ΠΈΠ±ΠΎ языку Ρƒ Вас Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅ – ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

БовсСм скоро Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π΅Ρ‚Π°Ρ‚ΡŒ ΠΈ ΠΌΠ½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΡŽ я большС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ скаТу. Ой, ΠΊΠ°ΠΊ? Π­Ρ‚Π° ΠΆΠ΅ Ρ‚Π΅ΠΌΠ° бСздонная? Много Ρ‡Π΅Π³ΠΎ нСдосказано? ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ всю ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ Π²Ρ‹ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π² коммСнтариях.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *