Введение в pwsh для продвинутых. Часть I
Наибольшая мощь платформы .NET раскрывается посредством IL (intermediate language, эдакий символический аналог языка ассемблера) — во что, собственно, и преобразовывается код на C# или любом ином языке платформы. Однако IL сторонятся как огня даже бывалые .NET'овцы (звучит как-то неполиткорректно), что говорить о разработчиках сценариев PowerShell?! Между тем, для последних это не просто полезный навык, скорее — возможность взять планку на порядок выше покуда другие рвут и мечут в отсутствии какой-либо фичи. Именно так в бытность второй версии PowerShell и поступал автор, реализуя, к примеру, побитовы(й|е) сдвиг(и) в(лево|право) посредством функции, в основе которой был динамический метод.
Здесь, правда, используется синтаксис pwsh, измождённым же ностальгией при переводе примера на вторую версию PowerShell следует быть аккуратными при использовании переменной $$ и принять на вид возможность имитации тернарной операции посредством массивов; для прочих пример может показаться притянутым за уши, так как pwsh уже располагает операторами -shl и -shr, а значит
(New-Shift).Invoke(7, 3)
или:
(New-Shift shr).Invoke(7, 1)
будут подобны разве что ложке дёгтя в бочке мёда. Однако, истинная причина, по которой мы сознательно избегаем синтаксиса версий ниже шестой, кроется в различного рода рестрикциях присущих .NET Framework (и, как следствие, "наследуемых" PowerShell -le v5), но отсутствующих в .NET Core, как, например, использование указателей в динамических методах. Чтобы продемонстрировать это, а заодно чуть подробнее разобрать сам принцип создания последних, рассмотрим побайтовый вывод числа через указатель.
Результатом, как и ожидается будет 00 40 00 00. А теперь немой вопрос: для чего это может понадобиться, если всё можно написать на C# и скормить Add-Type? Прежде — скорость: динамические методы создаются в динамической (кто бы мог подумать!) сборке pwsh, в то время как Add-Type создаёт физическую сборку, подгружаемую в текущий домен приложений, а это, во-первых, требует валидации кода, во-вторых, ведёт к захламлению сборками домена в текущем сеансе. Вторая немаловажная причина кроется в обработке больших данных где исключается параллелизм, например, расчёт энтропии некоторого файла, с которой, как было замечено ранее здесь, лучше и начинать исследования бинарного кода.


Лига программистов
2.1K постов11.9K подписчиков
Правила сообщества
- Будьте взаимовежливы, аргументируйте критику
- Приветствуются любые посты по тематике программирования
- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества