JavaScript: agora é sério

Luciano Ramalho
luciano@ramgarlic.com



Grupo de Discussão JSPRO
http://groups.google.com/group/jspro
Demo

JavaScript fora do
navegador, com
Node.js
Exemplo de script para
checar links em um
arquivo JSON
produzido por uma
view no CouchDB
Quem sou eu?
    Luciano Ramalho, programador desde 1978 (Web ’94)
      BOL (Abril S/A), UOL, AOL, Globo.com, IDG Now! etc.
    Entusiasta de linguagens
      Python, Ruby, Scheme, Java, PHP, JavaScript, Perl, C,
      C++, Pascal, Smalltalk, Tcl/Tk, Processing, BASIC, VB,
      HyperTalk, Lingo, Assembly Z-80, 8086, HP-25, TI-58...
    JavaScript com CouchDB na BIREME/OPAS/OMS
    APyB, FISL 1...11 (quase), Garoa Hacker Clube

groups.google.com/group/jspro
JavaScript:
  um nome maldito
    Não tem nada a ver com Java, foi uma decisão de
    marketing
    Não é um Java simplificado, mas essa percepção
    complica entender a semântica de JavaScript
    Ambas imitam a sintaxe de C e C++
    Marca pertencia à Sun, agora pertence à Oracle
    Sun licenciou a marca para a Netscape,
    Mozilla Foundation herdou a licença

groups.google.com/group/jspro
JavaScript:
  um nome maldito
    Uma salada de equívocos de outras linguagens de
    scripting (Perl, Tcl; PHP bebeu na mesma fonte)
    Variáveis automáticas: erros difíceis de localizar
    Sintaxe de C (for(;;) ilógico, switch perigoso...)
    Sem noção de módulos, nem mesmo include
    Abuso do contexto global, sem noção de namespace
    Tipagem fraca = conversão automática

groups.google.com/group/jspro
Tipagem dinâmica e fraca
      '' == '0'                 //   false




                                 ?
      0 == ''                   //   true
      0 == '0'                  //   true
      false == 'false'          //   false
      false == '0'              //   true
      false == undefined        //   false
      false == null             //   false
      null == undefined         //   true
      ' trn ' == 0           //   true
   Exemplos do D. Crockford
    (O Melhor do JavaScript)
groups.google.com/group/jspro
Tipagem dinâmica e fraca
       '' == '0'                //   false
       0 == ''                  //   true
       0 == '0'                 //   true
       false == 'false'         //   false
       false == '0'             //   true
       false == undefined       //   false
       false == null            //   false
       null == undefined        //   true
       ' trn ' == 0          //   true


groups.google.com/group/jspro
Tipagem dinâmica e fraca
       '' == '0'                //   false
       0 == ''                  //   true
       0 == '0'                 //   true
       false == 'false'         //   false
       false == '0'             //   true
       false == undefined       //   false
       false == null            //   false
       null == undefined        //   true vale notar
       ' trn ' == 0          //   true que Python
                                           e Ruby não
                                           têm este
groups.google.com/group/jspro              problema
Resolvendo este problema
      '' === '0'                //   false
      0 === ''                  //   false
      0 === '0'                 //   false
      false === 'false'         //   false
      false === '0'             //   false
      false === undefined       //   false
      false === null            //   false
      null === undefined        //   false
      ' trn ' === 0          //   false
   Solução do D. Crockford
   (O Melhor do JavaScript)
groups.google.com/group/jspro
JavaScript x ECMAScript

    JavaScript: quem define é a Mozilla Foundation
      documentação oficial:
        https://developer.mozilla.org/en/JavaScript
      versão estável atual: 1.8.5
        Firefox 4 e 5, SeaMonkey 2.1



groups.google.com/group/jspro
https://developer.mozilla.org/en/JavaScript
JavaScript x ECMAScript
    ECMA: European Computer Manufacturers Association

      1      1997   1ª edição
      2      1998   ISO/IEC 16262
                                                      padrão
      3      1999   regex, try/catch, JS 1.5
                                                      de fato
      5      2009   strict mode, get/set, JSON
  Harmony    ????   várias idéias de JS 1.6, 1.7, 1.8...



groups.google.com/group/jspro
ECMA-262
                                                        5.1 Edition
                                                         jun/2011
                                                         256 pag.




http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Gramática x Pragmática
    Gramática:
      Sintaxe: como se constrói comandos, evitando erros
      sintáticos
      Semântica: significado (“paradigma”): como se
      constrói programas corretos aproveitando as
      características da linguagem
      Léxico: vocabulário (funções, bibliotecas): como tirar
      proveito das bibliotecas e não reinventar a roda
    Pragmática: usos e costumes

groups.google.com/group/jspro
Pragmática é o que mudou
  no JavaScript moderno
    Como a linguagem é utilizada no mundo real
      “sotaque”, expressões idiomáticas, estilo
      “boas maneiras” e boas práticas
    Contextos de uso
      ambientes (cliente, servidor), embutida, independente
    Ecosistema
      ferramentas, frameworks, “autoridades” (gurus)

groups.google.com/group/jspro
O lado bom do JavaScript
    Vantagens tradicionais de linguagens scripting
    Gerenciamento automático de memória
    Objetos nativos com sintaxe conveniente e expressiva
      Arrays (como listas dinâmicas e heterogêneas)
      Objects (como dicionários ou arrays associativos)
      Expressões regulares (integradas como em Perl)
      Funções e closures (como em Scheme)

groups.google.com/group/jspro
Funções de primeira classe

    First-class functions
      Como em “First-class citizens”
      Cidadãos que gozam de todos os direitos civis
      Funções como objetos de primeira classe
    Na maioria das linguagens, números e strings são
    objetos de primeira classe.


groups.google.com/group/jspro
Funções de primeira classe
    Como qualquer objeto de primeira classe, uma função
    pode ser:
      Criada dentro uma expressão, em tempo de
      execução
      Atribuída a uma variável
      Inserida em uma estrutura (array, object)
      Passada como parâmetro para outra função
      Devolvida como resultado de uma outra função
groups.google.com/group/jspro
Funções de primeira classe

    Aplicações mais comuns:
      Callbacks em sistemas orientados a eventos (GUIs,
      clientes e servidores de protocolos de redes de alto
      desempenho e escalabilidade)
    Conceito tão poderoso que graças a ele muitas das
    limitações conceituais de JavaScript podem ser
    superadas ou contornadas


groups.google.com/group/jspro
Funções de Ordem Superior

    Higher-order functions
    Aceitam outras funções como argumentos
    Exemplos clássicos: Map, Filter, Reduce
    Exemplo comum em JS: Array.forEach




groups.google.com/group/jspro
forEach
// print process.argv
process.argv.forEach(
  function (val, index, array) {
    console.log(index + ': ' + val);
});




groups.google.com/group/jspro
Usos modernos de uma
  expressão-função

                                escopo
                                 local


(function(){ })()
groups.google.com/group/jspro
Usos modernos de uma
  expressão-função
 jQuery.noConflict();

 (function($){
     $("div#jQuery").css(
         "font-weight","bold");
 })(jQuery);


groups.google.com/group/jspro
Pragmática: novos usos
    AJAX: XMLHttpRequest e JSON
    HTML5: armazenagem no cliente e Canvas
    Plug-ins para navegadores e outros aplicativos
    Apache CouchDB
      BD NoSQL orientado a documentos
      Plataforma para CouchApps


groups.google.com/group/jspro
Pragmática: novos usos
    Aptana Jaxer, RingoJS, AppengineJS, Wakanda...
      Servidores de aplicações
    Common.js
      Uma biblioteca padrão de uso geral
    Node.js
      Plataforma de programação assíncrona
    CoffeeScript: uma nova sintaxe

groups.google.com/group/jspro
Referências
http://www.delicious.com/ramalho/javascript
Vamos continuar esta conversa
    E-mail: luciano@ramgarlic.com
    Twitter: @luciano
    Grupo de discussão: http://groups.google.com/group/jspro
    Links: http://www.delicious.com/ramalho/javascript
    JavaScript: The Good Parts (Douglas Crockford)
    JavaScript: The Definitive Guide 6 ed. 2011 (D. Flanagan)
    Padrões JavaScript (Stoyan Stefanov)

groups.google.com/group/jspro

JavaScript agora é sério (TDC 2011)

  • 1.
    JavaScript: agora ésério Luciano Ramalho luciano@ramgarlic.com Grupo de Discussão JSPRO http://groups.google.com/group/jspro
  • 2.
    Demo JavaScript fora do navegador,com Node.js Exemplo de script para checar links em um arquivo JSON produzido por uma view no CouchDB
  • 3.
    Quem sou eu? Luciano Ramalho, programador desde 1978 (Web ’94) BOL (Abril S/A), UOL, AOL, Globo.com, IDG Now! etc. Entusiasta de linguagens Python, Ruby, Scheme, Java, PHP, JavaScript, Perl, C, C++, Pascal, Smalltalk, Tcl/Tk, Processing, BASIC, VB, HyperTalk, Lingo, Assembly Z-80, 8086, HP-25, TI-58... JavaScript com CouchDB na BIREME/OPAS/OMS APyB, FISL 1...11 (quase), Garoa Hacker Clube groups.google.com/group/jspro
  • 4.
    JavaScript: umnome maldito Não tem nada a ver com Java, foi uma decisão de marketing Não é um Java simplificado, mas essa percepção complica entender a semântica de JavaScript Ambas imitam a sintaxe de C e C++ Marca pertencia à Sun, agora pertence à Oracle Sun licenciou a marca para a Netscape, Mozilla Foundation herdou a licença groups.google.com/group/jspro
  • 5.
    JavaScript: umnome maldito Uma salada de equívocos de outras linguagens de scripting (Perl, Tcl; PHP bebeu na mesma fonte) Variáveis automáticas: erros difíceis de localizar Sintaxe de C (for(;;) ilógico, switch perigoso...) Sem noção de módulos, nem mesmo include Abuso do contexto global, sem noção de namespace Tipagem fraca = conversão automática groups.google.com/group/jspro
  • 6.
    Tipagem dinâmica efraca '' == '0' // false ? 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' trn ' == 0 // true Exemplos do D. Crockford (O Melhor do JavaScript) groups.google.com/group/jspro
  • 7.
    Tipagem dinâmica efraca '' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' trn ' == 0 // true groups.google.com/group/jspro
  • 8.
    Tipagem dinâmica efraca '' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true vale notar ' trn ' == 0 // true que Python e Ruby não têm este groups.google.com/group/jspro problema
  • 9.
    Resolvendo este problema '' === '0' // false 0 === '' // false 0 === '0' // false false === 'false' // false false === '0' // false false === undefined // false false === null // false null === undefined // false ' trn ' === 0 // false Solução do D. Crockford (O Melhor do JavaScript) groups.google.com/group/jspro
  • 10.
    JavaScript x ECMAScript JavaScript: quem define é a Mozilla Foundation documentação oficial: https://developer.mozilla.org/en/JavaScript versão estável atual: 1.8.5 Firefox 4 e 5, SeaMonkey 2.1 groups.google.com/group/jspro
  • 11.
  • 12.
    JavaScript x ECMAScript ECMA: European Computer Manufacturers Association 1 1997 1ª edição 2 1998 ISO/IEC 16262 padrão 3 1999 regex, try/catch, JS 1.5 de fato 5 2009 strict mode, get/set, JSON Harmony ???? várias idéias de JS 1.6, 1.7, 1.8... groups.google.com/group/jspro
  • 13.
    ECMA-262 5.1 Edition jun/2011 256 pag. http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
  • 14.
    Gramática x Pragmática Gramática: Sintaxe: como se constrói comandos, evitando erros sintáticos Semântica: significado (“paradigma”): como se constrói programas corretos aproveitando as características da linguagem Léxico: vocabulário (funções, bibliotecas): como tirar proveito das bibliotecas e não reinventar a roda Pragmática: usos e costumes groups.google.com/group/jspro
  • 15.
    Pragmática é oque mudou no JavaScript moderno Como a linguagem é utilizada no mundo real “sotaque”, expressões idiomáticas, estilo “boas maneiras” e boas práticas Contextos de uso ambientes (cliente, servidor), embutida, independente Ecosistema ferramentas, frameworks, “autoridades” (gurus) groups.google.com/group/jspro
  • 27.
    O lado bomdo JavaScript Vantagens tradicionais de linguagens scripting Gerenciamento automático de memória Objetos nativos com sintaxe conveniente e expressiva Arrays (como listas dinâmicas e heterogêneas) Objects (como dicionários ou arrays associativos) Expressões regulares (integradas como em Perl) Funções e closures (como em Scheme) groups.google.com/group/jspro
  • 28.
    Funções de primeiraclasse First-class functions Como em “First-class citizens” Cidadãos que gozam de todos os direitos civis Funções como objetos de primeira classe Na maioria das linguagens, números e strings são objetos de primeira classe. groups.google.com/group/jspro
  • 29.
    Funções de primeiraclasse Como qualquer objeto de primeira classe, uma função pode ser: Criada dentro uma expressão, em tempo de execução Atribuída a uma variável Inserida em uma estrutura (array, object) Passada como parâmetro para outra função Devolvida como resultado de uma outra função groups.google.com/group/jspro
  • 30.
    Funções de primeiraclasse Aplicações mais comuns: Callbacks em sistemas orientados a eventos (GUIs, clientes e servidores de protocolos de redes de alto desempenho e escalabilidade) Conceito tão poderoso que graças a ele muitas das limitações conceituais de JavaScript podem ser superadas ou contornadas groups.google.com/group/jspro
  • 31.
    Funções de OrdemSuperior Higher-order functions Aceitam outras funções como argumentos Exemplos clássicos: Map, Filter, Reduce Exemplo comum em JS: Array.forEach groups.google.com/group/jspro
  • 32.
    forEach // print process.argv process.argv.forEach( function (val, index, array) { console.log(index + ': ' + val); }); groups.google.com/group/jspro
  • 33.
    Usos modernos deuma expressão-função escopo local (function(){ })() groups.google.com/group/jspro
  • 34.
    Usos modernos deuma expressão-função jQuery.noConflict(); (function($){ $("div#jQuery").css( "font-weight","bold"); })(jQuery); groups.google.com/group/jspro
  • 35.
    Pragmática: novos usos AJAX: XMLHttpRequest e JSON HTML5: armazenagem no cliente e Canvas Plug-ins para navegadores e outros aplicativos Apache CouchDB BD NoSQL orientado a documentos Plataforma para CouchApps groups.google.com/group/jspro
  • 36.
    Pragmática: novos usos Aptana Jaxer, RingoJS, AppengineJS, Wakanda... Servidores de aplicações Common.js Uma biblioteca padrão de uso geral Node.js Plataforma de programação assíncrona CoffeeScript: uma nova sintaxe groups.google.com/group/jspro
  • 39.
  • 40.
  • 41.
    Vamos continuar estaconversa E-mail: luciano@ramgarlic.com Twitter: @luciano Grupo de discussão: http://groups.google.com/group/jspro Links: http://www.delicious.com/ramalho/javascript JavaScript: The Good Parts (Douglas Crockford) JavaScript: The Definitive Guide 6 ed. 2011 (D. Flanagan) Padrões JavaScript (Stoyan Stefanov) groups.google.com/group/jspro