С Java на одной стороне и Ruby/Groovy на другом, я знаю, что во втором лагере я свободен сделать опечатки, которые не будут найдены до времени выполнения. Верен для этого всего динамически типизированные языки?
Править: Меня попросили уточнить тип опечатки. В Ruby и в Groovy, можно присвоить переменной со случайным именем, которое никогда не читается. Можно назвать методы, которые не существуют (очевидно, тесты должны поймать это, это было сказано). Можно обратиться к классам, которые не существуют, и т.д. и т.д. В основном, любой допустимый синтаксис, даже с типографскими ошибками, допустим и в Ruby и в Groovy.
В Perl, если вы объявляете use strict
в своем коде, вы должны объявить свои переменные с помощью my
. Опечатки в именах переменных будут обнаружены во время компиляции. Это одна из самых больших вещей, которых мне не хватает при кодировании на Python.
Python дружественен к опечаткам
так, как вы описали в своем вопросе.
Но это не означает, что эти «опечатки» могут быть обнаружены только @ runtime. При использовании анализатора кода, такого как pylint (идеально интегрированного в вашу разработку) environment) вы поймаете «большинство» из них последовательно до того, как нажмете «запустить».
По большей части, да. Динамическая типизация и не требующая объявления переменных — это свойства языка, которые часто встречаются вместе.
Однако они не связаны между собой по своей сути. Язык может легко иметь динамическую типизацию, требуя объявления имен переменных перед использованием. Как ire_and_curses упоминается, это может быть достигнуто на Perl с помощью директивы «использовать строгий».
Вот что происходит, когда я пытаюсь разобраться с упомянутыми вами подводными камнями в Squeak и Dolphin, двух реализациях динамического языка Smalltalk 80.
Вы можете присвоить переменной случайное имя, которое никогда не будет прочитано
Язык Smalltalk требует объявления переменных temp и instance. Если я пытаюсь скомпилировать метод, содержащий неопределенную переменную, я получаю ошибку времени компиляции.
| anArray |
anArrray := Array with: 2 with: 1. "Unknown variable anArrray"
Создание переменных динамически - это не то, что должны позволять динамические языки. Есть разница между декларациями без типов и вообще без деклараций.
Вы можете вызывать несуществующие методы
Компилятор выдает предупреждение, если вы используете селектор (т.е. имя метода), который совершенно неизвестен.
Компилятор не будет беспокоиться, если я вызову метод paint
на массиве, потому что в системе есть другой класс, реализующий paint
. Эта ошибка будет поймана только во время выполнения.
Если же я вызову метод sortt
(в то время как я намереваюсь вызвать sort
), компилятор выдаст предупреждение. При разработке сверху вниз вы можете обойти эти предупреждения.
| anArray |
anArray := Array with: 2 with: 1.
anArray paint. "Runtime error. You can't paint an array but perhaps a Shape"
anArray sortt. "Compile-time warning"
Вы можете ссылаться на классы, которые не существуют
Это недопустимо. Хотя в Squeak при необходимости можно быстро создать новый класс из диалога ошибок.