7
votes

Comment tout peut être un objet?

en Java, par exemple, il existe le type de données primitive "INT" qui représente une valeur 32 bits et il existe "Entier" qui n'est qu'une classe avec une seule propriété "INT" (et certaines méthodes bien sûr). Cela signifie qu'une classe "entier" Java utilise toujours des primitives dans les coulisses. Et c'est la raison pour laquelle Java n'est pas un langage de programmation orienté objet pur.

Où pourrait-on stocker une valeur s'il n'y a pas de primitives? Par exemple, j'imagine cette classe de pseudo: xxx

ceci serait récursif.

Comment une langue de programmation peut-elle être mise en œuvre sans primitives? < P> J'apprécie toute aide de résoudre ma confusion.


4 commentaires

Il ne peut pas être implémenté sans primitives, mais vous n'avez pas besoin de les rendre apparentes ou accessibles à l'utilisateur de la langue ...


Un langage de programmation sera à un moment donné besoin de stocker un INT vers la mémoire par exemple. RAM. Toutes les bits et octets et les pointeurs crus sous le capot de chaque langue. Des langues comme Scala peuvent décider de ne pas exposer les primitives au programmeur


La documentation peut faire n'importe quoi de rien.


Cette question est trop éloignée du code pour débordement de pile. Cela pourrait être plus approprié sur les programmeurs.stackexchange.com.


7 Réponses :


11
votes

Derrière la scène sera toujours primitives car elle est juste une bite en mémoire. Mais certaines langues cachent des primitives que vous pouvez travailler uniquement avec des objets. Java vous permet de travailler à la fois avec des objets et des primitives.


2 commentaires

Je suis sûr que le point l'obtient maintenant.


Alors, comment? Le processeur ne peut pas fonctionner avec des objets.



1
votes

Finalement tout revient aux bits en mémoire et instructions à l'ordinateur. La différence entre assembleur, compilée, procédurale, orientée objet, et toutes les autres choses est la quantité d'abstraction entre vous et les bits et combien d'avantages (ou de coût) vous obtenez de cette abstraction.


0 commentaires

2
votes

sans être capable d'accéder à des données réelles (par exemple, des primitives ou des bits réels) (directement ou indirectement) sur une machine, il n'est plus un langage de programmation, il s'agit d'un Interface Description Langue .


0 commentaires

4
votes

Si vous voulez dire par primitives Types de valeur, vous pouvez ensuite vivre sans eux en tant qu'utilisateur et utiliser integer au lieu de int et payer Pour la surcharge de l'allocation de tas et gc . Mais cela ne vient pas gratuitement et vous devez payer le coût. Les primitives comme des entiers 32 bits / 64 bits et IEEE-754 Points flottants seront toujours plus rapides car il existe un support matériel pour eux.

d'un point de vue de l'écrivain de compilateur, vous devez utiliser ce que la machine prend en charge les choses de travailler.


0 commentaires

3
votes

LISP est une langue fonctionnelle très simple. Le LISP de base n'a pas eu de primitive int et une solution aux entiers était d'avoir successeur du successeur du successeur de zéro pour 3.

Cela comptait effectivement quelques avantages, les entiers étant ouverts, aucun débordement, alors les opérations vraiment commutatives, associatives, etc. Quelques optimisations agréables possibles. Et bien sûr SUCLE (SUCC (SUCLE (SUCLE (ZERO))) pourrait être codé de manière plus tuple (probablement mieux non dans Lisp).

Au plus tard, Normal, LISP '3' serait un atome, 123 serait un tel atome, avec des opérateurs de mathématiques.

Il existe ensuite des langues de manipulation de symboles (snobol) qui pourraient faire des mathématiques sur les chaînes numériques ['4', '0'] * ['3'] . .

Les noms sont donc des objets (atomes) comme un charnel 'A' ou INT 42.


0 commentaires

1
votes

(Je repaurerai la question à ce que je pense que vous demandez. Si vous pensez que je suis trompé, n'hésitez pas à commenter.)

Comment un système de type peut-il basé sur la composition et l'héritage définir tout type utile s'il n'y a pas de type intrinsèque pour commencer? À moins que la mise en œuvre de la langue ne connaisse d'au moins un type intrinsèque à partir de, tout type défini serait voué à être recursif ou vide. Est-ce inévitable?

Oui, dans chaque langue familiale que je connaisse, c'est à peu près inévitable.

Si chaque type est composé d'autres types, à tout le moins, vous devez avoir un type intrinsèque à construire sur - par exemple, un type intrinsèque qui représente un bit , afin de Construisez le type Byte à travers la composition, puis le type mot , puis divers entier types, etc. Ensuite, vous devez définir les opérations pouvant être effectuées sur ces types, en manipulant les bits qui composent leur représentation interne.

Et même si tout ce dont vous avez besoin est un type intrinsèque à construire, il serait probablement terriblement inefficace - vous ne voulez pas gaspiller de l'espace ni des cycles de processeur et que vous souhaitez profiter des différents emplacements de stockage et des instructions Votre architecture cible offre, y compris les registres FP et autres choses.

Ainsi, un bon compromis entre la performance et la "pureté" est d'offrir dans la langue certains types intrinsèques susceptibles d'être reconnaissables par des processeurs modernes (comme int32 , int64 , float , double , etc.) et construisez le reste du système de type sur eux. En Java, ils ont décidé d'appeler ces types intrinsèques primitifs et les faire séparer des classes.


1 commentaires

C'est exactement ce que je voulais dire. Merci! Aussi un grand merci aux autres. Vous m'avez aidé à sortir de ma confusion.



3
votes

Cela pourrait vous aider à vous montrer le code analogue dans une langue qui prend le principe de conception «Tout est un objet» beaucoup plus sérieusement em> que Java. À savoir SmallTalk . Imaginez ce que ce serait comme si Java n'avait que int code>, pas integer code>, mais em> tout ce que vous avez utilisé pour utiliser entier code> pour était possible avec int code>. C'est SmallTalk.

Ceci est un extrait du code définissant le Smallinteger Code> Classe dans Squeak 5.0 A >: P>

Integer immediateSubclass: #SmallInteger
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Kernel-Numbers'!
!SmallInteger commentStamp: 'eem 11/20/2014 08:41' prior: 0!
My instances are at least 31-bit numbers, stored in twos complement
form. The allowable range in 32-bits is approximately +- 10^9
(+- 1billion).  In 64-bits my instances are 61-bit numbers,
stored in twos complement form. The allowable range is
approximately +- 10^18 (+- 1 quintillion).   The actual
values are computed at start-up.  See SmallInteger class startUp:,
minVal, maxVal.!

!SmallInteger methodsFor: 'arithmetic' stamp: 'di 2/1/1999 21:31'!
+ aNumber 
        "Primitive. Add the receiver to the argument and answer with the result
        if it is a SmallInteger. Fail if the argument or the result is not a
        SmallInteger.
        Essential, No Lookup. See Object documentation whatIsAPrimitive."

        <primitive: 1>
        ^ super + aNumber! !

!SmallInteger class methodsFor: 'instance creation' stamp: 'tk 4/20/1999 14:17'!
basicNew

        self error: 'SmallIntegers can only be created by performing arithmetic'! !


0 commentaires