Frameworks, continuações e Factor
March 26th, 2005
São duas palavras que estão na moda. Mas primeiro: Qual a diferença entre “Framework” e “Biblioteca”?
Biblioteca é algo mais genérico. Você desenvolve o seu programa e pode utilizar partes de diversas bibliotecas. Já um Framework é uma aplicação incompleta. O que você faz é basicamente “preencher” os buracos para gerar o todo.
Continuações possui uma certa semelhança com um Framework. Você desenvove a sua aplicação e, algumas partes são preenchidas pelo usuário para dar prosseguimento no programa. Recentemente indiquei um material sobre continuações escrito pelo Phil Windleys em Scheme.
Ontem saiu um material sobre o assunto só que em Ruby, escrito pelo Mikael Brockman.
O primeiro mostra a simplicidade de utilizar Scheme para passar um programa do console para a web. O segundo mostra continuações em Ruby. Para converter o programa para web usando continuações, talvez o mais indicado seja utilizar um Framework para tal (Borges, Wee, não sei de outro nem da robustez dos dois :-) ). O que é melhor não vem ao caso no momento. Pode ser que apenas dependa do momento.
Mas onde entra Factor na história? Bem, resolvi fazer uma brincadeira para ver como funciona. O funcionamento é mais próximo ao Scheme, já que usa apenas as bibliotecas. Na realidade seriam as palavras de vocabulários. Por sinal, achei bem interessante a terminologia. Utilizo o vocabulario ‘math’ para aplicações matemáticas. Mas o programinha ficaria assim:
USE: httpd
USE: threads
USE: cont-responder
USE: html
: start-httpd [ 8888 httpd ] [ dup . flush [ start-httpd ] when* ] catch ;
[ start-httpd ] in-thread
Primeiro especificamos os vocabulários que desejamos utilizar (na realidade podemos informar apenas no momento em que desejamos utilizar as palavras específicas). Depois iniciamos o servidor http em uma outra thread, caso contrário teremos que abrir outro console.
: contador ( count - )
[ ( count URL -- )
<html>
<head>
<title> "Contador : " write dup unparse write </title>
</head>
<body>
<h2> "Contador: " write dup unparse write </h2>
<p> "++" over [ 1 + contador ] cons quot-href
"--" swap [ 1 - contador ] cons quot-href
</p>
</body>
</html>
] show-final ;
</code>
Esse é o código do nosso programa/página. Poderíamos criar outras palavras para diminuir um pouco a verbosidade dentro do contador (principalmente a parte de html até o body).
"contador" [ 0 contador ] install-cont-responder
Finalmente ‘ensinamos’ ao servidor, como chamar a nossa ‘rotina’ do contador, isto é, quando o nosso navegador apontar para:
http://localhost:8888/responder/contador/
A ‘rotina’ contador será executada e o conteúdo produzido por ela será enviado ao navegador. Me pareceu simples e sem muita frescura.
Entry Filed under: Factor
4 Comments
1. JP | March 27th, 2005 at 4:55 am
Como falei para o Slava, autor da Factor, no OSNews:
Low level + High Level + Integration and Glueing + OO + Closures + Neat Syntax
Beat that with a self contained platform.
:-)
2. Guaracy Monteiro | March 27th, 2005 at 3:59 pm
> Como falei para o Slava, autor da Factor, no OSNews:
Confesso que não conhecia o Slava até o dia 24/03/05. Mas gostei do cara.
> Low level + High Level + Integration and Glueing + OO + Closures +
> Neat Syntax
Não entendi a primeira parte (High+Low+Integration). É sobre Ruby ou Factor ou outra? Basicamente não se mexe com baixo nível em Factor. Existe uma VM gigante (44 K no windows :-) e o resto é tudo em Factor mesmo (2.2 M de código em mais de 3K palavras). O máximo seria a utilização de bibliotecas de terceiros utilizando-se uma interface em Factor (mais ou menos como seria utilizada em Delphi, VB ou Ruby).
Pessoalmente acharia uma abordagem interessante para o Ruby. Uma VM pequena (provavelmente mais de 44K pela complexidade) e o resto em Ruby (já tem um pessoal brincando com Ruby in Ruby)
3. JP | March 27th, 2005 at 4:14 pm
“Low level + High Level + Integration and Glueing + OO + Closures + Neat Syntax”
É sobre Ruby. E quero ver ele conseguir fazer algo melhor em uma plataforma que se contém.
Em Ruby:
“Low Level” = Ruby/C e código em C.
“High Level” = Ruby realmente.
“Integration and Glueing” = Usar o que tem disponível de outras linguagens, plataformas e ferramentas.
“OO” = Porque as linguagens mainstream suportam OO.
“Closures” = Porque é uma das características únicas de Ruby, muito show! Factor não suporta.
“Neat Syntax” = Toda a syntax legal de Ruby, com suporte automático a reflection e etc.
Estou pagando para ver alguém fazer algo melhor. :-)
4. Guaracy Monteiro | March 27th, 2005 at 6:24 pm
> “Low level + High Level + Integration and Glueing + OO + Closures +
> Neat Syntax”
>
> É sobre Ruby. E quero ver ele conseguir fazer algo melhor em uma
> plataforma que se contém.
Quanto ao ‘melhor’ é difícil definir. Vai depender muito de gosto. Ai, duas pessoas podem ficar discutindo uma vida inteira sem chagarem a uma conclusão.
> Em Ruby:
>
> “Low Level” = Ruby/C e código em C.
IMHO, C não é de baixo nível. Até tem coisas que chegam mais próximo. Mas C++ também. Delphi (ObjectPascal) também (é possível incluir código objeto, assembly, trabalhar com ponteiros, alocação dinâmica de memória, etc).
> “High Level” = Ruby realmente.
Tudo bem. (mas não sei onde se encaixa o fato de Ruby também possibilitar o acesso de bibliotecas diversas). Por exemplo:
getCursorPos = Win32API.new(”user32″, “GetCursorPos”, [’P'], ‘V’)
lpPoint = ” ” * 8 # store two LONGs
getCursorPos.Call(lpPoint)
x, y = lpPoint.unpack(”LL”) # get the actual values
> “Integration and Glueing” = Usar o que tem disponível de outras
> linguagens, plataformas e ferramentas.
Acho que aqui está a parte de utilização de bibliotecas de terceiros (seja pela utilização da técnica anterior, seja pelo desenvolvimento de um binding utilizando C). Ambas com suas vantagens e desvantagens.
> “OO” = Porque as linguagens mainstream suportam OO.
Também gosto de OO, mas não chega a ser a solução para tudo. De qualquer forma, Factor tem suporte à OO. Não do modo que estás mais acostumado (Java, Ruby, etc), mas no formato Lisp (CLOS).
> “Closures” = Porque é uma das características únicas de Ruby, muito
> show! Factor não suporta.
Humm. Acho que é importante resaltar que as duas possuem ‘paradigmas’ diferentes. Apesar de tudo ser objeto em Ruby, ainda assim existe o conceito de ‘variável’. Em Factor a ‘variável’ no sentido que estamos acostumados (nome apontando/contendo um determinado valor) é praticamente inexistente. Vair usar pouco ‘variáveis’ em Factor. É mais simples utilizar a pilha. Mas voltando aos ‘Closures’, o exemplo do contador possui a mesma funionalidade. Cada página aberta tera um contexto próprio e, consequentemente, a ‘variavel’ contador será unica e independente para cada página aberta.
> “Neat Syntax” = Toda a syntax legal de Ruby, com suporte automático a
> reflection e etc.
Syntaxe? Fica um pouco difícil discutir, basicamente por dois motivos:
1 - o velho problema do gosto pessoal;
2 - Factor nem tem sintax para discutir. Usa espaço como delimitador e postfix. Pronto. :-) Já aprendeste a linguagem. Agora é só aprender o que faz cada palavra.
Ok, vamos incluir na sintaxe “:” e “;” para iniciar e encerrar a definição das palavras (considere def .. end do Ruby), o ‘[” e ‘]’ para um bloco (considere o { } ou ( ) ou begin end, etc) e aspas para delimitar strings.
Não estou muito preocupado com comparações no momento, até porque Ruby é mais madura, possui uma comunidade maior e, consequentemente, uma biblioteca maior. Estou apenas ‘namorando’ Factor. Pessoalmente não sou monogâmico com relação às linguagens. Quanto mais melhor. :-)
> Estou pagando para ver alguém fazer algo melhor. :-)
Novamente o problema do ‘melhor’. :-)
O que parece que o Slava está qurendo fazer é algo, no final das contas, parecido com o Squeak. Uma máquina virtual pequena, quase toda a linguagen definida nela mesmo e um ambiente gráfico para o trabalho.
Porém, diferente do Alan Kay que colocou uma visão mais lúdica no Squeak (já que o objetivo maior dele é o ensino), talvez pelo background do Slava (Java), Factor tenderá mais para o lado ‘comercial’, mas com a mesma funcionalidade de uma IDE do Smalltalk.