Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Intel 386...568 
 Go Web ...351 
 Ethreal 1...319 
 Trees...314 
 Rust...282 
 Alg1...278 
 Тренажёр...267 
 Максвелл 3...262 
 Benchmark...259 
 System...255 
 Assembler...254 
 Mod_parrot...252 
 Linux Kernel 2.6...250 
 Go...250 
 Ext4 FS...248 
 C + UNIX...246 
 2.0-> Linux IP Networking...245 
 Эльбрус...242 
 C->Pusher...242 
 Rodriguez 6...242 
 
  01.01.2025 : 3803065 посещений 

iakovlev.org

Mod_parrot

 Оригинал : http://www.perl.com/pub/a/2004/12/22/mod_parrot.html
 
  Как известно , mod_perl - средство для написания веб-приложений и расширения
 возможностей апача . В новой 6-й версии перла , которая еще не доведена до конца ,
 появляется новый енжин -  Parrot .
 Модуль mod_parrot также , как и mod_perl , 
 имеет прямой доступ к API и дает возможность писать собственные хэндлеры.
  Parrot - это оптимизированная виртуальная машина , 
  выполняющая откомпилированный байт-код .
 Существуют отдельные виртуальные машины также под питона,пхп,раби(или руби ?).
 Получается 4 разных языка , и задача parrot - обьединить их в общем суб-языке.
 Parrot включает 3 ипостаси :
  собственно сам байткод
  PASM - ассемблер , который и генерит этот байткод
  PIR: Parrot Intermediate Representation (PIR) - более высокоуровневая языковая 
 надстройка над PASM
 Mod_parrot был сотворен Bjorn Hansen , Robert Spier , Kevin Falconeв 2002 году .
  Если рассматривать основные фичи mod_perl , то они имеют меньше отношения 
  к выводу контента
 и больше к таким вещам , как аутентификация и фильтры , и все это на перле .
 Parrot использует собственные обьекты для доступа к API .
  Апач , кроме перла , понимает также пхп , питон , раби и даже лисп . 
  Для каждого из этих языков
 существует свой собственный модуль . В parrot все эти модули сведены воедино .
  NCI (native call interface) - механизм доступа к Apache API , 
 каждая из которых представляет из себя враппер , или набор си-шных макросов , 
 которые вкомпилированы в mod_perl .
 В parrot NCI переписан , теперь он не привязан к этим врапперам и позволяет вызвать
 произвольную си-шную функцию без написания собственно самого си-кода .
 Вот как из mod_parrot делается sys call getpid():
 .sub _main
     # load libc.so, where getpid() is defined, and assign it to $P0
     $P0 = loadlib '/lib/libc.so.6'
 
     # find the function in the library and assign it to $P1
     # 'iv' means that getpid() returns an integer and takes no arguments
     $P1 = dlfunc $P0, 'getpid', 'iv'
 
     # call getpid() and place result in $I0
     $I0 = $P1( )
 
     # print the PID
     print $I0
     print "\n"
 .end
 Собственно сами апач-API-функции находятся в httpd . Пэррот может вызывать 
 их и отсюда тоже .Базовым классом для пэррот является Apache::RequestRec. 
 Пример вызова функции ap_rputs(аналг $r->puts в mod_perl)
 .sub puts method, prototyped
     .param string data
     .local pmc r
     .local pmc ap_rputs
     .local int offset
 
     classoffset offset, self, 'Apache::RequestRec'
     getattribute r, self, offset
 
     # find NCI object for ap_rputs
     find_global ap_rputs, 'Apache::NCI', 'ap_rputs'
 
     # use NCI to call out to Apache's ap_rputs
     ap_rputs( data, r )
 .end
  Загрузить parrot можно по адресу http://www.smashing.org/mod_parrot
 Необходимый минимум :
  Apache 2.0.50 or later
  Perl 5.6.0 or later (for configuration only)
  Apache::Test 1.13 or later (for the test suite)
 
  Пример написания "Hello World," на PIR :
 # this namespace is used to identify the handler
 .namespace [ 'HelloWorld' ]
 
 # the actual handler
 .sub _handler
     # our Apache::RequestRec object
     .local pmc r
 
     # this will contain Apache constants
     .local pmc ap_constants
 
     # instantiate the Apache::RequestRec object
     find_type $I0, 'Apache::RequestRec'
     r = new $I0
 
     # who should we say hello to?
     $S0 = r.'args'( )
     $I0 = length $S0
     if $I0 > 0 goto say_hello
     $S0 = 'world'
 
 say_hello:
     # call the puts method to send some output
     $S1 = 'Hello ' . $S0
     r.'puts'( $S1 )
 
     # tell Apache that we're finished with this phase
     find_global ap_constants, 'Apache::Constants', 'ap_constants'
     $I0 = ap_constants['OK']
     .pcc_begin_return
         .return $I0
     .pcc_end_return
 .end
  Вначале мы прописываем нэймспэйс . Далее идет собственно _handler . 
 Он начинается с обьявления локальных переменных . 
 Ap_constants дает доступ к внутренним переменным самого апача -  
 OK и DECLINED.
 Код проверяет querystring , используя метод Apache::RequestRec->args 
 и иприсваивает ее значение строке $S0 . 
 Далее вызывается Apache::RequestRec->puts для вывода контента .
 По умолчанию тип контента  text/html. 
 После этого мы говорим апачу - ОК - с помощью ap_constants,
 и выходим из хэндлера .
  Для компиляции этого хэндлера в байткод , сохраняем файл с расширением 
  .imc и выполняем :
 	parrot -o HelloWorld.pbc HelloWorld.imc
 Как инициализировать mod_parrot и заодно наш хэндлер:
 	ParrotInit /path/to/lib/ModParrot/init.pbc
 	ParrotLoad /path/to/lib/Apache/RequestRec.pbc
 	ParrotLoad /path/to/lib/Apache/Constants.pbc
 	ParrotLoad /path/to/HelloWorld.pbc
  Для постоянной загрузки нашего хэндлера надо прописать в httpd.conf:
 	
 	    SetHandler parrot-code
 	    ParrotHandler HelloWorld
 	
  Ниже дан пример хэндлера аутентификации для зашиты private-директории . 
  В качестве критерия доступа служит пароль "squawk." . PIR-код :
 # this namespace is used to identify the handler
 .namespace [ 'TestAuthHandler']
 
 # the actual handler
 .sub _handler
     # our Apache::RequestRec object
     .local pmc r
     .local string pw
     .local int status
 
     # this will contain Apache constants
     .local pmc ap_constants
     find_global ap_constants, 'Apache::Constants', 'ap_constants'
 
     # instantiate the Apache::RequestRec object
     find_type $I0, 'Apache::RequestRec'
     r = new $I0
 
     # check the password, ignoring the username
     (status, pw) = r.'get_basic_auth_pw'( )
     if pw != 'squawk' goto auth_failure
     $I0 = ap_constants['OK']
     goto auth_return_status
 
 # authentication failed
 auth_failure:
     $I0 = ap_constants['HTTP_UNAUTHORIZED']
     goto auth_return_status
 
 # return our status code
 auth_return_status:
     .pcc_begin_return
         .return $I0
     .pcc_end_return
 .end
 Пропишем в httpd.conf:
 
 	ParrotAuthenHandler TestAuthHandler
 	AuthType Basic
 	AuthName Private
 	Require valid-user
 
 А вот пример "Hello,world" , написанный на 6-м перле :
 use Apache::Constants ':common';
 use Apache::RequestRec;
 
 sub handler(Apache::RequestRec $r)
 {
     my ($status, $pw) = $r.get_basic_auth_pw();
     return ($pw eq 'squawk') ? OK : HTTP_UNAUTHORIZED;
 }
 Компилится он в байт-код с таким же успехом , как и аналогичный pir-код.
 Выбор же , на чем писать , нужно будет сделать уже вам :-)
  Сейчас идет окончательная фаза доделывания пэррот , 
 притирка к апи , а также реализация виндовой поддержки . 
 Нет поддержки для CGI-скриптов .
 В общем , ждем-с 6-й перл.
 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье