Parrot- Примеры



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

Классический hello!

Создайте файл hello.pir, содержит следующий код:

.sub _main
   print "Hello world!\n"
   end
.end

Затем запустите его путем ввода:

parrot hello.pir

Как ожидается, это будет отображать текст 'Hello world!' на консоли, после чего новая линия (из-за \n).

В этом примере, приведенном выше, ' .sub _main", говорится, что инструкции в подпрограмм с именем '_main", до тех пор пока не будет "конец",. Во второй строке содержатся инструкции по печати. В этом случае, мы называем его вариант инструкции, которые принимает строковая константа. Ассемблер заботится о решении о том, какой вариант инструкции для использования для нас. Третья строка содержит "конец", инструкцию, которая приводит к тому, что переводчик прекратить.

С помощью регистров

Мы можем изменить hello.pir для первого магазина строки Hello world! \n в регистр и затем использовать регистр с распечатать инструкции.

.sub _main
   set S1, "Hello world!\n"
   print S1
   end
.end

Здесь мы уже точно, для использования. Вместе с тем, при замене S1 с $S1 мы может делегировать выбор зарегистрируйтесь, чтобы использовать для попугаев. Можно также использовать = обозначение записи набор инструкций.

.sub _main
   $S0 = "Hello world!\n"
   print $S0
   end
.end

Сделать pir даже более читаемым, под названием регистры могут быть использованы. Это позже сопоставлены с реальным номером регистров.

.sub _main
   .local string hello
   hello = "Hello world!\n"
   print hello
   end
.end

' .local' директива указывает на то, что с именем регистра требуется только внутри текущего сбора группы (то есть, между .sub и .). После ' .local' - это тип. Это может быть int (для I регистров), float (для N регистров), string (для S-регистров), PMC (для P регистров) или имя PMC типа.

Подводя итоги квадратов

Этот пример представляет некоторые дополнительные инструкции и pir синтаксис. Линий, начиная с # приведены в комментарии.

.sub _main
   # State the number of squares to sum.
   .local int maxnum
   maxnum = 10

   # Some named registers we'll use. 
   # Note how we can declare many
   # registers of the same type on one line.
   .local int i, total, temp
   total = 0

   # Loop to do the sum.
   i = 1
   
loop:
   temp = i * i
   total += temp
   inc i
   if i <= maxnum goto loop

   # Output result.
   print "The sum of the first "
   print maxnum
   print " squares is "
   print total
   print ".\n"
   end
.end

Пассивный инфракрасный датчик обеспечивает бит синтаксическом сахара, который делает его более высокого уровня, чем ассамблеи. Например:

temp = i * i

- Это еще один способ написания более - кора:

mul temp, i, i

И:

if i <= maxnum goto loop

Такая же, как:

le i, maxnum, loop

И:

total += temp

Такая же, как:

add total, temp

Как правило, в тех случаях, когда Parrot инструкция изменяет содержимое регистра, это будет первое регистра при записи инструкция в виде.

Как это обычно бывает в языках, циклы и выборок, выполнены в рамках условных филиал заявления и этикетки, как показано на рисунке выше. Ассамблеи программирование - это одно из тех мест, где с помощью goto не плохой форме!

Числа Фибоначчи

Фибоначчи в серии определяется так: два номера, 1 и 1. Затем неоднократно добавить вместе последние два номера в серии следующий: 1, 1, 2, 3, 5, 8, 13, и так далее. В число Фибоначчи FIB(n) - n-й номер в серии. Здесь простая попугаев ассемблер программа, которая находит первый 20 чисел Фибоначчи.

# Some simple code to print some Fibonacci numbers

        print   "The first 20 fibonacci numbers are:\n"
        set     I1, 0
        set     I2, 20
        set     I3, 1
        set     I4, 1
        
REDO:   eq      I1, I2, DONE, NEXT

NEXT:   set     I5, I4
        add     I4, I3, I4
        set     I3, I5
        print   I3
        print   "\n"
        inc     I1
        branch  REDO
DONE:   end

Это эквивалентно код в Perl:

print "The first 20 fibonacci numbers are:\n";

my $i = 0;
my $target = 20;
my $a = 1;
my $b = 1;

until ($i == $target) {
   my $num = $b;
   $b += $a;
   $a = $num;
   print $a,"\n";
   $i++;
}

ЗАМЕТКА: в качестве штрафа интерес, один из самых коротких и, безусловно, самый красивый пути печать серии Фибоначчи в Perl, perl -le ' $b= 1; print $a+ = $b во время печати $b = $a'.

РЕКУРСИВНО вычислений Чернова

В этом примере мы определить Чернова функции и рекурсивно вызвать для вычисления Чернова.

.sub _fact
   # Get input parameter.
   .param int n

   # return (n > 1 ? n * _fact(n - 1) : 1)
   .local int result

   if n > 1 goto recurse
   result = 1
   goto return

recurse:
   $I0 = n - 1
   result = _fact($I0)
   result *= n

return:
   .return (result)
.end


.sub _main :main
   .local int f, i

   # We'll do factorial 0 to 10.
   i = 0
   
loop:
   f = _fact(i)

   print "Factorial of "
   print i
   print " is "
   print f
   print ".\n"

   inc i
   if i <= 10 goto loop

   # That's it.
   end
.end

Рассмотрим _fact sub первым. На что он обошел молчанием ранее, почему имена подпрограмм, все начать с подчеркивания! Это просто показывает, что этикетка - международные, а не оплачивается в частности подпрограмм. Это имеет важное значение в качестве метки, затем отображается для других подпрограмм.

В первой строке, .param int n, указывает на то, что эта подпрограмма принимает одно целое значение параметра и что мы хотели бы сослаться на регистра, оно прошло в название n для остальных.

Многое из того, что следующим образом видели в предыдущих примеров, за исключением из строки следующего содержания:

result = _fact($I0)

Это одна линия pir фактически представляет собой довольно несколько строк PASM. Во-первых, значение в регистр $I0 в соответствующий регистр для того, чтобы рассматривать как целое значение параметра в _fact функции. Вызовов, связанных с регистрами, а затем настроить, после чего _fact. Затем, после того как _fact возвращает значение, возвращаемое _fact помещается в регистр имя результата.

Право до .конец _fact sub, .вернуться директива используется для обеспечения значение регистра; назвал результат помещается в соответствующий регистр для того, чтобы рассматриваться как вернуть значение код вызова.

Вызов на _fact в основном работает точно так же, как в рекурсивный вызов _fact в рамках подпрограмм _fact. Остается только один бит новый синтаксис :главный, после .sub _main. По умолчанию, pir предполагает, что исполнения начинается с первой подпункта в файле. Такое поведение может быть изменено путем маркировки sub для запуска в с :main.

Сбор для PBC

Для компиляции pir для Android, используйте флаг -o и выходной файл с расширением .PBC.

parrot -o factorial.pbc factorial.pir

PIR по сравнению с PASM

pir может быть превращен в PASM, работающем двигателе:

parrot -o hello.pasm hello.pir

В PASM на заключительный пример выглядит так:

_main:
   set S30, "Hello world!\n"
   print S30
end

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

Advertisements