bs— это язык программирования и компилятор/интерпретатор программ небольшого размера в системах UNIX . [1] Команда bsможет быть вызвана либо для интерактивного программирования, либо с файлом, содержащим программу, опционально с аргументами, через оболочку Unix , например, с использованием Shebang (Unix) #!/usr/bin/bs .
На ранней странице руководства говорится: «[ bs] является отдаленным потомком Basic [sic] и SNOBOL4 с добавлением небольшого количества C ». [1]
Команда bsпоявляется в UNIX System III Release 3.0 (1980), впервые выпущенной за пределами Bell Labs в 1982 году. [1] Она была написана Диком Хейтом (Ричард К. Хейт) примерно в 1978 году, который описывает ее следующим образом: [2]
В то время я писал bsUnix (V 3?), и все команды конвертировались из ассемблера в C. Так что команда [ Кена Томпсона ] basстала моей bs— своего рода.
В руководстве по версии 3.0 bsна странице 9 заметно упоминается (выделено автором): [3]
Написание программы. Чтобы ввести текст исходной программы в файл UNIX, используйте ed(1). Четыре основных языка, доступных в UNIX, — это C (см. cc(1)), Fortran (см. f77(1)), bs (компилятор/интерпретатор в духе Basic, см. bs(1)) и язык ассемблера (см as(1).).
Хотя команда не выпускалась снаружи до System III, она bsприсутствовала внутри UNIX/TS 1.0 (ноябрь 1978 г.), [4] PWB/UNIX 2.0 (июнь 1979 г.), [4] и CB UNIX edition 2.1 (ноябрь 1979 г.) [5 ] [6] и 2.3 (1981). [7] Эта bsкоманда не встречается в некоторых более ранних внутренних выпусках, например, в выпуске группы поддержки UNIX от марта 1977 года, [4] или в руководстве PWB/UNIX от мая 1977 года, [8] предполагающем ее создание примерно в 1978 году. появляются в любой версии Research Unix или Berkeley Software Distribution .
Впоследствии, в 1990-е годы, bsон был включен в различные коммерческие операционные системы, производные от System III или System V, включая, помимо прочего: PC / IX ; [9] UNIX System V выпусков 2 и 3: SVR2 , [10] SVR3 , SVR3.2 (1986 г.); [11] HP-UX ; [12] АИКС ; [13] и A/UX . [14] (В Руководстве пользователя для ПК AT&T UNIX (3B1) конкретно упоминается, что эта bsкоманда недоступна, но она доступна в SVR3.2. [10] )
Иногда bsего рекламировали как один из основных языков программирования для разработки под UNIX. [3] [9] [15] Однако bsон не включен ни в команды и утилиты POSIX.1 (стандартный список команд Unix ), ни в единую спецификацию UNIX и не поставляется с большинством современных операционных систем. Например, в Linux аналогичный синтаксис и функциональность обеспечиваются оболочками bc , Perl и POSIX .
В 21 веке bsприсутствует, по крайней мере, в HP-UX Release 11i (2000), [12] , а также в версиях AIX 6.1 (2007) [13] и 7.2 (2018), [16] , вероятно, из-за их UNIX. Наследие System V.
Страница руководства bs[1] , якобы единственная спецификация языка программирования, характеризует его следующим образом:
Bs предназначен для задач программирования, где время разработки программы так же важно, как и конечная скорость выполнения. Формальности объявления данных и манипулирования файлами/процессами сведены к минимуму. Построчная отладка, операторы traceand dumpи полезные сообщения об ошибках во время выполнения упрощают тестирование программ. Более того, неполные программы можно отлаживать; внутренние функции можно протестировать до того, как будут написаны внешние функции, и наоборот.
Программа bsкомпилируется и выполняется иначе, чем программы, написанные на других основных языках программирования Unix того времени: C , FORTRAN и ассемблере , соответствующие команды которых компилируют исходный код программы в исполняемый вывод ассемблера ( a.out ). Вместо этого bsпрограмма сначала преобразуется командой bsво внутреннее обратное польское представление ( RPN ) , а затем выполняется внутренней машиной виртуального стека команды . [17] Таким образом, этот язык представляет собой гибрид интерпретатора и компилятора и отличается от программирования Unix от Древней Unix .bs
Язык bsимеет некоторые общие функции и синтаксис с BASIC , SNOBOL и C , причем первые два, по-видимому, послужили источником его названия. Как и BASIC, его можно использовать в интерактивном режиме, либо выполняя операторы немедленно, либо собирая их в программу для последующего выполнения. Как и в SNOBOL4, оператор присваивания ( =) используется для ввода-вывода и bsможет выполнять код в строках, используя свою функцию оценки . Он также включает в себя оператор запроса SNOBOL ( ?), используемый для проверки успешности вычисления выражения. Встроенная formatфункция, ограниченная одним аргументом, поддерживает подмножество printfспецификаторов преобразования формата C, например, «%f».
В языке есть некоторые заметные элементы. Например, его программные функции определяются с использованием синтаксиса, и его функции могут иметь локальные переменные. Кроме того, он может работать в двух режимах: либо интерпретировать (и выполнять) операторы и программы, либо их компилировать, а также переключаться между ними с помощью и . В противном случае его функциональность уникальна только в совокупности (на одном языке), поскольку отдельные функции избыточны с функциями сосуществующих инструментов, таких как Unix Shell , например, файловый ввод-вывод и циклы, и AWK , например, ассоциативные массивы и регулярные выражения. соответствие.fun ... nufbscompilestop
Язык bsпредназначался для удобной разработки и отладки небольших модульных программ. Он имеет набор синтаксиса и функций из предыдущих популярных языков, но в отличие от сценария Shell он компилируется внутренне . Таким образом, по назначению, дизайну и функциям bsон является малоизвестным и скромным предшественником гибридных интерпретируемых/компилируемых языков, таких как Perl и Python .
Следующие примеры взяты из bs(1) справочной страницы A/UX . [18]
В этом примере bsв качестве калькулятора используется:
$ bs # Расстояние (дюймы), которое свет проходит за наносекунду. 186000 * 5280 * 12 / 1e9 11.78496 ...# Сложные проценты # (6% на 5 лет на 1000 долларов США). int = .06 / 4 bal = 1000 for i = 1 5 *4 bal = bal + bal*int bal - 1000 346 .855007 ... выход
Этот пример представляет собой схему типичной bsпрограммы:
# инициализировать вещи: var1 = 1 open ( «read» , «infile» , «r» ) ... # вычислять: while ? ( str = read ) ... next # очистка: close ( "read" ) ... # последний выполненный оператор (выход или остановка): выход # последняя строка ввода: бегать
Этот пример демонстрирует ввод-вывод:
# Скопируйте «старый файл» в «новый файл». открыть ( «читать» , «старый файл» , «r» ) открыть ( «записать» , «новый файл» , «w» ) ... пока ? ( write = read ) ... # закрыть "read" и "write": close ( "read" ) close ( "write" ) # Конвейер между командами. open ( "ls" , "!ls *" , "r" ) open ( "pr" , "!pr -2 -h 'List'" , "w" ) while ? ( pr = ls ) ... ... # обязательно закройте (подождите) эти: close ( "ls" ) close ( "pr" )
Ниже приведен пример bsпрограммы, которая генерирует слова песни «99 бутылок пива» с использованием /usr/bin/bs. [19]
fun Sing ( n , end ) s s = ( "s" , "" ) [ match ( n , "^1$" ) ] put = format ( format ( format ( "%s бутылка%%s пива%%% %s" , n ), s ), end ) nuf для n = 99 , n , put = "" пойте ( формат ( "%-0.0f" , n ), "на стене," ) пойте ( формат ( "%-0.0f" , n ), "," ) put = "сними один, раздай" -- n song (( format ( "%-0.0f" , n ), "no" ) [ 0 == n ] , " на стене." ) next