Главная страница

Программирование в Scilab Микаэль Боден Micha


Скачать 1.35 Mb.
НазваниеПрограммирование в Scilab Микаэль Боден Micha
Дата18.09.2022
Размер1.35 Mb.
Формат файлаpdf
Имя файлаprogscilab-v.0.10_ru.pdf
ТипРеферат
#683094
страница2 из 13
1   2   3   4   5   6   7   8   9   ...   13

Шлюз точно получает доступ к адресам в стеке, который содержит данные переменных x и y. Для этой цели заголовок шлюза Fortran может содержать объявление, такое как:
i n t e g e r il где il — переменная, которая хранит положение в стеке, который хранит переменную, ко- торая используется. Внутри стека каждый адрес соответствует одному байту и точно управ- ляется с помощью исходного кода каждого шлюза. Целые числа представляют различные места в стеке, т. е. различные адреса байтов. Рисунок
3
демонстрирует способ, которым ядро
Scilab’а версии 5 управляет байтами в стеке. Если целочисленная переменная il связана с отдельным адресом в стеке, выражение il+1 идентифицирует следующий адрес стека.
Addr#0
Addr#1
Addr#2
Addr#3
Addr#2 -1 31
Рис. 3: Детали управления стеком. – Адреса управляются точно ядром Scilab с помощью
32
х
-битных чисел со знаком.
Каждая переменная хранится в виде пары связанных друг с другом заголовка и дан- ных. Это изображено на рисунке
4
, который раскрывает детали заголовка переменной. Сле- дующий исходный код Fortran является типичным кодом первой строки в шлюзе наследия в Scilab. Переменная il содержит адрес начала текущей переменной, скажем x для приме- ра. В действительном исходном коде, мы уже проверили, что текущая переменная является матрицей чисел типа double, то есть, мы уже проверили тип переменной. Затем переменная m устанавливается равной числу строк матрицы, а переменная n — числу столбцов. Нако- нец, переменная it обнуляется, если матрица вещественная, и устанавливается равной 1,
если матрица комплексная (т. e. содержит как вещественную, так и мнимую часть).
m = i s t k ( il +1)
n = i s t k ( il +2)
it = i s t k ( il +3)
10

Как мы можем видеть, мы просто используем такое выражение как il+1 или il+2 для того,
чтобы переместиться от одного адреса к другому, то есть, от одного бита к следующему.
Из-за целочисленной арифметике, используемой в шлюзах на целых числах, таких как il,
мы должны обратить внимание на диапазон значений, которые мы можем достичь этим отдельным типом данных.
Данные
Тип
Число строк
Число столбцов
IsReal
Заголовок
Рис. 4: Детали управления стеком. – Каждая переменная связана с заголовком, который позволяет доступ к данным.
Тип данных integer в Fortran является 32
х
-битным целым числом со знаком. 32
х
- битные целые числа со знаком лежат в диапазоне от −2 31
= −2 147 483 648 до 2 31
− 1 =
2 147 483 647. В ядре Scilab мы не используем отрицательные целые числа, для идентифи- кации адресов внутри стека. Это напрямую подразумевает, что Scilab не может адресовать более 2 147 483 647 байт, т. e. 2,1 ГБ.
Из-за множества шлюзов в Scilab, нельзя непосредственно передать управление па- мятью от стека более динамичному распределению памяти. Это является проектом Scilab версии 6, которая сейчас разрабатывается и появится в следующих годах.
Ограничения, связанные с различными операционными системами анализируются в следующих разделах.
2.2.2
Ограничения памяти в 32
х
- и 64
х
-битных системах
В этом разделе мы анализируем ограничения памяти Scilab версии 5 в зависимости от версии операционной системы, на которой запущен Scilab.
В 32
х
-битных операционных системах память адресуется оперированием 32
х
-битными целыми числами без знака. Следовательно в 32
х
-битной системе мы можем адресовать
4,2 ГБ, то есть 2 32
= 4 294 967 296. В зависимости от конкретной операционной системы
(Windows, Linux) и в зависимости от конкретной версии этой операционной системы (Windows
XP, Windows Vista, версия ядра Linux и т. д.), этот предел может (или не может) быть до- стигнут.
В 64
х
-битных системах память адресуется операционной системой с помощью 64
х
- битными целыми числами без знака. Следовательно, очевидно, что максимально доступная память в Scilab равна 2 64
≈ 1,8 × 10 10
ГБ. Это больше, чем любая доступная физическая память на рынке (на момент написания этой статьи).
Но будь это 32
х
- или 64
х
-битная операционная система, будь это Windows или Linux,
стек Scilab по-прежнему управляется внутри через 32
х
-битные целые числа со знаком. Сле- довательно, можно использовать не более 2,1 ГБ памяти для переменных Scilab, которые хранятся внутри стека.
11

На практике мы можем иметь дело с некоторыми отдельными работами по линейной алгебре или графике в 64
х
-битных системах, которые не работают в 32
х
-битных системах.
Это может быть вызвано временным использованием памяти операционной системы в про- тивовес стеку Scilab’а. Например, разработчик может использовать функции malloc/free вместо использования части стека. Это также может случиться, если память выделена не библиотекой Scilab, а на более низком уровне подбиблиотекой, используемой Scilab’ом. В
некоторых случаях этого достаточно, чтобы заставить файл-сценарий работать в 64
х
-битной системе, в то время как этот же самый файл-сценарий не будет работать в 32
х
-битной си- стеме.
2.2.3
Алгоритм в stacksize
В этом разделе мы представляем алгоритм, используемый функцией stacksize для распределения памяти.
Когда вызывается команда stacksize("max"), мы сначала вычисляем размер текущего стека. Затем, мы вычисляем размер наибольшей области свободной памяти. Если текущий размер стека равен наибольшей области свободной памяти, мы немедленно возвращаемся.
Если нет, то мы устанавливаем размер стека в минимум, который распределяет минимальное количество памяти, которое позволяет сохранить используемую в данный момент память.
Используемые переменные затем копируются в новое пространство памяти, а старый стек перераспределяется. Затем мы устанавливаем размер стека в максимум.
Мы уже видели, что Scilab может адресовать 2 31
≈ 2,1 × 10 9
байт, т. е. 2,1 ГБ памяти.
На практике, это может быть трудно или даже невозможно распределить такое большое количество памяти. Это частично вызвано ограничениями различных операционных систем в которых запущен Scilab, что и анализируется в следующем разделе.
2.3
Список переменных и функция who
Следующая команда показывает поведение функции who, которая показывает текущий список переменных, а также состояние стека.
-->who
Ваши переменные:
WSCI
home scinoteslib modules_managerlib atomsguilib atomslib matiolib parameterslib simulated_annealinglib genetic_algorithmslib umfpacklib fft scicos_autolib scicos_utilslib xcoslib spreadsheetlib demo_toolslib development_toolslib soundlib texmacslib tclscilib m2scilib maple2scilablib compatibility_functilib statisticslib windows_toolslib timelib stringlib special_functionslib sparselib signal_processinglib
%z
%s polynomialslib overloadinglib optimsimplexlib optimbaselib neldermeadlib optimizationlib interpolationlib linear_algebralib jvmlib output_streamlib iolib integerlib dynamic_linklib uitreelib guilib data_structureslib cacsdlib graphic_exportlib datatipslib graphicslib fileiolib functionslib elementary_functionslib differential_equationlib helptoolslib corelib
PWD
%tk
%pvm
MSDOS
%F
%T
%nan
%inf
SCI
SCIHOME
TMPDIR
%gui
%fftw
$
%t
%f
%eps
%io
%i
%e
%pi используются
7936 элементов из
5000000.
12
и
80 переменных из
9231.
Ваши глобальные переменные:
%modalWarning demolist
%driverName
%exportFileName используется
601 елементов из
999.
и
4 переменных из
767.
Все переменные, чьи имена оканчиваются на «lib» (как optimizationlib, например)
связаны с библиотеками внутренних функций Scilab’а. Некоторые переменные, начинаю- щиеся со знака «%», т. е. %i, %e и %pi, связаны с предопределёнными переменными Scilab,
поскольку они являются математическими константами. Другие переменные, чьи имена на- чинаются со знака «%» являются связанными с точностью чисел с плавающей запятой и стандартом IEEE. Эти переменные — %eps, %nan и %inf. Переменные в именами в верхнем регистре SCI, SCIHOME, MSDOS и TMPDIR позволяют создать переносимые файлы-сценарии,
т. е. файлы-сценарии, которые могут выполняться независимо от директории установки или операционной системы. Эти переменные описаны в следующем разделе.
2.4
Переносимость переменных и функций
Есть несколько предопределённых переменных и функций, которые позволяют созда- вать переносимые файлы-сценарии, то есть, файлы-сценарии, которые одинаково хорошо работают в Windows, Linux или Mac. Эти переменные представлены на рисунках
5
и
6
. Эти переменные и функции используются главным образом для создания внешних модулей, но могут быть иметь практическую ценность в широком наборе ситуаций.
SCI
директория, куда установлен Scilab
SCIHOME
директория, в которой находятся пользовательские
MSDOS
истина, если текущая операционная система — Windows
TMPDIR
временная директория для текущей сессии Scilab’а
Рис. 5: Переменные, используемые для переносимости.
[OS,Version]=getos()
имя текущей операционной системы f = fullfile(p1,p2,...)
формирование пути файла из частей s = filesep()
разделитель файлов, зависящий от операционной си- стемы
Рис. 6: Функции, используемые для переносимости.
В следующем примере мы проверяем значения некоторых предопределённых перемен- ных на Linux-машине.
- - > SCI
SCI
=
/ h o m e / m y n a m e / P r o g r a m s / Scilab - 5 . 1 / scilab - 5 . 1 / s h a r e / s c i l a b
- - > S C I H O M E
S C I H O M E
=
/ h o m e / m y n a m e /. S c i l a b / scilab - 5 . 1 13

- - > M S D O S
M S D O S
=
F
- - > T M P D I R
T M P D I R
=
/ tmp / S D _ 8 6 5 8 _
Переменная TMPDIR, которая содержт имя временной директории, связана с текущей сессией Scilab: каждая сессия Scilab имеет уникальную временную директорию.
Временная директория Scilab’а создаётся при запуске Scilab’а (и не уничтожается до са- мого выхода из Scilab). На практике, мы можем использовать переменную TMPDIR в тестовых файлах-сценариях, где мы должны создавать временные файлы. В этом случае файловая система не засоряется временными файлами и гораздо меньше шансов переписать важные файлы.
Мы часто используем переменную SCIHOME для размещения файла .startup на теку- щей машине.
Для того, чтобы проиллюстрировать использование переменной SCIHOME, мы рассмот- рим задачу поиска файла .startup Scilab’а.
Например, мы иногда вручную загружаем некоторые специфичные внешние модули при запуске Scilab’а. Чтобы это сделать, мы вводим команды exec в файл .startup, который автоматически загружается при запуске Scilab’а. Для того, чтобы открыть файл .startup мы можем использовать следующую команду.
e d i t o r ( f u l l f i l e ( SCIHOME , " . s c i l a b " ))
На самом деле, функция fullfile создаёт абсолютное имя директории из директории SCIHOME
до файла .startup. Более того, функция fullfile автоматически использует разделитель директорий, соответствующий операционной системе / для Linux и \ для Windows. Сле- дующий пример показывает результат работы функции fullfile в операционной системе
Windows.
- - > f u l l f i l e ( SCIHOME , " . s c i l a b " )
ans
=
C :\ D O C U M E

1\ R o o t \ A P P L I C 1\ S c i l a b \ scilab -5.3.0 - beta - 2 \ . s c i l a b
Функция filesep возвращает строку, представляющую разделитель директорий в те- кущей операционной системе. В следующем примере мы вызовем функцию filesep в Windows.
- - > f i l e s e p ()
ans
=
\
В Linux-системах, функция filesep вернёт «/».
В Scilab’е есть две возможности, которые позволяют получить имя операционной си- стемы: функция getos и переменная MSDOS. Обе возможности позволяют создавать файлы- сценарии, которые управляют особыми настройками, зависящими от операционной систе- мы. Функция getos позволяет управлять единообразно во всех операционных системах, что ведёт к улучшенной переносимости. Вот почему первым мы выбрали представление этой функции
Функция getos возвращает строку, содержащую имя текущей операционной системы и, по выбору, её версию. В следующем примере мы вызываем функцию getos в Windows
XP.
14

- - >[ OS , V e r s i o n ]= g e t o s ()
V e r s i o n
=
XP
OS
=
W i n d o w s
Функция getos может быть обычно использована в командах select, как показано ниже.
OS = g e t o s ()
s e l e c t OS
c a s e " W i n d o w s " t h e n d i s p ( " S c i l a b on W i n d o w s " )
c a s e " L i n u x " t h e n d i s p ( " S c i l a b on L i n u x " )
c a s e " D a r w i n " t h e n d i s p ( " S c i l a b on M a c O s " )
e l s e e r r o r ( " S c i l a b on U n k n o w n p l a t f o r m " )
end
Обычное использование переменной MSDOS представлено на следующем примере.
if ( M S D O S ) t h e n
// команды Windows e l s e
// команды Linux end
На практике рассмотрим ситуацию, где мы хотим вызвать внешнюю программу с максимально возможной переносимостью. Предположим, что под Windows эта программа файлом-сценарием «.bat», под Linux эта программа вызывается скриптом «.sh». В данном случае мы могли бы написать файл-сценарий, используя переменную MSDOS и функцию unix,
которая выполняет внешнюю программу. Несмотря на своё имя, функция unix работает оди- наково под Linux и Windows.
if ( M S D O S ) t h e n u n i x ( " m y p r o g r a m . bat " )
e l s e u n i x ( " m y p r o g r a m . sh " )
end
Предыдущий пример показывает, что можно написать переносимую Scilab-программу,
которая работает одинаково в разных операционных системах. Может возникнуть более сложная ситуация, поскольку часто случается, что путь, ведущий к программе, также зави- сит от операционной системы. Другая ситуация состоит в том, что когда мы хотим скомпи- лировать исходный код при помощи Scilab, используя, например, функции ilib_for_link или tbx_build_src. В этом случае мы хотели бы передать компилятору некоторые особен- ные опции, которые зависят от операционной системы. Во всех этих ситуациях переменная
MSDOS позволяет сделать единый исходный код, который остаётся переносимым в различных системах.
Переменная SCI позволяет вычислить пути относительно текущей установки Scilab.
Следующий пример демонстрирует образец использования этой переменной. Сначала мы получаем путь макроса, указанного Scilab’ом. Затем объединяем переменную SCI с относи- тельным путём до файла и передаём это в функцию ls. Наконец, мы конкатенируем пере- менную SCI со строкой, содержащей относительный путь до файла-сценария и передаём это
15
в функцию editor. В обоих случаях команды не зависят от абсолютного пути до файла,
что делает их более переносимыми.
- - > g e t _ f u n c t i o n _ p a t h ( " n u m d i f f " )
ans
=
/ h o m e / m y n a m e / P r o g r a m s / Scilab - 5 . 1 / scilab - 5 . 1 / . . .
s h a r e / s c i l a b / m o d u l e s / o p t i m i z a t i o n / m a c r o s / n u m d i f f . sci
- - > ls ( f u l l f i l e ( SCI , " / m o d u l e s / o p t i m i z a t i o n / m a c r o s / n u m d i f f . sci " ))
ans
=
/ h o m e / m y n a m e / P r o g r a m s / Scilab - 5 . 1 / scilab - 5 . 1 / . . .
s h a r e / s c i l a b / m o d u l e s / o p t i m i z a t i o n / m a c r o s / n u m d i f f . sci
- - > e d i t o r ( f u l l f i l e ( SCI , " / m o d u l e s / o p t i m i z a t i o n / m a c r o s / n u m d i f f . sci " ))
В общих ситуациях часто кажется, что проще писать файл-сценарий только для кон- кретной операционной системы, поскольку она единственная, которую мы используем в дан- ный момент. В этом случае мы склонны использовать инструменты, которые недоступны для других операционных систем. Например, мы можем полагаться на особое расположение фай- ла, который может быть найден только в Linux. Или мы можем использовать какую-нибудь консоль, зависящую от операционной системы, или инструкции управления файлами. В ко- нечном счёте, полезный файл-сценарий имеет высокую вероятность быть использованным в операционной системе, которая не была первичной целью исходного автора. В данной си- туации тратится много времени, чтобы обновить файл-сценарий так, чтобы он заработал на новой платформе.
Поскольку Scilab сам по себе является переносимым языком, то в большинстве случа- ев было бы неплохо подумать о том, как этот файл-сценарий будет переноситься прямо с начала разработки. Если есть действительно трудный или неизбежный пункт, то, конечно,
разумно снизить переносимость и просто решить задачу так, чтобы сократить разработку.
На практике такое случается не так часто, как кажется, так что обычное правило состоит в том, чтобы писать код как можно более переносимым.
2.5
Уничтожение переменных : clear
Переменная может быть создана по желанию, когда она потребуется. Она также может быть уничтожена напрямую с помощью функции clear, когда в ней больше не нужды. Это может быть полезным, когда большая матрица хранится в данный момент в памяти и если память становится проблемой.
В следующем примере мы определим большую матрицу случайных чисел A. Когда мы попытаемся определить вторую матрицу B, то видим, что нет больше памяти. Следователь- но, мы используем функцию clear для уничтожения матрицы A. Тогда мы можем создать матрицу B.
- - > A = ra n d ( 2 0 0 0 , 2 0 0 0 ) ;
- - > B = ra n d ( 2 0 0 0 , 2 0 0 0 ) ;
! - - e r r o r 17
r a n d : Превышен допустимый размер стека
(используйте функцию stacksize для его увеличения).
- - > c l e a r A
- - > B = ra n d ( 2 0 0 0 , 2 0 0 0 ) ;
Функцию clear следует использовать только по необходимости, то есть, когда вычисле- ние не может быть выполнено из-за памяти. Это предупреждение верно для разработчиков,
которые используют компилируемые языки, где памятью управляют напрямую. В языке
Scilab’а память управляется Scilab’ом и, вообще, нет причин управлять ею самостоятельно.
16

Родственной темой является управление переменными в функциях. Когда тело функ- ции выполнилось интерпретатором, все переменные, которые были использованы в теле, и которые не являются выходными аргументами, автоматически удаляются. Следовательно нет нужды напрямую вызывать функцию clear в этом случае.
2.6
Функции type и typeof
Scilab может создавать различные типы переменных, такие как матрицы, полиномы,
1   2   3   4   5   6   7   8   9   ...   13


написать администратору сайта