My photo

Mildred's Website

Tags:
My avatar

GoogleTalk, Jabber, XMPP address:
mildred@jabber.fr


GPG Public Key
(Fingerprint 197C A7E6 645B 4299 6D37 684B 6F9D A8D6 9A7D 2E2B)

Articles

Articles from 1 to 10

Sun 05 Sep 2010, 08:11 AM en

Hi everyone, this is my first post.

I'm using Webby to manage my blog and I'm testing things out.

Mon 06 Sep 2010, 09:13 AM comp dev fr lisaac

En Lisaac, il y a trois types de chaînes de caractères: ABSTRACT_STRING qui sert de parent à STRING et STRING_CONSTANT.

  • Le prototype ABSTRACT_STRING contient les méthodes de bases pour toutes les chaînes de caractères, utile à leur manipulation. C'est une classe abstraite qui sert à la manipulation en lecture seule de toute chaîne de caractères.

  • STRING est un prototype qui introduit des méthodes de modification, comme l'ajout d'une autre chaîne en fin. Il est très pratique en tant que buffer pour construire une chaîne.

  • Vous l'aurez deviné, les STRING_CONSTANT sont des chaînes constantes qu'on ne peux pas modifier (non mutables). Ce n'est pas techniquement impossible, il vaut cependant mieux éviter. Ces STRING_CONSTANT correspondent en fait aux chaînes littérales incluses dans le segment DATA de l'exécutable généré. Ainsi, toutes ces chaînes sont obligatoirement terminées par '\0' contrairement aux autres chaînes.

    Une autre particularité est que les chaînes STRING_CONSTANT sont générées par le compilateur, qui va s'assurer qu'il n'y aura pas deux chaînes différentes compilées dans le programme avec le même contenu.

Quelle conclusion peut on en tirer quant à la comparaison entre chaînes ?

  1. Il est nécessaire de comparer les chaînes caractère à caractère pour s'assurer de leur égalité

  2. Dans le cas des STRING_CONSTANT, il est possible de ne faire qu'une comparaison de pointeurs.

Bien sûr, la méthode n°2 est beaucoup plus rapide, Si possible, on aimerait pouvoir l'utiliser tout le temps. Dans le cas du compilateur Lisaac, les performances étant tellement critiques (nous avons affaire à un algorithme exponentiel) que Benoît s'est arrangé pour toujours faire une comparaison de pointeurs. Comment ?

Tout simplement en transformant les chaînes classiques en STRING_CONSTANT. Cela est fait en construisant de toute pièces l'objet STRING_CONSTANT en copiant les données contenues dans n'importe quelle autre chaîne. Et pour s'assurer de l'unicité de la chaîne, il est nécesaire au préalable de vérifier que la chaîne STRING_CONSTANT n'existe pas déjà.

Pour cela, toutes les chaînes utiles dans le compilateur à tout instant se trouvent dans un prototype ALIAS_STR. Pour les utiliser, on fait juste référence au nom du slot dans ALIAS_STR. Ces chaînes sont de plus insérées au démarrage du compilateur dans l'ensemble SET(ABSTRACT_STRING) qui contient toutes les chaînes constantes.

Cela reste une manipulation lourde (il est nécessaire d'insérer à la main toutes les chaînes constantes qu'on utilise quelque part dans le compilateur dans cet ensemble de chaînes) réservée au compilateur Lisaac. La conversion entre ABSTRACT_STRING et STRING_CONSTANT reste explicite et alourdit le code. J'ai eu donc envie de généraliser cela en l'implémentant en bibliothèque.

Avec les systèmes d'auto-import et auto-export, la conversion peut être très facile. Il restait cependant le problème délicat de référencer toutes les STRING_CONSTANT du segment DATA et de les insérer dans l'ensemble des chaînes. Pour cela il faut ajouter un système d'introspection qui permet au programme de parcourir toutes les chaînes constantes compilées. J'ai pensé à plusieurs solutions:

  • Ajouter trois externals pour respectivement avoir la borne basse du tableau des chaînes compilées, la borne haute, et un moyen d'obtenir la chaîne à un indice donné. Cela s'est avéré trop compliqué dans la mesure où les externals sont évalués lors du depending pass et que les chaînes constantes ne sont connues que lors de l'executong pass (voire à la toute fin de l'exécution du compilateur).

    Il aurait donc fallu ajouter une instruction pour évaluer la borne haute et basse, et évaluer la nième chaîne. Puisque le paramètre est tout sauf une constante entière, cela voudrait dire construire un bloc conditionnel SWITCH. Trop complexe.

  • Seconde solution, fournir ldans deux externals le nombre de chaînes et un pointeur vers un NATIVE_ARRAY(STRING_CONSTANT). C'était la solution la plus prometteuse, mais cela aurait complexifié la génération de code.

    En effet, NATIVE_ARRAY(STRING_CONSTANT) se traduit en type C par STRING_CONSTANT**. J'ai pensé au début que construire le code C suivant suffirait:

    STRING_CONSTANT* __string = {
      {12, "123456789012"},
      ...
      NULL
    };
    

    Sauf que cette construction est invalide en C, nous avons affaire à un tableau de Expanded STRING_CONSTANT, et le marqueur NULL ne compile donc pas en C. J'aurais donc pu créer le tableau à part, mais je n'avais pas envie.

    Ce qui aurait été possible:

    __STRING_CONSTANT __string_1 = {12, "123456789012"};
    ...
    
    __STRING_CONSTANT* __string[] = {
      __string_1,
      ...
      NULL
    };
    
  • Dernière solution, la liste chaînée. Chaque chaîne est liée par un pointeur à la chaîne précédante, et un unique external est généré pour avoir le haut de la liste. Au final, cela ne prend pas plus de place qu'un tableau et permet plus de possibilités (comme par exemple de faire rentrer dans la liste des chaînes construites après coup). Le code C généré ressemble à:

    __STRING_CONSTANT __string_1 = {STRING_CONSTANT__, 12, "123456789012"};
    __STRING_CONSTANT __string_2 = {&__string_1,       12, "123456789013"};
    __STRING_CONSTANT __string_3 = {&__string_2,       12, "123456789014"};
    __STRING_CONSTANT* __string_first = &__string_3;
    

    La première chaîne est liée au prototype (qui est lié à NULL) et les chaînes suivantes sont liées à celles d'avant. Un symbole spécial représente le haut de la pile qui est très simplement disponnible avec un external. C'est la solution que j'ai retenue.

Une fois le compilateur modifié, il faut modifier la bibliothèque standard. Au début, j'ai eu pour approche d'utiliser la liste chaînée comme ensemble de chaînes uniques au lieu d'un HASHED_SET. Mais les performances ont été tellement déplorables que j'en suis revenu à l'ensemble de hash.

Les modifications sont presque prêtes, et il va être nécessaire d'introduire deux commits de bootstrap (un commit pour introduire la fonctionnalité dans le compilateur, l'autre avec une bibliothèque standard modifiée et le compilateur qui délègue l'aliasing à la bibliothèque).

Il reste quelques problèmes à corriger, et ce sera prêt.

Mildred.

Tue 07 Sep 2010, 06:16 PM comp en

What is a prototype? I often wondered what it exactly meant. And I am developping a prototype-based language: Lisaac.

I went on Wikipedia to find out:

Prototype-based programming is a style of object-oriented programming in which classes are not present, and behavior reuse (known as inheritance in class-based languages) is performed via a process of cloning existing objects that serve as prototypes. This model can also be known as class-less, prototype-oriented or instance-based programming. Delegation is the language feature that supports prototype-based programming.

To cut the story short:

  • you don't have classes
  • instead you already have full featured objects (with values)
  • you don't instanciate, you clone the prototype

And that's all. But often, prototype-based language have other very interesting features.

Tue 07 Sep 2010, 06:26 PM comp fr

Vous verrez peut être bientôt apparaître ici les différents design patterns implémentés en différents langages, y figureront au moins Ada et Lisaac.

Wed 15 Sep 2010, 02:08 PM comp dev fr lisaac

Ce post fait suite à mon précédent post sur l'aliasing des chaînes de caractères. Je disais que j'avais presque fini, mais ce n'est sans doute pas le cas.

J'ai de gros problèmes de performance.

Rappelons ce que je cherche à faire :

  • Ajouter une ou des primitives pour accéder aux STRING_CONSTANT compilées
  • Ajouter le support de l'aliasing des chaînes de caractères dans la bibliothèque standard
  • Remplacer l'aliasing des chaînes du compilateur (ALIAS_STR) par l'aliasing fait dans la bibliothèque standard.

La première étape est réalisée grâce aux listes chaînées. Les primitives de compilation ont été ajoutées.

La modification de la bibliothèque standard est bien avancée. Comme cela nécessite une nouvelle primitive du compilateur, il à fallu bootstrapper le compilateur à nouveau.

Et maintenant, vient la dernière étape: supprimer l'aliasing du compilateur. Pour cela, je commence par me compiler un compilateur Lisaac avec la nouvelle primitive et son support dans la bibliothèque standard. Ce compilateur est extrêmement lent (2h45 de bootstrap). En effet, l'aliasing est réalisé en double. Puis je supprime le support de l'aliasing du compilateur et j'ai un gros problème:

  • le compilateur en mode optimisé plante
  • le compilateur en mode optimisé compilé avec gcc en mode debug ne plante pas
  • le compilateur en mode debug ne plante pas

Je ne sais plus quoi faire ... et j'en suis là pour le moment. Je me demande si c'est -O2 ou -fomit-frame-pointer qui pose problème.

Pour les problèmes d'optimisation, je pense savoir un peu ce qui cloche. Voici comment j'ai implémenté l'aliasing dans STRING_CONSTANT:

Section Public

  - first_string :STRING_CONSTANT <- (first_string := `100`);
  // Il s'agit ici du pointeur de tête vers la liste chaînée au complet

  + next_string :STRING_CONSTANT := NULL;
  // Pointeur suivant de chaque STRING_CONSTANT vers la suivante (initialisé
  // par le compilateur)

Section Private

  //
  // Aliasing String.
  //

  - bucket:SET(ABSTRACT_STRING) <-
  // Ensemble de toutes les chaînes. HASHED_SET est tout de même bien plus
  // performant qu'une liste chaînée non ordonnée.
  ( + sc :STRING_CONSTANT;
    bucket := HASHED_SET(ABSTRACT_STRING).create;

    sc := first_string;
    {(sc != STRING_CONSTANT) && {sc != NULL}}.while_do {
      bucket.fast_add sc;
      sc := sc.next_string;
    };

    bucket
  );

  - list_insert <-
  // On met quand même à jour la liste chaînée, ça peut servir.
  [
    -? { first_string != Self };
  ]
  (
    bucket.fast_add Self;
    next_string  := first_string;
    first_string := Self;
  );

Section Public

  - new_intern p:NATIVE_ARRAY(CHARACTER) count nb_char:INTEGER :SELF<-
  // Do not use directly. WARNING: Use by c_string and c_argument (COMMAND_LINE).
  ( + sc, result:STRING_CONSTANT;

    sc := clone;
    sc.set_storage p count nb_char;
    result ?= bucket.reference_at sc;
    (result = NULL).if {
      result := sc;
      result.list_insert;
    };

    result
  );

En fait, j'ai pas du tout assuré !!!

J'ai deux slots code (<-) qui sont réinitialisés en données (:=). Cela veut dire qu'à chaque fois que le slot est appelé, le compilateur va intéroger un slot invisible auto-généré pour savoir si c'est la donnée qu'on veut ou le code.

En plus j'ai l'impression que la version de Lisaac que j'utilise pour compiler (celle qui met 2h45) avait peut être une ancienne version de la lib ou l'aliasing était fait par la liste chaînée non triée au lieu de HASHED_SET. Bref, j'ai tout à revoir.

Mildred

Tue 28 Sep 2010, 02:03 PM comp fedora fr

Tout commence à mon avis avec une simple mise à jour de mon installation principale de Fedora: sudo yum upgrade --skip-broken. Tout semble bien se passer et je continue à travailler.

Sep 28 09:37:34 Updated: glibc-common-2.12.90-13.x86_64
Sep 28 09:42:00 Updated: glibc-2.12.90-13.x86_64
Sep 28 09:42:55 Updated: glibc-headers-2.12.90-13.x86_64
Sep 28 09:51:07 Updated: selinux-policy-3.9.5-7.fc14.noarch
Sep 28 09:53:27 Updated: nscd-2.12.90-13.x86_64
Sep 28 09:55:02 Updated: gdb-7.2-15.fc14.x86_64
Sep 28 09:58:00 Updated: planner-0.14.4-26.fc14.x86_64
Sep 28 10:01:25 Updated: gnome-user-share-2.30.1-1.fc14.x86_64
Sep 28 10:10:48 Updated: selinux-policy-targeted-3.9.5-7.fc14.noarch
Sep 28 10:11:04 Updated: glibc-devel-2.12.90-13.x86_64
Sep 28 10:11:16 Updated: rpmdevtools-7.10-1.fc14.noarch
Sep 28 10:12:34 Updated: glibc-debuginfo-2.12.90-13.x86_64
Sep 28 10:12:58 Updated: glibc-2.12.90-13.i686

Soudain, plus rien ne marche. N'importe quelle commande me retourne un segfault, j'essaie d'ouvrir un nouvel onglet dans mon émulateur de terminal, il se ferme aussitôt. Je tente de me déconnecter pour me reconnecter, pensant que cela résoudrait le problème, mais en me déconnectant, l'interface graphique tombe en rade et sur la console, j'ai un message qui tourne en boucle concernant le daemon abrt chargé d'enregistrer tous les crash pour en faire des rapports de bugs. Je tente de redémarrer l'ordinateur, mais ça ne marche pas, alors je l'arrête de force.

Je le redémarre, et ...

J'ai une erreur dans /sbin/init, un segfault qui à été localisé dans ld.so. Je tente avec init=/bin/sh ou encore selinux=0 sans résultat.

Je panique.

Comment faire ? Démarrer sur un système de secours bien sûr. Je resors une clef USB que je pensait cassée, mais elle marche et j'arrive à booter sur une Fedora 13 i686. Génial.

Je tente un chroot /mnt/fedora /bin/init ... bien sûr le format du binaire n'est pas reconnu, c'est un binaire 64bits et le kernel de la clef USB est 32 bits uniquement.

Je tente un yum --installroot=/mnt/fedora info glibc et j'ai un problème de versions de base de donnée qui ne correspond pas.

Conclusion, il me faut une clef USB avec Fedora 14 x86_64. Je commence à télécharger l'image ISO et je passe en BitTorrent qui est bien plus rapide. Bien sûr, je l'enregistre dans le dossier /home virtuel, donc au bout d'un moment, le système est trop rempli et freeze. Je recommence en l'enregistrant sur un disque dur externe et c'est bon.

Et là, il faut que je change le système qui se trouve sur ma clkef USB que je suis en train d'utiliser. Chaud !

dd if=F14.iso of=/dev/sdb bs=16M
sync

Bien sûr, la commande sync ne marche plus. J’attend donc patiemment que la LED de la clef USB s'arrête pour éteindre sauvagement l'ordinateur. Je le relance avec le nouveau système et je peux enfin taper la commande qui va me sauver la vie:

yum --installroot=/mnt/fedora reinstall glibc

Sep 28 11:42:43 Installed: glibc-2.12.90-13.x86_64
Sep 28 11:42:57 Installed: glibc-2.12.90-13.i686
(je dois préciser que l'ordinateur avait 2h de retard cart l'orloge système
 est réglée UTC, il était donc réellement 13:42)

J'avais essayé un yum downgrade mais ça prenait trop de temps et impactait trop de packages. Je peux alors enfin faire un chroot sans segfault:

chroot /mnt/fedora /bin/sh
sh#

Miracle!

Je redémarre et tout rentre dans l'ordre.

Note: il s'agit du bug 638091

Wed 29 Sep 2010, 11:15 AM en fr srs

Bonjour,

J'ai commencé ce blog la toute première fois pour parler de sujets techniques, pouvoir m'exprimer et clarifier mes idées en même temps, partager des sujets que je pense intéressants.

Je vais ajouter un nouveau volet à ma prose et détailler mon opération imminente. Comme beaucoup avant moi l'on fait, je veux partager mon expérience pour que celles qui me suivront ait une idée de ce qui peut les attendre.


I started this blog to talk about technical subjects that I cared about. I don't wish to expose my entire private life on these pages, but I feel it's important to be able to talk about topics you care about. Computer Science is such a topic. I also wanted to be able to write articles about things I did in order to explain my developpments.

Now, I'm going to add another subject: my surgery. It will take place the 4th of October, next monday. And I really wanted to share all of these information like many did before me. I hope this might help.

That's about it, some posts might not appear on the front page as they might not be suitable for everyone to see. You can always access them through the tag pages.

Sat 02 Oct 2010, 06:40 AM en srs

I arrived to Thailand fine, that was yesterday around 6 am (local time). Just add 5 hours to the European time (CEST) and you get the time in Thailand. The plane was not so comfortable, considering you had to stay 11 hours in the same seat, but the service was very good. We had a vegetarian meal so that we were served first, and we got two of them. One at the departure, one at the arrival. Plus a sandwich and drinks.

This was the occasion for me to watch the film Prince of Persia again, this time in English. Fortunately, I already have seen this film, otherwise I might not have understood much. The plane's noise was loud and covering the sound. The same way, PA messages were difficult to hear and understand.

The plane landed fine and we went to the airport ... immigration followed by collecting luggage, then we went to where the clinic staff awaited us. They were very nice, and speaking a good English. When we left the airport, we were assaulted by the air which was hot and wet. Not so surprising, but not usual for us, Europeans. Then, off to the van, direction Chonburi, which was cold and dry due to the air conditioning.

I received a letter welcoming me to Thailand and with the appointment times. All very beautiful.

The landscape is very different than France, there are many more trees, but many more buildings as well. All very wide. And the roads are huge. Did I mention that they drive on the left of the road (and the wheel is on the right). This might take some time getting used to, fortunately I don't have to drive.

We arrived at the hotel, and checked in. The room is spacious and good looking. The only drawback is the mattress is not good quality at all, says Elie. It's an old sprung mattress. Never mind.

I asked for Valerie's room but I didn't get the confirmation until 9 am, by phone. At that time I was asleep, until noon. The afternoon, the program changed and I had to do a complete physical checkup at 1:30 pm. I just had time to take a shower, remove few offending hair and dress up until I went to see Valerie and I had to hurry downstairs.

Bow accompanied us to the hospital and I had complete physical checkup. Blood stampings, X-rays of the chest area and an electro-cardiogram. All went well, except the confusion on my first name as ever. Shanti versus Dominique which is the real first name (on the passport) but not my usual name. Anyway.

Then, I went to the clinic, and waited. I had the opportunity to rest a little, and send a short e-mail before I had to go to see the clinic's psychiatrist. I had to draw a person and a landscape, later describe them. And describe my condition. How I was during childhood, ...

I received a beautiful booklet describing the operation and after-care, a beautiful gift made of jasmine flowers and a box containing ... dilators. I then went to my appointment with Dr Suporn.

He said that there was plenty of material and it should all go well. He confirmed that my admission to the hospital was on Sunday afternoon and explained the details of the operations.

We went back to the hotel, it was raining the 5pm rain. Very hot rain. We took the van just to do 200 meters, I might argue on that. But I understand, we are very well cared of here. We then visited the hotel and had an evening meal with the other French patients around. And go to sleep.

I made it short, sorry, but it's already 12:30 pm and I still have to take a shower.

Everyone is nice and very attentive. Today, I have the day off to visit, buy a few essentials and contact everyone using the SIP account from free.fr that I made work using the Twinkle software (Ekiga doesn't send your voice, I suppose due to codec issues).

Sun 03 Oct 2010, 01:31 PM en photos srs

Sun 03 Oct 2010, 04:45 PM en srs

Yesterday, after noon when we ate at the Hotel's restaurant, we went to town to go shop a little. Finally, we spent the entire afternoon in a mall where there were many shops. We bought:

  • two SIM cards for our mobile phones
  • a buddha figurine
  • clothes

The mall has four floors with many different shops, cinemas, ... I don't know how I can tell about it, probably best if you come visit. Things aren't very cheap, but still cheaper than in France. Elie says things costs half the price in France.

To give you an idea, 40 baht (THB) is approximately 1 euro. The SIM card costs from 50 baht to 99 baht, each call costs 2 baht for the first minute, and then, 0.5 baht per minute. The top we bought costs around 399 bahts, around 10 euros. A typical dish at the Hotel's restaurant costs from 150 baht to 300 baht.

Anyway, when we left the mall, it was raining, and the sun was set. Back at the hotel, I worked to buy the domain mildred.fr and a hosting service to host the blog. I couldn't update the website on free.fr from Thailand, access denied. At the same time, Elie went to buy a pizza with fried fries and fried onions rolls (these taste very good by the way) that we ate in the room.

Today, we awoke at 9 am, still early from us who still suffer lightly from jet lag, and went downstairs to have our first breakfast in the hotel. Yesterday, we woke up at 11:30 am. Far too late. I also learned that I had to be available at 11 am to be admitted to the hospital. We just had time to eat, prepare, and hurry to the lobby.

The hospital is very modern, we were admitted, and I had a plastic bracelet attached around my arm, with my name on it. On the 9th floor (room 902, I was mistaken before), we have the view on the sea. The room is big, clean, and I would be tempted to add beautiful, but it's an hospital room after all.

We had to make our choice of meal for noon and afternoon on a menu, and I was able to add that we were vegetarian, so the dishes don't contain any meat. We ate, and I spent the afternoon putting photos on the blog, and doing other things. The afternoon meal was at 5 pm and I just ordered a vegetable soup. I do like it, more than the tomato soup that taste lake ketchup (that I distaste).

Just before 9 pm, I had to be prepared for the operation tomorrow. I had an enema (lavement en français), not very nice to have if you ask me. And I had to have my genitals shaved. That's where I am at now. I just followed that by a shower, including shampoo that I won't have the opportunity to have until next week.

I feel ok, I would have expected nervousness perhaps, but no. Now, it's 10:20 pm and I am going to sleep soon. I was given a sleep pill if ever I would find hard to go to sleep, but I don't think I'll use it.

I'm ready for tomorrow, the schedule is to be waken up from 6 am to 7 am, take a shower using surgical soap, and go to the operation theater around 8:30 to 9 am. Then, follows 5 hours of operation, 1 hour of waking up and I shall be around at 3 pm, and I'll perhaps call around noon for the people in Europe.

Good night :)

Shanti

Page: