• Artykuły
  • Forum
  • Ciekawostki
  • Encyklopedia
  • Kod bajtowy Perla

    Przeczytaj także...
    Perl – interpretowany język programowania autorstwa Larry’ego Walla początkowo przeznaczony głównie do pracy z danymi tekstowymi, obecnie używany do wielu innych zastosowań. Wzorowany na takich językach jak C, skryptowe: sed, awk i sh oraz na wielu innych.Kod bajtowy (ang. bytecode) – nazwa reprezentacji kodu używanej przez maszyny wirtualne oraz przez niektóre kompilatory. Kod składa się z ciągu instrukcji (których kody operacji mają zwykle długość jednego bajta, stąd nazwa), które nie odpowiadają bezpośrednio instrukcjom procesora i mogą zawierać instrukcje wysokiego poziomu (takie jak np. stwórz obiekt klasy X, połącz dwa łańcuchy itd.), jednak w przeciwieństwie do kodu źródłowego wymagają analizy tylko pojedynczych poszczególnych operacji.
    Maszyna stosowa to maszyna (procesor bądź maszyna wirtualna), w której podstawowe operacje prowadzi się na stosie, nie zaś na rejestrach.

    Kod bajtowy Perla używany w Perlu 5 jest maszyną stosową z operacjami umiarkowanie wysokiego poziomu. Perl 6 używać będzie maszyny wirtualnej Parrot.

    Wynikiem kompilacji:

    print "Hello, world!\n";
    

    jest następujący bytecode:

    OP     enter
    COP    nextstate
    OP     pushmark
    SVOP   const PV "Hello, world!\n"
    LISTOP print
    LISTOP leave
    

    Klasy opcodów[ | edytuj kod]

    Opcody są pogrupowane w kilka klas zależnie od tego na jakich argumentach działają. Klasy te to:

    Działanie dwuargumentowe a. binarne – w algebrze działanie algebraiczne o argumentowości równej 2, czyli funkcja przypisująca dwóm elementom inny; wszystkie elementy mogą pochodzić z innych zbiorów.
  • OP – ogólna klasa,
  • COP – informacja dla debugera,
  • SVOP – operacje na skalarach,
  • PADOP,
  • UNOP – operacje unarne,
  • LOGOP – operacje logiczne (sterujące),
  • BINOP – operacje binarne,
  • LISTOP – operacje działające na listach,
  • PMOP – operacje na wyrażeniach regularnych,
  • LOOPOP – operacje pętli,
  • Stos[ | edytuj kod]

    Stos nie zawiera obiektów, a jedynie wskaźniki do nich.

    Żeby wywołać operacje unarną lub binarną umieszczamy jej argumenty na stosie i wywołujemy ją.

    Na przykład operacja unarna UNOP negate pobierze najwyższy element ze stosu i wstawi na stos jego zanegowaną wartość, operacja binarna BINOP add pobierze dwa najwyższe elementy ze stosu i wstawi ich sumę.

    Żeby wywołać operację wymagającą większej ilości argumentów:

  • zaznaczamy za pomocą OP pushmark, że zaczyna się nowa ramka stosu,
  • umieszczamy na stosie wszystkie argumenty zaczynając od pierwszego,
  • wywołujemy odpowiednią operację (np. LISTOP print), lub umieszczamy na stosie adres funkcji do wywołania (PADOP gv GV *foo), po czym ją wywołujemy za pomocą UNOP entersub.
  • Przykład wywołania $x = "Hello, world!\n":

    COP    nextstate
    SVOP   const PV "Hello, world!\n"
    PADOP  gvsv GV *x
    BINOP  sassign
    

    Przykład wywołania $x = -$y:

    PADOP  gvsv GV *y
    UNOP   negate
    PADOP  gvsv GV *x
    BINOP  sassign
    

    Przykład wywołania $x = $y + $z:

    PADOP  gvsv GV *y
    PADOP  gvsv GV *z
    BINOP  add
    PADOP  gvsv GV *x
    BINOP  sassign
    

    Przykład wywołania print(1,2,3):

    OP     pushmark
    SVOP   const IV 1
    SVOP   const IV 2
    SVOP   const IV 3
    LISTOP print
    

    Przykład wywołania foo(1,2,3):

    COP    nextstate
    OP     pushmark
    SVOP   const IV 1
    SVOP   const IV 2
    SVOP   const IV 3
    PADOP  gv GV *foo
    UNOP   entersub
    

    Operacje na zmiennych skalarnych[ | edytuj kod]

    Opcode PADOP gvsv umieszcza na stosie adres zmiennej.
    Opcode SVOP const umieszcza na stosie stałą.

    Opcode BINOP sassign przypisuje zmiennej, odnośnik do której adres znajduje się na najwyższej pozycji stosu. Adres zostaje zdjęty ze stosu, ale wartość zostaje.

    Przykład wywołania $x = $y:

    PADOP gvsv  GV *y
    PADOP gvsv  GV *x
    BINOP sassign
    

    Przykład wywołania $x = $y = $z:

    PADOP  gvsv GV *z
    PADOP  gvsv GV *y
    BINOP  sassign
    PADOP  gvsv GV *x
    BINOP  sassign
    

    Operacje na liczbach[ | edytuj kod]

    Podstawowe operacje arytmetyczne to:

    Operatory ++ i -- działają też na łańcuchach. Wersje pre- i post- różnią się tym, co zostaje na stosie.

    Operacje na łańcuchach znaków[ | edytuj kod]




    w oparciu o Wikipedię (licencja GFDL, CC-BY-SA 3.0, autorzy, historia, edycja)

    Reklama

    Czas generowania strony: 0.009 sek.