Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования (и ОС) ФОРТ (FORTH) S022: Переменные


Информационный Канал Subscribe.Ru

S022: Переменные

--------------------------------------------------------------------------------
Для хранения данных используются переменные. В зависимости от языка и от типа
данных, которые в них хранятся, они могут иметь самую различные варианты расположения
в памяти. Тип переменной -- тип данных, которая она может хранить. 
Самый простой тип переменной -- целое: 

Форт: 

VARIABLE speed

C(++) 
int speed;

При описании переменных перед именем переменной нужно указывать ее тип. Для целых
переменных также указывается, что переменная без знака unsigned int или со знаком
signed int. Если используется просто int, по умолчанию считается что переменная
является signed int. При описании переменной можно указать ее начальное значение:

unsigned int mass=12;

Если выша программа выдает странные значения при вычислениях, посмотрите не используете
ли вы неинициализированные переменные (они имеют неопределенные значения). 
Python: 

speed=123;

Python создает переменные при их первой инициализации. Python использует переменные
с динамической типизацией -- тип задается типом значения, которое присваивается
переменной. 
При компиляции с Форта и С(++) для переменной speed в памяти выделяется машинное
слово (несколько байт), и при использовании speed в выражениях языка оно заменяется
на адрес этой области памяти. 

Аналогично устроены float переменные: 

Форт: 

FVARIABLE speed     \ Форт должен поддерживать набор слов FLOAT

C(++) 
float speed;

Python: 
speed=12.3e3;

Для строковых переменных все намного сложнее: их размещение в памяти зависит
от языка и версии компилятора. 


Программа для решения линейного уравнения
C(++) 


#include 
#include 

// программа для решения линейного уравнения
// a * x + b = 0

// значения коэффициентов зададим через глобальные переменные:

float a = 1.2e3;
float b = 4.5e6;

int main()
{
// результат запишем в локальную (внутри функции main)
     float x;
// вычисляем x:
     x = -b/a;
// выводим результат:
     printf("\n%e * x = %e\nx = %e\n",a,b,x);
// выходим в ОС из функции main()
     return 0;
}

Python 


# программа для решения линейного уравнения
# a * x + b = 0

# значения коэффициентов зададим через переменные:

a = 1.2e3
b = 4.5e6

# вычисляем x с автоматическим созданием переменной

x = -b/a;

# выводим результат:

print a," * x = ",b
print 'x = ',x

Так как Форт язык низкоуровневый, использование переменных более многословно.
Не стоит также забывать, что многие Форты не поддерживают плавающую точку, поэтому
пример будет работать только на целых числах: 
\ программа для решения линейного уравнения в целых числах (для Форта)
\ a * x + b = 0

\ значения коэффициентов зададим через переменные:

VARIABLE a     \ создаем переменную: слово а ( -- addr ) при выполнении
               \ положит на стек адрес памяти, выделенный под переменную

               \ инициализируем переменную a
12 ( -- 12 )
a  ( 12 -- 12 addr )
!  ( 12 addr -- )
               \ слово ! ( n addr -- ) берет со стека адрес переменной,
               \ число, и записывает число по этому адресу в память

VARIABLE b     \ инициализируем переменную b
45 b !

\ вычисляем x

VARIABLE x

               \ читаем значение переменной b из памяти

b ( -- b.addr )
  ( b-addr -- b.value )

               \ слово @ ( addr -- n ) берет со стека адрес переменной
               \ в памяти и читает из памяти на стек значение переменной

               \ читаем значение a

a ( b.value -- b.value a.addr )
  ( b.value a.addr -- b.value a.value )

               \ выполняем деление b/a

/ ( b.value a.value -- b/a )

               \ инвертируем знак

NEGATE ( b/a -- -b/a )

               \ записываем результат в x

x !    ( -b/a x.addr -- )

\ выводим результат:

a @ .
 .( * x = )     \ используем слово .( примечание ) печатающее текст до )
b @ .
CR             \ конец строки
 .( x = )
x @ .
CR

BYE

Как видно из этого примера, язык Форт позволяет использование переменных, но
при этом код оказывается "развесистым", и при большом объеме вычислений медленным.
Если вы пишете программы на Форте, старайтесь пользоваться стеком и минимумом
переменных: 
# то же пример без использования переменных (только стек)

12 45     ( a b )   \ кладем на стек a, потом b (b оказывается на вершине)
SWAP      ( b a )   \ меняем числа местами
/         ( b/a )   \ делим словом / ( n1 n2 -- n1/n2 )
NEGATE    ( -b/a )  \ меняем знак
 . CR      ( )       \ выводим результат
BYE

Если вам нужно решить несколько тысяч таких уравнений, определим новое слово
lineq. ( a b -- ), которое будет брать со стека параметры a и b и печатать решение
уравнения: 
\ определяем слово

: lineq. ( a b -- )
\ вывести решение уравнения a * x = b , взяв a и b со стека
     SWAP / NEGATE . CR
;

\ решаем кучу уравнений

12 34 lineq.
56 78 lineq.
 ...
1912 -381 lineq.

BYE

PS: более подробно стек описан далее 

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.forth
Отписаться
Вспомнить пароль

В избранное