[nem-pl] Uwagi różne

Marcin 'Qrczak' Kowalczyk qrczak at knm.org.pl
Wed Feb 18 22:14:50 CET 2004


Witam. Na oko podoba mi się Nemerle - wygląda mniej więcej tak, jak
wyglądałby mój język, gdyby był statycznie typowany i .NET-owy.

Drobne błędy na <http://nemerle.org/csharp-diff.html>:
- zawiera link do nieistniejącego <http://nemerle.org/functional-values>,
- "begging" zamiast "beginning",
- ostatnia sekcja (7. The same) wygląda podejrzanie.

Chciałem sprawdzić szybkość pod linuksowym mono (i porównać z szybkością
mojego kompilatora). Przetłumaczyłem testowy program na Nemerle, robiąc
tylko dwa błędy ("if" zamiast "when" oraz nie zwróciłem uwagi, że
tablica jest inicjalizowana fałszem - w pozostałych językach, na które
to tłumaczyłem, tzn. w moim, w OCamlu, w Perlu i w Pythonie akurat można
było inicjalizować też prawdą, więc tam tablica była zanegowana):

--------
using System.Console;

class Primes {
  static Main () : void
  {
    def d = 1000;
    def n = 2 * d * d;
    def isNotPrime = array (n);
    Write ("2");
    
    for (mutable i <- 0; i < d; i <- i + 1) {
      unless (isNotPrime[i]) {
        def p = 2 * i + 3;
        Write (" {0}", p);
        for (mutable j <- i + p; j < n; j <- j + p)
          isNotPrime[j] <- true
      }
    };
    
    for (mutable i <- d; i < n; i <- i + 1) {
      unless (isNotPrime[i])
        Write (" {0}", 2 * i + 3)
    };
    
    WriteLine ()
  }
}
--------

$ ncc PrimesVectorN.n
____________________________________________________________
$ mono ./out.exe
2 3zsh: killed     mono ./out.exe

Po zamianie 1000 na 100 działa - w programie chyba nie ma błędu?
To tylko u mnie się sypie czy nie?

Zakładając, że ta sprawa zostanie rozwiązana - jak skompilować program
tak, żeby najszybciej działał, żeby porównać szybkość z innymi językami?
W szczególności przy bardzo małej tablicy program wykonuje się przez
0.17s - zgaduję, że to JIT; można to jakoś wyeliminować i prekompiliwać
do natywnego kodu? Jeśli wąskim gardłem jest Write i interpretowanie
formatu, to jak to zapisać lepiej?

Z drobiazgów, które mi się nie podobają:
- ncc ma opcję -out:STRING a nie -o STRING jak "każdy" kompilator,
- trzeba opakowywać nawet krótkie programy w klasę i metodę,
- nie wiem, skąd wziąć dokumentację biblioteki .NET - moglibyście gdzieś
  wspomnieć, żebym nie zgadywał, że jest Write obok WriteLine i że
  WriteLine może być też bezparametrowe, tylko żebym to przeczytał :-)
- "Nemerle Language Reference" nie mówi nic o wyrażeniu "array (n)".

Więcej uwag będzie kiedyś indziej.

Macie konkurencję :-)  Mój język nie jest co prawda całkiem gotowy, ale
kompilator już działa i niedługo będzie bootstrapowany samym sobą -
wtedy pokażę go światu. Dla porównania tak ten program wygląda po
mojemu; mamy podobne gusta w sprawach składni definicji zmiennych i
funkcji, średników, klamer, stopnia funkcyjności (też mam mutable i
immutable wiązania, domyślnie immutable), nawet konwencji wielkości
liter (u Was przez .NET, u mnie niezależnie):

--------
let D = 1000;
let N = 2*D*D;
let IsPrime = Vector (Fill N True);
Write 2;

Each (Range 0 D) ?i {
   if IsPrime at i {
      let p = 2*i+3;
      Write " " p;
      Each (Range (i+p) N p) (IsPrime at _ = False)
   }
};

Each (Range D N) ?i {
   if IsPrime at i {
      Write " " (2*i+3)
   }
};

WriteLine();
--------

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak at knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/





More information about the devel-pl mailing list