[Indekso][Instrukcio]


Ada

ADA havas internacian normon (ISO 8652), kaj en la mondo ekzistas pli ol 450 tradukiloj por diversaj komputiloj, kies konformeco al la normo estas oficiale atestita. En Usono ADA estas norma lingvo por programado en militaj aplikoj (la normo MIL-STD-1815A). Krome, ADA estas uzata en instruado kiel baza programlingvo aŭ por ilustri kelkajn konceptojn mankantajn en Paskalo --- ekz-e deksesuma nombrosistemo, escepto, genera programpeco, laŭbita operacio, pasigo per valorrezulto, rendevuo, reven'ordono, ŝlosilvorta parametro k.a. (vd sube).

Leksiko. La normoj tre strikte difinas la eksteran prezenton de la programoj en ADA. La lingvo estas registrumblinda, kaj ni uzas ĉefliterojn por neformale apartigi la apriorajn nomojn. La ŝlosilvortoj en ADA estas tre multnombraj kaj rezervitaj (ni ilin substrekas). Komentarion komencas du apudaj minusoj -- kaj fermas la sekva linifino (ekz-e la programpecoj pri racionoj kaj duoniga serĉo).

La aranĝo de programo. Kompleta programo en ADA estas bindata el bibliotekaj pecoj (angle "library unit") anticipe tradukitaj. La lingvo kaj ĝiaj tradukaj rimedoj provizas la kontrolon, ĉu la interfacoj de la pecoj koheras. Se ene de iu biblioteka peco oni bezonas atingi objektojn de aliaj pecoj, la nomoj de tiuj aliaj pecoj estas listigendaj en speciala kunteksta sekcio (angle "context clause"), kiel montras la peco pri duoniga serĉo.

Enkapsuligo, abstraktaj datumtipoj. Pakaĵa tradukpeco povas enkapsuligi ne nur datumojn (kiel estas en la pakaĵo), sed ankaŭ agojn (procedurojn). En tiu kazo krom la interfaca pakaĵo (analogia al la "difina modulo" de MODULA) oni registras en la biblioteko ankaŭ la respondan pakaĵkorpon (analogian al la "realiga modulo" de MODULA). Ekz-e en la programo racionoj la interfaca pakaĵo specifas la racionojn preskaŭ kiel abstraktan datumtipon, dum la pakaĵkorpo difinas konkretan realigon de la operacioj.

Paralelado. ADA disponigas rimedojn por paralelado: oni povas deklari programpecon tasko; interago kaj sinkronigo de la taskoj (t.e. de la de ili priskribataj procezoj) estas farata per rendevuoj. Ekzemplo pri plurtaskado estas problemo pri la mortemaj manĝantaj filozofoj.

Esceptoj, generaj programpecoj. Vd la koncernajn artikolojn.

Racionoj: Enkapsuligo kaj abstrakta datumtipo en ADA

   PACKAGE racionoj IS            --------- la interfaca "difina" pakaĵo
      TYPE raciona IS RECORD
         supro: INTEGER; subo: POSITIVE;  -- numeratoro kaj denominatoro
      END RECORD;
      FUNCTION egalas(x,y: raciona) RETURN BOOLEAN;     -- ekz-e 1/2=2/4
      FUNCTION "/"(x,y: INTEGER) RETURN raciona;   -- racionkonstruilo
      FUNCTION "+"(x,y: raciona) RETURN raciona;   -- raciona adicio
      FUNCTION "-"(x,y: raciona) RETURN raciona;   -- raciona subtraho
      FUNCTION "*"(x,y: raciona) RETURN raciona;   -- raciona multipliko
      FUNCTION "/"(x,y: raciona) RETURN raciona;   -- raciona divido
   END racionoj; -- la interfaca pakaĵo finiĝis

   PACKAGE BODY racionoj IS       ---------   la realigo (pakaĵkorpo)
      PROCEDURE samonigu(x,y: IN OUT raciona) IS   -- kaŝitaĵo
          xx: raciona;                             -- loka variablo
      BEGIN IF x.subo=y.subo THEN RETURN; END IF;
            xx:=x; x.subo:=x.subo*y.subo; x.supro:=x.supro*y.subo;
            y.subo:=y.subo*xx.subo; y.supro:=y.supro*xx.subo;
      END samonigu;

      FUNCTION egalas(x,y: raciona) RETURN BOOLEAN;
          u:raciona:=x; v:raciona:=y; -- lokaj variabloj, komencvalorizo
      BEGIN samonigu(u,v); RETURN u.supro=v.supro;
      END egalas;

      FUNCTION "/"(x,y: INTEGER) RETURN raciona IS
      BEGIN IF y>0 THEN RETURN (x,y); END IF; -- pozicia racion'indiko
            RETURN (supro=>-x, subo=>-y);  -- ŝlosila racion'indiko
      END "/";

      FUNCTION "+"(x,y: raciona) RETURN raciona IS
          u:raciona:=x; v:raciona:=y;
      BEGIN samonigu(u,v); RETURN (u.supro+v.supro, u.subo+v.subo);
      END "+";

      FUNCTION "-"(x,y: raciona) RETURN raciona IS
          u:raciona:=x; v:raciona:=y;
      BEGIN samonigu(u,v); RETURN (u.supro-v.supro, u.subo-v.subo);
      END "-";

      FUNCTION "*"(x,y: raciona) RETURN raciona IS
         BEGIN RETURN (x.supro*y.supro, x.subo*y.subo); END "*";

      FUNCTION "/"(x,y: raciona) RETURN raciona IS
         BEGIN RETURN (x.supro*y.sube, x.subo*y.supro); END "/";
   END racionoj;


[Indekso][Instrukcio]