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: p> ceci serait récursif. P> Comment une langue de programmation peut-elle être mise en œuvre sans primitives? P> < P> J'apprécie toute aide de résoudre ma confusion. P> p>
7 Réponses :
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. p>
Je suis sûr que le point l'obtient maintenant.
Alors, comment? Le processeur ne peut pas fonctionner avec des objets.
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. P>
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 . p>
Si vous voulez dire par d'un point de vue de l'écrivain de compilateur, vous devez utiliser ce que la machine prend en charge les choses de travailler. P> primitives code> Types de valeur, vous pouvez ensuite vivre sans eux en tant qu'utilisateur et utiliser integer code> au lieu de int code> et payer Pour la surcharge de l'allocation de tas et gc code>. 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 Code> seront toujours plus rapides car il existe un support matériel pour eux. p>
LISP est une langue fonctionnelle très simple. Le LISP de base n'a pas eu de primitive 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 Au plus tard, Normal, LISP '3' serait un atome, 123 serait un tel atome, avec des opérateurs de mathématiques. P>
Il existe ensuite des langues de manipulation de symboles (snobol) qui pourraient faire des mathématiques sur les chaînes numériques Les noms sont donc des objets (atomes) comme un charnel 'A' ou INT 42. P> int code> et une solution aux entiers était d'avoir successeur du successeur du successeur de zéro code> pour 3. P>
SUCLE (SUCC (SUCLE (SUCLE (ZERO))) CODE> pourrait être codé de manière plus tuple (probablement mieux non dans Lisp). P>
['4', '0'] * ['3'] p>. P>.
(Je repaurerai la question à ce que je pense que vous demandez. Si vous pensez que je suis trompé, n'hésitez pas à commenter.) p>
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? P> blockQuote>
Oui, dans chaque langue familiale que je connaisse, c'est à peu près inévitable. P>
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 em>, afin de Construisez le type EM> Byte em> à travers la composition, puis le type mot em>, puis divers entier em> 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. P>
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. p>
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 em>, int64 em >, float em>, double em>, 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 em> et les faire séparer des classes. P>
C'est exactement ce que je voulais dire. Merci! Aussi un grand merci aux autres. Vous m'avez aidé à sortir de ma confusion.
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.
Il ne peut pas être implémenté i> 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.