Speakeasy (вычислительная среда) - Speakeasy (computational environment)

Speakeasy
Speakeasy Red Logo.png
Разработчики) Speakeasy Computing Corporation
Стабильный выпуск
IV Iota / 2006 г.
Написано в Мортран , Фортран , C
Операционная система Windows , macOS , RedHat Linux , SUSE Linux , Mandrake Linux , Debian , Solaris , HP-UX
Тип Технические вычисления
Лицензия Пробная версия
Speakeasy (интерпретируемый язык программирования)
Парадигма императив
Разработано Стэнли Коэн
Разработчик Speakeasy Computing Corporation
Впервые появился 1964 г.
Печатная дисциплина динамичный
Под влиянием
APL
Под влиянием
MATLAB

Speakeasy - это интерактивная среда для числовых вычислений, в которой также использовался интерпретируемый язык программирования . Первоначально он был разработан физиком-теоретиком Стэнли Коэном для внутреннего использования в Физическом отделе Аргоннской национальной лаборатории . В конце концов он основал Speakeasy Computing Corporation, чтобы сделать программу доступной на коммерческой основе.

Speakeasy - это долговечный цифровой пакет. Фактически, первоначальная версия среды была построена на основе основного динамического репозитория данных под названием «Именованное хранилище», разработанного в начале 1960-х годов, а самая последняя версия была выпущена в 2006 году.

Speakeasy был призван облегчить вычислительную работу физиков Аргоннской национальной лаборатории.

История

Speakeasy изначально задумывался для работы на мэйнфреймах (единственный вид компьютеров в то время), а затем был перенесен на новые платформы ( миникомпьютеры , персональные компьютеры ) по мере их появления. Перенос одного и того же кода на разные платформы стал проще за счет использования макросов метаязыка Mortran для выявления системных зависимостей, недостатков и различий компиляторов. Speakeasy в настоящее время доступен на нескольких платформах: ПК под управлением Windows , macOS , Linux , компьютеры отделов и рабочие станции под управлением нескольких разновидностей Linux, AIX или Solaris .

Speakeasy также была одной из первых интерактивных вычислительных сред, реализованных таким образом в системе CDC 3600 , а затем и в машинах IBM TSO, поскольку в то время одна из них проходила бета-тестирование в Аргоннской национальной лаборатории. К 1984 году она была доступна на Digital Equipment Corporation «s VAX системы.

Практически с самого начала (поскольку функциональность динамического связывания была сделана доступной в операционных системах) Speakeasy предлагает возможность расширения своего операционного словаря с помощью отдельных модулей, динамически связанных с базовым процессором по мере необходимости. По этой причине такие модули были названы «линкулы» (LINKable-modULES). Они являются функциями с генерализованной интерфейсом, который может быть записан в FORTRAN или C . Независимость каждого из новых модулей от других и от главного процессора очень помогает в улучшении системы, особенно в старые времена.

Этот простой способ расширения функциональных возможностей главного процессора часто использовался пользователями для разработки собственных специализированных пакетов. Помимо программ, функций и подпрограмм, которые пользователь может написать на собственном интерпретируемом языке Speakeasy, линкулы добавляют функциональные возможности, выполняемые с типичными характеристиками скомпилированных программ.

Среди пакетов, разработанных пользователями, одним из наиболее важных является «Modeleasy», первоначально разработанный как «FEDeasy» в начале 1970-х годов в исследовательском отделе Совета управляющих Федеральной резервной системы в Вашингтоне, округ Колумбия. Modeleasy реализует специальные объекты и функции для оценки и моделирования больших эконометрических моделей. Его эволюция в конечном итоге привела к его распространению как независимому продукту.

Синтаксис

Символ : _ (двоеточие + подчеркивание) является одновременно логотипом Speakeasy и подсказкой интерактивного сеанса.

Знак доллара используется для разграничения комментариев; амперсанд используется для продолжения оператора в следующей физической строке, и в этом случае приглашение становится следующим : & (двоеточие + амперсанд); точка с запятой может разделять операторы, написанные в одной физической строке.

$ suppose you have a very long statement, 
$ you can write it on multiple physical lines using "&" 
$ at the end of the line to be continued:

:_ the_return_value = this_is_a_function_with_many_arguments(argument_1, argument_2, &
:&                             argument_3, argument_4, argument_5, argument_6)

$ on the other hand, you can collect several short statements 
$ on a single physical line using ";"
:_ a=1; b=2; c=3; d=4 

Как следует из названия, Speakeasy был нацелен на то, чтобы сделать синтаксис максимально удобным для пользователя и максимально приближенным к разговорной речи. Лучшим примером этого является набор команд для чтения / записи данных из / в постоянное хранилище. Например (ключевые слова для языков написаны заглавными буквами, чтобы прояснить суть):

:_ GET my_data FROM LIBRARY my_project
:_ KEEP my_data AS a_new_name_for_mydata IN LIBRARY other_project 

Переменным (например, объектам Speakeasy) дается имя длиной до 255 символов, когда опция LONGNAME включена, в противном случае - до 8 символов (для обратной совместимости). Они динамически типизируются в зависимости от присвоенного им значения.

:_ a=1
:_ whatis a
A is a REAL SCALAR.
:_ a="now a character array"
:_ whatis a
A is a 21 element CHARACTER ARRAY.

Аргументы функций обычно не требуется заключать в круглые скобки или разделять запятыми, при условии, что контекст остается ясным и однозначным. Например:

:_ sin(grid(-pi,pi,pi/32))    $ fully specified syntax

можно написать:

:_ sin grid(-pi,pi,pi/32)     $ the argument of function sin is not surrounded by parenthesis

или даже

:_ sin grid(-pi pi pi/32)     $ the arguments of function grid can be separated by spaces

Возможны многие другие упрощения синтаксиса; например, чтобы определить объект с именем 'a', равный десятиэлементному массиву нулей, можно написать любой из следующих операторов:

:_ a=array(10:0,0,0,0,0,0,0,0,0,0)
:_ a=0,0,0,0,0,0,0,0,0,0
:_ a=0 0 0 0 0 0 0 0 0 0
:_ a=ints(10)*0
:_ a=10:

Speakeasy - это векторно-ориентированный язык: при передаче структурированного аргумента функции скаляра результат обычно представляет собой объект с той же структурой аргумента, в котором каждый элемент является результатом функции, примененной к соответствующему элементу аргумент. В приведенном выше примере результатом применения функции sin к массиву (назовем его x ), сгенерированному сеткой функций, является ответ массива , элемент answer (i) которого равен sin ( x (i)) для каждого i из 1 to noels (x) (количество элементов x ). Другими словами, заявление

:_ a=sin(grid(-pi pi pi/32))

эквивалентен следующему фрагменту программы:

x=grid(-pi pi pi/32) $ generates an array of real numbers from -pi to pi, stepping by pi/32
for i = 1,noels(x)   $ loops on the elements of x
  a(i) = sin(x(i))   $ evaluates the i-th element of a
next i               $ increment the loop index

В вектор-ориентированные заявления избежать написания программ для таких петель и гораздо быстрее , чем они.

Рабочая зона и объекты

Самым первым оператором сеанса пользователь может определить размер «именованного хранилища» (или «рабочей области», или «распределителя»), который выделяется раз и навсегда в начале сеанса. В пределах этой рабочей области фиксированного размера процессор Speakeasy динамически создает и уничтожает рабочие объекты по мере необходимости. Предоставляется настраиваемый пользователем механизм сборки мусора, позволяющий максимизировать размер свободного блока в рабочей области, упаковывая определенные объекты в нижнюю или верхнюю часть распределителя. В любой момент пользователь может спросить об использованном или оставшемся пространстве в рабочей области.

:_ SIZE 100M $ very first statement: the work area will be 100MB
:_ SIZE      $ returns the size of the work area in the current session
:_ SPACELEFT $ returns the amount of data storage space currently unused
:_ SPACENOW  $ returns the amount of data storage space currently used
:_ SPACEPEAK $ returns the maximum amount of data storage space used in the current session

Ориентация необработанного объекта

В пределах разумных ограничений соответствия и совместимости с объектами Speakeasy можно работать с использованием того же алгебраического синтаксиса.

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

$ The following example shows how a Matrix-family object and an Array-family object
$ with the same structure and values are operated on differently although using the 
$ same "*" and "/" operator: in the first case using the matrix algebra and in the 
$ second case operating on an element-by-element basis.
:_ a=matrix(2,2:1,2,3,4) ; a
  A (A 2 by 2 Matrix)
  1  2
  3  4
:_ a*a
  A*A (A 2 by 2 Matrix)
  7   10
  15  22
:_ a/a
  A/A (A 2 by 2 Matrix)
  1  0
  0  1
:_ aa=array(2,2:1,2,3,4) ; aa
  AA (A 2 by 2 Array)
  1  2
  3  4
:_ aa*aa
  AA*AA (A 2 by 2 Array)
  1   4
  9   16
:_ aa/aa
  AA/AA (A 2 by 2 Array)
  1  1
  1  1

Семейства объектов

Speakeasy предоставляет набор предопределенных «семейств» объектов данных: скаляры, массивы (до 15 измерений), матрицы, наборы, временные ряды.

Элементарные данные могут быть вещественными (8-байтовые), комплексными (2x8-байтовыми), символьно-буквальными или именно-буквальными (элементы матриц могут быть действительными или сложными, значения временных рядов могут быть только реальными).

Отсутствующие значения

Для обработки временных рядов предусмотрено пять типов пропущенных значений . Они обозначаются как NA (недоступно), NC (не вычислимо), ND (не определено), а также NB и NE, значение которых не предопределено и остается доступным для разработчика линкулов. Они внутренне представлены определенными (и очень маленькими) числовыми значениями, действующими как коды.

Все операции с временными рядами заботятся о наличии пропущенных значений, соответствующим образом распределяя их по результатам.

В зависимости от конкретной настройки отсутствующие значения могут быть представлены в виде обозначения выше, знака вопроса или пробела (полезно в таблицах). При использовании во вводе вопросительный знак интерпретируется как отсутствующее значение NA.

:_ b=timeseries(1,2,3,4 : 2010 1 4)
:_ b
  B (A Time Series with 4 Components)
  1  2  3  4
:_ b(2010 3) = ? 
:_ showmval qmark
:_ b
  B (A Time Series with 4 Components)
  1  2  ?  4
:_ 1/b
  1/B (A Time Series with 4 Components)
  1    .5   ?    .25
:_ showmval explain
:_ b
  B (A Time Series with 4 Components)
  1     2     N.A.  4
:_ 1/b
  1/B (A Time Series with 4 Components)
  1     .5    N.C.  .25

В числовых объектах, отличных от временных рядов, понятие «отсутствующие значения» не имеет смысла, и числовые операции над ними используют фактические числовые значения независимо от того, соответствуют ли они «кодам отсутствующих значений» или нет (хотя можно вводить «коды отсутствующих значений» и показан как таковой).

 :_ 1+?
  1+? =  1.00
 :_ 1/?
  1/? =  5.3033E36
 :_ 1*?
  1*? = ?

Обратите внимание, что в других контекстах вопросительный знак может иметь другое значение: например, при использовании в качестве первого (и, возможно, единственного) символа командной строки он означает запрос на отображение большего количества частей длинного сообщения об ошибке (которое заканчивается знаком «+»).

:_ a=array(10000,10000:)
ARRAY(10000,10000:) In line "A=ARRAY(10000,10000:)"  Too much data.+
:_ ?
Allocator size must be at least     859387 kilobytes.+
:_ ?
Use FREE to remove no longer needed data
or
use CHECKPOINT to save allocator for later restart.+
:_ ?
Use NAMES to see presently defined names.
Use SIZE & RESTORE to restart with a larger allocator.
:_ ?
NO MORE INFORMATION AVAILABLE.

Логические значения

Некоторая поддержка предоставляется для логических значений, операторов отношения ( можно использовать синтаксис Fortran ) и логических выражений.

Логические значения фактически сохраняются как числовые значения: 0 означает ложь, а ненулевое значение (1 на выходе) означает истину.

:_ a = 1 2 3 4 5
:_ b = 1 3 2 5 4
:_ a>b
  A>B (A 5 Component Array)
  0  0  1  0  1
:_ a<=b
  A<=B (A 5 Component Array)
  1  1  0  1  0
:_ a.eq.b
  A.EQ.B (A 5 Component Array)
  1  0  0  0  0
:_ logical(2) $ this changes the way logical values are shown
:_ a>b; a<=b; a.eq.b
  A>B (A 5 Component Array)
 F F T F T
  A<=B (A 5 Component Array)
 T T F T F
  A.EQ.B (A 5 Component Array)
 T F F F F

Программирование

Специальные объекты, такие как объекты «ПРОГРАММА», «ПОДПРОГРАММА» и «ФУНКЦИЯ» (вместе именуемые процедурами ), могут быть определены для автоматизации операций. Другой способ выполнить несколько инструкций с помощью одной команды - сохранить их в файле использования и заставить процессор читать их с помощью команды USE.

Использовать файлы

«ИСПОЛЬЗОВАНИЕ» файла использования - это самый простой способ выполнения нескольких инструкций с минимальным вводом текста. (Эта операция примерно соответствует тому, какой "источник" файла находится на других языках сценариев.)

Файл использования является альтернативным источником ввода для стандартной консоли и может содержать все команды, которые пользователь может вводить с клавиатуры (следовательно, конструкция управления многострочным потоком не допускается). Процессор читает и выполняет файлы использования по одной строке за раз.

Выполнение файла использования может быть конкатенированным, но не вложенным, т. Е. Управление не возвращается вызывающей стороне по завершении вызываемого файла использования.

Процедуры

Полная возможность программирования достигается с помощью «процедур». На самом деле это объекты Speakeasy, которые должны быть определены в рабочей области для выполнения. Доступна опция, позволяющая автоматически извлекать и загружать процедуры из внешнего хранилища по мере необходимости.

Процедуры могут содержать любые конструкции управления потоком выполнения, доступные в языке программирования Speakeasy.

Программ

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

Подпрограммы и функции

Подпрограммы и функции выполняются на новом уровне области видимости, который удаляется, когда они завершаются. Связь с вызывающим уровнем области видимости осуществляется через список аргументов (в обоих направлениях). Это реализует скрытие данных, т. Е. Объекты, созданные в подпрограмме или функции, не видны другим подпрограммам и функциям, но через списки аргументов.

Доступен глобальный уровень для хранения объекта, который должен быть виден изнутри любой процедуры, например, самих процедур.

Функции отличаются от подпрограмм тем, что они также возвращают функциональное значение; ссылка на них может быть частью более сложного оператора и заменяться возвращенным функциональным значением при оценке оператора.

В некоторой степени подпрограммы и функции Speakeasy очень похожи на одноименные процедуры Fortran.

Управление потоком

Для условного выполнения доступна конструкция IF-THEN-ELSE, а для цикла предусмотрены две формы конструкции FOR-NEXT.

IF (logical-expression) THEN
   true-block
[ELSE
   false-block]
END IF
FOR index = min, max [, step]
   loop-block
NEXT index
FOR value IN set-of-values
   loop-block
NEXT value

Оператор GO TO label предназначен для перехода, в то время как вычисляемый оператор GO TO в стиле Фортран может использоваться для множественного ветвления.

...
IF (logical-expression) GO TO label
...
label:
...
$ In the following statement 
$ selector must be >= 1 and <= N

GO TO label1, label2, ..., labelN : selector 
...
label1:
...
label2:
...
...
labelN:
...

Механизм ON ERROR с несколькими опциями предоставляет средства для обработки ошибок.

Написание линкулов

Linkules - это функции, обычно написанные на Fortran (или, что не поддерживается, на C). С помощью макросов Mortran или C и библиотеки API они могут взаимодействовать с рабочей областью Speakeasy для извлечения, определения и управления любым объектом Speakeasy.

Большая часть рабочего словаря Speakeasy реализована через линкулы. Они могут быть статически связаны с ядром ядра или динамически загружаться по мере необходимости, при условии, что они правильно скомпилированы как общие объекты (unix) или dll (windows).

Примечания

внешние ссылки