Langage de programmation

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Langage de programmation

par katagoto » 15 août 2008, 11:04

Je me demandais une chose : lorsqu'ils ont voulu faire le C, ils ont dût faire le premier compilateur à partir de rien et définir la syntaxe, la compilateur n'avais qu'à passé le code émit en langage machine, c'est étrange, non ?

par Sékiltoyai » 14 août 2008, 13:50

certes, en PHP on peu appelé une fonction via son seul nom...
Euh, en même temps, tu mets le nom d'une fonction dans une variable et il est possible d'appeler une fonction sans hardcoder son nom…

Evidemment qu'en C on ne met pas le nom d'une fonction dans une variable, cela n'a aucun sens, le processeur ne sait pas ce que cela veut dire, il ne connaît pas le nom des fonctions. C'est pour cela qu'en langage compilé, à fortiori bas-niveau, on ne manipule que des adresses. A vrai dire, ce n'est pas vraiment compliqué, il faut juste savoir que le programme tourne sur une machine et non dans le vide, que chaque type a une taille, que la mémoire ça se gère, etc… Pour appeler une fonction, on pourraît très bien stocker dans un pointeur correctement typé un entier correspondant à l'adresse de la fonction (bon, le seul problème, c'est qu'il est rare que l'on connaisse cette adresse…).
C'est exactement ce qui est fait avec les variables pour écrire des drivers :

Code : Tout sélectionner

*( (volatile byte *) 0xffb7 = 3; // On écrit 3 dans une variable d'adresse 0xffb7 et de taille d'un octet…

par Hywan » 14 août 2008, 13:12

J'étais impressionné de voir des tableaux de fonctions par exemple.
Je ne comprend pas tellement pourquoi c'est impressionant, bien que j'ai eu un peu de mal à modéliser le problème, c'est une sorte de référencement de fonction, certes, en PHP on peu appelé une fonction via son seul nom...
Comme en C tout est pointeur, on peut pointer vers une données, ou une fonction (ou encore d'autres choses hein). Un tableau de fonction est donc un tableau de pointeur vers des fonctions. Le tableau ne contient pas le nom des fonctions, mais un pointeur vers la fonction, c'est très différent.

Avec PHP, on peut faire d'autres choses, mais c'est interprété, c'est différent ;-).

par katagoto » 14 août 2008, 12:15

En fait, tu as raison, mais quand je parlais de fonctions, je parlais de fonctionnalités. Je n'arrive pas à le décrire, mais la syntaxe de C est tellement bien construite qu'on peut écrire des gros délires en se disant : « Allé, si ça marche, je me rase la tête », et bah, hop, un chauve de plus (le malheureux).
Bon, j'ai pire, mais : chauve qui peu !
J'étais impressionné de voir des tableaux de fonctions par exemple.
Je ne comprend pas tellement pourquoi c'est impressionant, bien que j'ai eu un peu de mal à modéliser le problème, c'est une sorte de référencement de fonction, certes, en PHP on peu appelé une fonction via son seul nom...

Bah j'ai appris pas mal de trucs d'un coup :lol:

par Hywan » 13 août 2008, 23:17

Mais attention, la syntaxe du cast c'est tout simplement l'appel d'une fonction avec un argument. En effet : (int) var, revient à écrire int(var). La syntaxe int(var) n'est peut-être pas accepté (me souviens plus), mais quand on a un tableau de pointeur vers des fonctions, on utilise cette syntaxe là : (*(tab + i)) arg, ou (tab) arg (totalement équivalent, plus lisible). On comprend déjà plus pourquoi on peut faire ce qu'on veut avec C, c'est d'une logique implacable …

par Sékiltoyai » 13 août 2008, 23:09

Ouais, en C, tout est pointeur, à ne pas oublier :)
On peut tout manipuler, stocker une adresse de fonction dans une variable et l'appeler. Le principe du C est simple, il va t'imposer un typage fort parce qu'il est compilé, et cela t'empèche de faire des conneries, mais cela n'empèche pas de passer outre, car tu peux très bien (attention, gros raccourci), changer radicalement le type d'une variable, simplement en passant par des pointeurs (le cast ne suffit pas toujours, et peut modifier le contenu, selon le type de cast…).

par Hywan » 13 août 2008, 22:46

Ouf, Sékil était là pour me reprendre ;-).
En fait, tu as raison, mais quand je parlais de fonctions, je parlais de fonctionnalités. Je n'arrive pas à le décrire, mais la syntaxe de C est tellement bien construite qu'on peut écrire des gros délires en se disant : « Allé, si ça marche, je me rase la tête », et bah, hop, un chauve de plus (le malheureux). J'étais impressionné de voir des tableaux de fonctions par exemple. Je sais, c'est tout bête et extrêmement logique. Le C est tellement logique qu'on se demande pourquoi personne d'autre n'y ait pensé … c'est … hmm, déroutant de simplicité (et je pèse mes mots). Les structures, les typages, tout est une question de syntaxe, on est totalement libre.

Ah oui, j'ai oublié de préciser une chose. Le C est génial car c'est le langage le plus lisible par l'homme qui permet un tel contrôle des données, notamment au niveau mémoire.

par Sékiltoyai » 13 août 2008, 22:13

C est un langage très très puissant car il met en place une trèèès grande abstraction qui est … logique !
En bref, C est un langage très abstrait qui te permet de faire pratiquement n'importe quoi.
Euh, concret, pas abstrait, au contraire…
Quand on commence à fouiner sérieusement dans C, on se rend compte que rien n'est impossible. J'irai jusqu'à dire que C est construit sur C. Les fonctions sont bâtis sur un type fonction, ce qui permet d'avoir des tableaux de fonctions par exemple. Le langage s'utilise lui-même pour fournir des outils de bases, c'est très très bien conçu (ça m'épate à chaque fois d'ailleurs).
Comme tu le sais HyWaN, j'aime pas les raccourcis :)
Le langage C ne fournit pas d'outils. Le C ce n'est qu'une syntaxe (et encore, dans le temps c'était n syntaxes). Même le compilateur n'est pas unique, puisqu'il y a plusieurs dizaines de compilateurs pour le langage. Donc s'il y a des fonctions "natives", c'est que c'est maintenant à peu près harmonisé d'un système à l'autre…
Les fonctions natives que l'on utilise en C ne sont donc en aucun cas spécifiques au langage, elles sont utilisables en n'importe quel autre langage (du moment qu'il est compilé et qu'il supporte l'édition des liens). Après si la majorité de ces librairies, drivers, ou programmes de base d'un système, ainsi que les compilateurs (y compris les compilateurs de C), sont programmés en C, c'est que le C est le langage bas niveau le plus humainement lisible. Mais on pourrait tout aussi bien les coder en assembleur ou en tout autre langage permettant, comme le C, un accès direct aux périphériques ou autres ressources.

par Hywan » 13 août 2008, 19:08

@ouckileou : Exact. J'ai pris Prolog en exemple. J'ai un ami (prof) qui fait une thèse sur la programmation génétique dans le but des preuves et tests ; il écrit tout en Java. En gros, les tests unitaires ne couvrent pas 100% des cas, mais 90% des cas (à la louche, pour l'exemple). Le but de la programmation génétique est de « créer » les 10% de tests manquants. Domaine très nouveau mais très intéressant.

Quant à l'algorithme du voyageur de commerce, on peut le résoudre simplement en Java, voire même en PHP c'est évident. Si on a un langage qui nous permet de coder des graphes, on peut résoudre le problème facilement.

Donc oui, ton intervention est utile : il faut modérer mes propos. Comme dans la vie, la programmation n'est pas soit toute blanche, soit toute noire : on trouve des cas ambiguës et cette fois, c'est la connaissance approfondie des langages qui va nous permettre de les départager.


@katagoto : La plupart des langages reposent sur C ou C++. PHP est « écrit » (interprété) en C, le noyau de Java est écrit en C (bien que les couches supérieures du noyau soient écrit en Java), Prolog est interprété en C, CAML également, Perl aussi je crois. C est un langage très très puissant car il met en place une trèèès grande abstraction qui est … logique ! Quand on commence à fouiner sérieusement dans C, on se rend compte que rien n'est impossible. J'irai jusqu'à dire que C est construit sur C. Les fonctions sont bâtis sur un type fonction, ce qui permet d'avoir des tableaux de fonctions par exemple. Le langage s'utilise lui-même pour fournir des outils de bases, c'est très très bien conçu (ça m'épate à chaque fois d'ailleurs).
Pour moi, C reste _le_ langage de l'informatique, une sorte de gros monstre tellement trop fort qu'en bientôt 40 ans, personne n'a réussi à faire mieux. On a bien le langage D qui est intéressant mais je n'ai pas encore trop mis mon nez dedans.
En bref, C est un langage très abstrait qui te permet de faire pratiquement n'importe quoi. Tellement n'importe quoi qu'il est la base de beaucoup de langages, et surtout de langages interprétés. Ces langages interprétés permettent de répondre à un problème précis grâce à une logique précise (tu vois la pyramide se construire ?). Mais le C, une fois compilé, n'est qu'un binaire, transformé en langage machine et interprété par le processeur ; fin : on est arrivé aux fondations de la pyramide.
Après, le C++ (incrémentation de 1) n'est qu'une évolution du C, mais C++ est écrit en C. On trouve aussi l'Objective C qui est très puissant, et bâtis en C à l'instar de C++. Bref, les possibilités sont illimités ;-).

C'est pas beau l'informatique :) ?

par Nagol » 13 août 2008, 17:51

J'ai une question stupide : pour quoi le C++ est adapté, pas de trool et ça n'a rien à voir avec PHP ^^
du dev système classique, d'appli relativement grosse (pour avoir besoin de faire de l'objet) classiquement, on pourrait parler de langage "généraliste" pour reprendre les analogies précédentes

par katagoto » 13 août 2008, 16:12

J'ai une question stupide : pour quoi le C++ est adapté, pas de trool et ça n'a rien à voir avec PHP ^^

par ouckileou » 13 août 2008, 14:20

En Prolog (pour faire de l'Intelligence Artificielle — IA —), on a le back-tracking qui est implémenté dans le langage. Encore une fois, rares sont les langages qui ont ceci car c'est peu utile, sauf dans le cas de l'IA où c'est pratiquement un des fondements.
L'IA c'est quand même super vaste, dire que certains langage sont adaptés à l'IA et pas d'autres est un peu rapide à mon sens. Il y a certains problèmes placés dans la catégorie IA qui peuvent très bien être résolu avec du Java et donc de l'objet (on a parlé il y a quelques temps du problème du voyageur de commerce, et des algos génétiques par exemple).

Tout comme le Prolog est adapté à certaines problématiques de l'IA mais pas à d'autres.

par katagoto » 13 août 2008, 13:45

Là j'ai compris

par Hywan » 13 août 2008, 13:14

tu dis que chaque problème amène à penser différement, et que chaque langage nécessite la même logique, alors il faut prendre le langage le plus aproprié en terme de liibilité ?
Justement non. Chaque langage répond à une logique particulière. Certains langages ont des logiques similaires (comme l'a dit Berze : Perl et PHP se ressemblent dans la logique générale), mais ce sont des langages par famille.

On trouve des familles de langages, donc des familles de logiques : la famille ML (Caml, OCaml, …), la famille LISP (LISP, Scheme, …), la famille « script CGI » (PHP, Perl, Python parfois, …), etc.

Pour te donner un exemple : PHP n'est pas approprié pour résoudre des équations car il ne sait pas du tout comment faire, alors que Caml, lui, a déjà tout pour résoudre ça. Il sait très bien géré la récursivité (elle est optimisée), il a un typage inductif, qui se prête très bien aux équations justement, une gestion de mémoire différente, etc.
Un typage inductif c'est vachement sympa (mais je ne sais pas comment s'est codé, j'ai pas encore tout compris). C'est une autre façon de traiter les données, et c'est là toute la finesse de ce langage. PHP a un typage faible, il ne peut pas travailler sur des expressions (au sens Mathématiques), ou sinon, il faudrait faire de l'objet et ce serait très lourd.
En Prolog (pour faire de l'Intelligence Artificielle — IA —), on a le back-tracking qui est implémenté dans le langage. Encore une fois, rares sont les langages qui ont ceci car c'est peu utile, sauf dans le cas de l'IA où c'est pratiquement un des fondements.

Calimero a bien résumé ça. Je complète (ou insiste) en disant qu'il faut déjà connaître son problème et ensuite utilisé l'outil adapté. L'outil c'est le langage. On va lire le mode d'emploi, c'est sûr, mais ce n'est pas parce qu'on connaît tous les outils qu'on sait résoudre tous les problèmes. Ça n'a pas de sens.

En fait, on parle de paradigme de programmation, c'est tout à fait le mot que je cherchais.

par katagoto » 13 août 2008, 12:40

J'essaye juste de te faire évoluer et surtout de te faire comprendre ce qu'est la programmation (cela n'inclue pas que je le sache, mais je te fais part de mes sentiments). Ça ne résume pas à un langage, mais à des logiques. Parmi ces logiques, on peut retrouver l'IA par exemple, ou la résolution d'équations, d'expressions, les automates, les machines de recherches, les arbres, l'algorithmique de texte, et j'en passe. Tous ces domaines requièrent une logique et une approche différente.
Ce qui fait que pour la résolution d'équation, on va préférer utiliser OCaml plutôt que PHP, car OCaml (Objective Caml, de la famille ML) utilise un typage inductif, ce qui est très pratique. Sa syntaxe est également très clair pour résoudre ce type de problème. Bref, c'est un langage plus adapté que PHP. Tu comprends ?
J'ai pas tout compris là...

Bon, j'admet que PHP n'est pas approprié pour faire des résolutions d'équations ou même des IA (faire des IA), mais là où je ne comprends pas, ou enfin je ne pense pas comprendre c'est : tu dis que chaque problème amène à penser différement, et que chaque langage nécessite la même logique, alors il faut prendre le langage le plus aproprié en terme de liibilité ?

c'est pas ça :(

Commence par donner une règle générale et après, en sautant une ligne, donne un exemple, je comprend mieu à l'envers, en plus, en ce moment je suis plus limité que d'habitude...