Partage
  • Partager sur Facebook
  • Partager sur Twitter

JAVA ou C ? Non, ce n'est pas un troll.

Mais une demande d'avis pour faire un choix technique

    3 juillet 2020 à 0:36:51

    Bonsoir à tous,

    Avant de rentrer dans le vif du sujet, je vais exposer ici le contexte pour que les réponses soient les plus pertinentes possibles. Passionné de son, je me suis lancé dans la construction d'un programme qui serait l'équivalent d'une table de mixage pour faire des petits «concerts» avec des gens qui seraient à distance les uns des autres (chacun dans une ville différente par exemple).

    Le programme devra donc récupérer des signaux diffusés par les sources (par exemple un guitariste et un chanteur), les passer à travers des filtres du genre «égaliseur», combiner ces sources avec un fichier sonore pour la partie batterie et basse, et renvoyer le tout pour les auditeurs ET (c'est le point le plus important), au chanteur et au guitariste pour qu'ils entendent où ils en sont.

    La principale difficulté sera donc d'avoir une latence minimale (et donc une performance maximale) cas sinon, le chanteur et le guitariste ne seront jamais en rythme.

    Ayant appris le JAVA pour débuter la programmation, j'ai donc naturellement commencé par écrire mon programme dans ce langage. Cependant, pour le décodage des signaux, n'ayant pas trouvé de bibliothèque vraiment à jour, j'ai utilisé FFMPEG écrite en C que je lance via des commandes de type «Process Builder» qui permettent de s'adresser directement à l'OS. Puis j'ai créé des modules JAVA qui récupèrent ces signaux décodés en un signal «brut» de type wav, les filtrent et les combinent. Enfin, de nouveau avec des «Process builder», FFMPEG se charge de rediffuser mon signal.

    Ça fonctionne pas trop mal (à quelques bugs près quand je chatouille un peu trop les formats de signaux) mais je me pose cette question : quid de la performance ? Le passage de FFMPEG (écrit en C) pour me fournir un signal interprétable en JAVA, faire mes traitements, et ensuite renvoyer un signal compréhensible par FFMPEG qui le diffusera me semble «lourd» et source de latence, ce que je veux absolument éviter.

    FFMPEG étant écrit majoritairement en C, je me pose donc naturellement la question de savoir si je ne devrais pas apprendre ce langage dans le but de transposer tout ce que j'ai écrit en JAVA vers le C.

    Qu'en pensez vous ? Est-ce que je verrai vraiment une différence de performance ? Et comment mesurer ce gain de performance si il y en a un ? Il ne s'agit donc pas de savoir si JAVA ou C est meilleur, mais plutôt de m'aider à faire un choix technique.

    Merci d'avance pour vos réponses. :-)

    -
    Edité par Dr_Click 3 juillet 2020 à 1:11:09

    • Partager sur Facebook
    • Partager sur Twitter
    Dr_Click
      3 juillet 2020 à 2:17:17

      Salut,
      Ceci n'est que mon avis, mais le langage C est un langage de bas niveau comparé à d'autres.
      C'est vrai qu'il est très performant, mais le code peut être compliqué à écrire et difficile à débugger.
      La librairie FMOD qui est censé gérer les sons en C me semble plus ou moins supporté.
      J'ai cru comprendre que Java est à moitié compilé et à moitié interprété.
      Tu es donc habitué à des choses comme des classes et la gestion d'objets.
      Si tu veux apprendre un langage à la fois puissant et performant, je te suggère plutôt le langage C++
      Je pense qu'on peut même appeler des fonctions écrites en C à partir de code écrit en C++
      (à condition d'avoir la même distribution pour les deux compilateurs)
      La latence ne sera pas seulement causée par le programme, il faut tenir compte des transmissions et de la capacité des lignes (ou bande passante).
      Si tu choisis d'apprendre C++, ne suis pas le cours d'OpenClassrooms.
      Vas plutôt du côté de Zeste de Savoir.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        3 juillet 2020 à 8:50:51

        Bonjour PierrotLeFou et merci pour ce premier avis.

        En effet, JAVA est pré-compilé et je suis habitué à travailler avec des objets. Par rapport à ta réponse, je me pose donc une nouvelle question : celle de la compatibilité entre C et C++.

        D'un côté, je lis des forums expliquant que c'est parfaitement compatible ; même si la manière d'écrire le code est très différente, le compilateur transforme C++ en C avant de compiler le tout. De l'autre, je lis que non, utiliser des codes sources de bibliothèques écrites en C (comme FFMPEG) dans un programme en C++, ça ne donnera rien de bon car les deux langages sont de plus en plus divergents et n'ont plus grand chose en commun.

        Qu'en est-il ? D'un côté, je serais sans doute moins perdu en me mettant au C++ car je retrouverais la POO, de l'autre, si ça ne compile pas quand j'inclus les sources de bibliothèques en C, je ne serai pas plus avancé...

        Je sais que ça fait pas mal de questions, mais au regard du volume d'heures à passer pour apprendre, je préférerais faire choix le plus adapté à mes besoins.

        Bon début de journée.

        • Partager sur Facebook
        • Partager sur Twitter
        Dr_Click
          3 juillet 2020 à 14:26:06

          Salut,
          Non, aucun compilateur ne transforme le C++ en C. En fait, ce sont deux compilateurs tout à fait différents.
          Il m'est cependant arrivé de compiler avec C++ de petits programmes écrits en C et il y a peu de changements à faire (surtout les entrées-sorties).
          Mais cette façon d'écrire n'est pas toujours recommandée. C++ a effectivement divergé de C et on essaie d'écrire le C++ en fonction de ses fonctionalités orientées objet.
          Je n'ai pas essayé d'appeler des fonctions (déjà compilées) écrites en C à partir de programmes écrits en C++ sauf pour des choses simples.
          C'est quand les fonctions manipulent des objets que ça se gâte.
          Tu parles d'utiliser le code source de fonctions écrites en C avec le compilateur C++. La plupart du temps, ça ne compilerait pas correctement.
          Selon la description de tes besoins, je pense que tu serais mieux d'apprendre le C++. Tu serais moins perdu en lisant du code C si tu as appris C++ que l'inverse.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            3 juillet 2020 à 14:27:28

            Bonjour,

            Le C++ a plus de possibilités que le C. Ça fait 35 ans que je fais du C, et 30 du C++, et il ne m'est absolument jamais venu à l'idée d'écrire du code en C dans un environnement de haut niveau!
            Le C++ supporte tout à fait de s'interfacer avec le C, un peu comme la plupart des langages car la plupart des API des systèmes sont en C, il faut pouvoir y accéder. Donc aucun risque de compatibilité entre C++ et C (voire même le C++ pourra directement compiler ton code C.)
            Par contre penser que passer de Java à C++ serait plus facile que de passer de Java à C, là j'ai un très gros doute.
            - Le C n'est pas si compliqué, il peut s'apprendre très vite.
            - Le C++ est nettement plus complexe, et sa ressemblance avec Java est piégeuse. Par expérience, ceux qui ont le plus de difficultés à suivre ma formation C++ viennent du Java ou du C#.

            Le C++ transformé en C pour être compilé, j'ai connu cela il y avait le C++AT&T mais ça n'est plus le cas depuis 1985! Le C++ est compilé directement.
            Le gros handicap du C++ est justement qu'il est plutôt difficile à maîtriser, et si tu souhaites l'apprendre avec des bases Java, il te faudra trouver une formation très bien faite. Ne surtout pas essayer d'utiliser tes connaissances Java en C++, tu risques d'y laisser des plumes.

            Donc si ton souhait est de t'investir sur un nouveau langage alors pourquoi pas le C++, mais on n'apprend pas le C++ en quelque semaines.
            Si par contre ton objectif est de résoudre ton problème, le C sera un peu moins bien mais il pourra tout faire avec un apprentissage nettement plus court.

            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

              3 juillet 2020 à 15:13:09

              Le C++ n'a absolument pas plus de possibilité que le C, c'est juste complètement faux de dire çà. Et sinon si tu connais déjà le Java, ce langage s'interface très bien avec le C, regarde du coté de JNI. 

              Et je pense que pour ton programme on peut dire sans trop se mouiller que la principale latence viendra des transmissions réseau. 

              • Partager sur Facebook
              • Partager sur Twitter
                7 juillet 2020 à 12:59:06

                Merci pour ces réponses.

                La bibliothèque FFMPEG est écrite en C donc sans objets si j'ai bien compris une des différences entre C et C++. Mon utilisation de cette bibliothèque sera de lui demander de capter un signal encodé au format opus (ou à défaut, mp3 ou ogg) pour me fournir un signal PCM (wav) et inversement, et éventuellement de me transformer le signal via des filtres audio. Je pense donc que la notion d'objet ne sera pas un problème dans cette utilisation car ma communication avec FFMPEG se limitera à des échanges de tableaux d'octets.

                Cependant, puisque je risque d'avoir des problèmes de compilation, est-il possible de dire à l'IDE : compile moi le code source de FFMPEG en C, celui du reste du projet en C++ et quand tu as les fichiers pré-compilés en «.o», assemble tout ça ensemble pour en faire un exécutable global ?

                Est-ce une idée totalement absurde ?

                PS : J'ai commencé à regarder un peu les cours en C et ceux et C++. Même si, comme le dit Dalfab, la ressemblance entre C++ et JAVA est probablement piégeuse, j'ai pris peur en regardant la syntaxe du C et je n'ai pas réussi à savoir si les notions de thread ou de «bloqueur temporaire» de thread existent ou si je dois réinventer la roue si je ne trouve pas de bibliothèque toute faite. Qu'en est-il réellement ?

                -
                Edité par Dr_Click 7 juillet 2020 à 13:11:13

                • Partager sur Facebook
                • Partager sur Twitter
                Dr_Click
                  23 juillet 2020 à 14:29:58

                  Salut,

                  Il est possible d'inclure du code C au sein d'un projet C++. Il suffit de "déclarer" le code C :

                  extern "C" {
                  
                  ici du C
                  
                  }
                  
                  //Une lib C qui pourrait être utilisée en C++ contient 
                  //généralement ce genre de test : #ifdef __cplusplus extern "C" { #endif //du C... #ifdef __cplusplus } #endif

                  Pour les threads, il y a pthread. Celle que j'utilisais avant d'utiliser les threads de la SDL (basés sur pthread...). Elle a toujours fait le boulot et est assez largement documentée sur le net avec beaucoup de cours/tutos. Donc une mise en oeuvre plus rapide que lorsqu'il faut se livrer à des essais.

                  Bonne continuation.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Bonhomme !! | Jeu de plateforme : Prototype.

                    24 juillet 2020 à 10:18:58

                    Si tu aimes le C et que tu le connais bien je te dirais pourquoi pas.

                    Java c'est un langage qui a été popularisé ces deux dernières décennies mais je pense qu'il est largement plus au goût du jour par rapport aux alternatives performantes et plus simples qui existent aujourd'hui. Malheureusement il est toujours enseigné en école ce qui empêche les non-curieux de s'intéresser à autres chose.

                    Alternatives intéressantes :

                    • C++20 (aka C++ moderne)
                    • Rust
                    • Partager sur Facebook
                    • Partager sur Twitter

                    git is great because Linus did it, mercurial is better because he didn't.

                    JAVA ou C ? Non, ce n'est pas un troll.

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown