ak_47: (Default)
[personal profile] ak_47
На прошедших рожденственских каникулах наконец дошли руки посидеть с PowerShell. Тем более что последняя версия мигрировала на .NET Core и полностью кроссплатформенная. Все последующие версии тоже будут только на .NET Core.

У меня мало опыта с .NET, трогал пару раз в прошлом, но несерьёзно, поэтому было интересно что и как там сейчас. Я долго не брался за PowerShell хотя видел как многие пользуются им и фанатеют. Думал, ну может это как VIM: или ненависть или любовь до гроба, посередине почти не бывает. Для меня лично причины игнорировать PowerShell были такие (забегая вперёд, все эти опасения не оправдались):
  1. Странный и слишком избыточный синтаксис, который отпугивает. Кажется что нормальный человек все эти Get-ChildItem и New-ItemProperty (да ещё и с миллионом параметров каждый) никогда не выучит. И руки обломаются писать такую колбасу на каждую ерунду в шелле.

  2. Необходимость серьёзно разбираться с .NET если хочется нормальной производительности.

  3. Лень и сила привычки. Тем более что под Виндой я легко себе могу сделать Linux-подобную среду, а вот наоборот - нет. Поэтому лучше уж сразу инвестировать в bash и GNU toolchain и пользоваться ими везде, чем под каждую платформу учить уникальные вещи.
В качестве упражнения я решил пройти Advent Of Code за один из прошлых годов используя лишь PowerShell. Читать мегабайты мануалов довольно скучно и малопродуктивно, а практические задачи порешать это именно то, что надо. The proof is in the pudding, как говорится.

Итоги:

Ни одно из вышеперечисленных опасений не оправдалось:
  • Несмотря на длинные имена команд, в PowerShell предопределены алиасы на всё что используется чаще всего. Поэтому особо много писать не требуется. В 98% случаев я не пользовался полными именами, хватало алиасов.
  • Множество параметров тоже не пришлось зубрить, т.к. шелл поддерживает Tab-completion. Причём, он довольно умный и сначала предлагает наиболее релевантные параметры.
  • За все 25 задач в Advent Of Code в собственно .NET пришлось залезть лишь пару раз: 1) хотел сделать настоящий двумерный массив, а не jagged array; 2) надо было использовать regexp чуть менее тривиальный.
В целом очень понравилось, буду продолжать пользоваться. Фактически, это полноценный язык программирования с несколько странным синтаксисом. Много хороших заимствований из других скриптовых языков, всё очень удобно. Если уж так получилось что чего-то не хватило, то можно пользоваться любыми .NET классами напрямую, не надо искать никаких левых приблуд.

То, что удивило или не понравилось:
  1. Неожиданностью было то, что округление целых не как в С/С++, а Round half to even. Т.е., число округляется до ближайшего чётного целого. Например, 1.5 и 2.5 будут округлены как 2.

  2. Непоследовательный синтакс для вызовов встроенных шелловских функций и .NET методов. Например:
    PowerShell function call:
    Foo -param1 "a" -param2 "b"
    или с неявными параметрами:
    Foo "a" "b"
    Но при этом:
    $a = [math]::Truncate(7/2)
    Иногда есть скобки, иногда нет.

  3. Недоделанная работа с unsigned integers. Такой код приводит к ошибке: [uint32]$a = 0xffffffff. Обходится это таким уродством: [uint32]$a = "0xffffffff". Надеюсь в будущем исправят.
То, что понравилось:
  1. Новый подход к шеллу: всё объект. Для программиста это родная среда, не надо заниматься утомительным расковыриванием текста как часто приходится делать в bash. Например, чтобы показать в рабочей директории все файлы размером больше 10К, отсорторованными по дате создания:
    gci | where Length -gt 10kb | sort CreationTime
    gci это алиас Get-ChildItem. При этом та же команда Get-ChildItem будет работать на любой древовидной структуре, файловая система или ещё что.

  2. Приятный синтаксический сахар. Например, switch на стероидах:
    switch -file $somePath {
        1     { echo "1" }
        "two" { echo "2" }
        { $_ -like "wtf"}    { echo "hm.." }
        { $_ -in "a",$b,42 } { echo "got $_" }
        default { throw "error: $_" }
    }
    Каждая строка в файле будет обработана в этом switch'е.

    Типа, лямбда:
    $foo = { param($x) $x * 2 }
    &$foo 2
    4
    Можно передавать $foo в другие функции и пр.

  3. Нет 40-летней legacy как в bash. Всё унифицировано, все команды и параметры работают везде одинаково. Поэтому учить приходится довольно мало при кажущемся богатстве синтаксиса и объектов.
В заключение могу сказать что Microsoft провела последние 20 лет в глухой несознанке. Теперь потихоньку начинают выходить из транса.

Date: 2019-01-16 12:05 pm (UTC)
From: [personal profile] vythe
Вот никогда мне не была понятна любовь к скриптам. Начиная с перла, ага.

Конечно, как-бы-возможность использовать любимый библиотечный объект, не создавая проект на восемь файлов, четыре директории - это мило. Но если нужно что-то реально делать, а не поиграться один вечер - через год находишь на сервере скрипт, не-помню-кем написанный, который что-то делает, и копированию толком не поддается. И чинишь его, чинишь...

Я и жабускрипт не уважаю, если честно - особенно ввиду буйной моды на его улучшения.

Date: 2019-01-14 11:14 am (UTC)
From: [identity profile] laoxia.livejournal.com
фигня, слабое подобие левой руки баша

Date: 2019-01-14 10:24 pm (UTC)
From: [identity profile] laoxia.livejournal.com
Баш 1есть2работает. Можно конечно привезти пару индийских деревенек на пару тройку тыщ индусов и изобрести велосипед. Но зачем?

Не, я понимаю, по устоявшейся традиции надо долбить нечто десятка два лет, а потом таки признать что .... ну как там с эксплорером.
Edited Date: 2019-01-14 10:26 pm (UTC)

Date: 2019-01-15 09:09 am (UTC)
From: [identity profile] laoxia.livejournal.com
>под Винду не было нормального шелла, считай, вообще никогда

ну вообще то был cygwin?

Date: 2019-01-15 04:40 am (UTC)
From: [identity profile] zaj-gizund.livejournal.com
Microsoft Delenda Est

Profile

ak_47: (Default)
АК-47

Most Popular Tags

Expand Cut Tags

No cut tags
Powered by Dreamwidth Studios