Avançar para o conteúdo
Imagem com logotipo, contendo link para a página inicial
  • United Stated of America flag, representing the option for the English language.
  • Bandeira do Brasil, simbolizando a opção pelo idioma Português do Brasil.

Aprenda Programação: Ponto de Entrada (main()) e Estrutura de Programa

GNU Emacs com código-fonte para o programa `Hello, world!` (`Olá, mundo!`), com `Olá, meu nome é Franco!` escrito em dez linguagens de programação: Lua, Python, JavaScript, C, C++, Java, LISP, Prolog, SQL e GDScript.

Créditos para a imagem: Imagem criada pelo autor usando o programa Spectacle.

Pré-Requisitos

Na introdução sobre ambientes de desenvolvimento, indiquei Python, Lua e JavaScript como boas escolhas de linguagens de programação para iniciantes. Posteriormente, comentei sobre GDScript como opção para pessoas que tenham interesse em programar jogos digitais ou simulações. Para as atividades de introdução a programação, você precisará de, no mínimo, um ambiente de desenvolvimento configurado em uma das linguagens anteriores.

Caso queira experimentar programação sem configurar um ambiente, você pode usar um dos editores online que criei:

Contudo, eles não possuem todos os recursos dos interpretadores para as linguagens. Assim, cedo ou tarde, você precisará configurar um ambiente de desenvolvimento. Caso precise configurar um, confira os recursos a seguir.

Assim, se você tem um Ambiente Integrado de Desenvolvimento (em inglês, Integrated Development Environment ou IDE) ou a combinação de editor de texto com interpretador, você está pronto para começar. Os exemplos assumem que você saiba executar código em sua linguagem escolhida, como apresentado nas páginas de configuração.

Caso queira usar outra linguagem, a introdução provê links para configuração de ambientes para as linguagens C, C++, Java, LISP, Prolog e SQL (com SQLite). Em muitas linguagens, basta seguir os modelos da seção de experimentação para adaptar sintaxe, comandos e funções dos trechos de código. C e C++ são exceções, por requerem o uso de ponteiros para acesso à memória.

Todo Programa Tem um Começo

Sua jornada de programação tem um começo. Você está nos primeiros passos.

Todo programa também tem um começo. Contudo, nem todo programa começa na primeira linha definida em um arquivo de código-fonte.

O início de um programa varia de acordo com convenções estabelecidas pela linguagem de programação adotada. Algumas linguagens consideram que a primeira linha com código do arquivo de código-fonte inicie o programa. Outras definem que todo programa comece a partir de uma palavra reservada, um comando ou uma função.

Qualquer que seja o caso, o início de um programa chama-se ponto de entrada (entry point). Linguagens como JavaScript e Lua definem que o ponto de entrada é a primeira linha com código do arquivo interpretado. Linguagens como C e Java utilizam uma função ou método, chamado de main(), na qual se deve implementar o código inicial. Outras linguagens podem definir convenções diferentes para iniciar um programa. Da mesma forma, bibliotecas, frameworks ou motores podem estabelecer convenções próprias sobre o início de um programa que os utilize. Esse é o caso para _ready() e _init() em GDScript.

Estrutura de um Programa Trivial

Qualquer que seja o caso, código-fonte escrito em uma linguagem de programação deve seguir a estrutura proposta pela linguagem. Não se pode escrevê-lo de qualquer forma, como é o caso de linguagem natural. Em um texto, é possível escrever palavras aleatórias, mesmo que a combinação resultante não faça sentido. Em uma linguagem de programação, escolher palavras aleatórias dificilmente resultará em um programa válido. Muito provavelmente, o resultado será um erro emitido pelo interpretador ou compilador.

Assim, um dos primeiros passos para se começar a programar na linguagem é reconhecer a estrutura esperada. O reconhecimento de padrões é uma habilidade importante em programação; hora de praticá-lo. A Seção "Olá, Mundo!" da introdução sobre ambientes de desenvolvimento apresenta, em diversas linguagens, um dos programas mais simples de se criar: um programa que escreve uma mensagem na tela (normalmente de um console ou terminal) e termina.

Por conveniência, repete-se os exemplos nesta seção. Para cada linguagem a seguir, tente observar a estrutura de um programa que escreve Olá, meu nome é Franco!. Quais linguagens possuem estruturas parecidas? Quais linguagens possuem estruturas diferentes? Na sua opinião, algumas linguagens parecem mais simples que outras?

  1. Em Lua:

    print("Olá, meu nome é Franco!")
  2. Em Python:

    print("Olá, meu nome é Franco!")
  3. Em JavaScript:

    Está usando um navegador em um computador ao invés de dispositivo móvel (como smartphone ou tablet)? Se estiver em computador, você pode executar o código JavaScript usando o console embutido, acessível com a tecla de atalho F12.

    console.log("Olá, meu nome é Franco!")
  4. Em C:

    #include <stdio.h>
    
    int main()
    {
        printf("Olá, meu nome é Franco!");
    
        return 0;
    }
  5. Em C++:

    #include <iostream>
    
    int main()
    {
        std::cout << "Olá, meu nome é Franco!";
    
        return 0;
    }
  6. Em Java:

    public class OlaMundo
    {
        public static void main(String[] args)
        {
            System.out.print("Olá, meu nome é Franco!");
        }
    }
  7. Em LISP:

    (princ "Olá, meu nome é Franco!")
  8. Em Prolog:

    main :- write("Olá, meu nome é Franco!").
  9. Em SQL (SQLite):

    SELECT "Olá, meu nome é Franco!";
  10. Em GDScript (para Godot Engine):

    extends SceneTree
    
    func _init():
        print("Olá, meu nome é Franco!")

Programas que começam com um comando ou uma chamada de função de impressão são escritos em linguagens que adotam a primeira linha de um arquivo como ponto de entrada. A abordagem é comum em linguagens de programação interpretadas, especialmente as que permitem programação interativa usando Read, Evaluate, Print, Loop (REPL; leia, avalue, escreva, repita). Nos exemplos anteriores, Lua, Python, JavaScript, LISP, Prolog e SQL utilizam a primeira linha de código como início de um programa.

Programas que começam com um comando ou uma função como main() ou _init() são escritos em linguagens que possuem um ponto de entrada específico. Escrever a linha para a escrita da mensagem fora do comando ou da função resultaria em erro. C, C++, Java e GDScript são exemplos de linguagens com ponto de entrada específico. Por padrão, nenhuma dessas linguagens fornecem funcionalidades de REPL (embora seja tecnicamente possível implementar um).

Algumas linguagens, como Python, opcionalmente permitem definir um ponto de entrada específico para o programa. Por exemplo, o código-fonte Python a seguir também escreve Olá, meu nome é Franco! e termina:

def main():
   # [2] Depois vem para cá.
   print("Olá, meu nome é Franco!")

if (__name__ == "__main__"):
    main() # [1] O programa começa aqui.    # [3] Ele termina aqui.

Assim, caso você encontre um código como o anterior escrito em Python, o programa começa após a linha iniciada por if; no exemplo, isso significa que o início ocorre na linha 6, não na linha 1. De fato, ele começa na linha 6, depois executa a linha 3, depois termina na linha 7.

Em outras palavras, a ordem que um computador segue as instruções não é, necessariamente, a ordem na qual o programa está escrito. Da mesma forma, nem toda linha de código é executada em todo uso de um programa. As razões para situações anteriores ficarão claras em momentos futuros, quando se introduzir conceitos como estruturas de condição, estruturas de repetição e subrotinas (funções, procedimentos e métodos).

Estrutura Básica de Programas

Pode-se generalizar a estrutura de alto nível de todo programa de um computador da seguinte forma:

  1. Importação de bibliotecas e código pré-definido para auxiliar na solução;
  2. Declaração de código auxiliar (por exemplo, estruturas de dados e subrotinas);
  3. Programa principal:
    • Ponto de entrada;
    • Funcionalidades do programa principal;
    • Ponto de saída.

Na forma de um algoritmo, a estrutura pode ser esquematizada como:

// Bibliotecas e código pré-definido para auxiliar na solução.

// Declaração de código auxiliar (por exemplo, estruturas de dados e subrotinas).

// Ponto de entrada.
inicio

    // Funcionalidades do programa principal.
    // ...

// Ponto de saída.
fimalgoritmo

No algoritmo, utiliza-se a seqüência iniciada por duas barras // como um comentário, isto é, texto que é ignorado por um compilador ou interpretador e, portanto, não é incorporado a um programa. Comentários são escritos em linguagem natural; eles não precisam seguir a sintaxe da linguagem de programação. Comentários são úteis para explicar o funcionamento de um código ou o problema considerado, fazer anotações, comunicar idéias para outras pessoas, e qualquer outra coisa que você ache que mereça ser escrita. O importante é saber que é possível adicionar ou remover comentários sem alterar o funcionamento de um programa.

Por exemplo, ambos os trechos de código a seguir são equivalentes em JavaScript:

  1. Trecho sem comentários:

    console.log("Olá, meu nome é Franco!")
  2. Trecho com comentários:

    // Linha ignorada.
    // Outra linha ignorada.
    // Agora o programa começará.
    console.log("Olá, meu nome é Franco!") // Aqui também é ignorado.
    // Esta linha também será ignorada.
    // ...

Evidentemente, os comentários anteriores são apenas ilustrativos. Comentários irrelevantes não precisam ser escritos; eles apenas acrescentam conteúdo desnecessário ao código. Embora eles não façam diferença para a máquina, eles consomem tempo e esforços da pessoa que ler o código.

Para ilustrar a estrutura de programa para um programa real, pode-se escolher uma linguagem com ponto de entrada específico. Código escrito em C fornece um exemplo clássico de estrutura de um programa.

// Bibliotecas e código pré-definido para auxiliar na solução.
#include <stdio.h>

// Ponto de entrada.
int main()
{
    // Funcionalidades do programa principal.
    printf("Olá, meu nome é Franco!");

    // Ponto de saída.
    return 0;
}

O novo código é equivalente ao código escrito anteriormente em C, pois, novamente, comentários são desconsiderados pela máquina. Comentários são para pessoas, código-fonte é para a máquina (e pessoas que o lerem).

Como curiosidade, todo programa inicia de um único ponto de entrada. Contudo, podem existir múltiplos pontos de saída. Programas podem terminar antes da última instrução devido a erros (chamados de erros de tempo de execução ou run-time error), ou em pontos arbitrários definidos no código-fonte.

Caso você esteja curioso sobre o significado do valor 0 em return 0 no código C, ele significa sucesso, isto é, que o programa terminou corretamente.

Além da Implementação

Para estimular suas habilidades de reconhecimento de padrões, você consegue imaginar a razão de todos os programas apresentados nesta página serem semelhantes?

Os programas que escrevem Olá, meu nome é Franco! são semelhantes porque todos eles implementam um mesmo algoritmo. No caso, um programa que inicia, escreve uma mensagem pré-definida, e termina. Ele poderia ser representado como:

inicio
    escreva("Olá, meu nome é Franco!")
fimalgoritmo

A sintaxe escolhida é a adotada pelo VisuAlg, comumente usado em universidades e faculdades para ensino introdutório de programação.

No algoritmo anterior, o programa começa após inicio e termina em fimalgoritmo. O código escrito entre inicio e fimalgoritmo é o código do programa.

Conseguir identificar um algoritmo é importante porque algoritmos podem ser implementados em qualquer linguagem de programação. Basta identificar os padrões.

No caso, para escrever o programa Olá, Mundo! em uma linguagem de programação arbitrária,

  1. Deve-se saber onde um programa começa. Na primeira linha de código de um arquivo? Dentro de um bloco de código específico?
  2. Deve-se procurar por um comando ou subrotina (função, procedimento ou método) que possa escrever uma mensagem no terminal.
  3. Deve-se saber onde um programa termina.

Para ilustrar na prática, pode-se escolher uma nova linguagem de programação. Por exemplo, C#.

O primeiro passo é procurar descobrir qual o ponto de entrada de um programa em C#. Para isso, você pode procurar por "C# entry point" (ou "C# ponto de entrada") em um motor de busca (por exemplo, DuckDuckGo, Google, ou Bing). Outra opção seria procurar por "C# documentation entry point" ("C# documentação ponto de entrada"), para sugerir que o motor de busca procure em páginas com palavra-chave "documentation", para documentação. Em seguida, você poderia procurar por "C# print" para tentar descobrir o recurso para escrita em console em C#. Com as informações anteriores, você poderia escrever seu primeiro programa em C#.

Agora que você conhece o programa Olá, Mundo!, uma terceira opção é procurar por "C# hello world". Olá, Mundo! permite identificar rapidamente a estrutura esperada para um programa em uma linguagem de programação. Em outras palavras, Olá, Mundo! é uma ótima escolha para iniciar o aprendizado em uma nova linguagem de programação.

Qualquer que seja o caminho, a busca revelará que um programa em C# possui a seguinte estrutura:

using System;

class MinhaClasse
{
    static void Main(string[] args)
    {
        Console.WriteLine("Olá, meu nome é Franco!");
    }
}

O programa em C#, portanto, é similar a um escrito em linguagens como C, C++ e Java. Aliás, o programa escrito em C# é bastante similar ao programa escrito Java.

O próximo passo para iniciar atividades de programação em C# seria procurar como executar código-fonte escrito na linguagem (você pode procurar por algo como "c# run program documentation" ou "c# executar programa documentação"). Entretanto, como isso não é algo de interesse para este tópico, podemos continuar.

C# é uma linguagem de programação popular. Para um segundo exemplo, pode-se considerar a linguagem de programação esotérica LOLCODE. Uma linguagem de programação esotérica (ou esolang) é comumente criada como uma piada.

HAI 1.2
    CAN HAS STDIO?

    VISIBLE "Olá, meu nome é Franco!"
KTHXBYE

Os mesmos passos resultariam em um programa como o anterior. Você consegue identificar a estrutura básica de programas em LOLCODE?

Para aprender sobre mais recursos de motores de busca, procure por como fazer buscas avançadas. Por exemplo, aspas duplas comumente permitem procurar por termos exatos; também é interessante saber como filtrar resultados por data (especialmente ano, no caso de programação, para se obter resultados mais recentes). Assim consulte a documentação do seu motor de busca favorito; por exemplo, para o Google (consulte este também). Para o DuckDuckGo, convém conhecer bangs.

Pensamento Computacional em Ação

Os três passos para escrever um programa Olá, Mundo! em uma nova linguagem de programação constituem um exemplo de aplicação de pensamento computacional.

O problema original era escrever Olá, Mundo! em uma nova linguagem de programação -- no caso, C# e LOLCODE. Em seguida, decompôs-se o problema em partes menores: identificação de ponto de entrada, identificação do recurso necessário para escrever uma mensagem, identificação de como terminar um programa.

A decomposição resultou nos itens necessários para resolver o problema. Para escrever um algoritmo para criação de programas em uma nova linguagem (textual, por exemplo), o processo simplificado seria algo como:

  1. Identificação de ponto de entrada;
  2. Identificação do recurso necessário para escrever uma mensagem;
  3. Identificação de como terminar um programa;
  4. Criação de um novo arquivo texto;
  5. Escrita, caso necessário, de importação de bibliotecas no arquivo;
  6. Escrita de ponto de entrada no arquivo;
  7. Escrita do código para escrita de mensagem (e da mensagem) no arquivo;
  8. Escrita de ponto de saída no arquivo.

Embora o nível do algoritmo anterior seja muito alto para computadores, ele é válido para pessoas. Em outras palavras, um computador e uma linguagem de programação são necessários, mas insuficientes para programação. Programação é, acima de tudo, uma prática intelectual na qual se resolve problemas de forma estruturada e repetível. Para programação de computadores, deve-se converter a solução expressa em pensamento humano em passos que sejam pequenos e simples o suficientes para que uma máquina possa repeti-los.

Assim, programar não é decorar a sintaxe de uma linguagem de programação. Pode-se consultar a sintaxe de uma linguagem sempre que necessário. Para isso, basta procurar pela documentação.

Programar é resolver problemas e demonstrar a uma máquina (o computador) como repetir a solução concebida. O computador é uma máquina desprovida de inteligência (ininteligente), então a solução concebida não pode ter erros, nem ambigüidades (diferentes possibilidades para interpretação). Os passos devem ser compatíveis com as instruções disponíveis pela arquitetura do computador, que são o que o computador pode fazer.

O que fazer quando se sabe o que fazer, mas não como? Estuda-se, pesquisa-se e usa-se um motor de busca.

Motores de busca são uma das principais ferramentas usadas por programadores. Contudo, você deve saber o que buscar. Se você souber de que precisa, você poderá descobrir como fazer. Para saber de que você precisa, é necessário entender os fundamentos. Fundamentos relacionam-se a conceitos e instruções básicas que computadores podem realizar.

Os próximos tópicos descrevem alguns fundamentos. Antes de continuar, convém organizar a forma de pensar, pois pesquisa e estudo são essenciais para se programar bem.

Método Científico

Parte de pensar computacionalmente é pensar como um cientista. O método científico é, portanto, aplicável a programação. Daqui em diante, ele também deve fazer parte de suas ferramentas.

Simplificadamente (e informalmente), o método científico consiste em:

  1. Identificar um problema;
  2. Pesquisar sobre o que se sabe sobre o problema;
  3. Formular hipóteses;
  4. Planejar experimentos;
  5. Testar e avaliar resultados obtidos;
  6. Descrever resultados, tirar conclusões, e refletir sobre o aprendizado;
  7. Repetir até resolver o problema (ou estar satisfeita ou satisfeito com os resultados obtidos).

Caso prefira, você pode trocar cientista por detetive. O método continua válido.

Para o exemplo de Olá, Mundo em C#, o método científico foi aplicado como:

  1. Caracterizar um problema: um programa em C# que escreva Olá, Mundo em um console;
  2. Formular hipóteses: usando um recurso para escrita em console entre o ponto de entrada e de saída, poder-se-ia criar um programa para escrever uma mensagem no console.
  3. Planejar experimentos:
    • Buscar pelos elementos necessários para a premissa da hipótese: ponto de entrada, ponto de saída, recurso para escrita;
    • Escrever um arquivo de código-fonte usando os elementos identificados;
    • Executar o programa criado;
    • Comparar os resultados. Se o resultado obtido na saída Olá, meu nome é Franco!, então a conclusão (tese) é correta: os três elementos permitem criar um programa para escrever a mensagem no console. Caso contrário, analisar resultados obtidos, entender melhor o problema, reformular a hipótese, repetir o processo;
  4. Testar e avaliar resultados obtidos:
  5. Suas conclusões.

A rigor, um processo científico teria maior rigor metodológico e detalhamento. Contudo, como não se trata de um problema acadêmico, o mais importante é entender o processo e como pensar em obter soluções para os problemas.

Em suma, quanto melhor o entendimento de um problema, mais clara e simples será a solução. Soluções claras e simples costumam ser elegantes; busque (almeje) a elegância.

Método Científico e Ponto de Entrada

Qual a relação do método científico com o ponto de entrada de um programa?

Nenhuma. Toda.

Algoritmos são seqüências finitas de passos para resolução de problemas. Se não existe um objetivo, não existe fim. Se não existe fim, não existe algoritmo. Em outras palavras, um algoritmo precisa começar e terminar.

Todo programa precisa partir de um estado inicial até obter-se um estado final desejado. Cada instrução de um código tenta aproximar o estado atual ao estado final.

Se uma instrução não contribui com a solução, questione se ela deve aparecer em seu código-fonte.

Nem Todo Programa Válido é Um Programa Correto

O título da subseção parece um oxímoro, mas é correto.

Compiladores e interpretadores podem detectar erros de sintaxe no uso de uma linguagem, mas não podem informar se um programa está correto ou não (o motivo é o problema da parada, que será citado na próxima subseção). Um código-fonte com sintaxe correta, mas resultados (ou comportamentos) incorretos, é dito com erro de lógica.

Em outras palavras, um programa válido em uma linguagem não é, necessariamente, um programa correto. Assim, o trabalho de uma desenvolvedora ou desenvolvedora não termina assim que um programa esteja rodando. Resultados corretos requerem a realização de inspeções e testes. Definir resultados esperados a partir de determinadas entradas é importante para verificar se um programa parece correto. Ou seja, o método científico mostra-se útil novamente, para fins de testes de hipótese e validação.

Nem Todo Programa Termina

Existem problemas que demandam quantidades de tempo tão altas que são computacionalmente insolúveis com a tecnologia atual. Pode-se aproximá-los, mas não se pode resolvê-los. O estudo da complexidade de problema é chamado de complexidade computacional.

Simplificadamente, isso implica que existem problemas que não se pode resolver com computadores. Assim, para fins práticos, problemas computacionalmente possíveis e iniciantes em programação, existem dois tipos de programas que não possuem fim:

  1. Programas incorretos;
  2. Programas cujo algoritmo (intencionalmente) repete-se para sempre.

Em outras palavras, se você escrever um programa que, inadvertidamente, não termina, provavelmente existe um erro de lógica em seu projeto.

O motivo da escolha do termo "provavelmente" ao invés de "certamente" é que existem problemas que são realmente impossíveis de se resolver com computadores atuais. Um deles é chamado de problema da parada, para determinar se, dada uma especificação programa e uma entrada (qualquer que ela seja), o programa terminará.

O problema da parada é a razão pela qual um interpretador ou compilador não pode afirmar se qualquer programa que possa ser escrito esteja correto. Para um contraexemplo, pode-se considerar o caso de programas que se repetem para sempre, isto é, que, intencionalmente, não devem terminar. Para que o compilador ou interpretador determinasse que tal programa esteja correto a partir de sua especificação, o programa teria que terminar. Em outras palavras, o programa teria, ao mesmo tempo, que terminar e nunca terminar. Se isso parece confuso é impossível, é porque, de fato, trata-se de uma contradição.

O que se precisa saber é que, para problemas complexos, pode ser difícil provar que um algoritmo está correto -- ou mesmo que ele termine. Isso é relevante porque existem sistemas nos quais qualquer erro pode ser fatal, como sistemas para saúde ou transportes.

Novos Itens para Seu Inventário

Ferramentas:

  • Linguagem de programação;
  • Motor de busca;
  • Método científico.

Habilidades:

  • Reconhecimento de padrões.

Conceitos:

  • Estrutura de um programa;
  • Programas que terminam (ou não).

Recursos de programação:

  • Comentários.

Próximos Passos

Embora a interatividade desta página seja praticamente nula, o conteúdo é de grande importância. Uma das habilidades mais importantes em programação é a capacidade de resolver problemas. Nesta página, você começou a pensar como programador para resolver problemas. Doravante, aplique o método científico e a decomposição do pensamento computacional toda vez que você programar.

Você aprendeu sobre estruturação de programas em linguagens de programação. Não apenas em algumas, mas em qualquer. Afinal, agora você sabe como proceder quando quiser começar a aprender uma nova linguagem.

De fato, isso demonstra o poder do pensamento computacional. Aprenda uma linguagem de programação e você saberá a linguagem de programação escolhida. Aprenda técnicas de pensamento computacional e você poderá programar em qualquer linguagem de programação.

Você também aprendeu a usar motores de busca como ferramentas para auxiliar em atividades de programação. Pesquisar efetivamente para obter respostas desejadas é uma habilidade importante para desenvolvimento de software.

Além disso, você aprendeu a identificar onde começa a implementação de um programa em um arquivo, assim com onde ela deva terminar. A sua jornada de programação também começou aqui. Apenas você poderá determinar quando ela terminará. Quanto mais estudar, aprender, praticar e criar, melhor programadora ou programador você será.

  1. Introdução;
  2. Ponto de entrada e estrutura de programa;
  3. Saída (para console ou terminal);
  4. Tipos de dados;
  5. Variáveis e constantes;
  6. Entrada (para console ou terminal);
  7. Aritmética e Matemática básica;
  8. Operações relacionais e comparações;
  9. Operações lógicas e Álgebra Booleana;
  10. Estruturas de condição (ou condicionais ou de seleção);
  11. Subrotinas: funções e procedimentos;
  12. Estruturas de repetição (ou laços ou loops);
  13. Vetores (arrays), cadeias de caracteres (strings), coleções (collections) e estruturas de dados;
  14. Registros (structs ou records);
  15. Arquivos e serialização (serialization ou marshalling);
  16. Bibliotecas;
  17. Entrada em linha de comando;
  18. Operações bit-a-bit (bitwise operations);
  19. Testes e depuração.
  • Informática
  • Programação
  • Iniciante
  • Pensamento Computacional
  • Aprenda a Programar
  • Python
  • Lua
  • Javascript
  • Godot
  • Gdscript
  • C
  • CPP
  • Java
  • Lisp
  • Prolog
  • SQL
  • CSharp