Lap-2024

Instalação OCaml

Esta ficha prática tem como objetivo instalar e configurar todo o software necessário para o desenvolvimento de código OCaml na Unidade Curricular de Linguagens e Ambientes de Programação.

Todo o processo de instalação descrito nesta ficha, assim como o desenvolvimento na Unidade Curricular de Linguagens e Ambientes de Programação, será feito tendo como base um Sistema Operativo da família Unix. A secção Sistema de Desenvolvimento Unix apresenta como instalar um sistema Unix numa máquina que execute sobre o sistema Windows ou Mac.

No final desta ficha, deverá ter instalado na sua máquina as seguintes plataformas:

Todo o processo de instalação se baseia fortemente na utilização do terminal (consola).

Sistema de Desenvolvimento Unix

Esta é uma óptima oportunidade para realizar uma actualização do seu Sistema
Operativo. Em geral, é boa prática manter o Sistema Operativo e o software
instalado actualizados, sobretudo antes de proceder à instalação de um conjunto
consequente de novos programas.

Linux

Se já possui um sistema Linux funcional, pode avançar para a secção Instalação OPAM.

Mac

Como gestor de pacotes num sistema MacOS, deverá optar entre o Homebrew ou o MacPorts. Com o propósito de instalar o software requerido para esta Unidade Curricular, acreditamos que o Homebrew oferece um processo de instalação mais simples e amigável. Por isso, se ainda não é um utilizador de MacPorts, recomendamos que instale o Homebrew e siga todas as instruções apresentadas para esta plataforma. Nota importante: não deve nunca tentar instalar em simultâneo o Homebrew e o MacPorts! Estes dois gestores de pacotes não são pensados para coexistir.

Windows

A utilização de um ambiente Unix dentro do Sistema Operativo Windows é possível graças ao Windows Subsystem for Linux (WSL). Em qualquer versão recente do Windows, o WSL é relativamente simples de instalar.

A utilização do WSL poderá requerer a mudança da configuração da sua
máquina. Se surgir, durante a instalação do WSL, o erro sobre "virtual machine"
então é sinal que deverá permitir a virtualização através da BIOS da sua
máquina. A configuração da BIOS depende de cada frabricante e modelo de
computador. Uma pesquisa por "enable virtualization [manufacturer] [model]"
deverá devolver resultados suficientes para resolver a questão.

A instalação do WSL completa-se da seguinte forma:

Se não lhe forem pedidas quaisquer credenciais, então algo correu mal durante a
instalação. Não avance para lá deste ponto! Desinstale a distribuição Ubuntu e
recomece novamente o processo.

Configuração Ubuntu. Para executar as instruções seguintes assumimos que instalou a versão 22.04 do Ubuntu, a versão por omissão no WSL. À partida, qualquer versão mais recente desta distribuição também lhe permitirá seguir sem problemas o restante desta secção.

Abra a aplicação Ubuntu. Esta aplicação poderá já estar a executar, caso tenha acabado de instalar o WSL. Deverá ser-lhe apresentado o Bash prompt, uma consola com o seguinte aspecto:

user@machine:~$
Se o prompt tiver o aspecto `root@...#` então algo correu mal. Verifica se de
facto criou um nome de utilizador e password no passo anterior. Se sim, o seu
utilizador a apresentar no prompt deveria ser o mesmo que escolhe anteriormente
e não `root`. Não avance para lá deste ponto! O mais fácil será reinstalar a
distribuição Ubunutu.

Nas versões mais recentes do Windows, a combinação Ctrl+Shift+C permite copiar texto a partir do terminal, enquanto que a combinação Ctrl+Shift+V permite colá-lo. É obrigatório incluir a tecla Shift, caso contrário não irá obter o efeito desejado.

Por forma a actualizar o gestor Aptitude (gestor de software da distribuição Ubuntu), execute o seguinte comando:

sudo apt update

Deverá introduzir a password que escolheu nos passos anteriores. O prefixo sudo remete para a execução do comando apt update em modo administrador ou, na terminologia Unix, super utilizador.

*With great power, comes great responsibility*. Executar comandos como super
utilizador permite um controlo quase total do sistema, e portanto potencialmente
perigoso. Não deve, por isso, executar todos os comandos em modo `sudo`, mas
apenas quando tal for estritamente necessário.

De seguida, execute o seguinte comando para proceder à actualização do software instalado:

sudo apt upgrade -y

Finalmente, proceda à instalação de alguns pacotes úteis:

sudo apt install -y zip unzip build-essential

Instalação OPAM

Linux. Siga as instruções referentes à distribuição que está a utilizar.

Mac. Se estiver a utilizar Homebrew, execute o seguinte comando:

brew install opam

Se estiver a utilizar MacPorts, execute o seguinte comando:

sudo port install opam

Windows. Execute o seguinte comando a partir do Ubuntu:

sudo apt install opam

Inicialização do OPAM

Não deverá nunca utilizar o OPAM em modo super utilizador. Por outras
palavras, não utilize o prefixo `sudo` em nenhum comando `opam`.

Linux, Mac e Windows (WLS). Execute:

opam init --bare -a -y

(É normal que obtenha um aviso sobre o ficheiro .profile não se encontrar corretamente referenciado no ficheiro .bashrc. Não precisa de fazer qualquer intervenção neste ponto.)

Criar um Switch OPAM

Mesmo que, porventura, já tenha instalado o OPAM e criado algum *switch*, para o
propósito da Unidade Curricular de **Linguagens e Ambientes de Programação**
deve criar um novo *switch* de raiz. Em geral, é boa prática de utilização do
OPAM criar *switches* novos para modularizar projetos ou ambientes de
desenvolvimento com propósitos muito específicos.

Um switch é a unidade do OPAM que permite dar um nome a uma instalação específica de uma versão do compilador OCaml e de um conjunto de pacotes de software associados. Pode conter vários switches criados, cada um apresentando uma versão específica do compilador, ou um conjunto de pacotes para um fim muito específico (por exemplo, um projeto pessoal em que esteja a trabalhar). Pode altenar (switch, daí o nome) livremente entre os diferentes switches que tiver criados na sua máquina.

Para criar um switch para LAP, deve executar o seguinte comando:

opam switch create lap2024 ocaml-base-compiler.4.14.0

Este comando irá criar um switch com o nome lap2024 cuja versão subjacente do compilador OCaml é a 4.14.0.

Se o anterior comando falhar com o erro de que a versão 4.14.0 não está
disponível, então provavelmente instalou uma versão antiga do OPAM. Actualize o
OPAM com o comando `opam update`.

De seguida, ser-lhe-á pedido que execute o seguinte comando:

eval $(opam env)

Poderá fazê-lo, mas o mais importante neste ponto é que saia da sessão do seu Sistema Operativo (ou simplesmente reinicie a máquina). Abra novamente o terminal e execute o seguinte comando:

opam switch list

O resultado deve ter o seguinte aspecto:

#     switch                         compiler                       description
->    lap2024                        ocaml-base-compiler.4.14.0      lap2024

Poderá conter outras linhas, caso tenha já feito desenvolvimento OCaml anteriormente. Deverá prestar particular atenção aos seguintes pontos:

Caso o passo anterior lhe peça para executar o comando `eval $(opam env)`, então
algo correu mal no passo de inicialização do OPAM (comando `opam init`). Pode
tentar executar `opam init --reinit` para resolver o problema. Além disso, é
mesmo necessário que realize o passo de sair da sessão do Sistema Operativo, ou
simplesmente reiniciar a máquina.

Para instalar os pacotes OPAM que precisamos para LAP, deve executar o seguinte comando:

opam install -y utop odoc ounit2 qcheck bisect_ppx menhir ocaml-lsp-server ocamlformat

Toda a linha anterior deve ser introduzida na consola, por isso deve ter a certeza que a copia na sua integralidade. É expectável que lhe seja apresentado algum output sobre configuração de editores de texto. Pode ignorar estas indicações.

Neste momento, já está em condições de lançar o programa utop, o OCaml Universal Toplevel:

utop

Como primeira experiência muito básica, introduza o número 42 seguido dos símbolos ;; (dois “ponto e vírgula). De seguida, prima a tecla Enter. Deverá obter o seguinte resultado:

# 42;;
- : int = 42

O símbolo # indica o prompt (i.e., onde escrever) no utop. Depois desta experiência simples, saia do utop, introduzindo o seguinte comando:

# #quit;;

Note o símbolo # junto à palavra quit. Pode também optar por utilizar a combinação Ctrl+D.

Visual Studio Code

Como veículo de edição de código OCaml para LAP, aconselhamos vivamente a utilização do Visual Studio Code (VS Code).

Apesar da utilização do VS Code, existem vários outros editores que são
excelentes escolhas no que toca a edição de código OCaml. Destes, destacamos o
`emacs` e o `vim` como os mais clássicos e até mais utilizados no meio
industrial e académico para desenvolvimento OCaml. No entanto, qualquer um
destes editores apresenta uma curva de aprendizagem que poderá ser
desaconselhada para iniciantes.

Por outro lado, desaconselhamos fortemente a edição de OCaml no Eclipse. O
plugin disponível não é activamente mantido e apenas funciona com versões
antigas do compilador OCaml.

Em primeiro lugar, deverá proceder ao download e posterior instalação do VS Code. Depois de lançar o VS Code deve abrir o painel de extensões, utilizando uma das seguintes opções:

Em vários momentos deverá utilizar a *Command Palette*. Para tal, navega pelo
menu `View → Command Palette`. Poderá também utilizar o atalho de
combinação de teclas, que deverá encontrar junto às palavras "Command Palette"
no menu `View`.

De seguida, siga as seguintes instruções se estiver a utilizar Windows ou Mac:

Em terceiro lugar, independentemente do Sistema Operativo utilizado, feche qualquer terminal aberto (ou simplesmente saia da sessão ou reinicie a máquina) de forma a que as novas configurações sejam efetivadas. Tal permitirá, mais tarde, lançar o VS Code a partir de um terminal.

Quarto, e apenas para os utilizadores Windows, abra a Command Palette e execute o comando WSL: Connect to WSL. Este comando irá instalar software adicional. Assim que a execução do comando terminar, deverá observar um indicador com a mensagem “WSL: Ubuntu” em baixo à esquerda da janela do VS Code. Se apenas observar um ícone com o aspecto >< clique neste e escolha “Connect to WSL” a partir da Command Palette que surge.

Quinto, abra novamente o painel de extensões do VS Code. Procure e instale a extensão “OCaml Platform”, desenvolvida por OCaml Labs. Não instale qualquer outra extensão, mesmo que faça referência à linguagem OCaml.

Se, após instalação da extensão "OCaml Platform", observar um erro referente à
falta do pacote `ocaml-lsp-server`, então algo correu na instalação deste pacote
através do OPAM. Verifique que de facto instalou este pacote através do comando
`opam install`, tal como referido na secção "Criar um *Switch* OPAM".

Verificar a Instalação do VS Code

Esta secção apresenta uma série de verificações que podemos realizar para garantir que a instalação do VS Code e da extensão OCaml foram bem sucedidas.

Na verdade, num sistema de desenvolvimento Unix não temos real necessidade de
reiniciar tantas vezes a máquina para que os efeitos de instalação de software
se verifiquem. No entanto, este passo tem o potencial de detecar precocemente
diferentes fontes de erro e por merece o esforço adicional.

Se não conseguiu observar este comportamento, existe algum problema com a sua instalação. Poderá tentar uma das seguintes opções:

Configuração de Edição OCaml em VS Code

Seguindo boas práticas de apresentação de código, recomendamos alterar algumas das configurações presentes por omissão no editor VS Code. Comece por abrir o ficheiro JSON navegando pelo menu “View → Command Palette”. De seguida, escreva “user setting json”. Finalmente, seleccione Open User Settings (JSON). Apresentamos de seguida as configurações recomendadas para LAP, que sugerimos que cole na janela apresentada:

{
    "editor.tabSize": 2,
    "editor.rulers": [ 80 ],
    "editor.formatOnSave": true
}

Com a configuração apresentada, todas as linhas de código OCaml que iremos escrever ao longo da Unidade Curricular nunca terão mais que 80 caracteres. Obedecemos, assim, à famosa regra das 80 colunas.

Instalação da Extensão Jupyter Notebook

Durante boa parte das aulas práticas de LAP utilizaremos o sistema Jupyter Notebook como ferramenta de apoio à resolução de exercícios. A utilização de Jupyter Notebook facilita a execução de código dentro do pŕoprio VS Code.

Comece por instalar o jupyter no seu computador:

sudo apt install jupyter
brew install jupyter

De seguida, deverá instalar o jupyter kernel de ocaml:

opam install jupyter

Depois deste comando executar com sucesso, deverá associar o kernel instalado com a instalação de jupyter:

ocaml-jupyter-opam-genspec
jupyter kernelspec install --name ocaml-jupyter "$(opam var share)/jupyter"

É possível que o último comando, jupyter kernelspec install, exija privilégios de super utilizador para executar corretamente. Nesse caso, deve utilizar o prefixo sudo:

sudo jupyter kernelspec install --name ocaml-jupyter "$(opam var share)/jupyter"

Finalmente, deverá instalar a extensão Jupyter dentro do VS Code. Dentro do notebook deverá conseguir selecionar o kernel de OCaml previamente instalado. Se todos estes passos forem bem sucessidos, deverá ser capaz de explorar o Jupyter Notebook desta primeira semana de aulas práticas.