Tipo de dados escalar vs. primitivo - eles são a mesma coisa?


127

Em vários artigos que li, às vezes há referências a tipos de dados primitivos e às vezes há referências a escalares.

Meu entendimento de cada um é que eles são tipos de dados simples, como int, boolean, char, etc.

Há algo que está faltando que significa que você deve usar terminologia específica ou os termos são simplesmente intercambiáveis? As páginas da Wikipedia para cada uma não mostram nada óbvio.

Se os termos são simplesmente intercambiáveis, qual é o preferido?

Respostas:


203

Eu não acho que eles sejam intercambiáveis. Eles são freqüentemente semelhantes, mas a diferença existe e parece estar principalmente no que eles contrastam e no que é relevante no contexto.

Os escalares são tipicamente contrastados com compostos , como matrizes, mapas, conjuntos, estruturas, etc. Um escalar é um valor "único" - inteiro, booleano, talvez uma string - enquanto um composto é composto de vários escalares (e possivelmente referências a outros compostos). "Escalar" é usado em contextos em que a distinção relevante é entre valores simples / simples / atômicos e valores compostos.

Os tipos primitivos , no entanto, são contrastados com, por exemplo, os tipos de referência e são usados ​​quando a distinção relevante é "Isso é diretamente um valor ou é uma referência a algo que contém o valor real?", Como nos tipos primitivos x referências do Java . Eu vejo isso como uma distinção de nível um pouco inferior ao escalar / composto, mas não exatamente.

Realmente depende do contexto (e freqüentemente que família de idiomas está sendo discutida). Para pegar um exemplo possivelmente patológico: strings. Em C, uma string é um composto (uma matriz de caracteres), enquanto em Perl, uma string é um escalar. Em Java, uma sequência é um objeto (ou tipo de referência). No Python, tudo é (conceitualmente) um objeto / tipo de referência, incluindo strings (e números).


1
Também devem ser considerados em uma discussão de tipos de referência e tipos primitivos são os tipos "valor". Em relação à equivalência de escalares e primitivos, isso depende do idioma. De acordo com o manual do PHP, por exemplo, apenas metade de seus tipos primitivos são escalares: php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
Isso me ajudou a 8 anos mais tarde :)
CoderXYZ

18

Há muita confusão e mau uso desses termos. Muitas vezes, um é usado para significar outro. Aqui está o que esses termos realmente significam.

"Nativo" refere-se a tipos incorporados ao idioma, em vez de serem fornecidos por uma biblioteca (mesmo uma biblioteca padrão), independentemente de como eles são implementados. As seqüências de caracteres Perl fazem parte do idioma Perl, portanto, são nativas no Perl. C fornece semântica de strings sobre ponteiros para chars usando uma biblioteca; portanto, o ponteiro para char é nativo, mas as strings não são.

"Atômico" refere-se a um tipo que não pode mais ser decomposto. É o oposto de "composto" . Os compostos podem ser decompostos em uma combinação de valores atômicos ou outros compostos. Inteiros nativos e números de ponto flutuante são atômicos. Frações, números complexos, contêineres / coleções e seqüências de caracteres são compostos.

"Escalar" - e esse é o que confunde a maioria das pessoas - refere-se a valores que podem expressar escala (daí o nome), como tamanho, volume, contagens, etc. Inteiros, números de ponto flutuante e frações são escalares. Números complexos, booleanos e seqüências de caracteres NÃO são escalares. Algo que é atômico não é necessariamente escalar e algo que é escalar não é necessariamente atômico. Os escalares podem ser nativos ou fornecidos por bibliotecas.

Alguns tipos têm classificações ímpares. Os tipos BigNumber, geralmente implementados como uma matriz de dígitos ou números inteiros, são escalares, mas tecnicamente não são atômicos. Eles podem parecer atômicos se a implementação estiver oculta e você não puder acessar os componentes internos. Mas os componentes estão apenas ocultos, então a atomicidade é uma ilusão. Eles são quase sempre fornecidos em bibliotecas, portanto não são nativos, mas poderiam ser. Na linguagem de programação do Mathematica, por exemplo, grandes números são nativos e, como não há como um programa do Mathematica os decompor em seus blocos de construção, eles também são atômicos nesse contexto, apesar do fato de serem compostos sob a capas (onde você não está mais no mundo da linguagem Mathematica).

Essas definições são independentes do idioma que está sendo usado.


16
Embora essa definição de tipo escalar faça mais sentido para mim, essa não parece ser a mais aceita.
lleaff

1
Obrigado por uma definição clara de 'Scalar'. Mesmo assim, como @lleaff aponta que a maioria das pessoas não o usa nesse sentido específico, seria melhor se o fizesse.
clockworkpc

Excelentes definições linguísticas. Esta resposta deve ser lida juntamente com a resposta de Michael Ekstrand para uma discussão mais completa. Infelizmente, no contexto das linguagens de programação, escalar tem diferentes significados.
Jerry

9

Simplificando, parece que um tipo 'escalar' se refere a um único item, em oposição a um composto ou coleção. Portanto, os escalares incluem valores primitivos e coisas como um valor enum.

http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

Talvez o termo 'escalar' possa ser um retrocesso para C:

onde escalares são objetos primitivos que contêm um único valor e não são compostos por outros objetos C ++

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

Estou curioso para saber se isso se refere a se esses itens teriam um valor de 'escala'? - Como contar números.


2
Foi-me ensinado (há muito tempo na escola) que o termo era derivado de 'processador escalar' em contraste com um 'processador vetorial'. Um processador escalar é uma CPU que pode lidar apenas com um dado de cada vez. Esses processadores foram / são nomeados após os termos aritméticos. Curiosamente, quando você consulta 'escalar' na wikipedia, você é redirecionado para 'variável'.
Evert

2

Gosto da resposta de Scott Langeberg porque é concisa e apoiada por links oficiais. Eu votaria na resposta de Scott, se pudesse.

Suponho que o tipo de dados "primitivo" possa ser considerado tipo de dados primário, para que os tipos de dados secundários sejam derivados dos tipos de dados primários. A derivação é através da combinação, como uma estrutura C ++. Uma estrutura pode ser usada para combinar tipos de dados (como int e char) para obter um tipo de dados secundário. O tipo de dados definido por estrutura é sempre um tipo de dados secundário. Os tipos de dados primários não são derivados de nada, são dados na linguagem de programação.

Eu tenho um paralelo ao primitivo, sendo a nomenclatura que significa primária. Esse paralelo é "expressão regular". Eu acho que a nomenclatura "regular" pode ser entendida como "reguladora". Assim, você tem uma expressão que regula a pesquisa.

Etimologia escalar ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) significa semelhante a uma escada. Eu acho que a maneira como isso se relaciona com a programação é que uma escada tem apenas uma dimensão: quantos degraus do final da escada. Um tipo de dados escalar possui apenas uma dimensão, representada por um único valor.

Eu acho que em uso, primitivo e escalar são intercambiáveis. Existe algum exemplo de uma primitiva que não é escalar ou de uma escalar que não é primitiva?

Embora intercambiável, primitivo refere-se ao tipo de dados que é um componente básico de outros tipos de dados e um primitivo não é composto de outros tipos de dados.

Escalar refere-se a ter um valor único. Escalar contrasta com o vetor matemático. Um vetor não é representado por um único valor porque (usando um tipo de vetor como exemplo) é necessário um valor para representar a direção do vetor e outro valor necessário para representar a magnitude do vetor.

Links de referência: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

Em C, tipos de enumeração, caracteres e as várias representações de números inteiros formam uma classe de tipo mais geral chamada tipos escalares. Portanto, as operações que você pode executar em valores de qualquer tipo escalar são as mesmas que para números inteiros.


0

tipo nulo é a única coisa que mais realisticamente se ajusta à definição de um "tipo escalar". Até a serialização de 'None' como 'N.' ajustar-se a uma palavra de 16 bits tradicionalmente escalar - ou mesmo um único bit com vários valores possíveis - não é um "dado único".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.