Parrot программирование на языке программирования и вы получите возможность работать на более низком уровне. Здесь приведен список примеры программирования вам о различных аспектах попугаев программирования.
Создайте файл 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.
Для компиляции pir для Android, используйте флаг -o и выходной файл с расширением .PBC.
parrot -o factorial.pbc factorial.pir
pir может быть превращен в PASM, работающем двигателе:
parrot -o hello.pasm hello.pir
В PASM на заключительный пример выглядит так:
_main: set S30, "Hello world!\n" print S30 end
PASM не распределение регистров или оказания поддержки для названных реестров. Он также не имеет .sub и .целью директивы, вместо того чтобы с их заменой на этикетке в начале инструкции.