Comment “faible” est-ce que C aller comme un “faible” au niveau de la langue?
On entend souvent que le C est un langage de bas niveau, mais quel niveau faut-il aller? Le plus bas niveau, je suis conscient de est gestion de la mémoire en utilisant les pointeurs. As-tu d'autres niveaux que j'ai encore à découvrir? Ce n' "proches du matériel" signifie? Comment "fermer le matériel" est C?
- "Le Langage de Programmation C — Une langue qui combine la flexibilité de l'assemblée de la langue avec le pouvoir de l'assemblée de la langue."
- langage d'assemblage avec le c ?
- courses.engr.illinois.edu/ece390/books/labmanual/...
- C m'a frappé avec une erreur de segmentation, m'a donné aucun rapport d'erreur, puis se mit à rire dans mon visage. J'ai pensé que c'était plutôt faible 🙁
- Oui @jason, au moyen de votre code en C, vous pouvez passer à l'assemblée pour quand vous voulez serrer le dernier bit de la performance.
- Ne sont pas des erreurs de segmentation des erreurs d'exécution ?
- Parfois, des questions plus larges marqués de la sorte... en ce moment, il y a un "rouvrir des" un vote est en cours, et j'attends votre question sera à nouveau ouvert. Il peut être un peu de un roller coaster, mais vous obtiendrez d'entrée!
- Niveau plus élevé signifie généralement moins besoin de savoir sur le matériel. Un système de fichiers est de niveau supérieur à un contrôleur de disque dur. Un ensemble d'outils en ligne de commande comme cp (copy), ls (dir), etc. est niveau plus élevé que celui d'un système de fichiers. L'interface graphique du gestionnaire de fichiers (comme nautilus / midnight / explorer) est de niveau supérieur à un ensemble d'outils en ligne de commande. Le niveau le plus bas est directement au matériel de l'interface, car il ne représente pas tout "niveau supérieur" de l'abstraction du matériel: c'est le matériel.
Vous devez vous connecter pour publier un commentaire.
Utiliser la terminologie standard. Un langage de haut niveau et de Bas niveau de langues.
Haut niveau de langues sont conçus pour la facilité de la personne qui écrit la langue.
Niveau inférieur langues sont conçus pour la facilité de l'ordinateur qui exécute la langue.
C est juste une étape de montage de la langue, qui est pratiquement une traduction humaine de code machine. Il ne peut pas faire plus bas que le code machine, mais les gens ne lisent pas hexadécimal très bien, de sorte que l'assemblée est considéré comme le plus bas niveau de langage de programmation.
La plupart C des opérations peut être traduit en moins de dix instructions machine. Certains peuvent être traduites en une seule instruction machine (selon les circonstances). Par comparaison, de nombreux langages de haut niveau peut nécessiter des dizaines de milliers d'instructions machine pour mettre en œuvre une opération particulière.
Le "niveau" d'une langue est surtout un concept abstrait. Il n'est pas utile pour beaucoup sauf le fait de comparer une langue à l'autre dans le contexte d'essayer de comprendre si vous devez écrire plus de code source dans l'un ou l'autre, ou si vous aurez à en savoir plus sur l'architecture de la machine dans une langue par rapport à l'autre.
C est parfois appelé "portable assemblée de la langue". Essentiellement tout ce que vous pouvez faire à l'assemblée, vous pouvez le faire en C (que ce soit par le biais de fonctionnalités intégrées dans la langue ou par l'intermédiaire d'assembly en ligne).
asm
mot clé n'est pas officiellement partie de la norme (c'est seulement répertorié comme un "extension"). Pratiquement chaque compilateur prend en charge une certaine forme de l'assembly en ligne, cependant. Si vous pouvez obtenir un pointeur vers l'adresse de l'espace où votre code réside, vous pouvez écrire self-modifying code qui injecte de l'arbitraire de l'assemblée des commandes (au moment de l'exécution) à l'aide de la norme C-les constructions de langage.C est un peu plus qu'une procédure wrapper autour de l'ASM. Un bon programmeur C, qui sait ce qui se cache derrière cette langue, devrait être en mesure de regarder un extrait de code et écrire l'ASM que le code compilé en. Ces instructions ASM peut être traduit 1:1 binaire des instructions machine. C'est à peu près un échelon au-dessus de l'assemblée, et en tant que tel, vous pouvez écrire le code C qui n'a RIEN de l'ordinateur est capable de faire, MAIS, étant à un niveau si faible, il est relativement primitive en termes de ce que vous avez à être spécifique au sujet. Par exemple, la mémoire est traitée en tant que telle, et non pas abstrait dans des constructions telles que le "tas". La création d'un "nouvel" objet dans un langage OO est aussi simple que de le dire; c'est l'équivalent du code C impliquerait un malloc pour la somme de la taille de tous les membres de cet objet, et des pointeurs vers chaque les membres de l'objet à l'intérieur du bloc.
Une personne qui crée du matériel (cpu, carte mère, etc) fournissent également de son langage machine (assembleur). Que devient le niveau le plus bas lui-même. Puis une autre personne écrit un compilateur pour C qui convertit la syntaxe du C en natif langage d'assemblage pour ce matériel (s'il vous plaît corrigez-moi si je me trompe). Avec C, vous pouvez utiliser de l'assemblée donc niveau le plus bas atteint!!
La mémoire, vous pouvez gérer les fins générales de l'OS sont généralement la mémoire virtuelle, sorte qu'il est généralement à tous une fraude de votre C les pointeurs ne contient pas des adresses de mémoire physique, il y a toute une couche plus profonde que cela.
Obtenir ci-dessous qui vous oblige à programmer le MMU , ce qui n'est pas facile à faire en C, il faut habituellement certains architecture même de la personne à charge d'assemblage et de votre code doit s'exécuter dans une certaine forme de privilégiés mode(comme le noyau du système d'exploitation ne)
Il peut être également les divers autres co-processeurs ou de l'ensemble de la gamme de jeux d'instructions il peut être difficile d'obtenir directement en C.
La définition de "faible" est un peu difficile, mais C prend en charge un nombre d'appels système, gotos, et même de l'assemblée de mélange par des extensions.
Vous devez définir ce que vous entendez par faible niveau afin de répondre à cette question.
C vous permet de faire des genre de tout ce que vous pourriez faire avec le montage, mais bien de ne pas tout. Si vous voulez faire quelque chose de bizarre/particulier/insolite dont vous pourriez avoir besoin d'utiliser de l'assemblée, bien que pour la plupart(/tous?) objectifs réels C sera plus que suffisant, en supposant que vous avez un bon compilateur pour votre matériel.
MODIFIER: Élaboration de cela un peu plus loin...
C ne pas vous donner aucune garantie quant à l'assemblage d'instruction qu'il sera compilé dans, et ne donne que quelques partielle des indications sur les objets seront affectés dans la mémoire.
En général, Si vous avez besoin d'avoir des choses en mémoire d'une manière particulière, ou si vous avez besoin d'un particulier de la séquence d'instructions de montage pour être exécuté, vous aurez probablement à utiliser une autre langue (probablement de l'assemblée directement), sinon en général C sera bien.
Bien sûr, on peut trouver autant de cas particuliers que nous voulons: si votre une assemblée spéciale des opérations qui vous permettent de faire de fantaisie de haut niveau trucs, C ne sera probablement pas en mesure d'exploiter ces.
C a été pensé pour remplacer assemblée normal (peut-être que je pourrais dire usage général) processeurs, il ne sera pas idéal sur les processeurs avec un modèle fonctionnel de l'assemblée ou dans de nombreux autres contextes.
Vous ne pouvez pas juste dire "comment niveau est C?", vous avez besoin de faire le contraire: définir quel type de faible niveau choses dont vous avez besoin et ensuite voir si C est en mesure de le faire.
Comment sur
register
? Un mot-clé sur une déclaration de variable locale qui demande au compilateur de le stocker dans un PROCESSEUR inscrire - mais il peut ignorer votre suggestion.Cependant, GNU C extends ce au point où vous pouvez spécifier un registre particulier que vous souhaitez utiliser!
La chose principale que C obscurcit, dans la mesure où elle occulte rien du tout, c'est le contrôle de flux, dans quelques cas. La seule chose que j'ai jamais écrit dans l'assemblée qui ne se traduisent pas bien C impliqués saut dans un bloc de code à un point arbitraire, l'avoir à l'exécuter à partir de cette position, vérifier périodiquement une certaine condition d'état et lors de la découverte du besoin, de stocker le programme actuel emplacement quelque part et à la sortie. Alors la prochaine fois, j'ai sauté en arrière dans la même situation que le bloc de code de la dernière sortie. Coopérative de coroutines, je crois que vous pourriez les appeler.
Le C solution a été d'utiliser deux threads séparés, communiquer par l'intermédiaire des sémaphores. Mais le fils ne font pas partie du langage C lui-même.
C est utilisé aujourd'hui dans de nombreux cas comme un "portable assemblée de la langue", parce que la sémantique de la langue peut être à peu près juste un placage mince au-dessus de la sous-tendent l'architecture de la machine.
Dans le passé, il était assez simple de regarder les lignes de code C et avoir une bonne idée de ce que la machine réelle, la langue serait que le code C est susceptible de générer.
Lorsqu'il est pris dans son entier avec son environnement, l'environnement de développement, il est nécessaire d'avoir une parfaite maîtrise de la mémoire présentation des structures de données et de l'ensemble de la mémoire de stage. L'esprit, ce genre de code C est, dans son ensemble, non portable, puisqu'il repose sur des implémentations détails du compilateur que le C standard permet d'être flexible et de mise en œuvre. Mais dans le gros, le code C peut être SURTOUT portable. C'est l'aspect de la langue est à l'origine de sa popularité dans de tels systèmes comme Unix en permettant la majeure partie de l'OS pour être portable sur l'ensemble des machines avec aussi peu de la mise en œuvre des aspects spécifiques de la mise en œuvre étant, disons, de l'assemblée de la langue, autant que possible.
Aujourd'hui, avec les compilateurs modernes et de leurs optimisations, C peut être moins littérale. Ce que vous voyez dans le code C ne peuvent pas être traduites littéralement en à ce que vous obtenez à l'assemblée en raison de la réelle optimisations apportées par le compilateur.
Un simple exemple artificiel est quelque chose comme:
Dans un simple compilateur, une mise en œuvre peut ainsi allouer 4 int) sur la pile, 2 pour les arguments, et 2 pour le travail variables. Une optimisation évidente est de ne pas attribuer le " c " de la variable à tous, comme il est inutilisé. Une poursuite de l'optimisation, c'est ignorer que le " d " ainsi, et il suffit d'utiliser la constante 10. Et encore plus intelligent compilateur peut bien voir comment cela func est utilisé et l'inclure automatiquement dans la fonction appelante, l'élimination de la sous-routine d'appel complètement.
Donc, d'une part, vous pouvez voir le code et de dire "c'est ce qu'il va ressembler dans l'assemblée", et donc de le traiter comme un faible niveau wrapper sur le dessus de l'assemblage. Sur les autres, vous pouvez tourner les compilateurs modernes optimisations de sorte qu'ils sont moins littérale, gardant ainsi la sémantique de ce que vous êtes en exprimant dans le code, si ce n'est la réelle mise en œuvre parfaite.
Ce que je veux dire par le niveau bas est tout ce qu'on veut dire quand ils disent que C est un langage de bas niveau. Si je savais que je n'aurais pas poser la question. – ecounysis 27 secondes auparavant
Ce n'est pas ce que la question ressemblait à tous.
Si ce que vous voulez savoir est ce que les "bas-niveau" veut dire quand ils disent que, wiki a des articles que vous pouvez lire.
http://en.wikipedia.org/wiki/Low-level_programming_language
http://en.wikipedia.org/wiki/High-level_programming_language
Quand ils disent que C est un langage de bas niveau, ils ne parlons pas de n'importe quel degré. Une langue est de niveau supérieur ou au niveau bas. Ils sont deux différents types ou Catégories.
int
en C correspond étroitement à un natif word sur la plateforme sous-jacente, et donc a des limites similaires dans la gamme et la précision. Comparer avec un langage comme Haskell, où les types numériques peuvent avoir une précision arbitraire.Le fait que vous posez cette question exprime votre naïveté de l'objet.
Il n'est tout simplement pas que simple.
À la fin
C n'a pas le remplir avec souplesse d'un langage d'assemblage, mais il est proche.
Il manque des fonctionnalités telles que la Queue de la Récursivité
Mais pour la plupart des fins, C est tout ce que vous aurait probablement besoin d'-