Контексты и умолчания
Mar. 17th, 2017 09:37 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Подумавши некоторое время над концепцией семантической локальности я пришел к в некотором смысле противоположной концепции "общего контекста коммуникации".
То есть меня в общем довольно давно волновал вопрос, почему за 40 лет не появилось языка программирования, который был бы shell лучше чем unix shell. То есть более высокоуровневый, с меньшим порогом вхождения. позволяющий легко формулировать сложные концепции.
Почему-то все попытки "улучшить" shell вели в строго противоположном направлении "давайте напихаем туда более низкоуровневых конструкций, массивов, объектов с методами, типизации". Да, эти конструкции, которые вполне себе высокоуровневы если смотреть с уровня ассемблера, даже портабельного, на уровне шелла - глубокие потроха, которые не надо выворачивать наружу.
Подумав, я пришел к выводу что
1. На этом уровне как часть языка нужно рассматривать не только команды и аргументы, но и форматы потоков, которыми эти команды обмениваются.
2. Должна быть некая система умолчаний. Сейчас в шелле контекст выполнения состоит пожалуй, из имени текущей директории (и. соответственно относительных путей). Ну с некоторой натяжкой - еще и списка фоновых задач из него запущенных - %1 меняет свое значение по ходу выполнения.
В более низкоуровневых языках программирования, которые являются аналогом письменной речи, система контекстов куда более развита. Начиная с let в Lisp-е и with в Pascal, и кончая развесистыми системами алиасов при импорте модулей в Python и Go. Где-то в промежутке namespaces в C++ и присваивание glob references в Perl. В общем придумано много способов сказать "сегодня это слово у нас значит то-то". Но это именно способы, характерные для письменной речи, причем даже скорее для научных и юридических текстов, а не для художественных и не для частной переписки.
А шелл это именно аналог устной речи. В естественных языках умолчаний и контекстной зависимости в устной речи гораздо больше чем в письменной. А вот в интерактивном взаимодействии человека с программой или программ между собой (опять же - шелловская сессия это не диалог человека с компьютером. Это целая тусовка - человек, шелл и куча программ, и они все общаются между собой в разных сочетаниях).
(три дня эту мысль думал, а все равно непричесанная какая-то. Или я поторопился и надо было еще сутки подумать?)
То есть меня в общем довольно давно волновал вопрос, почему за 40 лет не появилось языка программирования, который был бы shell лучше чем unix shell. То есть более высокоуровневый, с меньшим порогом вхождения. позволяющий легко формулировать сложные концепции.
Почему-то все попытки "улучшить" shell вели в строго противоположном направлении "давайте напихаем туда более низкоуровневых конструкций, массивов, объектов с методами, типизации". Да, эти конструкции, которые вполне себе высокоуровневы если смотреть с уровня ассемблера, даже портабельного, на уровне шелла - глубокие потроха, которые не надо выворачивать наружу.
Подумав, я пришел к выводу что
1. На этом уровне как часть языка нужно рассматривать не только команды и аргументы, но и форматы потоков, которыми эти команды обмениваются.
2. Должна быть некая система умолчаний. Сейчас в шелле контекст выполнения состоит пожалуй, из имени текущей директории (и. соответственно относительных путей). Ну с некоторой натяжкой - еще и списка фоновых задач из него запущенных - %1 меняет свое значение по ходу выполнения.
В более низкоуровневых языках программирования, которые являются аналогом письменной речи, система контекстов куда более развита. Начиная с let в Lisp-е и with в Pascal, и кончая развесистыми системами алиасов при импорте модулей в Python и Go. Где-то в промежутке namespaces в C++ и присваивание glob references в Perl. В общем придумано много способов сказать "сегодня это слово у нас значит то-то". Но это именно способы, характерные для письменной речи, причем даже скорее для научных и юридических текстов, а не для художественных и не для частной переписки.
А шелл это именно аналог устной речи. В естественных языках умолчаний и контекстной зависимости в устной речи гораздо больше чем в письменной. А вот в интерактивном взаимодействии человека с программой или программ между собой (опять же - шелловская сессия это не диалог человека с компьютером. Это целая тусовка - человек, шелл и куча программ, и они все общаются между собой в разных сочетаниях).
(три дня эту мысль думал, а все равно непричесанная какая-то. Или я поторопился и надо было еще сутки подумать?)
…а вот в PowerShell…
Date: 2017-03-17 07:17 am (UTC)Вот пример. (https://books.google.ru/books?id=78w1953mptUC&lpg=PA197&ots=z0wBoJ-4UK&dq=powershell%20Convert-TextObject&hl=ru&pg=PA197#v=onepage&q&f=false)
Re: …а вот в PowerShell…
Date: 2017-03-17 07:21 am (UTC)Re: …а вот в PowerShell…
Date: 2017-03-17 10:51 am (UTC)В юниксе, как только у тебя поток так или иначе форматированный, синтаксис сразу становится на порядок страшнее, чем у PowerShell, потому что формат приходится не только использовать, но еще и парсить.
UPD. Хуже. Не как только форматированный, а как только структурированный. Хоть как-то.
Re: …а вот в PowerShell…
Date: 2017-03-17 11:48 am (UTC)Чтобы был образец как правильно работать со структурированным потоком.
no subject
Date: 2017-03-17 07:23 am (UTC)Вот
with
в Паскале был иногда штукой исключительно вредной. Того же уровня вредности, что и широкодействующийusing namespace x
в плюсах илиfrom x import *
в Питоне.В один прекрасный день в
Foo
появляется полеbar
, и код внезапно и незаметно начинает работать неправильно. Плавали. Знаем.no subject
Date: 2017-03-17 07:32 am (UTC)Кстати в паскале, настоящем, родном, где не было модулей, это тоже не настолько страшно. Страшно это когда имя появляется в неймспейсе, импортированном из какой-нибудь библиотеки.
Кстати с from x import * ситуация несколько лучше, чем в приведенном примере на паскале - ведь импортированные из модуля переменные будут "гражданами второго сорта" и локальные переменные будут их перекрывать.
Но вообще задача комбинирования нескольких контекстов она действительно нетривиальна и ее надо думать.
Она очень мощна, и, как и любая мощная конструкция опасна.
Приведу еще такой пример - я в windows обычно c:\mingw64\usr\bin пишут в конец path. Чтобы мингв-шные утилиты не перекрывали родные виндовые, пришедшие в комлекте git или еще откуда взявшися (perl и python считаем "родными виндовыми). И вот теперь мне понадобилось что-то, что я в unix привык делать с помощью find,,,
no subject
Date: 2017-03-17 08:12 am (UTC)Ну, тот пример был из боевого применения Паскаля. Object Pascal, aka Delphi, двумя местами работы тому назад. И, кажется, оба юнита — и поменянный, и сломавшийся — были «наши». Для поломки достаточно было, чтобы их поддерживали разные люди. (Кстати, в контексте этой проблемы, я-который-здесь-и-сейчас и я-три-месяца-назад — разные люди.)
from x import *
перекрывается локальными переменными, но может перекрыватьfrom y import *
.no subject
Date: 2017-03-17 09:31 am (UTC)Ну либо глядя на RecordWildcards в хаскеле -- смотреть что больше по типу подходит ;)
no subject
Date: 2017-03-18 11:02 am (UTC)no subject
Date: 2017-03-17 08:14 am (UTC)no subject
Date: 2017-03-17 11:49 am (UTC)no subject
Date: 2017-03-17 11:55 am (UTC)Ну вот неправда. Совмещение нескольких инстансов оракловых продуктов (будь то БД, веблоджик, паблишер или ещё какая фигня из стека) на одном сервере только за счёт этого механизма и работает нормально. Не говоря уже о влиянии LD_LIBRARY_PATH на выбор правильных библиотек ld. Локаль, опять же, юниксовая, таймзоны...
no subject
Date: 2017-03-17 12:30 pm (UTC)no subject
Date: 2017-03-17 08:16 am (UTC)... А на это господин дракон велел сказать: посмотрим! ...
no subject
Date: 2017-03-17 11:47 am (UTC)no subject
Date: 2017-03-17 11:50 am (UTC)no subject
Date: 2017-03-17 12:34 pm (UTC)Впрочем, виндузятники по дефолту до сих пор скрывают расширения файлов, что очень удобно для всяческих троянов: скайчай себе файл новый-модный-фильм.avi.exe, спрячь расширение и запусти то, что видишь, он покажет тебе кино (про трахающихся негров, отключаемое только платной СМС-кой)
no subject
Date: 2017-03-20 10:11 am (UTC)no subject
Date: 2017-03-17 12:50 pm (UTC)no subject
Date: 2017-03-17 11:53 am (UTC)... Невнимательный маньяк ...
no subject
Date: 2017-03-17 12:26 pm (UTC)Долго страдал от её отсутствия, потом догадался погуглить :)
Windows Explorer и его икс-виндовые клоны же совершенно не приспособлены для работы с файловыми системами, максимум - с файлопомойкой, лежащей в нескольких директориях.
no subject
Date: 2017-03-17 11:52 am (UTC)no subject
Date: 2017-03-17 11:56 am (UTC)за которую деньги берут.... Векторы прерываний были завязаны узлом ...
no subject
Date: 2017-03-17 12:29 pm (UTC)Поэтому создавать утилиту которая делает частный случай, пусть и частый, можно только ради демонстрации какой-нибудь возможности другого инструмента, как, собственно и сделал Ларри.
no subject
Date: 2017-03-17 12:37 pm (UTC)no subject
Date: 2017-03-17 12:30 pm (UTC)А вот это зря! Copy, move и link - существенно разные действия, и путать их череповато.
no subject
Date: 2017-03-17 08:07 pm (UTC)Вот в драг-н-дроповых - это да. С этим есть проблема.
no subject
Date: 2017-03-17 08:35 pm (UTC)no subject
Date: 2017-03-17 09:03 pm (UTC)no subject
Date: 2017-03-18 07:03 am (UTC)no subject
Date: 2017-03-17 12:15 pm (UTC)Во-первых, это environment variables -- те самые, которые со словом export в баше. Но их количество обычно обозримо, так что жить можно.
Во-вторых, кроме экспортов, в шелле есть не экспортируемые в запускаемые программы переменные. Шелловские скрипты огребают от них по полной, потому что они видны всему скрипту, включая sourcing, а local внутри функций мало кто пишет.
Ну и по мелочам: cwd (не все используют pushd/popd), %1, !! и т.д.
no subject
Date: 2017-03-17 01:11 pm (UTC)У машины с этим еще на порядок хуже.
no subject
Date: 2017-03-17 10:38 pm (UTC)А как же Rexx ?
no subject
Date: 2017-03-17 11:59 pm (UTC)no subject
Date: 2017-03-18 07:06 am (UTC)no subject
Date: 2017-03-18 03:38 pm (UTC)no subject
Date: 2017-04-14 10:01 pm (UTC)Мне больше нравится, конечно, питон. Там надо специально стараться, чтобы писать НЕчитаемо.
no subject
Date: 2017-04-21 02:51 pm (UTC)no subject
Date: 2017-04-21 03:03 pm (UTC)Хочу ОС с микроядром, где само микроядро и системные сервисы написаны на Паскале или другом строго типизированном языке без арифметики пойнтеров. Недадуд, однако. Разве что DZ OS :)