Como o gedit pode detectar idiomas, mesmo que não estejam instalados?
Aqui está um exemplo onde o Gedit detecta Java.
Mas quando tento executar o Java a partir do terminal, ele diz que o java não está instalado .
Da mesma forma, ele pode detectar ada mesmo que não esteja instalado no meu sistema.
E o mesmo acontece com outras línguas...
Se um idioma não estiver instalado, como o gedit pode exibir a formatação de acordo com a sintaxe do idioma?
Se eu selecionar Objective-C em vez de Ada, ele não exibirá a formatação.
No entanto, se eu substituir o código de Ada por Objective-C, ele exibirá a formatação adequada
Mesmo que esses idiomas não sejam instalados por padrão, como o gedit pode diferenciá-los?
Este artigo diz que PHP, Ruby e Python vêm pré-instalados com o Ubuntu. No entanto, meu sistema também pode executar C e C++. Por que isso acontece e como isso se relaciona com o realce de sintaxe do Gedit?
TL;DR: Diferentes funcionalidades relacionadas à mesma linguagem são fornecidas por diferentes programas e bibliotecas, que geralmente podem ser instaladas separadamente. Aplicar realce de sintaxe, compilar código-fonte em código executável e executar código executável requerem software diferente . Nenhum dos programas ou bibliotecas envolvidos em fazer essas coisas são, na verdade , a própria linguagem .
Uma linguagem de programação, como qualquer tipo de linguagem, é uma ideia abstrata. É conceitualmente distinto de qualquer software que facilite o desenvolvimento de programas reais nele, e também de qualquer software necessário para suportar tais programas e permitir que eles sejam executados. Um idioma não pode realmente ser instalado em seu computador. É um tanto comum escrever e falar de uma maneira que não faça distinção entre uma linguagem e suas implementações . Este hábito é difícil de evitar. Mas pode levar à confusão, o que aconteceu aqui.
Como Puspam e N0rbert mencionaram, geralmente é possível ter uma ferramenta instalada que analisa a sintaxe de uma linguagem e aplica realce , sem também ter outras ferramentas de desenvolvimento para a linguagem instaladas. Você pode até criar sua própria linguagem que não tem implementação (ainda), cujos programas nunca (ainda) podem realmente ser executados, e escrever regras de realce de sintaxe para que um editor de texto como o Gedit a destaque corretamente. O realce de sintaxe não requer que você tenha outras ferramentas de desenvolvimento para uma linguagem; nem mesmo requer que tais ferramentas existam.
Algumas linguagens, como Perl e C++ , têm sintaxe extremamente complexa, onde qual parte da gramática sintática corresponde a partes específicas do seu código-fonte, na verdade depende do significado de algo que veio muito antes. Para essas linguagens, aplicar 100% de realce de sintaxe correta sempre reduz a um fragmento substancial de toda a tarefa de implementação da linguagem. Para essas linguagens, o realce de sintaxe geralmente é implementado de maneira aproximada , aplicando a gramática corretamente na maioria dos casos práticos.
Adivinhar em que idioma você está escrevendo algo também é uma questão de aproximação. Em geral, não é possível dizer com certeza. A razão usual dada para isso, o que é verdade, é que é possível escrever um programa que esteja simultaneamente em várias linguagens (possivelmente com significados diferentes em cada uma). Uma razão mais importante é que, durante o curso da escrita, seu código provavelmente está errado, inclusive de maneiras que o tornam tecnicamente não na linguagem em que você está escrevendo. Por exemplo, imagine digitar um programa simples em C. Se você fosse interrompido em um ponto aleatório enquanto fazia isso, o que você tem até agora seria realmente um programa C válido?
No entanto, as ferramentas muitas vezes podem fazer boas suposições sobre qual idioma você está usando. Além disso, se você nomear seu arquivo com um sufixo que é comumente usado para arquivos de código-fonte em algum idioma específico, os editores normalmente o usarão primeiro para decidir como destacá-lo.
O que as pessoas querem dizer quando dizem que uma linguagem interpretada está "instalada"
Esse artigo que você estava lendo inclui declarações como:
O que isso realmente significa é que o Ubuntu vem com implementações dessas linguagens. Às vezes, as pessoas se referem a uma implementação de uma linguagem com o mesmo nome da própria linguagem.
Essas três linguagens são mais frequentemente interpretadas, embora uma forma de compilação (compilar para um bytecode especial , que conceitualmente é a linguagem de máquina de um tipo de computador inventado, uma máquina abstrata , em termos da qual a linguagem é definida) possa ser envolvidos como parte do processo de interpretação.
Se uma linguagem é interpretada ou compilada é realmente uma estratégia de implementação e não uma propriedade da linguagem, e algumas linguagens têm implementações interpretadas e compiladas separadas. Mas as linguagens são mais frequentemente projetadas com uma ou outra estratégia em vista, então as frases "linguagem interpretada" e "linguagem compilada" são populares, e vou usar essas frases aqui.
A implementação de uma linguagem interpretada consiste em:
Para executar seu programa, o usuário geralmente deve ter:
É possível desenvolver software em tal linguagem usando apenas as ferramentas necessárias para executar um programa. Isso é diferente das linguagens compiladas (veja abaixo). Mas você pode querer ter ferramentas adicionais que saibam algo sobre a linguagem, como um editor de texto que saiba como destacar sua sintaxe.
Intérpretes no Ubuntu
Perl tem apenas uma implementação (embora existam muitas versões diferentes dela). O
perl
comando executa o interpretador. Na comunidade Perl , a implementação é mais frequentemente escrita como "perl" (sem letra maiúscula) e a linguagem é mais frequentemente escrita como "Perl". Isso distingue a linguagem de sua implementação, mas essa convenção ortográfica não é universal.Python tem várias implementações . Ubuntu vem com CPython , que (entre outros componentes) fornece o
python3
comando, ou especialmente em versões mais antigas do Ubuntu, opython2
comando. CPython é a implementação de referência oficial do Python e também a implementação mais popular. Mesmo no site oficial do Python , algumas das afirmações feitas sobre "Python" são sobre a linguagem, enquanto outras são sobre a implementação oficial. Outras implementações incluem PyPy , Jython e IronPython .Ruby também tem várias implementações . Ubuntu vem com Ruby MRI ("Matz's Ruby Interpreter"), que (entre outros componentes) fornece o
ruby
comando. MRI é a implementação de referência oficial do Ruby e também a implementação mais popular. Existem menos implementações amplamente usadas de Ruby do que implementações amplamente usadas de Python, mas uma implementação importante de Ruby além de Ruby MRI é JRuby .O que as pessoas querem dizer quando dizem que uma linguagem compilada está "instalada"
As pessoas não deveriam dizer isso, porque é sempre (e não apenas às vezes) ambíguo. Esse artigo que você está lendo (felizmente) não fala sobre compiladores dessa maneira. No entanto, muitas vezes as pessoas o fazem, e as questões conceituais contêm a resposta para sua pergunta, então vale a pena examinar isso.
A implementação de uma linguagem compilada consiste em:
Em algumas linguagens, a biblioteca de suporte às vezes pode ser vinculada estaticamente ao seu programa para que não seja necessária separadamente para executar seu programa. Essa é uma abordagem muito comum em algumas linguagens, como Go , mas é feita com menos frequência na maioria das outras, como C, C++ e Objective C.
Para executar seu programa, um usuário deve ter:
Para construir seu programa , deve-se ter:
Quando as pessoas falam sobre ter uma linguagem como C++ instalada, elas geralmente querem dizer que alguma implementação de um compilador e outras ferramentas necessárias para construir programas C++ estão instaladas. Mas o usuário não precisa disso para executar seu programa. Ubuntu vem com programas C e C++, mas (dependendo de como você instala o Ubuntu) pode não vir com ferramentas de desenvolvimento C e C++, que não são necessárias para executar os programas. O Ubuntu também vem com programas Perl e Python (e possivelmente programas Ruby), que precisam de intérpretes para serem executados.
Compiladores no Ubuntu - o caso de C e C++
Esta resposta já será muito longa, então vou apenas descrever a situação com C e C++, que são linguagens compiladas extremamente importantes. Isso ocorre apesar do Ubuntu ser enviado com programas escritos em algumas outras linguagens compiladas, incluindo Go.
C e C++ são linguagens separadas. Ambos são padronizados internacionalmente. Suas bibliotecas de suporte - bibliotecas padrão no sentido mais forte da frase - também são padronizadas, nos mesmos documentos que padronizam os idiomas. Nenhuma implementação de C ou C++ é abençoada como implementação de referência; essas linguagens têm várias implementações em pé de igualdade. Fora das situações de nicho, um punhado é muito mais popular do que os outros. (Nada disso é realmente porque são linguagens compiladas - por exemplo, Go tem uma implementação de referência e não é padronizado.)
É possível implementar C ou C++ sem implementar o outro, mas os compiladores mais populares fornecem ambos (e fornecer C++ sem C é incomum).
Os compiladores C e C++ mais populares são GCC (
gcc
,g++
), Clang (clang
,clang++
) e MSVC++ (cl.exe
). GCC e Clang estão prontamente disponíveis ou Ubuntu.A implementação de biblioteca padrão C mais popular em um sistema GNU/Linux como o Ubuntu é GNU libc . Também é provavelmente a implementação mais popular do mundo. Ele está associado ao GCC, mas outros compiladores, como o Clang, o direcionam sem problemas. (No Windows, uma implementação diferente (MSVCRT) é mais comumente usada.) No Ubuntu e na maioria dos outros sistemas GNU/Linux, GNU libc é sempre instalado e fornecido pelo arquivo
libc.so.6
. Quase todos os programas, escritos em C ou não, o utilizam, direta ou indiretamente. É considerado uma parte essencial do sistema operacional. Mas é possível escrever um programa que não o use, e pelo menos uma outra implementação de biblioteca padrão C, musl , está prontamente disponível para o Ubuntu.A implementação de biblioteca padrão C++ mais popular em um sistema GNU/Linux como o Ubuntu é libstdc++ . Ele está associado ao GCC, mas alguns outros compiladores podem direcioná-lo. Você também pode instalar o libc++ , que está associado ao Clang (ambos fazem parte do projeto LLVM ), mas o Clang também pode direcionar o libstdc++ sem problemas (que é o que você obtém por padrão no Ubuntu). A outra grande implementação da biblioteca padrão C++ é o MS STL , que foi lançado recentemente como software livre de código aberto, mas não está disponível para o Ubuntu.
Pacotes Ubuntu
Programas, bibliotecas e arquivos de cabeçalho para bibliotecas geralmente são fornecidos em pacotes diferentes, o que facilita a instalação de alguns, mas não de outros - como ter uma biblioteca instalada para executar programas que precisam dela, sem ter os arquivos de cabeçalho instalados que seriam necessários para desenvolver programas usando a biblioteca.
Os pacotes que fornecem bibliotecas geralmente são nomeados começando com
lib
. Os pacotes que fornecem arquivos de cabeçalho geralmente são nomeados com terminação-dev
. Consulte Como pacotes diferentes podem ter código-fonte idêntico? para detalhes sobre isso.build-essential
instala o GCC e também suporta bibliotecas para C e C++, arquivos de cabeçalho para essas bibliotecas de suporte e várias outras ferramentas úteis. Se você estiver desenvolvendo programas em C, C++ ou Objective C, mesmo com outro compilador, você desejará instalar esse metapacote. Se por algum motivo você quiser instalar o GCC sozinho, existe ogcc
pacote, mas isso não instala todos os compiladores. (GCC é a "GNU Compiler Collection.) Para C++, você também instalaria og++
. Mas eu recomendo apenas instalar obuild-essential
.clang
instala o Clang, incluindo o compilador C++.GNU libc é fornecido pelo
libc6
pacote. Você já tem isso. Se você não fizer isso, seu sistema Ubuntu está severamente quebrado e quase nada nele será executado. Seus arquivos de cabeçalho são fornecidos pelolibc6-dev
pacote, que você pode ter ou não, mas quebuild-essential
irá instalar.libstdc++ é normalmente, dependendo da versão, fornecida pelo
libstdc++6
pacote. (Isso não significa que você está usando a versão 6. A nomenclatura é por motivos históricos e de compatibilidade.) Seus arquivos de cabeçalho são fornecidos por um-dev
pacote com nome semelhante, não necessariamente com um6
no nome. Na maioria dos sistemas Ubuntu atuais, isso élibstdc++-9-dev
. A instalaçãobuild-essential
de , oug++
, traz os arquivos de cabeçalho necessários se você não os tiver.libc++ é atualmente fornecido por pacotes nomeados como
libc++1-10
elibc++abi1-10
, e seus arquivos de cabeçalho são fornecidos porlibc++-10-dev
, com o número da versão real no lugar de10
(se for diferente). Assim como no libstdc++, normalmente você não deve instalar diretamente nenhum desses pacotes para obter o que precisa para construir programas direcionados ao libc++. Em vez disso, instale olibc++-dev
. Isso fornece a vocêlibc++-10-dev
ou qualquer outra versão do pacote de arquivos de cabeçalho que é o padrão para seu sistema, que por sua vez depende dos pacotes que fornecem os binários da biblioteca real, garantindo que você os obtenha também.