Em uma linguagem de programação, o que diferencia um cidadão de primeira classe do restante? – terminologia independente-de-linguagem paradigmas

Pergunta:


De uma forma simples, o que é um “cidadão de primeira classe” em uma linguagem de programação? E, principalmente, como se diferencia algo que é um cidadão de primeira classe de algo que não o é?

Autor da pergunta Bruno Peres

Resposta Maniero:

Segundo a Wikipedia é quando um recurso da linguagem permite ser usado de todas as formas que normalmente é possível usar nela.

Se um recurso pode ser criado na linguagem mas não pode ser atribuído para uma variável, ou passado como argumento de uma função, ou retornado, aquele recurso específico não é um cidadão de primeira classe, ele não pode fazer tudo o que os de primeira classe pode, há limitação na sua atuação.

O termo é muito usado em funções e este é um bom exemplo. Essencialmente qualquer linguagem pode criá-las, mas nem todas podem tê-las atribuídas para variáveis ou passadas como argumentos ou retorno. As linguagens que permitem isso tem a função como uma cidadã de primeira classe.

Tem linguagens que até permitem fazer isto mas através de um mecanismo obscuro secundário, ou seja, dá para fazer, mas não é porque a linguagem “conscientemente” resolveu ter isso de forma facilitada e não tem uma sintaxe própria para isto. Então conseguir fazer é algo colateral à intenção da linguagem, e portando é de segunda classe.

Não ter um literal para aquilo provavelmente faz o recurso ser de segunda classe.

No artigo indica que o termo foi criado Christopher Strachey em 1960 provavelmente para diferenciar de formas precárias. O termo hoje é muito usado como marketing para dizer que a linguagem possui algo melhor que outras, mesmo que nem sempre seja o caso.

Já vi sendo usado em contextos um pouco diferentes e não sei se é certo. Encaram como coisas “nativas” na linguagem como sendo de primeira classe, em oposição a coisas que dá para fazer com algum esforço. Por exemplo assincronismo que é nativo em C# 5 para cima, embora sempre deu para fazer de forma convoluta. Mas você não pode usar async em qualquer lugar da linguagem, então ele não seria de primeira classe pela definição mais formal.

Há quem diga que a linguagem precisa ter poder de criar um recurso pelo próprio código para ele ser considerado de primeira classe. Por esta definição, torna as linguagens dinâmicas mais propensas a terem mecanismos de primeira classe. Me parece que esta proposição é um pouco mais estrita e nem sempre aceita em todos os círculos. Não costuma ser assim no livro Structure and Interpretation of Computer Programs que é meio que uma bíblia da computação.

Mas há quem diga que na definição menos estrita apenas coloca que o recurso deve poder ser usado em qualquer coisa da linguagem. Não sei se é certo porque é raro ter algo que pode ser usado tão universalmente assim, precisaria de uma definição de onde pode ou não. Nenhuma linguagem é tão livre que algo pode ser usado em tudo. Como muitos termos, há polêmica.

Na resposta do Norman Ramsey, que entende bem do assunto. ele coloca, por exemplo, que um int em Java não é de primeira classe porque não pode ser herdado. É uma forma de pensar.

Só não ache que ter algo como sendo de segunda classe é inerentemente ruim. Tem coisas que ser de primeira classe é péssimo. Pode dar poder, mas pode dar dor de cabeça lidar com aquilo.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *