Porto ja uns quants anys seguint el desenvolupament del perl6, encara que molt per sobre, pero ultimament el desenvolupament s'ha animat i estic més al tanto, sobretot en quant al
parrot.
Per explicar-ho aixi rapidament...
parrot es una maquina virtual CISC pensada per executar Perl6 i Python3k a sobre, entre d'altres llenguatges interpretats, la idea va sorgir un d'1 d'abril amb una conya d'ajuntar perl i python en un sol llenguatge.
Doncs sembla que aquesta mescla morbosa va causar més ganes als perleros que als de python, aixi que va començar el projecte
parrot (fent honor al sketch dels monty python), amb anims de crear una maquina virtual per a llenguatges interpretats.
Una cosa molt interessant del parrot i que em va agradar MOLT desde el principi, es que s'esta prenent el desenvolupament amb molta calma i molt de catxondeo, i escollint l'ensamblador com a eina base de desenvolupament.
A
perl6.org trobareu l'
Apocalypse, l'
Exegesis i els
Synopsis. Que són textes
/sagrats/ que surten cada cert temps explicant l'estat de les decissions i canvis en el desenvolupament de perl6.
* L'
Apocalypsis son uns textos on s'expliquen els canvis en la sintaxi del nou llenguatge, debatint totes les possibilitats i explicant les diferentes formes i ventatges de fer certes coses en perl.
* L'
Exegesis preten explicar els canvis de forma més pràctica a base d'exemples.
* Els
Synopsis son apunts importants en forma de resum de l'Apocalypsis
Tot plegat crea una atmosfera un pel biblica i es que no es per menys...perl arriba a la versió 6, un numero amb moltes connotacions mistiques i esoteriques.
El Lloro
Tornant a la part interessant...Parrot es una maquina virtual molt interessant, força semblant a la de microsoft, pero molt més simple de concepte, amb accés a bindings natius, threads, sockets, arrays, hashes, registres, etc.
Els opcodes de l'ensamblador estan en un estat força estable, aixi que ja es possible desenvolupar aplicacions en ensamblador per parrot

i la veritat es que es un ensamblador força maco. L'interficie a llibreries natives sembla que canviarà per utilitzar libffi, aixi que es millor no llençar-se a fer coses grosses natives.
Part dels features de perl6 estan pensats desde la base de parrot, com la capacitat per definir un tipus de variable, per tal d'optimitzar l'execució i facilitar la compilació nativa.
Parrot permet executar 3 tipus de formats i permet generar-ne 4. Anem a veurel's:
*
PASM: Parrot assembly file. Must contain just parrot assembly.
*
PIR: Parrot Intermediate Representation -- Es una representació de mig nivell de l'ensamblador de parrot (pasm).
*
PBC: Parrot ByteCode. The internal representation of opcodes.
El PIR
El PIR, ens permet fer coses com definir noms de variables a registres, utilitzar signes com '=', '+', enlloc de fer server opcodes (add, sub, inc, ...), obliga a ordenar el codi per moduls, en general el principal es: '.sub main :main'.
El codi de mossegades del lloro (PBC)The parrot bytecode
El PBC el genera parrot cada cop que s'executa, per tant ens estalviem el pas de parsejar el format del fitxer .pasm si executem un .pbc directament. Aquest codi PBC es l'intern utilitzat pel JIT per generar el codi natiu, aixi que podem fer una cosa aixi:
console:
$ cat hello.pasm
print "Hello World\n"
end
$ parrot hello.pasm
Hello World!
$ parrot -o hello.pbc hello.pasm
$ parrot -o hello.o hello.pbc
Com podeu veure a partir del PBC podem generar un fitxer objecte que podem utilitzar per linkar contra el exec_start.c i linkant contra la libparrot i tenir un executable parrot compilat natiu:
console:
$ gcc hello.o exec_start.c -lparrot -L/usr/pkg/lib -Wl,-R/usr/pkg/lib -I/usr/pkg/include
Tipus de registres de la VM
Tipus de registres de la maquina virtual:
* Integer (I# registers) -- nombres enters.
* Number (N# registers) -- nombres reals.
* String (S# registers) -- strings.
* PMC (P# registers) -- Parrot Magic Cookies. (arrays, hash, ..)
El nombre de registres habilitats en el 'processador' es defineix a l'hora de compilar.
S'ha mantingut l'us de la documentació POD en els fitxers de sources i els comentaris segueixen essent amb coixinets '#'.
Tot s'ha de dir que la barreja morbosa de perl i ensamblador m'encanta x) Fa un temps vaig començar a escriure una maquina virtual propia amb certes caracteristiques com vector d'interrupcions crides a simbols natius com a syscalls internes de la cpu, etc. La idea era la de crear una maquina virtual prou simple com per permetre la comunicació entre fils, processos i maquines de forma transparent permetent una programació en ensamblador agradable. Tinc els sources porai encara que de moment només tinc el nop i el jmp implementats

.
Anem a veure alguns exemples amb parrot:
console:
=head1 NAME
counter - Shows the numbers from 1 to 10
=cut
set I1, 1
print "("
_loop:
print I1
eq I1, 10, _eof
print ","
inc I1
branch _loop
_eof:
print ")\n"
end
Aqui pastejo una implementació del cat en parrot extret dels exemples:
console:
getstdin P0
getstdout P1
REDO:
readline S0, P0
print S0
if S0, REDO
end
Com podem veure els arguments son passats a l'inici d'execució en el PMC, i podem veure com fa un salt condicional. La veritat es que els opcodes són força xulos
The perl6
Parrot es més una palla mental a llarg terme que una implementació de perl6 funcional, aixi que han sortit una pila de projectes que implementen perl6 escrits en d'altres llenguatges:
Aqui podeu trobar una llista amb totes les implementacions.
Pugs és la més complerta i està escrita en haskell.
També hi ha el PIL2JS (perl6 escrit en javascript), PILRUN (escrit en perl5) i JSPERL que es perl6 escrit en javascript interpretat per perl5
Trashing hardware
Els dilluns són dies de recollida de trastos, i tot encaixant l'efemeride amb la sortida de nadal, podem trobar-nos pels contenidors gran quantitat de hardware interessant.
Mon pare es va trobar una bona pila de hardware, entre ell, un portatil ThinkPad, un pel vell, pero que amb una bateria d'alarma l'alimenta per 5h

.
És un 380ED, usease un pentium 166 amb 16 MB de ram (1M compartit amb la ) totalment suportat per sistemes *nix lliures, pero que mon pare vol mantenir-lo amb w95, que tot s'ha de dir que 'funciona' prou rapid, encara que tard o d'hora m'agradaria posar-li un Xfce amb Thunar, pero d'aqui a que surti estable... hehe.
Ara tic intentant trobar alguns conectors per les PCMCIAs de ethernet i winmodem ja que tinc les tarjes..pero sense l'adaptador a rj11 / rj45 no faig gaire. (si algu te un adaptador per una OlicomGocardEthernet o una USRoboticsSportsterWindmodem..digueu-me algo plz.
Gnome 2.12.2
Aquest cap de setmana va petar de gust el gnome de la bare, vaig actualitzar libpoppler i resulta que havia canviat l'API i el evince renderitzava tots els PDFs en negre, aixi que per recompilar el evince vaig haver de recompilar la resta de paquets, ja que a pkgsrc havien pujat a Gnome 2.12.2 (i properes 2.12.1

).
La veritat es que el 2.12.2 es la versió més estable, funcional i usable que he probat fins ara..realment impressionant

.
Ja de pas vaig empaquetar el gksu junt amb libgksu i libgksuui, aquests paquets estan ja pujats a -wip, espero que pel proxim release estable de pkgsrc estigui ja integrat dins del gnome meta-pkg, ja que funciona de puta mare.
Pkgsrc patch
He escrit un pegat pel bsd.pkg.mk de pkgsrc per poder fer upgrades massius sense haver d'estar davant de la pantalla, es un petit hack, pero força util, de fet ja ho vaig implementar fa uns anys i no me'l van acceptar, espero que amb un nou target i usant mk.conf la nova variable "REPLACE_ALL":
console:
--- bsd.pkg.mk 12 Jan 2006 23:43:56 -0000 1.1788
+++ bsd.pkg.mk 17 Jan 2006 15:00:37 -0000
@@ -58,6 +58,7 @@
# Transform package Makefile variables and set defaults
############################################################################
+REPLACE_ALL?= NO
CHECK_SHLIBS?= YES # run check-shlibs after install
CLEANDEPENDS?= NO
DEINSTALLDEPENDS?= NO # add -R to pkg_delete
@@ -2053,7 +2054,13 @@
. endif # CONFLICTS
${_PKG_SILENT}${_PKG_DEBUG} \
found="`${PKG_BEST_EXISTS} \"${PKGWILDCARD}\" || ${TRUE}`"; \
- if < "$$found" != "" >; then \
+ if < "$$found" != "" >; then \
+ if < "$$REPLACE_ALL" = "YES" >; then \\
+ ${ECHO_MSG} "***" \
+ ${ECHO_MSG} "*** Automatic replace in process..."\
+ ${ECHO_MSG} "***" \
+ ${MAKE} replace \
+ else \
${ECHO_MSG} "${_PKGSRC_IN}> $$found is already installed - perha ps an older version?"; \
${ECHO_MSG} "*** If so, you may use either of:"; \
${ECHO_MSG} "*** - \"pkg_delete $$found\" and \"${MAKE} reinsta ll\" to upgrade properly"; \
@@ -2061,6 +2068,7 @@
${ECHO_MSG} "*** - \"${MAKE} replace\" to replace only the pack age without re-linking"; \
${ECHO_MSG} "*** dependencies, risking various problems."; \
exit 1; \
+ fi \
fi
.endif # !NO_PKG_REGISTER & !NO_FORCE_REGISTER & overwrite
.if ${PKG_INSTALLATION_TYPE} == "pkgviews"
@@ -2645,6 +2653,12 @@
replace: ${_PKGSRC_BUILD_TARGETS} real-replace
.endif
+.PHONY: replace-all
+.if !target(replace-all)
+REPLACE_ALL=YES
+replace-all: ${_PKGSRC_BUILD_TARGETS} real-replace
+.endif
+
.PHONY: undo-replace
.if !target(undo-replace)
undo-replace: real-undo-replace
Si voleu probar-lo, simplement apliqueu el pegat contra el bsd.pkg.mk de /usr/pkgsrc/mk i utilitzeu el target "replace-all" alhora d'actualitzar qualsevol paquet (
'pkg_chk -N' per buscar paquets no actualitzats), d'aquesta forma si algun paquet depen d'un altre que ja esta instal.lat no ens aturara el build sino que el substituira directament.
Aixo pot comportar problemes de simbols no resolts si es tracta d'una lib amb major changes o llibreries no resoltes si son minor changes, aquests els podeu arreglar amb l'eina 'wip/apstget' que també vaig escriure, utilitzant 'apstget relink (pkgname)' intentara arreglar tots aquests enllaços trencats, i si no pot ens ho dirà i a manija podrem arreglar-ho, pero simplifica bastant la majoria de problemes d'actualitzacions amb pkgsrc.
Indenaight
L'altre nit vaig aprofitar-la per avançar diversos projectes que porto, la veritat es que va ser bastant productiu

. Vaig reinstal.lar NetBSD -current en el p4m (aka pl2). I ja que el tenia davant em vaig possar a mirarme el ~/prg on vaig trobar el Jalo. Un software que vaig fer (GPL) per una empresa a la que vaig estar currant per fer de loadbalancing per software de 4 tomcats, al final per falta de temps® es va acabar fent un random a l'entrada del tomcat enlloc d'utilitzar-lo.
Tinc pendent arreglar més cosilles abans de relesejar-lo, i m'agradaria probar el GIT amb ell, aixi que potser que crei un repositori GIT pel Jalo.
Vaig trobar-me també uns canvis no commitejats de l'screws en els que arreglaven parcialment algun segfault, aixi que vaig possar-me les piles i vaig acabar de fixar aquests bugs, vaig actualitzar l'ACR, arreglant uns quants bugs del mig port a acr (no estava adaptat del tot), vaig actualitzar bastanta documentació i vaig netejar una mica de codi i d'estructura de fitxers, faré unes quantes revisions més a tot plegat i treure una proxima release tb aviat. Encara que m'haure de mirar el suport de CLISP que sembla que no funciona bé, i podria afegir suport de Guile també.
Finalment vaig anar a parar a
-la madre del cordero-:
Planets amb rss2html
Vaig posar-m'hi en serio, ja que també el necessito per porticoluna, i ja de pas muntar un planet per nopcode també.
L'rss2html es un programet que descarrega fitxers rss o podcast desde HTTP o locals i genera un output en el format que desitgem (html, texte pla, urls, ...) permetent-nos parsejar-ho per altres programes o simplement utilitzant-lo com a lector de Blogs. Podem també limitar el numero de posts de cada blog a mostrar entre d'altres cosilles...
Tot el parser d'XML esta fet per mi, i es una api molt simple i alhora limitada, pero suficient per parsejar RSS.
En el TODO tenia dos punts
importants: planet + skins.
El tema del planet ja el tenia mig reorganitzat amb un codi que vaig afegir fa pocs messos (storage.c) on emmagatzemava tots els posts de forma jerarquica i utilitzant hashes per accedir als valors de cada post. Al tenir la informació en forma d'arbre havia de recollir tots els posts en una sola array i reordenar-los per data.
Aixi que vaig escriure una petita funció que parseja la data en forma rfc2822 i retorna el UTC i despres una funció de comparació que dona la resta d'ambdos.
Un cop implementat aixo vaig afegir un petit parser que recollia blocks de HTML definits dins d'un .html delimitats per comentaris a l'estil <!-- header -->, reutilitzant-los després per formatejar l'output de HTML. Usease un template.
La versió de cvs ja permet fer tot aixo, aquesta setmana muntaré un planet de blogs de nopcode a l'arrel de
blogs.nopcode.org.
[add comment] [view comments] (6)