031.1 Lição 1
Certificação: |
Web Development Essentials |
---|---|
Versão: |
1.0 |
Tópico: |
031 Desenvolvimento de software e tecnologias web |
Objetivo: |
031.1 Noções básicas de desenvolvimento de software |
Lição: |
1 de 1 |
Introdução
Os primeiros computadores eram programados através de um cansativo processo de conectar cabos em soquetes. Os cientistas da computação logo iniciaram uma busca incessante por maneiras mais fáceis de dizer ao computador o que fazer. Este capítulo é uma introdução às ferramentas de programação. Ele trata das principais maneiras pelas quais uma série de instruções em forma de texto — as linguagens de programação — representam as tarefas que um programador deseja realizar e as ferramentas que transformam o programa em uma forma chamada linguagem de máquina que pode ser executada por um computador.
Note
|
Neste texto, os termos programa e aplicativo são usados de forma intercambiável. |
Código fonte
Um programador normalmente desenvolve um aplicativo escrevendo uma descrição textual, chamada código-fonte, da tarefa desejada. O código-fonte está em uma linguagem de programação cuidadosamente definida que representa o que o computador pode fazer em uma abstração de alto nível compreensível pelos humanos. Também foram desenvolvidas ferramentas para permitir que os programadores, bem como os não-programadores, expressem suas ideias visualmente, mas o código-fonte continua sendo a forma predominante de se programar.
Da mesma forma que uma linguagem natural inclui substantivos, verbos e construções para expressar ideias de forma estruturada, as palavras e a pontuação em uma linguagem de programação são representações simbólicas de operações que serão realizadas na máquina.
Nesse sentido, o código-fonte não difere muito de qualquer outro texto em que o autor emprega as regras bem estabelecidas de uma linguagem natural para se comunicar com o leitor. No caso do código-fonte, o “leitor” é a própria máquina e, portanto, o texto não pode conter ambigüidades ou inconsistências — nem mesmo as mais sutis.
E como qualquer texto que discuta algum tópico em profundidade, o código-fonte também precisa ser bem estruturado e organizado de forma lógica ao se desenvolver aplicativos complexos. Programas muito simples e exemplos didáticos podem ser armazenados em poucas linhas de um único arquivo de texto contendo todo o código-fonte do programa. Programas mais complexos podem ser subdivididos em milhares de arquivos, cada um com milhares de linhas.
O código-fonte dos aplicativos profissionais deve ser organizado em pastas diferentes, geralmente associadas a uma finalidade específica. Um programa de chat, por exemplo, pode ser organizado em duas pastas: uma que contém os arquivos de código que tratam da transmissão e recepção de mensagens pela rede e outra com os arquivos que constituem a interface e reagem às ações do usuário. De fato, é comum que haja muitas pastas e subpastas com arquivos de código-fonte dedicados a tarefas extremamente específicas dentro do aplicativo.
Além disso, o código-fonte nem sempre está isolado em seus próprios arquivos, com tudo escrito em uma única linguagem. No caso dos aplicativos web, por exemplo, um documento HTML pode incorporar código em JavaScript para complementar o documento com funcionalidades extras.
Editores de código e IDE
Existe uma variedade estonteante de maneiras de escrever um código-fonte. Assim, muitos desenvolvedores lançam mão de ferramentas que ajudam a escrever e testar o programa.
O arquivo de código-fonte não é mais que um arquivo de texto simples e, como tal, pode ser editado em qualquer editor de texto, por mais despojado que seja. Para facilitar a distinção entre código-fonte e texto simples, cada linguagem adota uma extensão de nome de arquivo autoexplicativa: .c
para a linguagem C, .py
para Python, .js
para JavaScript etc. Os editores de texto de uso geral costumam reconhecer o código-fonte das linguagens mais populares e adicionam automaticamente itálico, cores e indentação para tornar o código mais legível.
Nem todo desenvolvedor escolhe editar o código-fonte em um editor de uso geral. Um ambiente de desenvolvimento integrado (em inglês, integrated development environment ou IDE) inclui um editor de texto junto com ferramentas que ajudam o programador a evitar erros de sintaxe e inconsistências óbvias. Esses editores são particularmente recomendados para os programadores menos experientes, mas os programadores experientes também podem usá-los.
Os IDEs mais populares, como o Visual Studio, o Eclipse e o Xcode, observam de forma inteligente o que o programador digita, muitas vezes sugerindo palavras (preenchimento automático) e verificando o código em tempo real. Os IDEs podem inclusive oferecer depuração e testes automatizados para identificar problemas sempre que o código-fonte é alterado.
Alguns programadores mais experientes optam por editores menos intuitivos, como o Vim, que oferece maior flexibilidade e não requer a instalação de pacotes adicionais. Esses programadores usam ferramentas externas independentes para adicionar os recursos que são integrados quando você usa um IDE.
Manutenção de código
Seja em um IDE ou usando ferramentas autônomas, é importante empregar algum tipo de sistema de controle de versão (VCS). O código-fonte está em constante evolução porque as falhas imprevistas precisam ser corrigidas e aprimoramentos devem ser incorporados. Uma consequência inevitável dessa evolução é que as correções e aprimoramentos podem interferir em outras partes dos aplicativos em uma grande base de código. Ferramentas de controle de versão como Git, Subversion e Mercurial mantêm um registro de todas as alterações feitas no código e a pessoa que as fez, permitindo rastrear e, eventualmente, voltar atrás em uma modificação malsucedida.
Além disso, as ferramentas de controle de versão permitem que cada desenvolvedor da equipe trabalhe em uma cópia dos arquivos do código-fonte sem interferir no trabalho dos outros programadores. Assim que as novas versões do código-fonte estiverem prontas e testadas, as correções ou melhorias feitas em uma cópia podem ser incorporadas pelos outros membros da equipe.
O Git, o sistema de controle de versão mais popular hoje em dia, permite que muitas cópias independentes de um repositório sejam mantidas por diferentes pessoas, que compartilham suas alterações como desejarem. No entanto, quer o sistema de controle de versão seja centralizado ou descentralizado, a maioria das equipes mantém um único repositório confiável, com um código-fonte e recursos sólidos. Muitos serviços online oferecem espaços de armazenamento para repositórios de código-fonte. Os mais populares dentre eles são o GitHub e o GitLab, mas o Savannah, do projeto GNU, também vale a menção.
Linguagens de programação
Existe uma grande variedade de linguagens de programação; novas linguagens são criadas a cada década. Cada linguagem de programação tem suas próprias regras e é recomendada para fins específicos. Embora as linguagens apresentem diferenças superficiais de sintaxe e palavras-chave, o que realmente as distingue são as profundas abordagens conceituais que representam, conhecidas como paradigmas.
Paradigmas
Os paradigmas definem as premissas nas quais se baseia uma linguagem de programação, especialmente no que diz respeito à maneira como o código-fonte deve ser estruturado.
O desenvolvedor parte do paradigma da linguagem para formular as tarefas a serem executadas pela máquina. Essas tarefas, por sua vez, são expressas simbolicamente com as palavras e construções sintáticas oferecidas pela linguagem.
A linguagem de programação é procedural quando as instruções apresentadas no código-fonte são executadas em ordem sequencial, como um roteiro de filme. Se o código-fonte for segmentado em funções ou sub-rotinas, uma rotina principal se encarrega de chamar as funções em sequência.
O código a seguir é um exemplo de linguagem procedural. Escrito em C, ele define variáveis que representam as faces, a área e o volume de formas geográficas. O valor da variável side
é atribuído em main()
, que é a função invocada quando o programa é executado. As variáveis area
e volume
são calculadas nas sub-rotinas square()
e cube()
que precedem a função principal:
#include <stdio.h>
float side;
float area;
float volume;
void square(){ area = side * side; }
void cube(){ volume = area * side; }
int main(){
side = 2;
square();
cube();
printf("Volume: %f\n", volume);
return 0;
}
A ordem das ações definidas em main()
determina a sequência de estados do programa, caracterizada pelo valor das variáveis side
, area
e volume
. O exemplo se encerra após exibir o valor de volume
com a instrução printf
.
Por outro lado, o paradigma da programação orientada a objetos (OOP) tem como principal característica a separação do estado do programa em subestados independentes. Esses subestados e as operações associadas são os objetos, assim chamados porque têm uma existência mais ou menos independente dentro do programa e porque têm finalidades específicas.
Os diferentes paradigmas não restringem necessariamente o tipo de tarefa que pode ser executada por um programa. O código do exemplo anterior pode ser reescrito de acordo com o paradigma OOP usando a linguagem C++:
#include <iostream>
class Cube {
float side;
public:
Cube(float s){ side = s; }
float volume() { return side * side * side; }
};
int main(){
float side = 2;
Cube cube(side);
std::cout << "Volume: " << cube.volume() << std::endl;
return 0;
}
A função main()
ainda está presente. Mas agora temos uma nova palavra, class
(classe), que introduz a definição de um objeto. A classe definida, chamada Cube
, contém suas próprias variáveis e sub-rotinas. Na OOP, uma variável também é chamada de atributo e uma sub-rotina é chamada de método.
Nesta lição, não há interesse em explicar todo o código C++ do exemplo. O que é importante para nós neste caso é saber que Cube
contém o atributo side
e dois métodos. O método volume()
calcula o volume do cubo.
É possível criar vários objetos independentes pertencentes à mesma classe; as classes também podem ser compostas por outras classes.
Lembre-se de que esses mesmos recursos podem ser escritos de maneira diferente e que os exemplos deste capítulo são bem simplificados. C e C++ possuem recursos muito mais sofisticados, possibilitando construções bem mais complexas e práticas.
A maioria das linguagens de programação não impõe rigorosamente um paradigma, mas permite que os programadores escolham diversos aspectos de um paradigma ou de outro. O JavaScript, por exemplo, incorpora aspectos de diferentes paradigmas. O programador pode decompor o programa inteiro em funções que não compartilham um estado comum entre si:
function cube(side){
return side*side*side;
}
console.log("Volume: " + cube(2));
Embora este exemplo seja semelhante à programação procedural, note que a função recebe uma cópia de todas as informações necessárias para sua execução e sempre produz o mesmo resultado para o mesmo parâmetro, independentemente das alterações que ocorram fora do escopo da função. Este paradigma, denominado funcional, é fortemente influenciado pelo formalismo matemático, no qual toda operação é autossuficiente.
Outro paradigma cobre as linguagens declarativas, que descrevem os estados em que se deseja que o sistema esteja. Uma linguagem declarativa pode descobrir como atingir os estados especificados. O SQL, a linguagem universal para consulta de bancos de dados, às vezes é chamada de linguagem declarativa, embora na verdade ocupe um nicho único no panteão da programação.
Não existe um paradigma universal que possa ser adotado em qualquer contexto. A escolha da linguagem também pode ser restrita pelos idiomas suportados na plataforma ou ambiente de execução em que o programa será usado.
Um aplicativo web que será executado pelo navegador, por exemplo, precisa ser escrito em JavaScript, que é uma linguagem universalmente suportada pelos navegadores (na verdade, algumas outras linguagens podem ser usadas porque fornecem conversores para criar JavaScript). Assim, para o navegador web — às vezes chamado de lado do cliente ou front end do aplicativo web — o desenvolvedor terá de usar os paradigmas permitidos em JavaScript. O lado do servidor ou back end do aplicativo, que lida com as solicitações do navegador, normalmente é programado em uma linguagem diferente; o PHP é mais popular para essa finalidade.
Independentemente do paradigma, toda linguagem possui bibliotecas de funções pré-construídas que podem ser incorporadas ao código. Funções matemáticas — como as ilustradas no código de exemplo — não precisam ser implementadas do zero, pois a linguagem já tem a função pronta para uso. O JavaScript, por exemplo, fornece o objeto Math
, com as operações matemáticas mais comuns.
Geralmente há funções ainda mais especializadas disponibilizadas pelo fornecedor da linguagem ou por outros desenvolvedores. Essas bibliotecas de recursos extras podem estar na forma de código-fonte, ou seja, em arquivos extras que são incorporados ao arquivo em que serão usados. Em JavaScript, a incorporação é feita com import from
:
import { OrbitControls } from 'modules/OrbitControls.js';
Esse tipo de importação, em que o recurso incorporado também é um arquivo de código-fonte, é mais frequentemente usado nas chamadas linguagens interpretadas. As linguagens compiladas permitem, entre outras coisas, a incorporação de funcionalidades pré-compiladas em linguagem de máquina, ou seja, bibliotecas compiladas. A próxima seção explica as diferenças entre esses tipos de linguagem.
Compiladores e interpretadores
Como já sabemos, o código-fonte é uma representação simbólica de um programa que precisa ser traduzido em linguagem de máquina para ser executado.
Grosso modo, existem duas maneiras possíveis de se fazer a tradução: converter com antecedência o código-fonte para execução futura ou converter o código no momento de sua execução. As linguagens da primeira modalidade são chamadas de linguagens compiladas e as da segunda, linguagens interpretadas. Algumas linguagens interpretadas oferecem a compilação como opção para que o programa possa iniciar mais rápido.
Nas linguagens compiladas, existe uma distinção clara entre o código-fonte do programa e o programa em si, que será executado pelo computador. Depois de compilado, o programa normalmente rodará apenas no sistema operacional e na plataforma para os quais foi compilado.
Em uma linguagem interpretada, o próprio código-fonte é tratado como o programa, e o processo de conversão para linguagem de máquina é transparente para o programador. Nas linguagens interpretadas, é comum chamar o código-fonte de script. O interpretador traduz o script para a linguagem de máquina do sistema em que ele está sendo executado.
Compilação e compiladores
A linguagem de programação C é um dos exemplos mais conhecidos de linguagem compilada. Os principais pontos fortes da linguagem C são sua flexibilidade e desempenho. Tanto supercomputadores e quando os microcontroladores de alto desempenho de eletrodomésticos podem ser programados na linguagem C. Outros exemplos de linguagens compiladas populares são C++ e C# (C sharp). Como seus nomes sugerem, essas linguagens são inspiradas em C, mas incluem recursos que suportam o paradigma orientado a objetos.
O mesmo programa escrito em C ou C++ pode ser compilado para diferentes plataformas, exigindo pouca ou nenhuma alteração no código-fonte. É o compilador que define a plataforma de destino do programa. Existem compiladores específicos a plataformas, bem como compiladores que atendem a diversas plataformas, como o GCC (que significa GNU Compiler Collection) , capazes de produzir programas binários para muitas arquiteturas distintas.
Note
|
Existem também ferramentas que automatizam o processo de compilação. Em vez de invocar o compilador diretamente, o programador cria um arquivo indicando as diferentes etapas de compilação a serem executadas automaticamente. A ferramenta tradicional usada para esse propósito é |
O processo de compilação nem sempre gera um programa binário em linguagem de máquina. Existem linguagens compiladas que produzem um programa em um formato genericamente denominado bytecode. Como um script, o bytecode não está em uma linguagem específica à plataforma e, por isso, requer um programa interpretador, que o traduz para a linguagem de máquina. Neste caso, o programa interpretador é simplesmente chamado de runtime.
A linguagem Java adota essa abordagem; assim, os programas compilados escritos em Java podem ser usados em diferentes sistemas operacionais. Apesar do nome, o Java não tem relação com o JavaScript.
O bytecode está mais próximo da linguagem de máquina do que do código-fonte, de forma que sua execução tende a ser comparativamente mais rápida. Como ainda há um processo de conversão durante a execução do bytecode, é difícil obter o mesmo desempenho de um programa equivalente compilado em linguagem de máquina.
Interpretação e interpretadores
Nas linguagens interpretadas como JavaScript, Python e PHP, o programa não precisa ser pré-compilado, o que facilita seu desenvolvimento e modificação. Em vez de compilá-lo, o script é executado por outro programa chamado interpretador. Normalmente, o interpretador de uma linguagem recebe o nome da própria linguagem. O interpretador de um script Python, por exemplo, é um programa chamado python
. O interpretador de JavaScript é geralmente o navegador web, mas os scripts também podem ser executados pelo programa node
fora de um navegador. Por ser convertido em instruções binárias toda vez que é executado, um programa em linguagem interpretada tende a ser mais lento do que um equivalente em linguagem compilada.
Nada impede que o mesmo aplicativo tenha componentes escritos em linguagens diferentes. Se necessário, esses componentes podem se comunicar por meio de uma interface de programação de aplicativos (API) mutuamente compreensível.
A linguagem Python, por exemplo, possui recursos muito sofisticados de mineração e tabulação de dados. O desenvolvedor pode escolher o Python para escrever as partes do programa que lidam com esses aspectos e outra linguagem, como o C++, para realizar o processamento numérico mais pesado. É possível adotar essa estratégia mesmo quando não existe uma API que permita a comunicação direta entre os dois componentes. O código escrito em Python pode gerar um arquivo no formato adequado para ser usado por um programa escrito em C++, por exemplo.
Embora seja possível escrever quase qualquer programa em qualquer linguagem, o desenvolvedor deve adotar aquela que estiver mais de acordo com o propósito do aplicativo. Ao fazer isso, você se beneficia da reutilização de componentes já testados e bem documentados.
Exercícios Guiados
-
Que tipo de programa pode ser usado para editar um código-fonte?
-
Que tipo de ferramenta ajuda a integrar o trabalho de diferentes desenvolvedores na mesma base de código?
Exercícios Exploratórios
-
Suponha que você queira escrever um jogo em 3D para ser jogado no navegador. Os apps e games para web são programados em JavaScript. Embora seja possível escrever todas as funções gráficas do zero, é mais produtivo usar uma biblioteca pronta para esse fim. Quais bibliotecas de terceiros fornecem recursos para a animação 3D em JavaScript?
-
Além do PHP, quais outras linguagens podem ser usadas no lado do servidor de um aplicativo web?
Resumo
Esta lição trata dos conceitos mais essenciais de desenvolvimento de software. O desenvolvedor deve conhecer as linguagens de programação mais importantes e o contexto de uso adequado para cada uma delas. Esta lição aborda os seguintes conceitos e procedimentos:
-
O que é código-fonte.
-
Editores de código-fonte e ferramentas relacionadas.
-
Paradigmas de programação procedural, orientada a objetos, funcional e declarativa.
-
Características das linguagens compiladas e interpretadas.
Respostas aos Exercícios Guiados
-
Que tipo de programa pode ser usado para editar um código-fonte?
Em princípio, qualquer programa capaz de editar texto simples.
-
Que tipo de ferramenta ajuda a integrar o trabalho de diferentes desenvolvedores na mesma base de código?
Um sistema de controle de origem ou versão, como o Git.
Respostas aos Exercícios Exploratórios
-
Suponha que você queira escrever um jogo em 3D para ser jogado no navegador. Os apps e games para web são programados em JavaScript. Embora seja possível escrever todas as funções gráficas do zero, é mais produtivo usar uma biblioteca pronta para esse fim. Quais bibliotecas de terceiros fornecem recursos para a animação 3D em JavaScript?
Existem muitas opções de bibliotecas de gráficos 3D para JavaScript, como threejs e BabylonJS.
-
Além do PHP, quais outras linguagens podem ser usadas no lado do servidor de um aplicativo web?
Qualquer linguagem suportada pelo aplicativo de servidor HTTP usado no host do servidor. Alguns exemplos são Python, Ruby, Perl e o próprio JavaScript.