Conceitos básicos

Sites estáticos são aqueles que possuem páginas não gerenciáveis pelo usuário final. São elaborados geralmente em linguagem HTML5 e precisam de ferramentas de webdesign para serem criados. São sites leves e ideais para quem não tem a necessidade de atualizar o lay-out com frequência.

Já os sites dinâmicos são aqueles que possuem um sistema de gerenciamento incorporado a ele, que permite que as atualizações sejam feitas diretamente pelo usuário final. Estes sistemas de gerenciamento são chamados de CMS (Content Management System) ou sistema de gestão de conteúdo.

  Tecnicamente falando

Popularmente as linguagens são classificadas pela sua tipagem, então linguagens estáticas formalmente são linguagems que possuem tipagem estática e linguagens dinâmicas possuem tipagem dinâmica.

Algumas linguagens podem ser classificadas como dinâmicas por terem outras características. Elas permitem execução de código arbitrário (eval) ou a transformação de códigos existentes em tempo de execução. Cada vez é mais comum as linguagens modernas permitirem estas flexibilidades. Não importa a tipagem, então formalmente existem linguagens que são dinâmicas por esta definição e estáticas pela tipagem.

A definição básica da tipagem estática que uma linguagem de programação pode ter como característica é que há uma verificação dos tipos usados em dados e variáveis para garantir que sempre está sendo usado um tipo que é esperado em todas as situações. Esta verificação é feita no código fonte pelo processo de compilação. Esta análise ajuda na chamada segurança de tipos na utilização dos dados pelo programa permitindo que o programador se preocupe menos com esta questão. O compilador fornece garantias que alguns problemas não poderão ocorrer após o programa passar por esta verificação, ou seja, erros são detectados logo, antes do programa ser efetivamente executado.

Uma variável não pode mudar seu tipo.

No entanto a tipagem estática pode causar uma falsa sensação de segurança. Só uma parte dos erros podem ser descobertos antecipadamente.

Outra grande diferença é em relação a performance. Embora seja possível fazer otimizações em um programa escrito com linguagem dinâmica para aproximar a performance dos programas escritos em linguagens estáticas, pela dificuldade de alcançar isto normalmente estas ações não são feitas com eficácia. Em teoria um compilador JIT tem mais condições de otimizar código com informações precisas de como o programa será executado e mesmo na prática pode até conseguir algum resultado melhor isoladamente.

Por outro lado se você já sabe com o que vai lidar, não precisa ter nada no código gerado auxiliando o funcionamento no programa e o próprio programa não precisa ter certas verificações escritas pelo programador. Se a verificação é feita antes da execução um programa com tipagem estática não precisa ter este trabalho durante a execução.

Não ajuda também o fato de que a maioria dos programas com tipagem dinâmica vão rodar em uma máquina virtual já que isto facilita o desenvolvimento da linguagem e permite algumas flexibilidades extras normalmente desejáveis em linguagens dinâmicas.

Existem as linguagens híbridas. Na prática não é possível ter as duas formas de tipagem mas é possível usar parte de um ou de outro conceito.



Quando uma linguagem é considerada estática, formalmente ela tem tipagem estática, ela pode ter a infraestrutura necessária para guardar dados diferentes em uma variável. Mas os dados são guardados de uma forma diferente dos outros tipos. Você terá um tipo estático que pode guardar dados dinamicamente, mas a linguagem ainda tem tipagem estática em sua essência.

A grosso modo a linguagem usa uma estrutura de dados extra para guardar o seu tipo e indicar onde está o dado real. Normalmente é feito na biblioteca e costuma ter auxílio do compilador apenas para indicar que a verificação normalmente feita deve ser relaxada já que a verificação será feita por esta biblioteca até certo ponto e também pelo programador para evitar que determinados erros sejam gerados em runtime através desta biblioteca.

Linguagem com tipagem dinâmica não pode efetivamente ser parcialmente estática. Afinal uma linguagem dinâmica, exije formalmente que a tipagem seja dinâmica. Se ela começar esperar um tipo específico e fazer a verificação antes da execução, ela se transforma em linguagem estática. Não é possível reduzir o nível de abstração.

É até possível prover uma verificação de tipos anterior como recurso adicional da linguagem mas não faz muito sentido se não vier acompanhado da mudança na forma com que os dados são gerenciados na memória. Se o programa precisa ter seus tipos fixos e garantidos antecipadamente seria um desperdício ele usar uma estrutura que permita ter vários tipos. Esta estrutura tem custo de memória (tag do tipo, referências para o tipo em todas situações) e de processamento (indireção extra, seleção do dado/método específico a ser utilizado).

É possível uma linguagem dinâmica usar tipagem manifesta sem mudar sua característica de tipagem dinâmica. A vantagem é pequena ou até questionável.

Mas também há casos de linguagens que conseguem compilar partes do código com tipagem estática e partes com tipagem dinâmica. A interface entre as partes precisam ser normalizadas para um jeito ou outro. Curiosamente algumas preferem se definir como estáticas ou dinâmicas para tentar incutir uma cultura predominante e usar a outra como exceção. Os puristas, para o bem ou para o mal, consideram uma escolha ruim. Na verdade existem duas linguagens muito semelhantes neste caso.



Algumas linguagens estáticas possuem referências para tipos quando os dados serão armazenados no heap. E mesmo no stack a informação ainda existirá no código para permitir reflexão, mas não haverá consumo de memória no stack para guardar o tipo.

Tipagem estática não significa que todos os tipos precisam ser declarados explicitamente. É comum, na maioria das situações, que o compilador consiga inferir o tipo de uma variável de acordo com sua atribuição ou até mesmo sua utilização (menos comum).

A grande vantagem da tipagem estática está mais no fato que a variável não poder mudar seu tipo. Isto realmente ajuda muito o desenvolvimento. Ter que escrever o tipo explicitamente ajuda pouco ou nada. Alguns acham que fica mais legível quando o tipo é escrito, outros acham que é apenas deficiência do compilador.

Então é possível ter uma linguagem estática que usa tipagem implícita reduzindo parcialmente a cerimônia que estas linguagens costumam ter.

O PHP possui a possibilidade de fazer uma verificação de tipos antes da execução mas isto ajuda pouco porque a linguagem costuma ser executada de forma interpretada e principalmente porque ela não pode verificar todos os tipos, todas as situações, portanto você não tem segurança alguma.

A segurança é definida pelo elo mais fraco. Durante a execução tudo é dinâmico.

Eventualmente pode-se usar o tipo mixed que é aquela estrutura de dados que permitirá que qualquer dado seja guardado ali. É provável que o compilador trate este tipo de forma diferente. O programa trata dados de forma dinâmica por exceção, o programador diz que ali tudo pode acontecer porque é isto que ele quer.

Por várias razões parece que Hack é o PHP que bebe na água do C#, me parece que o mixed se comporta como o dynamic do C#.

  Comparativos

Os gráficos sempre indicam a vantagem dos sites estáticos sobre os dinâmicos em matéria de velocidade no carregamento das páginas. Hoje em dia, a velocidade de carregamento é muito importante na hora da escolha de que tipo de site deve ser criado, mas não é tudo.
Os sites dinâmicos por outro lado, tem a vantagem de utilizar o banco de dados como um aliado a divulgação de informações e imagens de uma forma mais dinâmica e eficiente.
Em quaisquer dos casos o site deve ser configurado e otimizado ao máximo, com vistas a melhor performance possível, sempre levando em conta que uma boa escolha do servidor de hospedagem e da velocidade da internet interferem diretamente nos resultados desejados sobre o retorno que o site trará.

  Dinâmica X Estática

As principais vantagens das "linguagens estáticas" são a segurança, performance e auxílio em tempo de desenvolvimento (refatoração, completação de código, informação auxiliar, cobertura de código etc.).

As "linguagens dinâmicas" são flexíveis, rápidas para prototipar, concisas.

É bom entender que os bugs mais complicados continuam complicados igualmente nas duas tipagens.

Certamente há uma vantagem nas "linguagens dinâmicas" quando se pensa no desenvolvimento da própria linguagem. Definir a linguagem e criar uma implementação básica é muito mais simples que uma linguagem estática.

Porém para criar uma implementação poderosa, que possa resolver algumas das suas desvantagens, se torna um trabalho dificílimo.



  Tipagem forte e fraca

Algumas vezes estes conceitos são confundidos com tipagem forte e fraca. Isto se explica em parte porque a força da tipagem não é bem definida e não é universalmente aceita.

Tipagem forte costuma ser a característica que não permite um mesmo dado ser tratado como se fosse de outro tipo. É muito comum linguagens estáticas terem tipagem forte. Mas existem exceções.

Isto dá mais robustez ao código.

A linguagem C, por exemplo, permite que um dado seja acessado/interpretado como se fosse outro. Pode, por exemplo:

- Gravar um int e acessá-lo como se fosse um ponteiro.

- Gravar um float e acessar como se fosse um int. É certo que o resultado será catastrófico neste caso, mas é possível.

- Obter um 0 ser considerado falso ou outros números (não importa de que tipo) serem interpretados como verdadeiro em operações que exigem um booliano.

- Gravar dois short em sequência e ler como um int. Provavelmente nada útil será obtido mas é possível.

- Gravar "SOpt" e ler isto como se fosse um int.

C é uma linguagem de tipagem fraca. C++ também, apesar dela tentar reforçar um estilo onde isto não seja tão usado.

Os compiladores de C/C++ tentam evitar que isto seja usado abusivamente.



Daí concluímos que segurança de tipos não é uma característica inerente de linguagens ditas estáticas. A segurança pode ser quebrada por outros fatores. Type safety é outro conceito diferente que pode ser confundido erroneamente com tipagem forte e tipagem estática.

Muitas "linguagens dinâmicas" possuem tipagem forte, mas outras possuem tipagem fraca, normalmente criando coerções implícitas. É comum existir coerção em algumas situações sob regras definidas. Exemplo: "1" == 1 é verdadeiro e 1 + "1" dá "11".

A coerção implícita tem a vantagem de tornar o código ligeiramente mais curto. Isto costuma ser característica de linguagens de script, onde o tamanho do código faz diferença. Então, linguagens feitas para desenvolver aplicações, em oposição à scripts, não deveriam ter esta característica.

A definição destes termos não ajudam muito e dizer que uma linguagem é fracamente ou fortemente tipada de forma exclusiva também não costuma ser verdade.

  Entenda como os sites carregam os dados na internet :

Esquema A (Site estático) : O cliente (navegador web) envia uma solicitação HTTP para o servidor web com uma URL. O HTML (HyperText Markup Language) arquivo solicitado, armazenado no servidor web, é imediatamente devolvido ao cliente com uma resposta HTTP, e seu conteúdo é interpretado pelo navegador e, em seguida, exibido para o usuário. Isto é conhecido como o processamento do lado do cliente.

Esquema B (Site dinâmico) : O cliente (navegador web) envia uma solicitação HTTP para o servidor web com uma URL, que envia o pedido para o servidor de aplicativos. O servidor de aplicativos pode solicitar dados de um banco de dados em primeiro lugar, e, em seguida, constrói a resposta de HTTP a partir dos dados capturados no banco de dados. Esta resposta é passada de volta para o servidor web, que retorna o arquivo HTML, construído pelo servidor de aplicações, para o cliente, através de resposta HTTP. Isso é chamado de processamento do lado do servidor.

A principal diferença é que as páginas dinâmicas não são servidas como estão pelo servidor web, como páginas estáticas. Eles são construídos para cada solicitação HTTP enviada por cada cliente.

Essas etapas adicionais, necessárias para sites dinâmicos, aumentam o tempo para o usuário receber a resposta HTTP do servidor com a página solicitada (URL). E ninguém gosta de esperar não é mesmo.

Recursos de servidor também são afetados por sites dinâmicos como para cada solicitação HTTP, o mesmo conteúdo precisa ser construído novamente e novamente.

Há uma outra vantagem principal de sites estáticos sobre dinâmicos. As páginas estáticas não processam dados do usuário, contornando um grande problema de segurança relacionado a aplicativos da web dinâmicos: privacidade do usuário. Se os usuários não enviarem nenhum dado ao seu servidor, não haverão dados a serem protegidos e por sua vez pesquisados por mal intencionados.

É importante dizer que as linguagens HTML, Javascript e CSS são do tipo "client side", ou seja são interpretadas diretamente pelo browser(navegador) no computador do cliente e linguagens como PHP, asp, java são interpretadas pelos servidores web(servidores de hospedagem) que retornam o código em HTML para ser interpretado pelo browser(navegador) no computador do cliente consumindo assim maior tempo para carregamento do site.

Não é raro notarmos que um mesmo site pode ter uma aparência um pouco diferente quando visto em dispositivos diferentes. Geralmente alguns recursos não funcionam igualmente ou ficam indisponíveis. Muitas vezes o problema não está no site, mas sim no navegador utilizado para acessá-lo. O que acontece é que os cinco principais navegadores para desktop disponíveis no mercado usam cinco motores de renderização diferentes para exibir uma página da web e todos eles funcionam de maneiras diferentes. Isso significa que a sua experiência na web pode mudar de acordo com o navegador que você está usando e até mesmo de acordo com a versão do mesmo.

  Mas o que é um motor de renderização?

A função do motor de renderização, também conhecido como motor de layout, é renderizar, ou seja, exibir os conteúdos solicitados na tela do navegador.

Esse mecanismo é necessário, pois uma página da web não é uma entidade única que pode ser baixada e exibida na tela um pixel de cada vez. Em vez disso, ela é composta por uma série de instruções escritas em vários tipos de código – HTML, PHP, ASP, CSS, JavaScript, entre outras – que dizem ao navegador o que fazer, onde fazer e como fazer.

Cada navegador utiliza um motor de renderização para levar as informações de conteúdo e layout contidas nesses códigos e, em seguida, exibi-las totalmente formatadas e compreensíveis na tela do seu computador. O problema é que cada navegador usa um tipo de motor diferente e as especificações de cada linguagem de programação são muito detalhadas e cada motor só pode oferecer uma única interpretação dessa especificação.

No caso do CSS (código que fornece as informações da aparência de uma página), particularmente, nenhum motor ainda consegue reproduzir exatamente os mesmos resultados de outro. Às vezes, as diferenças podem ficar por conta apenas de um pixel desalinhado aqui ou ali ou eles podem ficar com uma aparência diferente.



  Quais são os principais motores utilizados pelos navegadores ?

Atualmente, existem cinco principais motores de renderização utilizados pelos navegadores mais populares do mercado.

São eles

- WebKit : um motor de código aberto usado pelo Safari no OS X e iOS, assim como por muitos outros navegadores em dispositivos móveis, incluindo o navegador nativo do Android. O WebKit se tornou totalmente open source em 2005, permitindo grandes evoluções e desenvolvimentos com colaboração de terceiros;

- Blink : um motor de código aberto baseado no WebKit. Ele alimenta navegadores como o Chrome, Opera, Amazon Silk e Android WebView (o navegador que abre dentro de aplicativos). Em 2013, o Google anunciou que aposentaria o tradicional motor de renderização que utilizava no Chrome, o WebKit, e adotaria um novo, o Blink. O motor foi modificado pelo próprio Google para melhorar o desempenho e reduzir a complexidade do navegador;

- Gecko : um motor de código aberto desenvolvido pela Fundação Mozilla e usado pelo Firefox. O Gecko roda em vários sistemas operacionais tendo suporte para BSD, Linux, Mac OS X, Solaris, OS/2, AIX, OpenVMS e Windows;

- Trident : um motor desenvolvido pela Microsoft e usado no Internet Explorer.

- EdgeHTML : O novo browser do Windows 10, chamado Microsoft Edge, utiliza uma versão mais recente e renovada do Trident chamada EdgeHTML.



  Veja modelos :

  Site estático : Clique aqui

  Site dinâmico : Clique aqui

  Quer um site ou loja virtual profissional ?

Entre em contato conosco.