Про интерпретируемые языки
Sep. 3rd, 2020 01:27 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
За что я люблю C, так это за невозможность прострелить себе ногу способом «не то имя переменной». Есть масса других, не менее романтических, но этого — нет. У Perl есть use strict и -wc, у Python приходится прикручивать внешние линтеры.
Тут пришлось немного попрограммировать на bash, и после толпы ошибок системы «забыл пробел перед скобкой» я нашёл утилиту shellcheck - линтер для shell-скриптов. Написан на хаскелле, но это я переживу.
Ловит глупые и не очень ошибки. Я его поставил из buster-backports и запускаю с -S warning (в более древних версиях этой опции нет), а то он слишком много говорит. Понимает несколько shell-овских диалектов.
Тут пришлось немного попрограммировать на bash, и после толпы ошибок системы «забыл пробел перед скобкой» я нашёл утилиту shellcheck - линтер для shell-скриптов. Написан на хаскелле, но это я переживу.
Ловит глупые и не очень ошибки. Я его поставил из buster-backports и запускаю с -S warning (в более древних версиях этой опции нет), а то он слишком много говорит. Понимает несколько shell-овских диалектов.
no subject
Date: 2020-09-03 01:29 pm (UTC)Мне оказалось проще вычищать свои шелловские скрипты до состояния shellcheck-clean, даже если мне кажется, что это у него вкусовщина.
Везде где по смыслу нужно допустим раскрытие содержимого переменной в несколько слов, все равно имеет смысл ставить комментарий "Зздесь мы запрещаем SC2016 потому что..."
Потому что те, кто будут читать твой шелловский код после тебя, скорее всего знают шелл хуже, чем не только ты, но и shellcheck. И все, что не очевидно для него, будет неочевидно и для них
Кстати, соберешлся в следующий раз писать на perl, попробуй пропустить написанное через perlcritic.
no subject
Date: 2020-09-03 02:38 pm (UTC)Тут у меня проблема, что я, например, бэктики люблю, которые были всегда, а он предлагает что-то более новое. И я не знаю, насколько это более новое у нас в зоопарке актуально.
no subject
Date: 2020-09-03 06:54 pm (UTC)беситудивляет:> "return" statement with explicit "undef" at line 52, column 9. See page 199 of PBP. (Severity: 5)
Вот как они додумались не пропускать "return undef" и вместо этого рекомендовать "return", да ещё и с severity 5? Как у них работает код
my $h = { key1 => func() };
если в функции func() "return undef" заменить на "return"?
no subject
Date: 2020-09-03 02:38 pm (UTC)Использование несуществующей переменной — ошибка более редкая, и специфичная для скриптовых языков, но прекрасно ловится в рантайме и внешними линтерами.
no subject
Date: 2020-09-03 02:38 pm (UTC)no subject
Date: 2020-09-03 03:10 pm (UTC)А мелкий скрипт просматривается глазами, и всё равно ведь запускать нужно.
Насчёт Питона, то в принципе несложно добавить проверку при компиляции модуля что каждому чтению глобального имени соответствует создание глобального имени или имя в builtins. Но есть трудности:
1. «from something import *» не так уж редки. Это делает проверку невозможной.
2. «globals().update()» тоже используется при массовой генерации имён. И это отследить труднее чем первый случай.
3. Есть и другие случаи динамического создания глобальных переменных. То что они редки не оправдание для компилятора.
4. Главное — это разрушит годами работающие скрипты, которые содержат неиспользуемые функции или код «закомментированный» при помощи «if 0:».
Для внешнего линтера это меньшая проблема. Он может учитывать код всего проекта, а не одного файла, его предупреждения опциональны и могут быть отключены в настройках. Компилятор должен без возражения принимать любой код, соответствующий спецификации, который не является заведомой ошибкой. Поэтому он производит так мало синтаксических предупреждений.
no subject
Date: 2020-09-04 10:58 am (UTC)Мне сразу вспомнился патч Бармина в перловой версии
Upd: что за хрень? DW разучился работать с HTML?
no subject
Date: 2020-09-04 11:56 am (UTC)no subject
Date: 2020-09-04 06:23 am (UTC)Для решения этой проблемы придумали функции (а также макросы, в некоторых языках) с формальными параметрами :)
no subject
Date: 2020-09-04 07:17 am (UTC)f(x1, y1, z1)
f(x2, y2, z1)
no subject
Date: 2020-09-04 07:37 am (UTC)no subject
Date: 2020-09-04 11:55 am (UTC)no subject
Date: 2020-09-04 11:56 am (UTC)no subject
Date: 2020-09-03 10:50 pm (UTC)