Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Avançando tradução do Cap 2 de "Escopos e Clausuras" #96

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions scope & closures/ch2.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,27 +72,27 @@ Não importa o *local* onde uma função é invocada, ou até mesmo *como* é in

O processo de consulta ao escopo léxico ocorre *apenas" em identificadores de primeira classe, como `a`, `b` e `c`. Se você tivesse uma referência para `foo.bar.baz` em um trecho de código, ocorreria uma consulta ao escopo léxico para localizar o identificador `foo`, mas no momento que esta variável é localizada, regras de acesso à propriedades de objetos assumem o comando para resolução das propriedades `bar` e `baz`, respectivamente.

## Cheating Lexical
## Trapaceando o Léxico

If lexical scope is defined only by where a function is declared, which is entirely an author-time decision, how could there possibly be a way to "modify" (aka, cheat) lexical scope at run-time?
Se o escopo léxico é de fato definido apenas pelo local onde uma função é declarada, cuja decisão vem do autor do código durante a programação, como pode haver uma maneira de "modificar" (ou trapacear) o escopo léxico em tempo de execução?
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cuja decisão vem do autor do código durante a programação que é uma decisão inteiramente author-time

Author-time se refere ao momento de escrita (autoria) do escopo (léxico), não o tempo que ele é executado (runtime). Foi essa associação que ele quis dizer.

O exemplo que consigo pensar agora é this, que tem sua associação (binding) executada no runtime, não em author-time. Ou seja, onde você escreve ele não importa, no momento da execução do código (runtime), o JS define onde o this está.

Coloquei o exemplo porque também ainda não pensei num termo apropriado para author-time, se tiver alguma sugestão será ótimo. Se de tudo não conseguirmos chegar num modelo ideal, acho válido manter author-time. Ele explica mais sobre author-time/runtime no próximo livro, mas não li com cuidado a ponto de opinar.

Copy link
Collaborator Author

@gmsecrieru gmsecrieru Jun 5, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Diferente de runtime ou compile time, que são termos com valor semântico dentro das Ciências da Computação, author-time me parece se tratar de uma terminologia cunhada pelo autor aproveitando-se de um recurso que a língua inglesa proporciona, que é a facilidade de se criar supostos "neologismos" que passam a ter o valor semântico justamente por sua semelhança com outros jargões da mesma área -- neste caso, runtime (cuja tradução comum é de fato tempo de execução) . A minha escolha para esta flexibilização se deu também pelo fato de, curiosamente, encontrar esta dúvida enquanto procurava a melhor forma de fazê-lo :)


JavaScript has two such mechanisms. Both of them are equally frowned-upon in the wider community as bad practices to use in your code. But the typical arguments against them are often missing the most important point: **cheating lexical scope leads to poorer performance.**
JavaScript possui dois mecanismos para isso. Ambos são vistos como má prática e igualmente (e amplamente!) desencorajados pela comunidade de modo geral, embora os argumentos que sustentam esta opinião normalmente não trazem consigo o ponto mais relevante: **trapacear o escopo léxico leva a um pior desempenho.**

Before I explain the performance issue, though, let's look at how these two mechanisms work.
Antes de explicar a questão da performance, porém, vamos olhar a forma com que estes dois mecanismos funcionam.

### `eval`

The `eval(..)` function in JavaScript takes a string as an argument, and treats the contents of the string as if it had actually been authored code at that point in the program. In other words, you can programmatically generate code inside of your authored code, and run the generated code as if it had been there at author time.
A função `eval(..)` em JavaScript recebe uma string como argumento e trata o conteúdo desta string como se tivesse de fato sido programado pelo autor do código naquele ponto do programa. Em outras palavras, você pode gerar código dinamicamente dentro do seu programa e executar este código como se estivesse lá desde o momento da programação.

Evaluating `eval(..)` (pun intended) in that light, it should be clear how `eval(..)` allows you to modify the lexical scope environment by cheating and pretending that author-time (aka, lexical) code was there all along.
Colocando desta forma, deve estar claro a forma com que `eval(..)` permite a você modificar o ambiente do escopo léxico ao trapacear e portanto fingir que aquele código estava lá desde o princípio.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avaliando eval(..) (piada intencional) Colocando desta forma, deve estar claro a forma com que como eval(..) permite a você modificar o ambiente do escopo léxico ao trapacear e portanto fingir que aquele código feito em author-time (vulgo léxico) estava lá desde o princípio.

Novamente, não consegui pensar numa forma melhor de referenciar author-time. Me pareceu um modelo adotado pelo próprio autor (carece de outras fontes).

Copy link
Collaborator Author

@gmsecrieru gmsecrieru Jun 6, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Na minha opinião, o significado do trocadilho é perdido ao sairmos da língua inglesa. Dentro deste contexto, a tradução com menos perda de sentido para evaluating seria interpretando [eval desta forma], termo que não possui relação gráfica/fonética que permita o tom anedótico pretendido pelo autor no idioma original. Arrisco dizer que, neste contexto, esta situação se dá com qualquer uma das opções possíveis para tradução deste termo.

Talvez o equivalente em língua portuguesa fosse um joguete como "Evaliando", mas isto seria um completo desserviço ao leitor, que, ao meu ver, também pode ter dificuldade de entender sua sugestão se não tiver algum conhecimento prévio da língua inglesa.

Meus dois centavos ;) 👍

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gmsecrieru ia escrever a mensagem mas fiquei sem internet 🎃

Concorco com suas observações, vamos manter assim conforme você falou. Enviei uma mensagem pro autor solicitando uma luz sobre um sinônimo apropriado (sugeri lexical-time).

Seus pontos são sempre muito válidos, adoraria conversar mais sobre o projeto (e assuntos relacionados) com você. Pode me passar algum contato seu? À parte disso, posso te colocar no projeto (write access) para me ajudar nas revisões das traduções e opinar sobre os rumos do trablho, tem algum interesse?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ótima ideia! Com alguma sorte ele pode nos auxiliar na melhor maneira de traduzir!

Muito obrigado pelo convite, vai ser um prazer ajudar nas revisões e me envolver mais com o projeto. Meu e-mail é george [at] secrieru ponto net


On subsequent lines of code after an `eval(..)` has executed, the *Engine* will not "know" or "care" that the previous code in question was dynamically interpreted and thus modified the lexical scope environment. The *Engine* will simply perform its lexical scope look-ups as it always does.
Durante a execução das linhas que sucedem a chamada para `eval(..)`, o *Motor* não vai "saber" ou "se importar" se o código em questão foi interpretado dinamicamente e portanto modificou o ambiente do escopo léxico. O *Motor* vai seguir efetuando suas consultas ao escopo léxico da mesma forma de sempre.

Consider the following code:
Considere o código a seguir:

```js
function foo(str, a) {
eval( str ); // cheating!
eval( str ); // trapaça!
console.log( a, b );
}

Expand All @@ -101,9 +101,9 @@ var b = 2;
foo( "var b = 3;", 1 ); // 1, 3
```

The string `"var b = 3;"` is treated, at the point of the `eval(..)` call, as code that was there all along. Because that code happens to declare a new variable `b`, it modifies the existing lexical scope of `foo(..)`. In fact, as mentioned above, this code actually creates variable `b` inside of `foo(..)` that shadows the `b` that was declared in the outer (global) scope.
A string `"var b = 3;"` é tratada, naquele ponto onde `eval(..)` é chamado, como um código que esteve lá desde o princípio. Pelo fato deste código declarar uma nova variável `b`, ele modifica o atual escopo léxico de `foo(..)`. O que ocorre, como mencionado acima, é que este código literalmente cria a variável `b` dentro de `foo(..)`, o que acaba por sombrear a variável `b` que foi declarada no escopo externo (neste caso, o global).

When the `console.log(..)` call occurs, it finds both `a` and `b` in the scope of `foo(..)`, and never finds the outer `b`. Thus, we print out "1, 3" instead of "1, 2" as would have normally been the case.
Quando a chamada para `console.log(..)` ocorre, são encontradas tanto `a` quanto `b` no escopo de `foo(..)`, e portanto nunca a variável `b` externa. Sendo assim, imprimimos "1, 3" em vez de "1, 2" como normalmente ocorreria.

**Note:** In this example, for simplicity's sake, the string of "code" we pass in was a fixed literal. But it could easily have been programmatically created by adding characters together based on your program's logic. `eval(..)` is usually used to execute dynamically created code, as dynamically evaluating essentially static code from a string literal would provide no real benefit to just authoring the code directly.

Expand Down