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]
В то время я писал bsна Unix (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 editions 2.1 (ноябрь 1979 г.) [5] [6] и 2.3 (1981 г.). [7] Эта bsкоманда не появляется в некоторых более ранних внутренних выпусках, например, в выпуске UNIX Support Group от марта 1977 г. [4] или в руководстве PWB/UNIX от мая 1977 г. [8], что предполагает ее создание около 1978 г. Она не появляется ни в одной из версий Research Unix или Berkeley Software Distribution .
Впоследствии и в 1990-х годах bsбыла включена в различные коммерческие операционные системы, производные от System III или System V, включая, но не ограничиваясь: PC/IX ; [9] UNIX System V Releases 2 и 3: SVR2 , [10] SVR3 , SVR3.2 (1986); [11] HP-UX ; [12] AIX ; [13] и A/UX . [14] (В руководстве пользователя для AT&T UNIX PC (3B1) специально упоминается, что bsкоманда недоступна, но она доступна в SVR3.2. [10] )
Иногда bsрекламировался как один из основных языков программирования для разработки под UNIX. [3] [9] [15] Однако bsне включен в команды и утилиты POSIX.1 (стандартный список команд Unix ) и не входит в Единую спецификацию UNIX и не поставляется с большинством современных операционных систем. Например, в Linux похожий синтаксис и функциональность предоставляются bc , Perl и POSIX shell .
В 21 веке bsприсутствует, по крайней мере, в HP-UX Release 11i (2000), [12] , а также в AIX версий 6.1 (2007) [13] и 7.2 (2018), [16], вероятно, из-за их наследия UNIX System V.
Страница руководства bs[1] , якобы единственная спецификация языка программирования, характеризует его следующим образом:
Bs предназначен для задач программирования, где время разработки программы так же важно, как и конечная скорость выполнения. Формальности объявления данных и манипуляции файлами/процессами сведены к минимуму. Отладка построчно, операторы traceи dumpи полезные сообщения об ошибках во время выполнения упрощают тестирование программ. Более того, можно отлаживать неполные программы; внутренние функции можно тестировать до того, как будут написаны внешние функции, и наоборот.
Программа bsкомпилируется и выполняется иначе, чем программы, написанные на других основных языках программирования Unix того времени: C , FORTRAN и языке ассемблера , соответствующие команды которых компилируют исходный код программы в исполняемый вывод ассемблера ( a.out ). Вместо этого bsпрограмма сначала преобразуется командой bsво внутреннее обратное польское ( RPN ) промежуточное представление , а затем выполняется внутренней виртуальной стековой машиной команды . [17] Таким образом, язык bsявляется гибридным интерпретатором и компилятором и отклонением в программировании Unix от Ancient Unix .
Язык bsразделяет некоторые функции и синтаксис с BASIC , SNOBOL и C , два первых, вероятно, вдохновили его название. Как и BASIC, он может использоваться интерактивно, либо выполняя операторы немедленно, либо собирая их в программу для последующего выполнения. Как и в SNOBOL4, оператор присваивания ( =) используется для ввода-вывода и bsможет выполнять код в строках, используя свою функцию eval . Он также включает оператор запроса 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 для 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" ) ... # последний выполненный оператор (выход или остановка): exit # последняя строка ввода: бегать
В этом примере демонстрируется ввод-вывод:
# Копировать "oldfile" в "newfile". open ( "read" , "oldfile" , "r" ) open ( "write" , "newfile" , "w" ) ... while ? ( 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 Bottles of Beer с помощью /usr/bin/bs. [19]
весело петь ( n , конец ) s s = ( "s" , "" ) [ матч ( n , "^1$" ) ] положить = формат ( формат ( формат ( "%s бутылка%%s пива%%%%s" , n ), s ), конец ) нуфдля n = 99 , n , put = "" sing ( format ( "%-0.0f" , n ), "на стене," ) sing ( format ( "%-0.0f" , n ), "," ) put = "сними одну, передай по кругу," -- n sing (( format ( "%-0.0f" , n ), "нет" ) [ 0 == n ] , "на стене." ) next