Re: Несколько вопросов вразброс
Артём Н. -> debian-russian@lists.debian.org @ Sun, 01 Jul 2012 14:35:40 +0400:
>> Вот у тебя там выше по треду было "если один файл в бэкапе побился, то
>> проще выкинуть весь бэкап". На практике это не так. Ценность остальных
>> обычно довольно высока.
АН> ...
>> При каждом таком зависе обычно fsck
>> находит и удаляет несколько orphaned inodes (т.е. файловая система
>> оказывается битой). Ценной информации при этом не потерялось ни разу.
>> Стоит ли ему, обнаружив один orphaned inode, удалять всю файловую
>> систему нафиг?
АН> Думаю, что сравнивать рабочую ФС и её копию - не совсем корректно. В случае
АН> бэкапа, имеется возможность сделать новый.
Если оно побилось, пока бэкап хранился (битый блок на бэкапном винте,
например), то ты это обнаружишь только во время восстановления. Когда
по постановке задачи :) сделать новый бэкап возможности уже нет.
>> Так вот, система обычно нужна в первую очередь выполняющая свои функции.
>> Может быть, с огрехами, но выполняющая. Надежность - требование никак
>> не первое, и скорее всего, не второе.
>> Система, при подъеме которой несколько скриптов обломались, обычно
>> все-таки поднимается, и можно что-то сделать с полученным
>> недорезультатом. А зависимостей у шелла, особенно какого-нибудь
>> статически собранного dash - минимум. Соответственно, шансов получить
>> надежную, но не загружающуюся систему, тоже минимум.
АН> Хм... Да, пожалуй, это верно.
АН> Но, если система выполняет ответственные действия..?
АН> Вопрос в том совместить требования надёжности и корректности с
АН> отказоустойчивостью и возможностью восстановления после сбоя?
Кодогенерация сишного или даже ассемблерного кода на какой-нибудь agda.
Которая из тебя душу вынет, пока ты ей корректность не докажешь.
Правда, порог вхождения весьма высокий.
Мне говорили о людях, которые на Haskell делают по этой схеме авионику.
Реально летающие приборы. В сам прибор хаскельную программу запихнуть
вряд ли можно - он, зараза, ленивый, и время реакции у него поэтому
негарантированное. А с кодогенерацией - и делают, и проходят
сертификацию процесса разработки, а она (сертификация эта) в авиации
довольно серьезная.
>> АН> Уж, если оффтопить, то по полной. :-)
>> АН> Что для создания надёжных систем больше всего подходит?
>> АН> И практически применимо (по опыту)?
>> Любой язык с полноценными ручками к fork/exec и обработкой исключений.
>> У шелла, собственно, первое есть - второго нет.
АН> Я так не думаю. C++? ObjectC?
Скажем так, чистый C в этом смысле (ну да, если понимать, что такое
исключение в случае C) будет лучше. Но годятся и эти. Я видел людей,
которые пишут работающие программы на C++ не сильно медленнее, чем я -
перловый скрипт. Но ты спрашивал про опыт. Мой опыт - perl, tcl,
python даже был.
АН> В том плане, какие языки имеют встроенную проверку корректности
АН> (семантической, естественно) и средства для повышения надёжности..?
АН> Знаю только про Ada. Но, т.к. слышал про неё лишь краем уха, ничего особо не
АН> понятно. Плюс, языки предметной области... Вопрос, какой должен быть баланс
АН> между созданием языка предметной области и "прямым" использованием языка общего
АН> назначения? Как должен быть организован процесс, начиная с проектирования, хотя
АН> бы..?
Любой статически типизированный функциональный язык с нормальной
системой типов, начиная с того же Haskell или Ocaml. При правильном
применении, правда, потому что они позволяют довольно легко прострелить
себе ногу. Если брать что-то менее мейнстримное и более строгое, типа
той же агды, то прострелить себе ногу будет сложнее. Но и библиотек
меньше.
И да, насколько я вижу тенденции, такие вещи стараются делать, сообразив
на таком языке себе DSL, и пользуясь им. Не запрещая себе пользоваться
языком общего назначения, но все-таки выражаясь в терминах абстракций
предметной области.
>> Я скрипты, от которых хочу надежности, обычно на перле пишу, учитывая,
>> что в Debian
>> Package: perl-base
>> Priority: required
АН> o.O Perl, кажется, похож на автомат со снятым предохранителем, направленный в ноги?
Многое зависит от наличия головы ;-) Никто не мешает писать в каждом
перловом файле use strict; и даже запускать его с -T. Ну и эта... Все
его "короткие" варианты под девизом Do The Right Thing - они для
однострочников. В скриптах, от которых требуется надежность, никто не
запрещает использовать более многословные варианты, и даже иногда
что-нибудь проверять :-)
>> >> Чтобы пользователь мог переопределить - это надо внутри конфига делать
>> >> подобные проверки. На предмет чего у шеллов (у всех sh-derived) есть
>> >> прекрасная подстановка ${parameter:-word}, чтобы так длинно не писать.
>> АН> Почему внутри конфига?
>>
>> Чтобы пользователь мог переопределить одну из пятнадцати переменных,
>> определенных в этом конфиге, а в остальных четырнадцати положиться на
>> конфиг.
АН> Так причём тут проверка в конфиге?
АН> Достаточно проверки в загрузчике конфига:
АН> config:
АН> OPT_PARAM1=123
АН> Скрипт:
АН> . config
АН> OPT_PARAM1=${ENV_USER_PARAM1-:OPT_PARAM1}
Можно. Но обычно удобнее в конфиге написать
OPT_PARAM1=${OPT_PARAM1:-value1}
и позволить пользователю переопределять именно OPT_PARAM_1,
использование которой он потом увидит, а не неочевидно с нею связанную
ENV_USER_PARAM1
А почему в конфиге? Да потому что тогда это будет написано в одном
месте, а иначе придется писать в каждом скрипте, использующем этот
конфиг. Зато, правда, тогда зачитывать этот конфиг можно будет не
только шеллом. Но поскольку по опыту ситуация, когда один и тот же
конфиг и сурсится шеллом, и читается чем-то еще, встречается крайне
редко...
Reply to: