Мы взяли интервью у его создателей

Снаряды существуют всегда и, к лучшему или худшему, практически не изменились с момента их появления. Пока не появилась NuShell, которая заново изобрела оболочки и бросила вызов нашей мышечной памяти. Это принесло некоторые большие изменения, которые включают переосмысление того, как работают конвейеры, структурированный ввод / вывод и плагины.

Мы хотели узнать больше о NuShell, поэтому взяли интервью у обоих его создателей: Джонатана Тернера и Иегуды Каца.

Присоединяйтесь к группе или каналу Telegram Not a Monad Tutorial, чтобы поговорить о программировании, информатике и статьях. Увидимся там!

Если вы ищете хороших инженеров, отправьте мне письмо по адресу [email protected] или вы также можете связаться со мной через твиттер по адресу @federicocarrone.

Зачем создавать NuShell? Это я или у него атмосфера AWK нового уровня?

Джонатан Тернер: Иногда самые простые идеи зацепляют вас больше всего :). Когда мы с Иегудой впервые начали обсуждать, как можно улучшить оболочки, мы остановились на идее использования структурированных данных, а не просто текста между приложениями (например, stdin / stdout). Он только что экспериментировал с PowerShell и увидел, как добавление некоторой структуры к данным открывает множество возможностей.

Основная идея довольно проста: Nu открывает все в таблицу, с которой вы можете работать. Файлы, потоки, команды, такие как ls и ps, выводят этот единый формат таблицы. Затем у вас есть набор команд, которые работают с этими таблицами, чтобы помочь вам получить нужные данные, изменить их, просмотреть и т. Д.

Забавно, что вы упомянули «awk». В некотором смысле Nu - это способ сказать: «Что, если бы нам не понадобились такие инструменты, как awk, так часто?» Поскольку вы работаете со структурированными данными, по мере того, как мы добавляем дополнительную поддержку для типов файлов, вам все реже требуется использовать «awk», «jq», «grep» и множество других инструментов для открытия и работы с общими типы файлов.

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

Зачем использовать Rust? Какой у вас был опыт до этого?

Джонатан: Мы с Иегудой пишем на Rust как минимум 4 года. Он был одним из первых, кто развернул Rust в продакшн, задолго до того, как он достиг версии 1.0.

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

Было ли использование Rust в каком-то смысле проблемой?

Иегуда Кац: Совсем наоборот! У Rust и его экосистемы есть два свойства, которые действительно хорошо подходят для того, что мы пытаемся сделать:

  1. Кроссплатформенность: есть версия почти каждого базового ящика, работающего в Windows, macOS и Linux.
  2. Строгий: в Rust действительно нет исключений. Вместо этого экосистема библиотеки Rust показывает крайние случаи как Результаты. Когда мы писали что-то вроде оболочки, это избавляло нас от всевозможных проблем по мере нашего развития.

В Rust также есть отличный менеджер пакетов (Cargo), что означает, что склеивать быстрые, кроссплатформенные и строгие пакеты из экосистемы действительно просто.

Как вы собираетесь делать программное обеспечение кроссплатформенным на Rust? Неужели это так много работы, как можно было бы подумать?

Иегуда: Не совсем. Что вы делаете, так это ищите ящики на crates.io, поддерживающие Windows. В большинстве случаев ящики, которые утверждают, что заботятся о Windows, поддерживают Windows, а также другие платформы.

Джонатан: Rust определенно является моим предпочтительным инструментом для кроссплатформенной разработки в наши дни. Как упоминает Иегуда, большинство ящиков работают в Windows, macOS и Linux. Мы также, вероятно, рассмотрим возможность работы Nu в браузере в будущем, что будет означать поддержку WASM, и Rust, вероятно, также лучший язык для этого.

Почему вы решили игнорировать соответствие POSIX?

Иегуда: На мой взгляд, этот вопрос немного вводит в заблуждение. Когда люди говорят, что оболочка «совместима с POSIX», они имеют в виду крошечный набор синтаксиса и функций, на которые люди полагаются в оболочке. Если вы хотите запустить сценарий оболочки POSIX в nu, вы можете просто запустить его с помощью bash или sh. С другой стороны, попытка сделать наш синтаксис полностью совместимым со стандартом POSIX привнесла бы всевозможные странные бредни десятилетней давности и ограничила бы эргономику нашего синтаксиса.

Джонатан: Когда люди просят обеспечить соответствие POSIX, я думаю, что разные люди имеют в виду разное. Как правило, я думаю, они имеют в виду «не нарушайте мою мышечную память». Это честно, отучаться от привычек раздражает. Тем не менее, то, что значит быть совместимым, сильно изменилось по сравнению с первоначальными идеями. На днях я видел этот твит, который, как мне показалось, неплохо резюмирует:

Чем отличается NuShell от других, таких как zsh или fish? Могу ли я с сегодняшнего дня установить его в качестве оболочки по умолчанию?

Джонатан: мы быстро приближаемся, когда вы сможете использовать Nu в качестве оболочки по умолчанию. Фактически, некоторые пользователи Nu уже с радостью используют его в качестве повседневного водителя. В версии 0.13 мы добавили возможность создавать свои собственные псевдонимы, что значительно улучшает работу Nu в качестве оболочки, поскольку теперь легко настроить собственный набор ярлыков для вещей, которые вы делаете регулярно.

Как вы пришли к такому «жесткому» разделению команд: стримеры, фильтры и потребители? Я не видел официальных названий этих концепций, но думаю, что это передает идею

Иегуда: Различия возникли органически и имеют смысл. Когда вы думаете о потоках, на самом деле есть три части: первая часть, средняя часть и последняя часть. Последняя часть является наиболее особенной, потому что она берет поток данных и превращает его в то, что вы можете видеть, что требует просмотра входящего потока. Например, выведенной таблице необходимо просмотреть несколько строк, чтобы узнать, какие заголовки использовать.

Зачем делать систему плагинов? Каковы преимущества использования JSON-RPC для внутренней связи?

Иегуда: основное различие между плагинами и встроенными модулями заключается в том, что встроенные команды имеют доступ к внутренним компонентам оболочки. Мы хотели создать как можно больше команд поверх более четко определенного интерфейса. Это также означало, что вы могли создавать собственные команды на Python, Ruby или JavaScript довольно рано в проекте.

Преимущество JSON-RPC заключается в том, что с JSON-RPC довольно легко работать практически на всех языках программирования, поэтому можно создать плагин на любом языке без серьезной помощи со стороны команды nushell.

Почему я должен сделать плагин? Почему бы просто не создать двоичный файл, который работает во всех оболочках, и позволить анализировать мой вывод пользователям NuShell?

Иегуда: главное преимущество создания плагина - это возможность работать напрямую со структурированными данными. Это означает, что все «хорошие вещи», которые nushell дает вам из коробки, например сортировка и фильтрация, будут работать без необходимости вашего пользователя анализировать строковый вывод в новом структурированном формате.

API плагина Nushell также позволяет вам указывать типы ваших аргументов, которые будут выдавать вам сообщения об ошибках, подсветку синтаксиса и некоторое количество контекстно-зависимого завершения прямо из коробки. Чем больше информации вы предоставите Nushell, тем больше мы сможем предоставить пользователям Nushell полезную информацию, когда они взаимодействуют с вашей командой.

Кроме того, API плагина Nushell также создан для потоковой передачи из коробки, поэтому, если вы используете API плагина обычным способом, вы можете идиоматически взаимодействовать с потоками структурированных данных таким образом, чтобы масштабировать до огромных объемов ввода без «Разбивая поток».

Что дальше с NuShell?

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