 Je vais parler de la principale différence entre Sylab et MATLAB. Juste pour vous rappeler que les deux Sylab et MATLAB ont commencé dans l'AIT. Donc, les deux langues ont la même philosophie et les deux langues sont très similaires. D'aujourd'hui, les Sylab et les psychos ont évolué indépendamment de MATLAB et Simulink. Donc, il y a beaucoup de différences qui ont apporté. L'année dernière, nous avons essayé de les faire plus convertir quand possible, mais en essayant de garder les points de Sylab. L'une des principales différences est la façon dont les fonctions sont évoluées dans Sylab et MATLAB. Dans MATLAB, les fonctions peuvent être définies en utilisant des files M. Donc, vous devez évoluer les files sur votre computer qui contient le code de la fonction. Et ces files M, si elles sont en passées, sont automatiquement évoluées dans MATLAB. Lorsque les fonctions qui ont été modifiées sont automatiquement évoluées dans le software. Et les fonctions qui sont évoluées de cette façon sont évoluées dans le scope spécial. Dans Sylab, les fonctions peuvent être définies directement dans la langue. Et pour cette raison, la fonction keyword, qui a commencé, qui a marqué le début de la fonction, devrait être évoluée par une fin de fonction qui a marqué l'end. Ce n'est pas le cas dans MATLAB. Et typiquement, la fonction peut être évoluée en demandant. Donc, vous pouvez explicitement évoluer la fonction dans le Sylab. Mais, c'est aussi possible de créer des libraries qui permettent, qui ressemblent à la passée de MATLAB, mais qui permettent la fonction d'être évoluée automatiquement en demandant. Mais la fonction, si vous modifiez la fonction dans une de ces libraries, ce n'est pas automatiquement évoluée. Donc, vous devez utiliser la fonction, généralement, d'évoluer la libraries. Et, pour exemple, ici, j'ai mis un petit exemple sur la façon dont la fonction peut être définie dans Sylab. Ça ressemble à MATLAB, mais ici, vous avez la fin de fonction, qui est utilisée pour marquer. Et cette sorte d'instruction peut être directement évoluée dans le console Sylab. Ce n'est pas utile d'y évoluer dans un fil et puis, faire le fil connu par le système. Il y a aussi des différences pour le comportement de la fonction. Comme j'ai dit avant, dans MATLAB, les fonctions sont installées dans un scope spécial. Et conséquentement, ce n'est pas possible de manipuler elles comme variables. Par exemple, ce n'est pas possible de faire une copie de la fonction ou d'y évoluer une fonction d'une formule. Il y a une fonction, dans MATLAB, qui est née en ligne, qui permet d'évoluer une fonction très petite dans le scope principal. Pour les scripts, ils sont plus ou moins vus comme fonction et peuvent être évolués juste en typant le nom du fil sans l'extension. Dans Sylab, les fonctions sont installées dans le scope principal comme variables comme matrices. Et toute la fonction peut être définie en ligne et aussi la fonction peut être née en ligne, donc vous pouvez définir une fonction dans une autre fonction. Consequentement, les fonctions sont variables comme d'autres. Quand vous typez le nom d'une fonction, en fait, vous référez à la fonction, vous ne l'étiez pas. Comme dans MATLAB, donc si vous voulez coller une fonction sans l'argument, vous devez ajouter la parenthèse, une séquence mt collée avec l'opening et l'entraînement de parenthèse. Et le file script devrait être évolué par l'exec keyword, l'exec de un file ou l'exec en ligne script. Et aussi, comme conséquence du fait que les fonctions sont variables comme d'autres, la fonction et la construction peuvent être passées comme l'argument de l'autre fonction, l'input ou l'output de l'argument. Donc ici, je crée une fonction, ou peut-être que je dois mettre plus de fonctions. Je vais couper cette fonction ici. Oui, j'ai créé une fonction qui est nommée DIFF et qui prend deux ou trois arguments. La première est la fonction, la deuxième est le nombre, la vecteur et la troisième option est la couleur. Oui, je teste si la troisième argument est présente et ensuite je compute la différence de la fonction pour estimer la différence, la dérivaise. Puis je peux coller cette fonction de cette façon. Le signe ici est une construction. Je peux, pour exemple, faire une fonction CELA et je peux différencier ça. Cette fonction devrait répondre à 1. Et donc ici, je compute la différence pour une vecteur qui est 0 à 5 par step de 1 et j'ai une valeur de 0 pour tous les numéros. Donc c'est aussi pour une fonction. Maintenant, si je regarde la fonction qui est définie ici, j'ai cette D, la vecteur que je compute ici, qui est la vecteur de l'application de l'application de 6, et la D, qui est la fonction. Donc les deux sont dans la vecteur, la vecteur de l'application de 6. Maintenant, je redefine la fonction d'application d'application d'une vecteur et si je regarde la variable qui est nommée D, maintenant la vecteur a été changée ici pour un numéro. Donc je redefine ça. Il y a aussi des différences dans la variable, la vecteur de la variable dans les fonctions. Dans Matlab, dans une fonction, seulement les variables qui sont localement définies dans les fonctions sont connues. Vous pouvez aussi déclarer quelques variables expliquées comme globales, donc beaucoup de fonctions peuvent partager aussi la main, le haut niveau peut partager cette variable, mais vous devez déclarer les variables globales àederante où vous voulez les utiliser. Dans l'application d'application, il est également possible de refermer les variables applicées dans la scope d'application. Ici, par exemple, je crée cette function d'0 qui compute y à grand n et dans l'application d'O, je define z égal 5 n y equal a plus z to the power n. A is not defined in this function. But if I define a and b here and I call foo, when foo is executed, the value of a is taken here in the main scope. So you have the scope of foo that contains the variable n, z and y and the main scope will contain the foo, the function itself, the a variable and the b variable. Another kind of difference is the semantic of basic function. There is a lot of functions, so I won't check all of them, but only the basic one, those which are very often used. So there is two families of basic functions who pose problems when you go from MATLAB to CELAB. The first family is the sum, prod, mean and max family. In MATLAB, sum of a compute the row vector of the sum along the first non-sigleton dimension of a.o. It's very complicated what it means. If I have a matrix here, which is a 2 by 2 matrix and I ask sum of this matrix, I get the vector 4 and 6. And if I put a vector, a row vector 1, 2, the result is 3. In CELAB, we thought that this solution is not very good because a matrix during an algorithm may become a vector. So the semantic of the function changes during the algorithm. So we decided that sum of a will every time compute the sum of all elements containing a. And to use the second semantic sum of a and i, which compute the sum along the es dimension for both. This is in MATLAB and it is also in CELAB. So this one has a constant semantic even for every shape of matrices. And it is true for all these functions. A second class of functions whose problem is the 1, 0, round and some other function. In MATLAB, you have this syntax 0 of m, which built a matrix full of 0 of side m by m. And 0 of m, n, which built a matrix with m rows, n columns and the same here for... And if you want to build a matrix of 0, which has the same size of a, you have to write this syntax 0 of size of a. Size of a return a vector, which is the dimension of the matrix a and 0, then you apply this syntax. In particular, this syntax is very... maybe useful for n dimensional matrices. If you have matrices with a non-definite number of dimension, it is quite difficult to use this kind of syntax. So this one is very useful. In CELAB, for historical reason, because at the beginning MATLAB was do the same. To build a matrix of 0, which has the same size of a, you can just enter 0 of a instead of 0 of size of a. It is also possible to have this syntax 0 of m, n and so on. But this one cannot be used because it conflicts with this one. Another family of problem is the ordering of complex numbers. I talk of the comparison operator, the mean, max and sort of functions. In MATLAB, depending on the function you have, this operation may work either on the real part, either on the modulus of the complex numbers. For example, for the comparison, the comparison works on the real part. So if you enter this expression, 1 plus 10 times a, i is less than 2, the response is true. It's quite strange for people who are doing mathematics. In CELAB, we decided not to do the same and to generate an error. If somebody wants to compare this kind of number, CELAB generates an error. But it is possible for the user to define the function, to give a function, which defines the mean of this operation, if you want. Here, I wrote this little function, which gives the MATLAB meaning to the comparison between a complex and a real number. Here I have this function. So for the name of the function, you have to see the overloading of CELAB. And here, I just put that the result should be the real part compared to the real part of B. And if you have defined this function, the result is the same as MATLAB. But if you want to say that the comparison should be done using the modulus or the phase, it's up to you to define them. There is also, now for some data types. For example, for string matrices in MATLAB, you have two kind of string matrices. The original one, which is the class char, which allows to define a column vector of character string. And this character string should be padded to the same length. For example, here, I use S1 equal the character string MATLAB, semicolon CELAB, creates a vector of strings with two rows. The first row is MATLAB, the second is CELAB, because MATLAB and CELAB are exactly the same lengths. And if I use this operator, I replace the semicolon by a comma, then the operation performs a catenation of the two strings. It's not, you are not building a vector, a row vector of strings. The second solution is to use the cell array, which is a generic object which allows to put in a matrix way other data. But here you have to use different operator to construct matrix and to index them. For example, here, if you want to construct a row vector which contains the string XYZ and MATLAB, you have to use brackets instead of squares. And if you want to get the first element of this vector, you have to use also your curly brackets. In CELAB, there is a specific matrix type, data type for the strings. And so we can use the regular operator for matrix contracts and indexing. For example, here, I built T as a row vector XYZ in CELAB, and T of 1 returns XYZ. And if I want to catenate the string, I use the plus operator. In CELAB, to build a high level object, one may use the CELAB built-in M list. And for compatibility with MATLAB, we have emulated the cell array, the MATLAB cell array using this data type. But due to this point, we'll probably change it in the time. In MATLAB, when you want to get the IG element of C, you have to use curly brackets. In CELAB, this can be done using regular parenthesis for subcell indexing. And if you want to get the element itself in MATLAB, in MATLAB, you have to use parenthesis and in CELAB parenthesis followed by the entry field. Empty matrixes are also different in MATLAB, which is probably the best solution. Empty matrixes is a matrix with at least one dimension equal to zero. So you may have empty matrix with zero rows and ten columns. And you have a coherent arithmetic, which is supported with these empty matrices. For example, if I call the size of the empty matrix, I get a vector because I return every time I return a vector, a column vector. In this case, there is no eigenvalue, so the number of rows is zero. But the number of columns is still one because IG is supposed to return a column vector. If you built a vector, which has two rows and zero columns, and you make the product X times X transpose, you will get a matrix, a two-two matrix filled with zeros. In CELAB, and for the same historical reason as before, there is only one empty matrix for all data types and all dimensions. So one empty matrix with dimension zero by zero. And this is the same for string matrices or integer matrices or double. To be able to take into account all these differences, it's not so easy to translate MATLA file to CELAB. For people who write MATLA file, it's quite easy to do the work manually because you know exactly what the program is doing. You know if a variable is a vector or a matrix. But if you have a code coming from elsewhere and you want to translate it, it's much more difficult because we have to know, oh, here, I apply sum to A. Oh, A, is it a matrix or is it a vector? It's not so easy, you have to look at the code. So we tried to develop MATLA to CELAB translator, which is an help for people who want to translate MATLA file to CELAB. So the problem is not only a syntax problem. In MATLA, the commands are marked with a percent. In CELAB, it's double slash. So this can be easily replaced using a text editor. But for all the problems I mentioned before, it's not so easy. To be able to have an answer to the problem, you have to perform type and dimension inference to be able to have good code which is produced. But sometimes when you want to call a function, the variables which are in the calling sequence, it is impossible to infer what is their type and their dimension. So to help the translator to produce good code, you may, it's possible to add commands which give pragmas on the input argument. For example, it's possible to say, oh, this argument is a matrix which contains double precision numbers. Or this one is the matrix which contains the integer number and it is the vector. So using these pragmas, the translator is able to generate a code which is quite clean. Without this pragmas, the code uses a lot of emulation functions to be sure that the function will run. But these emulation functions are slow because it's functions which are written in SyLab which try to emulate the behavior of the MATLAB functions. And if the translator is not able to know the type and the argument, for example, of an operation, it will use overloading function to emulate the MATLAB behavior. The principle of the translator, first, it makes some text addition to, for example, to change the commands and some other slight modification, textual modification just to make SyLab able to read the code, the MATLAB codes. As the syntaxes are not so different, just a few modifications of the initial syntax make it possible to read the code in SyLab. After that, using the SyLab parser, you make a syntax formal tree of the code and this tree is then translated using the inference. And finally, this tree is used to regenerate a SyLab function code. Just a pretty print of the code. As a result, the translator, for each em file, the translator produce the translated file, of course, tries to. And it also produces the function which is named Sy underscore foo dot Sy here, which is used to translate the code to the foo function. So there is a sort of bootstrap you can translate function recursively. Each function that is translated gives the way to translate the following one. And there is also a log file which is generated where are indicated the missing functions, the function that the translator does not know and the function he has not translated. In this case, he put the function as they were in the initial code. The current state of this translator is today able to rule all the MATLAB syntax, all the operator and most of the built-ins. The main weak point of the translator is the graphic user interface function and the advanced graphic function which are not yet handled. And a lot of, because in MATLAB, there is thousands of functions. So all these functions written in MATLAB are not translated, of course, but it's possible to do so if you have the right to do so. Just one, two pages on Sycos and Simulink. So as Simulink, Sycos includes the hierarchical block diagram editor, compiler, simulator, cico-generator et all of these for modeling and simulating hybrid dynamical system. But behind Sycos, there is a precise and well-defined semantic which is an extension to the synchronous languages like Simial and Lustre, to continuous time. And there is a clear cut between the continuous time and the discrete and event handling. And also Sycos support physical level modeling based on modellical language. And the current Sycos weak points are the editor which look and feel does not fit to the standard of the time. And also there is no state flow equivalent in Sycos. And the last difference, Sylab is free of charge and open source. So there is no license problem no cause problem. So I have finished.