Elmord's Magic Valley

Computers, languages, and computer languages. Às vezes em Português, sometimes in English.

Posts com a tag: rant

Sucker Punch

2012-06-11 21:37 -0300. Tags: film, rant, em-portugues

Esse fim-de-semana assisti um filmezinho chamado Sucker Punch. O filme pretende ter uma historinha "bonita" com uma moral nobre. Resumo da ópera: mãe morre e as filhas ficam com o padrasto. Padrasto fica fulo da vida porque a mulher não deixou nada para ele no testamento (pode-se vagamente assumir que a morte da mulher é responsabilidade do padrasto), e resolve abusar das filhas. A filha mais velha consegue se safar do cara, o cara tranca a guria no quarto e vai atrás da pequena. A guria escapa pela janela, conjura uma arma do éter luminífero, vai atrás do cara, dá um tiro para matá-lo, erra e mata a pequena. O cara chama a polícia, decidem internar a guria em um sanatório, e o cara suborna o rei do sanatório para fazerem uma lobotomia na guria para ela não contar nada à polícia. O rei do sanatório explica que o homem da lobotomia só aparece dali a uns dias, e enquanto isso a guria fica em tratamento no lugar lá. Essa introdução da história é apresentada em uns cinco minutos de filme, e é basicamente a única parte com alguma complexidade do enredo. A guria é levada a uma sala enorme onde uma mulher realiza algum tratamento psicoterápico maluco. Passam mais algumas cenas do sanatório. Lá pelas tantas, o filme começa a se passar em um mundo paralelo em que a guria está sendo levada para um bordel, onde ela é mantida com umas outras gurias. A sala enorme agora é alguma coisa bar-like com um palco. Muitas cenas depois, a guria vai fazer seu primeiro ensaio como dançarina, e quando começa ela a dançar, somos transportados para um outro mundo paralelo, onde ela entra em um templo pseudo-oriental onde há um mestre, que pergunta o que ela quer da vida. Ela diz que quer cair fora daquele lugar. O velho lhe entrega uma espada e umas armas, e diz que ela precisa de cinco itens para escapar. No mundo do nível anterior, a guria convence as outras a seguir um plano para tentar escapar do lugar. O plano consiste em a guria ficar dançando e distraindo a galera enquanto as outras fazem todo o trabalho sujo. Sempre que ela dança, o filme passa para o mundo de nível 3, onde as ações do plano de fuga correspondem a batalhas e explosões e tiros e dragões e what-not. No fim do filme, o quinto item necessário é a própria guria, que se sacrifica para a única outra guria que sobrou viva a essas alturas conseguir fugir. A morte da guria no nível 2 corresponde à lobotomia no nível 1. Fica claro aí que todos os eventos do nível 2 tiveram alguma correspondência no nível 1, e que uma das gurias de fato fugiu do sanatório. O cara que fez a lobotomia pergunta para a mulher do tratamento psicoterápico por que ela recomendou o procedimento, e ela responde que não recomendou. Nisso descobrem essa e outras tretas do rei do sanatório, ele vai preso, todos comemora. Em paralelo ao começo e ao fim do filme, há uma narrativinha dizendo que "ah, os anjos nos ajudam, mas não lutam por nós, somos nós quem decidimos o nosso destino, blá, blá, blá".

Em muitos aspectos, o filme é O Labirinto do Fauno com menininhas bonitas e explosões.

Essa foi a primeira impressão que o filme me passou. Mas depois de uma análise mais cuidadosa, percebi que há inúmeros paralelos entre as duas histórias. Começando pelo começo. Em ambas as histórias, a protagonista tem um padrasto cruel (no Labirinto do Fauno (LF), o padrasto é um capitão fascista que tortura e/ou mata metade do elenco e maltrata a outra metade). Em ambas as histórias, a protagonista "escapa" do mundo real para um mundo imaginário ou paralelo (no LF, um mundo mágico a la folclore europeu). Em ambas, o objetivo da protagonista é fugir (no LF, para um mundo subterrâneo, onde ela é uma suposta princesa que se perdeu no mundo dos homens). Em ambas, a saga começa com um mestre que dá instruções (no LF, o fauno).

No Sucker Punch (SP), a menina precisa obter cinco itens para fugir. O primeiro item é um mapa. No LF, a primeira coisa que o fauno dá à Ofelia (a protagonista) é um livro que diz o que ela tem que fazer e para onde tem que ir (não é exatamente um mapa, mas é close enough). O segundo item é fogo, que no mundo-nível-2 é um isqueiro. No mundo-nível-3, as gurias têm que entrar em um castelo, cortar a garganta de um dragão e pegar dois cristais que lá se encontram. No LF, a Ofelia tem que entrar em uma árvore moribunda, meter a mão na língua de um sapo gigante e pegar uma chave. No SP, as gurias têm que pegar os cristais sem acordar a mãe do dragão, mas a protagonista resolve testar os cristais dentro do castelo, faz um fogo medonho, acorda a dragoesa e a galera tem que sair correndo para escapar. Pois bem, a próxima missão da Ofelia é entrar em uma sala onde há uma mesa com um banquete preparado, abrir um cofre com a chave, pegar uma faca de lá e levar de volta antes que seu tempo acabe, mas não pode comer nem beber nada do banquete, para não acordar uma criatura muito doida que está no final da mesa. Ofelia come umas uvas da mesa, a criatura acorda e ela tem que sair correndo para escapar. O terceiro item no SP é (adivinhem só?) uma faca, que posteriormente será usada para matar o rei do bordel para conseguir o quarto item... uma chave! No fim do LF, para testar a Ofelia, o fauno a manda buscar seu irmão recém-nascido. Ao chegar com a criança para o fauno, o fauno diz que precisa derramar algumas gotas do sangue de um inocente (o bebê) para abrir o portal para o mundo mágico. Ofelia se recusa a entregar a criança, o fauno diz que então não pode levá-la ao mundo mágico, e desaparece. Nisso o capitão fascista está a perseguindo e a alcança, e lhe dá um tiro. Ofelia morre, e seu sangue é derramado na fontezinha feliz, e ela vai parar no mundo mágico, onde ela é congratulada por sua decisão nobre. No SP, o quinto e último item é a própria protagonista, que se sacrifica para a outra guria fugir.

No SP, os eventos de cada mundo paralelo possuem uma correspondência com os eventos dos outros. No LF, há algumas evidências de que o mundo mágico é o mesmo mundo real (a mandrágora entregada pelo fauno para que Ofelia pusesse debaixo da cama da mãe que está grávida e quase morrendo para curá-la de fato funciona, o capitão a encontra, e a mãe a atira no fogo, após o que a mãe adoece de novo; quando a Ofelia está fugindo do capitão no labirinto do fauno e chega a um beco sem saída, uma passagem se abre a ela, pela qual ela escapa e o capitão a perde; aparentemente Ofelia escapa do quarto pela porta desenhada a giz na parede).

Basicamente, o Sucker Punch tem um enredo bastante superficial, e boa parte da substância da história foi copiada largamente inspirada pelo Labirinto do Fauno. Na verdade, a maior parte do enredo do SP parece servir apenas para prover um ambiente onde menininhas bonitas com pouca roupa realizam coreografias interessantes, em meio a explosões e lutas com espada. Por que a guria se imagina em um bordel, onde todas as guriazinhas usam um quase nada de roupa o tempo todo? Ok, talvez seja o trauma de ter quase sofrido assédio do padrasto. Bom, mas por que diabos no outro mundo imaginário, onde ela literalmente luta para escapar, as gurias também usam roupinhas curtas, e a protagonista em particular usa algo que lembra um uniforme de colegial japonesa com menos pano? Na medida em que o intento do filme era de fato esse ("On the other hand, though it's fetishistic and personal, I like to think that my fetishes aren't that obscure. Who doesn't want to see girls running down the trenches of World War One wreaking havoc?" (palavras do diretor)), pode-se dizer que é um bom filme. Agora dizer que "one interpretation of the film is that it is a critique on geek culture's sexism and objectification of women" (segundo o mesmo diretor, segundo a Wikipédia) é demás. A menos que seja alguma espécie de psicologia reversa: o filme é o alvo de sua própria crítica. [Edit: Yes, it is. Quem diria?]

Fim de papo. Awey.

6 comentários / comments

Checked exceptions

2012-04-18 01:03 -0300. Tags: comp, prog, rant, em-portugues

Passei a vida mantendo uma distância saudável do public static void fucking Java, com exceções esporádicas que ajudaram a reforçar o sentimento. Esse semestre, entretanto, estou fazendo a rica cadeira de Programação Paralela e Distribuída, cujos exercícios de laboratório devem ser todos feitos em Java. Nesses momentos de diversão incomensurável descobri mais uma das maravilhas dessa linguagem: o conceito de checked exceptions.

A idéia é genial: na declaração de um método, é possível adicionar uma cláusula throws exceção, que informa ao compilador que o método pode lançar a exceção em questão, e o programador é obrigado a tratá-la quando chamar o método, ou a declarar que o seu método também pode lançar a exceção. O resultado prático, obviamente, é que enquanto se está testando o programa acaba-se adicionando tratadores de exceção do tipo:

try { do_whatever(); } catch (Exception e) {}

Até que de fato queremos debugar um problema com do_whatever(), e queremos o bom e velho stack trace que acompanha a exceção, mas que está sendo engolido pelo catch vazio. Nesse momento, mudamos o tratador para:

try {
    do_whatever();
} catch (Exception e) {
    System.out.println(e);
    e.printStackTrace();
}

Que é, bem, o tratador de exceções padrão. Não é ótimo ter que escrever você mesmo o tratador de exceções padrão da linguagem?

Além de, de certa forma, matar o propósito das exceções (isolar o tratamento de erros do resto do código), o que os criadores da linguagem aparentemente não conceberam é que enquanto eu estou escrevendo o programa, ele não está pronto. Eu quero poder ir testando o programa à medida em que vou escrevendo, e não quero entupir o código com tratadores de exceção enquanto estou fazendo o código funcionar. De fato, o que eu quero normalmente é não tratar uma exceção, para obter um stack trace. Talvez eu sequer tenha decidido ainda qual a melhor maneira de tratar o erro. (O quê?! Você não tinha um projeto detalhado do programa antes de começar a escrevê-lo? Blasfêmia! Vá vestir sua gravata e volte para os diagramas UML.)

Lisp foi provavelmente a primeira linguagem a incorporar a idéia de que é útil executar programas incompletos, e o Common Lisp provavelmente ainda é a linguagem que faz isso com mais competência. Em (Common) Lisp, chamadas a funções inexistentes, chamadas com número errado de argumentos, tipos diferentes dos esperados, etc., geram erros de execução. Um bom compilador também gera warnings em tempo de compilação ao encontrar esses problemas, mas não impede a compilação e execução do programa. O programador pode então decidir corrigir os erros imediatamente, quando possível, ou executar o programa incompleto para fins de teste. Erros de execução em Common Lisp não encerram o programa, mas abrem o debugger, de onde se pode averiguar e alterar o estado do programa, e erros geralmente são continuáveis, i.e., é possível prosseguir com a execução de um programa após a ocorrência de um erro de execução. Além disso, as implementações oferecem um prompt interativo de onde se pode chamar as funções do programa diretamente, sem necessidade de escrever uma função main para testar funções internas do programa. O resultado é que se pode encontrar e corrigir os problemas do programa à medida em que ele é escrito, ao invés de escrever um código longo e "inteiro" e debugá-lo depois.

C, nesse e em outros quesitos, segue uma filosofia "não ajuda mas também não atrapalha". Boa parte dos erros de tipos geram warnings ao invés de erros. A linguagem não força o tratamento de erros de execução (mas também não lhe diz que eles ocorrem, além da sucinta mensagem Segmentation fault).

Hoje em dia as assim chamadas linguagens de script são mais flexíveis com programas incompletos, e muitas oferecem prompts interativos, embora estes costumem parecer afterthoughts*, especialmente comparados com o Common Lisp. Não matar o programa diante de erros e permitir continuar a execução ainda é uma idéia louca demais para essas linguagens.

Java, entretanto, destaca-se entre as demais linguagens em ativamente impedir a execução de programas incompletos, não por razões técnicas, como em C, mas por filosofia da linguagem. Ironicamente, um dos co-autores da especificação do Java é o Guy Steele, um dos criadores do Scheme, autor do Common Lisp, the Language, e um dos principais membros do comitê de padronização do Common Lisp. A vida tem dessas coisas.

* Appendix: o show de horrores

Desculpem o rant. Pretendo que eles sejam esporádicos no blog, e escrever conteúdo mais útil/interessante/informativo a maior parte do tempo. Mas sendo ranting a função primária de um blog, é impossível suprimi-la totalmente. Humanitas precisa reclamar.

E já que chegamos até aqui, vou aproveitar a atmosfera smug-lisp-weenie e fazer uma análise dos prompts interativos das linguagens de script mais populares.

Python: Python é whitespace-nazi o suficiente para reclamar se o código estiver indentado mas não estiver subordinado a nenhuma estrutura de controle (e.g., a primeira linha de código de um programa nunca pode estar indentada). O prompt, obviamente, não é exceção. Como conseqüência, não se pode copiar um trecho interno de uma função e colar diretamente no prompt para testar. Além disso, o prompt interativo prestativamente imprime ... quando espera que um comando de múltiplas linhas seja completado, o que significa que não se pode copiar o trecho de código sem alterações e colar de novo no prompt (afinal seta-pra-cima anda pelo histórico linha por linha, não expressão por expressão) ou no código-fonte.

Ruby: Não é whitespace-nazi, mas compartilha dos outros problemas.

Perl: Segundo o FAQ da linguagem, a maneira típica de usar a linguagem interativamente é entrando no debugger, com um comando do tipo perl -de 42. O debugger não tem suporte a readline (i.e., sem seta-pra-cima). O debugger não imprime o resultado das expressões. Há comandos para imprimir, mas...

  DB<1> @a = (1,2,3)

  DB<2> p @a
123
  DB<3> $a = [1,2,3]

  DB<4> p $a
ARRAY(0x209d968)

Perdeu pro GDB, hein? Lamentável.

PHP: A versão linha de comando do php tem um "modo interativo", que consiste simplesmente em ler o código da stdin as usual, mas executar as expressões à medida em que são lidas. Sem prompt, sem histórico, sem impressão das expressões por default. E sim, tem que digitar o <?php antes do código.

JavaScript: Eu ia avacalhar com o JavaScript por costume, mas depois das duas acima é complicado. O prompt do SpiderMonkey usa as conversões de string padrão do JavaScript, que transformam [[1,2,3],[4,5,6]] em "1,2,3,4,5,6", mas pelo menos é fácil de remendar. O histórico é linha-por-linha (aliás, o mísero e ignorado bash anda expressão por expressão no histórico), mas pelo menos o prompt não imprime um prefixo antes das linhas de continuação. E parece que as versões mais novas do SpiderMonkey imprimem os objetos numa sintaxe JSON-like, o que resolve o problema anterior e ganha do <main.Foo instance at 0x00234269> das linguagens acima. É, a coisa tá tão feia que o JavaScript ganhou de todo o mundo. A vida tem dessas coisas.

3 comentários / comments

Main menu

Recent posts

Recent comments

Tags

em-portugues (213) comp (148) prog (71) in-english (62) life (49) unix (38) pldesign (37) lang (32) random (28) about (28) mind (26) lisp (25) fenius (22) mundane (22) web (20) ramble (18) img (13) rant (12) hel (12) scheme (10) privacy (10) freedom (8) esperanto (7) music (7) lash (7) bash (7) academia (7) copyright (7) home (6) mestrado (6) shell (6) android (5) conlang (5) misc (5) emacs (5) latex (4) editor (4) etymology (4) php (4) worldly (4) book (4) politics (4) network (3) c (3) tour-de-scheme (3) security (3) kbd (3) film (3) wrong (3) cook (2) treta (2) poem (2) physics (2) x11 (2) audio (2) comic (2) lows (2) llvm (2) wm (2) philosophy (2) perl (1) wayland (1) ai (1) german (1) en-esperanto (1) golang (1) translation (1) kindle (1) pointless (1) old-chinese (1)

Elsewhere

Quod vide


Copyright © 2010-2024 Vítor De Araújo
O conteúdo deste blog, a menos que de outra forma especificado, pode ser utilizado segundo os termos da licença Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.

Powered by Blognir.