beldmit: (Программизм)
[personal profile] beldmit
За что я люблю C, так это за невозможность прострелить себе ногу способом «не то имя переменной». Есть масса других, не менее романтических, но этого — нет. У Perl есть use strict и -wc, у Python приходится прикручивать внешние линтеры.

Тут пришлось немного попрограммировать на bash, и после толпы ошибок системы «забыл пробел перед скобкой» я нашёл утилиту shellcheck - линтер для shell-скриптов. Написан на хаскелле, но это я переживу.

Ловит глупые и не очень ошибки. Я его поставил из buster-backports и запускаю с -S warning (в более древних версиях этой опции нет), а то он слишком много говорит. Понимает несколько shell-овских диалектов.

Date: 2020-09-03 01:29 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Мне оказалось проще вычищать свои шелловские скрипты до состояния shellcheck-clean, даже если мне кажется, что это у него вкусовщина.

Везде где по смыслу нужно допустим раскрытие содержимого переменной в несколько слов, все равно имеет смысл ставить комментарий "Зздесь мы запрещаем SC2016 потому что..."

Потому что те, кто будут читать твой шелловский код после тебя, скорее всего знают шелл хуже, чем не только ты, но и shellcheck. И все, что не очевидно для него, будет неочевидно и для них

Кстати, соберешлся в следующий раз писать на perl, попробуй пропустить написанное через perlcritic.

Date: 2020-09-03 06:54 pm (UTC)
gul_kiev: (Default)
From: [personal profile] gul_kiev
Меня в perlcritic особенно вот это бесит удивляет:

> "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"?

Date: 2020-09-03 02:38 pm (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Не той переменной я регулярно стреляю себе в ногу, от языка не зависит. Последний раз было позавчера (правда на Питоне). Случается, когда копирую фрагмент кода, а потом модифицирую его, но кое-где пропускаю. Теперь код ссылается на существующее, но неправильное имя.

Использование несуществующей переменной — ошибка более редкая, и специфичная для скриптовых языков, но прекрасно ловится в рантайме и внешними линтерами.

Date: 2020-09-03 03:10 pm (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Для чего-то средне-крупного тесты обязательны, а линтеры желательны. Время запуска юнит-тестов сравнимо с временем компиляции на Си. Думаю, здесь баш на баш.

А мелкий скрипт просматривается глазами, и всё равно ведь запускать нужно.

Насчёт Питона, то в принципе несложно добавить проверку при компиляции модуля что каждому чтению глобального имени соответствует создание глобального имени или имя в builtins. Но есть трудности:

1. «from something import *» не так уж редки. Это делает проверку невозможной.
2. «globals().update()» тоже используется при массовой генерации имён. И это отследить труднее чем первый случай.
3. Есть и другие случаи динамического создания глобальных переменных. То что они редки не оправдание для компилятора.
4. Главное — это разрушит годами работающие скрипты, которые содержат неиспользуемые функции или код «закомментированный» при помощи «if 0:».

Для внешнего линтера это меньшая проблема. Он может учитывать код всего проекта, а не одного файла, его предупреждения опциональны и могут быть отключены в настройках. Компилятор должен без возражения принимать любой код, соответствующий спецификации, который не является заведомой ошибкой. Поэтому он производит так мало синтаксических предупреждений.

Date: 2020-09-04 10:58 am (UTC)
livelight: (hot)
From: [personal profile] livelight
> А мелкий скрипт просматривается глазами, и всё равно ведь запускать нужно

Мне сразу вспомнился патч Бармина в перловой версии

Upd: что за хрень? DW разучился работать с HTML?
Edited Date: 2020-09-04 11:00 am (UTC)

Date: 2020-09-04 11:56 am (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Поэтому программистам и приплачивают за вредность.

Date: 2020-09-04 06:23 am (UTC)
livelight: (Default)
From: [personal profile] livelight
> Случается, когда копирую фрагмент кода, а потом модифицирую его, но кое-где пропускаю.

Для решения этой проблемы придумали функции (а также макросы, в некоторых языках) с формальными параметрами :)

Date: 2020-09-04 07:17 am (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Угу, эти функции ещё вызвать нужно с актуальными аргументами.

f(x1, y1, z1)
f(x2, y2, z1)

Date: 2020-09-04 11:55 am (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Ага, значит для языков со статистической типизацией тоже линтеры нужны!

Date: 2020-09-03 10:50 pm (UTC)
belest: (Default)
From: [personal profile] belest
Вот только не надо про Perl... Никогда не забуду собственную ошибку, когда кое-где(!) вместо $1 стояло $!, и попробуй отловить. Всего лишь лишний shift.

Profile

beldmit: (Default)
Dmitry Belyavskiy

May 2025

S M T W T F S
    123
45678910
11121314151617
181920212223 24
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2025 04:51 pm
Powered by Dreamwidth Studios