O Logo é uma tecnologia obsoleta?
Esta é uma discussão que foi mantida na comp.lang.logo (e na correspondente
lista de discussão por e-mail de 16 de novembro a 2 de
dezembro, em 1998. A discussão foi intitulada "O Logo é uma tecnologia obsoleta?"
De Ken Kahn:
"Minhas prioridades: 1. Dar aos estudantes oportunidades ricas e
variadas para expressar seus pensamentos verbal,
visual, auditiva e cinestesicamente."
Eu creio que esta é uma idéia
muito excitante a ser perseguida. Nesta discussão eu tenho
enfatizado a natureza animada/visual do
ToonTalk. Estas outras modalidades sensoriais são importantes e
eu tenho seguido nessa direção. O ToonTalk faz um uso pesado de
efeitos sonoros. Ainda mais interessante, ele usa ao mesmo tempo
voz gravada e um dispositivo texto- narração. Se você tiver um
joystick com tecnologia "force-feedback" ( custam cerca de 100
dólares, por estes dias), então quando você utilizar o ToonTalk você
sentirá as vibrações do motor do helicóptero, ou da parede quando
entrar no recinto, ou o peso de alguma coisa em sua mão. Nos
próximos 9 meses, eu planejo integrar entrada de sons (fala) no Toon
Talk.
Talvez não seja necessário
dizê-lo para esta audiência, mas estas modalidades
deveriam estar disponíveis para que as crianças as
utilizassem em suas próprias criações. Por exemplo, o ToonTalk não
utiliza apenas o force-feedback mas dá às crianças a opção de
incluir efeitos de força em seus próprios programas. Idem para
efeitos sonoros e texto- narração. E entrada de sons(fala) quando
estiver pronta.
Eu não reivindico ter as respostas para como usar da melhor forma e
integrar essas variadas modalidades. É um espaço para a pesquisa
básica, assim como uma variedade de esforços de planejamento,
para explorar estas questões.
Saudações,
- Ken Kahn
De Ken Kahn:
Wen Su escreveu: "Expressar seus pensamentos verbalmente, utilizando computadores,
não é ainda muito diferente de utilizar lápis e papéis, como nossa
geração anterior fazia."
Bastante verdadeiro. O
lápis é uma "impressora de qualidade de
letra". E a expressão visual em um computador não é profundamente
diferente de pintar ou desenhar. Eu não desejaria abandonar o lápis
e o pincel pelo computador. Os estudantes se beneficiariam pela
exposição a todas estas ferramentas, eu suponho.
"Eu hesito em ser `do
contra´ aqui. Mas embora seja muito bom
fornecer aos estudantes uma ferramenta de construção multimídia de
forma que eles possam expressar seus pensamentos através destas
novas ferramentas multimídia, muitas ferramentas atuais não são
ainda simples o bastante para serem utilizadas por jovens (ou
mesmo por adultos)."
Novamente verdadeiro... como
também para o lápis e o pincel.
Apenas pergunte a um estudante se o que ele está escrevendo é
fácil. Tente apenas pintar uma imagem e obtê-la do jeito que deseja.
Tom Woods
Ken Kahn escreveu:
"Nesta discussão eu tenho enfatizado a natureza animada/visual do
ToonTalk. Estas outras modalidades sensoriais são importantes..."
AGORA você
está dizendo que quando tiver a narração funcionando,
você terá o equivalente de texto também? Isto seria extremamente
benéfico para novos e emergentes leitores que freqüentemente
começam lendo palavras que eles mesmos escreveram ou falaram.
Você pode estar fazendo algo importante.
Tom Woods
Ken Kahn escreveu:
Eu concordo que a maioria das pessoas aprecia o que elas já
conhecem. Isto pode significar que os professores não darão ao
ToonTalk a chance que ele merece.
E também em outra mensagem em réplica a Tom Woods:
"Talvez eu deva reformular a
questão da obsolescência do Logo
como 'o Logo é ainda a melhor primeira linguagem a ser aprendida
pelas crianças?'. Eu não creio. Eu acho que as linguagens
visuais/animadas são mais atraentes para as crianças e mais fáceis
de aprender."
Eu aprecio a forma pela qual você reformulou seu desafio ao Logo, o
que o torna mais agradável para que eu observe o ToonTalk, quando
tiver tempo para escrever relatórios.
Com relação aos professores dando ao TT a chance que ele
merece: isto me faz pensar em alguma coisa em um livro chamado
"Learning in Science", de Osborne & Freyberg (é um livro acerca de
Ciência para crianças.), o qual eu acabei de rever para refrescar
minha memória, eu cito:
"As idéias perdem `status´
quando se tornam menos inteligíveis,
plausíveis e frutíferas. Inversamente, novas idéias aumentam seu
prestígio quando se tornam mais inteligíveis, mais plausíveis e mais
frutíferas". (48) [Eles escrevem mais sobre o que querem dizer com
estes termos.]
Embora eu tivesse estado interessado muito
tempo no MicroWorlds
e o avalie bem nestes três critérios, eu penso que deveria dar uma boa olhada em sua alternativa.
Seria ingênuo pensar que a próxima evolução do Logo/MicroWorlds será "sempre" a melhor primeira linguagem para crianças. A partir de outras perspectivas eu vejo outros problemas, entretanto:
Minha perspectiva: a tentativa que você está efetuando em
comparação com o Superlogo não o MicroWorlds (eu não sei muito
sobre o SuperLogo).
Sua perspectiva (minha também): o
mercado real para linguagens de
programação para crianças parece estar encolhendo, quando
simulações mais sofisticadas pré-realizadas, como o "sim-life"
etc... vêm à tona.
Bill Kerr
Brian Harvey escreveu:
"Eu não compreendo isto. Se os
processos estavam embutindo a recursão, e portanto você
realmente precisava manter a totalidade
dos estados de todas as chamadas de procedimento ao redor, então
eu não entendo por que você o está evitando. Se sua queixa é que a
pilha de Java cresce atrás das chamadas, então o problema não são
as sub-rotinas, mas as implementações de linguagens inferiores.
Utilize, ao invés, a Logo Berkeley! Ela corrigirá a eliminação de
chamadas por trás."
Eu concordo que as linguagens de
procedimentos devem fazer a otimização da
recursão por trás. Mas eu estava tentando destacar
outro ponto. O ToonTalk poderia ser implementado como uma
coleção de registros de processos não-ordenados. Um registro de
processo é como uma estrutura de pilhas – ele contém um indicador
para o código (robôs, no ToonTalk) e um vetor de argumento (uma
caixa, no ToonTalk). Para ser justo com as linguagens
convencionais, apesar de o ToonTalk ter processos muito
econômicos, as chamadas de procedimentos ordinárias são mais
custosas desde que elas utilizam o "heap" (área da memória) em vez da pilha. Mas o fato de que as pilhas não são utilizadas é que
define por que a geração, suspensão e término dos processos são
tão econômicos no ToonTalk.
"Mas (e este é o ponto principal
que quero destacar aqui) existe outra forma de armar a
concorrência sem incorrer em erros de
sincronização: programação funcional! As
condições de saída são possíveis
apenas se os diversos `threads´ estão assinalando novos
valores para as variáveis. Mas não há necessidade de fazê-lo (em
termos do Logo, você nunca precisa utilizar MAKE).
Quando você agrega programação funcional com programação seqüencial, eu creio que você não está fazendo justiça ao poder da chamada de
procedimento como um mecanismo de controle. Algumas
computações realmente se aplicam, a si mesmas, ao modelo
imperativo de programação que você descreve. Mas o que ocorre
com o exemplo clássico do Logo da geração de uma sentença
inglesa? Eu creio que isto é melhor descrito como uma composição
de funções. E mesmo se os argumentos para as funções são
corretamente computados, não há problema de sincronização."
Eu concordo que em programas sem efeitos
colaterais como na programação funcional todas as
minhas objeções e preocupações
acerca da sincronização desaparecem. E eu concordo que alguns
programas interessantes podem ser escritos em um estilo funcional
puro, por exemplo, seu gerador de sentença. Mas (e este é meu
ponto principal aqui) existem muitos programas que não podem ser
escritos como funções puras. O exemplo da conta bancária que eu
dei anteriormente é um deles. Ou um marcador de pontos em um
jogo. Ou muitas simulações, animações, jogos etc. Mesmo
programas que fazem I/O são difíceis de se encaixar em estruturas
puramente funcionais.
"Agora, por um lado, você
proporciona chamada de funções, com os Pombos
etc. Mas eu penso que, devido a você depreciar a idéia,
sua metáfora torna a chamada de função muito mais complicada do
que deveria ser. Eu ainda não vejo por que toda chamada de função
DEVE ser um processo separado – talvez porque eu não entenda o
que você está falando acerca de espaço na pilha. Você está dizendo
que os processos separados asseguram a não-mutação de variáveis
compartilhadas? Você não poderia atingir o mesmo objetivo não
permitindo que os robôs (procedimentos, eu entendi) mudassem as
coisas fora de si mesmos?"
Eu deveria antes dizer que eu proporciono
uma técnica de programação ou padrão de
utilização do ToonTalk que corresponde exatamente
à chamada de função. E eu admito que é um pouco mais
complicado quando tudo o que você deseja fazer é uma chamada de
função. Mas eu afirmo que você deseja algo mais geral que a
chamada de função. Suponha que você deseja devolver dois itens.
No ToonTalk você apenas coloca dois Pombos em uma caixa e
enquanto os valores são computados eles são dados aos Pombos
e seus ninhos correspondentes são preenchidos. Suponha que você
não deseja um valor simples, mas um fluxo de respostas. Talvez
mesmo um fluxo infinito (por exemplo o Cone de Eratóstenes
gerador de números primos). Suponha que você deseja criar uma
rede de agentes cooperativos. E por que alguém deveria forçar a
passagem de mensagens entre objetos para ajustar-se à estrutura
da chamada de função?
Nós poexemplos estar perdendo todos, menos os programadores e
cientistas da computação nesta lista, mas eu creio que são bons
artigos. Eu estou aprendendo como ser mais claro acerca do que
estou fazendo.
Saudações,
- Ken Kahn (www.ToonTalk.com)
De Brian Harvey:
Eu temo que ainda não compreendi; por que uma estrutura na pilha é
mais custosa que uma no "heap"? É esta alguma característica
específica do PC que eu não conheço?
"Eu deveria antes dizer que eu
proporciono uma técnica de programação ou
padrão de utilização do ToonTalk que corresponde
exatamente à chamada de função. E eu admito que é um pouco mais
complicado quando tudo o que você deseja fazer é uma chamada de
função. Mas eu afirmo que você deseja algo mais geral que a
chamada de função. Suponha que você deseja devolver dois itens."
Interessante – nós estamos tendo exatamente o mesmo argumento
agora na comp.lang.scheme; os tipos implementadores têm
colocado em valores de retorno múltiplos por razões de eficiência, e os fãs lambda o odiaram.
Mas eu não desejo que você
faça tudo funcionalmente. O que eu quero é uma
linguagem que não imponha um paradigma para mim,
mas permita-me escolher o que é melhor para o programa a mão.
Portanto, não é que eu deseje que você deixe nada de fora; eu
desejo que você faça a composição de função mais fácil, também!
Brian Harvey escreveu na mensagem...
Eu acredito que este pode ser o centro da
nossa discordância. Não está muito claro aquela afirmação em que você quer dizer "simples para o implementador" ou "simples para o usuário".
Se o for para o primeiro, nós, em princípio,
discordamos. Se for para o segundo, nós discordamos quanto à estratégia de interface com o usuário. Eu não estou convencido de que os meios simplificados "dão ao usuário um martelo e o ensinam que tudo são pregos!"
Eu quero dizer o usuário. Embora eu gostasse de
usuários avançados para ter uma idéia boa de como as coisas são implementadas. Os cursos de Scheme e Lisp não ensinam aos estudantes como escrever interpretadores de meta? Isso é muito mais difícil de fazer se a linguagem não for simples.
Quando eu cheguei à Xerox PARC (1984), fiquei bastante envolvido em um projeto de linguagem de múltiplos paradigmas (chamado Loops, depois InterLoops, depois CommonLoops, e eu saí fora quando ele passou a ser chamado de CLOS). Eu me lembro de estar revisando um papel escrito para a Bell Labs que discutia persuasivamente que havia custos cognitivos e colaboradores muito grandes para usar tais linguagens ricas.
Convenceram-me de que é difícil para a maioria das pessoas trocar entre paradigmas de programação diferentes mantendo as particularidades que essas linguagens permitem. E o autor do papel relatou os problemas às equipes da Bell Labs que teve devido a diferentes membros estarem usando modos muito diferentes de programar.
Os membros da equipe acharam difícil de entender e mudar para outro código. Também pode haver interferência entre as partes. Um componente do tipo Prolog, de programação lógica, tem dificuldades ao integrar bem uma linguagem imperativa substituta.
Um componente funcional puro permite
todos os tipos de transformações de programa e
execuções paralelas que quebram quando integrados com linguagens com efeitos colaterais. Você começou esta discussão inteira dizendo que a informática mudou desde o surgimento do Logo, e nós deveríamos apoiar novos paradigmas. Portanto, eu acredito que vale a pena observar que as linguagens populares que são compatíveis com paralelismo e OOP não excluíram outros mecanismos expressivos; pois isto é exclusivo ao TT.
Sim, a corrente principal acrescentou
paralelismo às estruturas existentes. E os programadores profissionais têm uma dura tarefa de compreender e depurar programas Java com segmentos (e o Java é um dos melhores exemplos para isto). Os cientistas da computação continuam explorando a linguagem de programação atora, funcional, baseada em lógica e constraints que, assim como o ToonTalk, despreza algumas idéias antigas para ir em busca do progresso. Por outro lado, a indústria de computadores, ou corrente principal, simplesmente tenta enxertar coisas novas no velho. Este grupo de notícias é sobre o Logo – sobre linguagens de programação poderosas para crianças.
Ao
contrário da corrente principal, as constraints de sistemas
legados e retrocessos de compatibilidade são mínimos. E nós poexemplos dar às crianças a habilidade de criar programas paralelos sem forçá-las a dominar a complexidade de travas e regiões atômicas. E sem esperar que elas depurem condições de competição e paralisações completas.
Saudações,
Ken Kahn (www.ToonTalk.com)
Ken Kahn" <KenKahn@ToonTalk.com> escreveu:
Eu me lembro de estar revisando um papel escrito para a Bell Labs que discutia persuasivamente que havia custos cognitivos e colaboradores muito grandes para usar tais linguagens ricas.
Convenceram-me de que é difícil para a maioria das pessoas trocar entre paradigmas de programação diferentes mantendo as particularidades que essas linguagens permitem. Eu acho que eu gostaria de saber se todos os paradigmas são igualmente difíceis neste sentido.
Minha
experiência de ensino me fez (relutantemente!) concluir que a
programação seqüencial é muito natural
para a maioria das pessoas, e que programação funcional exige maior esforço mental (embora a compensação por esse esforço seja evidente). Onde está a programação simultânea naquele padrão? O que significa manter o custo marginal da composição de função em uma linguagem, naquele padrão, versus o custo
marginal da simultaneidade inclusa? Também pode haver interferência entre as partes.
Um componente do tipo Prolog, de
programação lógica, tem dificuldades ao integrar bem uma linguagem imperativa substituta. Um componente funcional puro permite todos os tipos de transformações de programa e execuções paralelas que quebram quando integrados com linguagens com efeitos colaterais. Também pode haver interferência entre as partes. Um componente do tipo Prolog, de programação lógica, tem dificuldades ao integrar bem uma linguagem imperativa substituta.
Um componente funcional puro permite todos os tipos de
transformações de programa e execuções paralelas que quebram quando integrados com linguagens com efeitos colaterais. Eu concordava com você no exemplo de programação lógica, mas o funcional me parece ser um pouco falsário; lá você está falando sobre complexidade para o implementador, e não sobre carga cognitiva para o usuário. Sim, a corrente principal acrescentou paralelismo às estruturas existentes.
E os programadores
profissionais têm uma dura tarefa de compreender e depurar programas Java com segmentos (e o Java é um dos melhores exemplos para isto). Os cientistas da computação continuam explorando a linguagem de programação atora, funcional, baseada em lógica e constraints que, assim como o ToonTalk, despreza algumas idéias antigas para ir em busca do progresso. Por outro lado, a indústria de computadores, ou corrente principal, simplesmente tenta enxertar coisas novas no velho. Sim, a corrente principal acrescentou paralelismo às estruturas existentes.
Eu estou convencido de que é difícil depurar
programas que combinam simultaneidade com mutação de
variáveis compartilhadas. Mas não estou convencido de
que você não pode ter tudo da * simultaneidade * composição de funções sem mutação * mutação (não-compartilhada) de variáveis locais tudo na mesma linguagem, sem problemas. PS. Na Scheme nós poexemplos fazer funcional, seqüencial, simultâneo e OOP, embora a Scheme seja, pelo menos sob um sentido, uma linguagem muito simples. Ela não possui milhões de primitivas, como a CLOS, ou muita sintaxe, como o Java. Nós tentamos ensinar aos nossos estudantes a usar vários paradigmas de programação, mas prestar atenção a qual eles estão usando.
Eu suspeito que esses programadores que você mencionou que misturaram estilos adotaram uma Common Lisp manual sem nenhuma instrução explícita sobre paradigmas.
Brian Harvey escreveu na mensagem <73v2ml$lk6$1@agate.berkeley.edu>...
Eu acho que eu gostaria de saber se todos os paradigmas são igualmente difíceis neste sentido.
Minha
experiência de ensino me fez (relutantemente!) concluir que a programação seqüencial é muito natural para a maioria das pessoas, e que programação funcional exige maior esforço mental (embora a compensação por esse esforço seja evidente).
Onde está a
programação simultânea naquele padrão? O que significa manter o custo marginal da composição de função em uma linguagem, naquele padrão, versus o custo marginal da simultaneidade inclusa? Perguntas muito boas! Alguém conhece uma pesquisa que foi feita para dar as respostas a estes tipos de perguntas? Ou nos computadores e na literatura educacional ou na psicologia de programação?
(A única coisa que eu posso pensar é que a tese de mestrado de Mitch Resnick sobre o MultiLogo.) Um componente funcional puro permite todos os tipos de programa transformações e execuções paralelas que quebram quando integradas com linguagens com efeitos colaterais.
Aquela que é
funcional me parece ser um pouco de falsário; lá vem
você falando sobre complexidade para o implementador, não em carga cognitiva para o usuário. Que tal nos preocuparmos com a ordem de execução dos argumentos para uma função? No caso, você não precisa se aborrecer com isso. Caso haja efeitos colaterais, você agora tem uma coisa a mais para se lembrar. Eu estou convencido de que é difícil depurar programas que combinam simultaneidade com mutação de variáveis compartilhadas.
Mas não estou convencido de que
você não pode ter tudo da * simultaneidade *
composição de funções sem mutação * mutação (não-compartilhada) de variáveis locais tudo na mesma linguagem, sem problemas. Eu não tenho certeza. Nós simplesmente teremos de esperar até que alguém o construa (ou pelo menos o projete detalhadamente).
Mas você deverá
concordar que não há nenhum dialeto do Logo que satisfaça esses critérios, certo?
Saudações,
- Ken Kahn (www.ToonTalk.com)
luvisi@andru.sonoma.edu escreveu:
Existem muitas linguagens que compartilham o mesmo modelo de computação do ToonTalk – Concurrent Prolog, Parlog, Guarded Horn Clauses, Strand, KL1, OC, Herbrand, Janus, Linear Janus e Oz. Você poderia dar alguns URLs e recomendações de livros?
Como um resolvedor de problemas profissional e sendo um ser humano, eu
sempre estou tentando encontrar novas maneiras de encarar os problemas. Muito bom, mas teórico: Concurrent Constraint Programming (Acm Doctoral Dissertation Awards) Vijay A. Saraswat / Hardcover / publicado em 1993. Nosso preço: US$ 55.00 (pedido especial). Leia mais sobre esse título... Não li, mas deveria.
Parece bom: Objects for Concurrent Constraint Programming (Klwer International Series in Engineering and Computer Science, 426) Martin Henz / Hardcover / publicado em 1997.
Um pouco velho, mas uma boa coletânea de artigos;
Concurrent Prolog : Collected Papers (Logic Programming Series) Ehud Shapiro(Editor) / Hardcover / publicado em 1988 Considere a diferença entre: cout << 2 << 3; == ( cout.operator<<( 2) ).operator<<( 2 );= 23 e: cout << (2 << 3); == (cout.operator<<(2 << 3 ); = 16 Eu sou o único a achar que isso é um pouco complicado? Ver isso me deixa contente por erros de sintaxe e confusões não serem um problema do ToonTalk.
|