# Parrot virtual machine

Parrot era un progetto open source volto a creare una macchina virtuale progettata specificamente per eseguire linguaggi di programmazione dinamici in modo efficiente. A differenza di molte altre macchine virtuali basate sullo stack, Parrot utilizzava un'architettura a registri, che offriva maggiore flessibilità e potenziali vantaggi in termini di prestazioni. Parrot compilava il codice sorgente dei linguaggi di programmazione in un bytecode intermedio (PIR), che veniva poi eseguito dalla macchina virtuale. Parrot era un software open source rilasciato sotto licenza artistica 2.0.
Parrot è stato un progetto nato e sviluppato principalmente dalla comunità Perl ma che nel tempo ha saputo attrarre a sé molti altri sviluppatore della comunità open source. La licenza artistica 2.0 è stata adottata principalmente per ragioni legate alla necessità di bilanciare gli interessi degli autori con quelli della comunità di sviluppatori e utenti. La piattaforma era compatibile con un'ampia gamma di sistemi e con la maggior parte dei processori moderni. La sua flessibilità e le sue caratteristiche avanzate lo rendevano un'ottima scelta per linguaggi come Raku. Era però in grado di supportare altri linguaggi dinamici come Python, Ruby, PHP e molti altri.
La versione 1.0, con un'API (Application programming interface) stabile per lo sviluppo, è stata rilasciata il 17 marzo 2009. L'ultima versione è la release 8.1.0 "Andean Parakeet".
Parrot è stato ufficialmente interrotto nell'agosto 2021, dopo essere stato soppiantato da MoarVM nel suo utilizzo principale (Raku) e non essere mai diventato una VM mainstream per nessuno degli altri linguaggi supportati.

## Linguaggi interni a Parrot

Esistono tre forme di codice programma in Parrot:
* Bytecode: codice binario interpretato nativamente da Parrot. Il bytecode viene solitamente memorizzato in file con l'estensione ".pbc".
* Parrot Assembly Language (PASM): linguaggio di basso livello che veniva compilato in bytecode. Il codice PASM viene solitamente memorizzato in file con l'estensione ".pasm".
* Parrot intermediate representation (PIR): PIR si colloca a un livello più alto rispetto a PASM, offrendo un'interfaccia più intuitiva e vicina a linguaggi di programmazione ad alto livello ed è più facile da leggere e comprendere rispetto al codice PASM. Anch'esso viene compilato in bytecode per essere eseguito. Il codice PIR viene solitamente memorizzato in file con l'estensione ".pir".

## Esempi
### Registri

Parrot è una macchina virtuale basata sui registri. Questo lo avvicina concettualmente al modello delle moderne CPU più che al modello delle virtual machine basate su stack. Parrot fornisce quattro tipi di registri:
* I: Tipo intero nativo
* N: Numeri in virgola mobile
* S: Registri tipo stringa avanzati con supporto Unicode
* P: PMC o contenitore polimorfico: tipo di oggetto Parrot
A differenza di molte altre architetture, Parrot non impone un numero fisso di registri che possono essere utilizzati in un programma ma sarà il compilatore ad assegnare un numero qualsiasi di registri a una subroutine, a seconda delle sue esigenze specifiche.

### Operazioni aritmetiche

In PASM
In PIR

## mod_parrot

mod_parrot è un modulo opzionale per il server web Apache che crea un ponte per la Parrot Virtual Machine (PVM) direttamente all'interno di un ambiente web. In questo modo il codice Parrot esegue le sue operazioni e genera la risposta HTTP che verrà inviata al client.