Re: Dates and times again

2004-03-22 Thread Nick Ing-Simmons
Dan Sugalski [EMAIL PROTECTED] writes:
In an attempt to drain the swamp...

So far as I can see, we need, in descending order of importance (and 
speed) (And if there's stuff missing, add them):

1) A timestamp value
2) A way to chop the timestamp to pieces
3) A way to turn the timestamp into a string
4) A way to turn pieces to a timestamp
5) A way to turn the string into a timestamp

All of which is confounded by the joys of timezones and platform limitations.

As far as I can tell, the only thing we can absolutely count on are:

  asctime, ctime, difftime, gmtime, localtime, mktime, strftime

Everything gives you a ticks of size ? since ? hook or three.
In most places the ticks are less than second.

All the stringify and human/planet-izing seems to be library fodder.

gettimeofday() is widely available or fakeable. (Tk uses it.)
Seems $^T could start based on time(2) and then get deltas using 
something finer. Perhaps aspire to clock_gettime() and fake
that interface where not available?



We can't even count on timegm, unfortunately. Neither can we count on 
getting fractional time. (Or even really count on getting a GMT time 
that's actually GMT, as far as that goes, but that's 
user-misconfiguration and there's a limit to what I'm willing to care 
about) Nor strptime for time parsing, though a case could be made 
there that we could do our own. (Cases to be made for that should be 
accompanied by unencumbered source to do the parsing ;) Can't even 
count on the full range of output when splitting the time up--if you 
check the CVS logs you'll see I yanked out a few elements because 
they're not C89 and there wasn't any way to synthesize them easily 
that I know of.

That means we can't convert to TAI, since that needs leap second info 
we don't have, so base time can't be TAI. From what I can tell from 
the interfaces and long painful experience we can't convert to and 
from anything other than the current system timezone. (Maybe. I'm not 
100% sure that's reliable either)

Right now, you can get a black-box integer timestamp that's fixed to 
GMT time, and you can disassemble that timestamp into day/month/year 
pieces. I adjusted the year to be a real year, but I haven't adjusted 
the month. We can do that, though. We can easily:

*) Give a float timestamp
*) Adjust the timestamp to various base dates (I've already made my
preferences clear :)

My general rule-of-thumb for ops is that they must:

*) Be something we want to guarantee behaviour on everywhere
*) Require C code
*) Have a fixed signature

Being primitive isn't necessary as such, but doesn't hurt. Having to 
be required present at all times isn't necessary either, though we 
should nail down lexical oplibs if we want to start talking about 
secondary libraries of this stuff.

Anyway, given the restrictions on what we have to work with, the 
first question is:

*) Is what we're providing correct
*) What *aren't* we providing that we must to allow full and
proper date processing in modules without much pain?



Re: Dates and times again

2004-03-22 Thread Nick Ing-Simmons
Larry Wall [EMAIL PROTECTED] writes:

That would seem like good future proofing.  Someday every computer will
have decentish subsecond timing.  I hope to see it in my lifetime...

It isn't having the sub-second time in the computer it is the API 
to get at it... 


My guess is that eventually they'll decide to put a moratorium on
leap seconds, with the recommendation that the problem be revisited
just before 2100, on the assumption that we'll add all of a century's
leap seconds at once at the end of each century.  That would let
civil time drift by at most a minute or two before being hauled
back to astronomical time.  

Given that most people live more than an minute or two from their 
civil-time meridian who will notice? (Says me about 8 minutes west of 
GMT.)


I'd say what's missing are the error bars.  I don't mind if the
timestamp comes back integral on machines that can't support subsecond
timing, but I darn well better *know* that I can't sleep(.25), or
strange things are gonna happen.

But you can fake sleep() with select() or whatever.




Re: Dates and times again

2004-03-22 Thread Leopold Toetsch
Nick Ing-Simmons [EMAIL PROTECTED] wrote:
 Larry Wall [EMAIL PROTECTED] writes:
..., but I darn well better *know* that I can't sleep(.25), or
strange things are gonna happen.

 But you can fake sleep() with select() or whatever.

$ cat sl.pasm
   sleep 0.1
   end

$ time parrot sl.pasm

real0m0.116s
user0m0.010s
sys 0m0.000s

leo


Re: Dates and Times

2004-03-10 Thread Joshua Hoblitt
On Sat, 6 Mar 2004, Jared Rhine wrote:

 It'd be great, if possible, to get a statement here from the DateTime
 group sanctioning one or another particular Parrot clock interfaces as
 efficient, complete, and preferred.  I haven't poked over to see
 if they are chatting about this Parrot issue.

A few of us have already offered opinions...

What we would like for DateTime.pm is an epoch that is _absolutely_ fixed across all 
platforms.  perl does not provide this so we are dependent on the behavior of time(), 
gmtime(), and Time::Local to make up for this.  I have already suggested that Parrot 
include an op that returns TAI but I would happily settle for gettimeofday(2).  What 
ever is decided upon Parrot should commit to making it consistent across _all_ 
platforms.

-J

--


Re: Dates and Times

2004-03-10 Thread Joshua Hoblitt
On Tue, 9 Mar 2004, Edward S. Peschko wrote:

 On Tue, Mar 09, 2004 at 04:21:24PM -0500, Gordon Henriksen wrote:
  Not an opcode doesn't mean balkanized. There is a parrot/stdlib
  directory.

 fair enough, but then where does the distinction lie? Why put gmtime, et al.
 in opcodes? As well as addmonth?

Returning the current time since epoch x should be an opcode as this is a very common 
and latency sensitive operation.  I believe an awful lot of code only wants to 
determine the elapsed amount of time by subtracting to subsequent timestamps.  Date 
and time manipulation is complicated and belongs at a much higher level.

 If you are optimising for simplicity and , it surely makes sense to put these in
 the standard library.

Only if it's a _correct_ implementation.  There is no reason why DateTime.pm couldn't 
be ported to Parrot after object support settles down a bit.

 If you are optimising for speed, then it makes sense to put them in opcodes.

Bloating the core doesn't count as an optimization.

 But I don't see the 'creeping featuritis' that you see. As well as the
 memory imprint problems that you see. Is parrot going to link with libc?

 If so, you get a ton of functionality for (almost) free, just by doing an
 intelligent wrapper around strftime. As well as providing much of your
 localization support. And you get a natural boundary on what functionality should
 be put (in the core) versus what should be put in a module.

We all know how consistent the nice vendors are with there libc implementations. :)  
Do we really want to expose the platform specific strftime() extensions?

-J

--


Re: Dates and Times

2004-03-10 Thread Joshua Hoblitt
On Tue, 9 Mar 2004, Edward S. Peschko wrote:

   This sort of creeping featuritis is why date formatting and especially
   parsing do NOT belong as opcodes. It's too big a problem to solve in the
 
  I agree.


 And the more I think about it, the more I think this concern is misplaced.
 Putting it in an opcode will make it *harder* to do this type of thing, not easier.
 In perl5 land, backwards - and forwards - compatibility is a big concern. There will
 be a large tendency to stabilize any implementation that occurs here.

So why do you think time manipulation is about the only thing left out of the x86 ISA? 
:)

-J

--


Dates and times again

2004-03-10 Thread Dan Sugalski
In an attempt to drain the swamp...

So far as I can see, we need, in descending order of importance (and 
speed) (And if there's stuff missing, add them):

1) A timestamp value
2) A way to chop the timestamp to pieces
3) A way to turn the timestamp into a string
4) A way to turn pieces to a timestamp
5) A way to turn the string into a timestamp
All of which is confounded by the joys of timezones and platform limitations.

As far as I can tell, the only thing we can absolutely count on are:

 asctime, ctime, difftime, gmtime, localtime, mktime, strftime

We can't even count on timegm, unfortunately. Neither can we count on 
getting fractional time. (Or even really count on getting a GMT time 
that's actually GMT, as far as that goes, but that's 
user-misconfiguration and there's a limit to what I'm willing to care 
about) Nor strptime for time parsing, though a case could be made 
there that we could do our own. (Cases to be made for that should be 
accompanied by unencumbered source to do the parsing ;) Can't even 
count on the full range of output when splitting the time up--if you 
check the CVS logs you'll see I yanked out a few elements because 
they're not C89 and there wasn't any way to synthesize them easily 
that I know of.

That means we can't convert to TAI, since that needs leap second info 
we don't have, so base time can't be TAI. From what I can tell from 
the interfaces and long painful experience we can't convert to and 
from anything other than the current system timezone. (Maybe. I'm not 
100% sure that's reliable either)

Right now, you can get a black-box integer timestamp that's fixed to 
GMT time, and you can disassemble that timestamp into day/month/year 
pieces. I adjusted the year to be a real year, but I haven't adjusted 
the month. We can do that, though. We can easily:

*) Give a float timestamp
*) Adjust the timestamp to various base dates (I've already made my
   preferences clear :)
My general rule-of-thumb for ops is that they must:

*) Be something we want to guarantee behaviour on everywhere
*) Require C code
*) Have a fixed signature
Being primitive isn't necessary as such, but doesn't hurt. Having to 
be required present at all times isn't necessary either, though we 
should nail down lexical oplibs if we want to start talking about 
secondary libraries of this stuff.

Anyway, given the restrictions on what we have to work with, the 
first question is:

*) Is what we're providing correct
*) What *aren't* we providing that we must to allow full and
   proper date processing in modules without much pain?
--
Dan
--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and times again

2004-03-10 Thread Larry Wall
On Wed, Mar 10, 2004 at 09:59:32AM -0500, Dan Sugalski wrote:
: That means we can't convert to TAI, since that needs leap second info 
: we don't have, so base time can't be TAI.

That part is only half true.  Or maybe less than half, if UTC decides
to cut loose from astronomical time and ends up tracking TAI exactly
from now on.  But we *do* know the mappings in the past.  (Well,
for the recent past, anyway. :-)

: Right now, you can get a black-box integer timestamp that's fixed to 
: GMT time, and you can disassemble that timestamp into day/month/year 
: pieces. I adjusted the year to be a real year, but I haven't adjusted 
: the month. We can do that, though. We can easily:
: 
: *) Give a float timestamp

That would seem like good future proofing.  Someday every computer will
have decentish subsecond timing.  I hope to see it in my lifetime...

: *) Adjust the timestamp to various base dates (I've already made my
:preferences clear :)

0 on 1/1/2000 works out very well if it turns out we don't do UTC
leaps seconds any more.  Then TAI and UTC only go nonlinear before
2000, and so far that's in the past, which is generally easier to
predict afterwards, given enough historical evidence.

And if they do add leaps to UTC in the future, then at least TAI
and GMT always march in lockstep, and we'll be no worse off than we
are now.  :-)

It will be very good if the fate of leap seconds is decided well
before POSIX has to consider how to store time after that date
in 2038.  --http://www.ucolick.org/~sla/leapsecs/onlinebib.html

My guess is that eventually they'll decide to put a moratorium on
leap seconds, with the recommendation that the problem be revisited
just before 2100, on the assumption that we'll add all of a century's
leap seconds at once at the end of each century.  That would let
civil time drift by at most a minute or two before being hauled
back to astronomical time.  More to the point, it would put the
problem off till another day (not to mention another generation).
So that's my prediction.  But then, I'm terrible at time estimation...

: *) Is what we're providing correct

I'd say what's missing are the error bars.  I don't mind if the
timestamp comes back integral on machines that can't support subsecond
timing, but I darn well better *know* that I can't sleep(.25), or
strange things are gonna happen.

: *) What *aren't* we providing that we must to allow full and
:proper date processing in modules without much pain?

Snap-to-grid semantics for when the clock inevitably gets off by a
second or two from somebody's idea of the correct time.  (But that
should be solved in your levels two through five, not in the
timestamp.)  The basic idea is I can add 86400 seconds to yesterday
and I get the same time today, even if there was a leap second.
One would have to request such a snap explicitly, I expect, because
you'd have to communicate to it that you don't actually care about
sub-minute times, or whatever your grid specifies.  But that's how
graphics programmers solve the mouse jitter problem, and I think we
can learn from them.

Larry


Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
 Leave parsing and formatting entirely to libraries. Absolutely no need
 for that in the instruction set.

well, I have a bit of a problem with that... As it was pointed out
before, people have gone hogwild with the parsing and formatting
routines, and its a bloodbath of modules on CPAN with different
methods for time parsing.

Which is a pity, because an augmented strftime and its reverse would
handle most if not all of the parsing needs, ie:

strftime( out Sx, in Sy, in Nz )

where 
 
 Sx is an output date string
 Sy is a format described by strftime 
 (ex: %y = 2 digit year %Y = 4 digit year,etc)

 Nz is the number of seconds past a certain epoch (provided by 
 gmclock,
time)

r_strftime( out Nx, in Sy, in Sz )

where 
 Nx is the number of seconds past a certain epoch

 Sy is a format for a given date (provided by strftime)

 Sz is the date to be converted to in seconds

Perhaps there could be an extra argument for locales - and maybe the 
op could be split in two (ie: for (r_)gm_fmtime, (r_)local_fmtime), 
but for me, in processing time values most of the time you know the 
format for dates - as long as they are machine generated. If they are not, 
you can always fall back to the very slow Date::Parse and cousins, or 
maybe string these ops along in a chain of '||' to query for multiple
formats.  

But how many times are you going to need to parse formats 
like '3 weeks from next Wednesday?'. 

Whether or not this is a low-level module or an op is debatable, but
standardizing on one type of formatting dates at the lowest possible
level would make perl6 much much cleaner. And right now, things are
way too slow - any low level module doing this would IMO need to do it
in C anyways to get the fastest possible speed, which seems to argue
for them being ops.

Ed


RE: Dates and Times

2004-03-09 Thread Gordon Henriksen
Jared Rhine wrote:

 Gordon Henriksen wrote:
 
  gmclock(out Nx)
  UTC clock in seconds since  hrs Jan 1, 2000,
  ignoring leap seconds.
  
  tolocal out Nx, out Iy, in Nz
  x is set to z converted to the local time zone. y - 1
  if Daylight Savings Time was in effect at z; y - 0
  otherwise.
  
  splittime Px, Nx
  Splits date up like Perl 5 gmtime. (But without
  annoying y -= 1900 and m -= 1?)
  
  add_months(out Nx, in Ny, in Nz)
  Sets x to y + z months.
 
 This proposal was perhaps taken offline by the core team, but to avoid
 a Warnock, I'll pipe up and say I like this proposal as a core
 instruction set.

Thanks for the anti-Warnock.


 It'd be nice if the first item, gmclock wasn't defined in terms of
 UTC.  Regardless of the future fate of UTC leap seconds, any
 UTC-based clock would need to account for leap seconds going back,
 right?  So it seems that GMT should be preferred in the core, with any
 UTC calculations being performed at the language or module level.
 
 So, gmclock seems the right opcode (not utcclock), making the
 definition GMT clock in seconds since  hrs Jan 1, 2000.

Fair enough. I wasn't trying to load terms for once. In point of fact,
this set of opcodes is very much agnostic to whether or not leap 
seconds are used.

The reason that add_months belongs as an opcode is because there's been
no decision made re leap seconds, and in fact some anti-decisions have
been proposed. Without some way to manipulate dates in accordance with
the actual rules that get used (which might be platform dependent at
this point), a portable program can't be written. Were this decision
made solidly, then all of the ops except gmclock and possibly tolocal
would be better written as library code.

Were leap seconds to fall in the middle of a month, then we would need
to have an add_days op. Since that's not the case, the assumption that
a day is 86400 seconds long is safe so long as you avoid adding enough 
days to cross a year boundary. Meanwhile, add_months encapsulates the 
leap-second worries AND lets IMC code conveniently manipulate dates 
without days-per-month tables and is-it-a-leap-year algorithms (which
are required to convert add_months to add_days).


 Daylight savings time calculation seems appropriate to stay in the
 core, but perhaps additional opcodes are need to set the clock's
 understanding of the time zone used for DST calculations?

Indeed; the local time zone is pretty narrow-minded and backwards-
thinking. The problem is balancing weight with efficiency, and time
zone databases are pretty heavy critters, which make me think get 
thee OUT of the core!...


 # years
 Nz = Py[5]
 Nz = Nz - 2000# epoch based at year 2000
 Nz = Nz * 12  # = months per year
 
 inappropriate sarcasmI look forward to the exciting advancement of
 changing from subtracting 1900 from all my dates to subtracting 2000
 or dealing with negative numbers; that'll change everything and really
 advance the state of the art./sarcasm

What you're complaining about is the elements of Perl's gmtime/localtime
arrays. Actually, I suggested removing that quirk from splittime:

  splittime Px, Nx
  Splits date up like Perl 5 gmtime. (But without
  annoying y -= 1900 and m -= 1?) ^^^
^^
The Nz - 2000 is conversion *to* the epoch, not reinterpreting the value

in the array.

Unless you think storing dates and times as the number of seconds since
Jan 1  is a good idea, perhaps. :)

I'd used Jan 1 2000 as an epoch since Larry suggested that's what he was
planning for Perl 6 to use.

-- 

Gordon Henriksen
IT Manager
ICLUBcentral Inc.
[EMAIL PROTECTED]



RE: Dates and Times

2004-03-09 Thread Gordon Henriksen
Edward S. Peschko wrote:

 Gordon Henriksen wrote:
 
  Leave parsing and formatting entirely to libraries. 
  Absolutely no need for that in the instruction set.
 
 well, I have a bit of a problem with that... As it was pointed out
 before, people have gone hogwild with the parsing and formatting
 routines, and its a bloodbath of modules on CPAN with different
 methods for time parsing.

Not an opcode doesn't mean balkanized. There is a parrot/stdlib
directory.

 Perhaps there could be an extra argument for locales - and maybe the 
 op could be split in two (ie: for (r_)gm_fmtime, (r_)local_fmtime), 
 but for me, in processing time values most of the time you know the 
 format for dates - as long as they are machine generated. If they are
not, 
 you can always fall back to the very slow Date::Parse and cousins, or 
 maybe string these ops along in a chain of '||' to query for multiple
 formats.  
 
 But how many times are you going to need to parse formats 
 like '3 weeks from next Wednesday?'. 

Uh. Yeah.

This sort of creeping featuritis is why date formatting and especially 
parsing do NOT belong as opcodes. It's too big a problem to solve in the

core, and regardless of how rich the interface is, it'll never be quite 
rich enough to satisfy everyone.

Someone depends on formats like 3 weeks from next Wednesday on a
regular
basis. You might not need to format dates from the Chinese lunar
calendar,
but you can bet that it's vital to someone. Eras? Well, sure. Fuzzy date
parsing? (Guessing.) Oh, baby. Global time zone database? Bring it on. A
kl-hw (Klingon Homeworld) locale? But of course!

There'll always be pressure to further enhance the feature, increasing
parrot's *core* memory footprint. You can't skip loading the implem-
entation of core parrot ops like you can avoid DateTime.pm.

So keep it to (un)loadable user code, and provide a class that solves
90%
of the problem in the stdlib.


Also, trying to nail down a rich interface before seeing what Larry has 
in mind for Perl 6 date handling is roughly a waste of time

-- 

Gordon Henriksen
IT Manager
ICLUBcentral Inc.
[EMAIL PROTECTED]



Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
On Tue, Mar 09, 2004 at 04:21:24PM -0500, Gordon Henriksen wrote:
 Edward S. Peschko wrote:
 
  Gordon Henriksen wrote:
  
   Leave parsing and formatting entirely to libraries. 
   Absolutely no need for that in the instruction set.
  
  well, I have a bit of a problem with that... As it was pointed out
  before, people have gone hogwild with the parsing and formatting
  routines, and its a bloodbath of modules on CPAN with different
  methods for time parsing.
 
 Not an opcode doesn't mean balkanized. There is a parrot/stdlib
 directory.

fair enough, but then where does the distinction lie? Why put gmtime, et al.
in opcodes? As well as addmonth? 

If you are optimising for simplicity and , it surely makes sense to put these in
the standard library.

If you are optimising for speed, then it makes sense to put them in opcodes.

It all comes down to how fast one is versus the other. If everything is going 
to be built in the standard library based off of bytecode then there will be 
a performance hit. How severe, I don't know, but definitely a performance hit.

And given the prevalence of string and date manipulation in every day tasks,
I would suggest not having that performance hit.

  But how many times are you going to need to parse formats 
  like '3 weeks from next Wednesday?'. 
 
 Uh. Yeah.
 
 This sort of creeping featuritis is why date formatting and especially 
 parsing do NOT belong as opcodes. It's too big a problem to solve in the

But I don't see the 'creeping featuritis' that you see. As well as the 
memory imprint problems that you see. Is parrot going to link with libc?

If so, you get a ton of functionality for (almost) free, just by doing an 
intelligent wrapper around strftime. As well as providing much of your 
localization support. And you get a natural boundary on what functionality should
be put (in the core) versus what should be put in a module. 

And any scheme that Larry would come up with would be implemented in terms
of what would be in parrot.

The problem would then come down to filling in deficiencies of individual
C89 implementations (which hopefully will lessen as time goes on), making 
an intelligent interface into strftime, and doing a reverse lookup. 
How I'd love to be able to do in my code:

my @date_formats = 
map( strftime( %a %b %e %T %Z %Y, r_strftime( %b %d %Y, 
$_)) , 
@ls_formatted_dates );

where r_strftime converted back to floating point seconds and then strftime
reconverted back into @date_formats..

or 

my $secs = gmclock();
my @oracle_dates = map( strftime(%d-%b-%Y, addmonths( $secs, $_)), (1..10)) 

making 10 dates each spaced a month apart and formatting them for inclusion into
oracle.

Given the prevalence in which this is done, I'd want to do it *fast*. 
As I see it, with an opcode this will be as fast as possible, approaching 
C speed. 

So - if you can guarantee that there isn't going to be a lot of overhead 
by putting it in stdlib, then sure by all means it should be put there.


 Someone depends on formats like 3 weeks from next Wednesday on a
 regular basis. You might not need to format dates from the Chinese 
 lunar calendar but you can bet that it's vital to someone. 

Look at strftime(3C) some time. I'd say that the problem has been 
to a large extent solved. Yes, it doesn't handle TAI or other epochs, which could
be handled by an offset, and yes, there aren't certain

I would think that most of this can 
 parsing? (Guessing.) Oh, baby. Global time zone database? Bring it on. A
 kl-hw (Klingon Homeworld) locale? But of course!

Most of the above is already there (well, maybe not klingon). Do you want to 
reinvent everything? What's not there could be implemented in terms of a 
wrapper around the opcode. Or augmented inside the opcode. It would be a judgement 
call as to which though.


 There'll always be pressure to further enhance the feature, increasing
 parrot's *core* memory footprint. You can't skip loading the implem-
 entation of core parrot ops like you can avoid DateTime.pm.

Resist the temptation then. Like I said, strftime provides quite a lot.

 
 So keep it to (un)loadable user code, and provide a class that solves
 90%
 of the problem in the stdlib.

like I said, if there isn't a performance penalty for this, then go ahead.
If there is a substantial performance penalty for every time I manipulate a date,
you could easily make the argument 'so keep the core ops relatively small, which
solve 90% of the problem, and put the rest into a wrapper inside stdlib.'

 
 Also, trying to nail down a rich interface before seeing what Larry has 
 in mind for Perl 6 date handling is roughly a waste of time

well, no, I don't think so.. At least if I was developing perl6 I'd 
want some input on it. The RFCs after all are 3 years old, and at some point 
there is going to have to be a merging between perl6-internals and perl6-language..

Ed


Re: Dates and Times

2004-03-09 Thread Melvin Smith
At 03:52 PM 3/9/2004 -0800, Edward S. Peschko wrote:
On Tue, Mar 09, 2004 at 04:21:24PM -0500, Gordon Henriksen wrote:
 Not an opcode doesn't mean balkanized. There is a parrot/stdlib
 directory.
fair enough, but then where does the distinction lie? Why put gmtime, et al.
in opcodes? As well as addmonth?
If you are optimising for simplicity and , it surely makes sense to put 
these in
the standard library.

If you are optimising for speed, then it makes sense to put them in opcodes.
I don't think optimising for X is the reason. Parrot should have
concise, necessary, complete opcode primitives upon which anything
else can be built.
Date parsing can be done all with opcodes, but please not inside opcodes.

If we cannot provide a decently performing VM that makes people want to
write stuff in bytecode (or compiled to bytecode) we have failed anyway.
It all comes down to how fast one is versus the other. If everything is going
to be built in the standard library based off of bytecode then there will be
a performance hit. How severe, I don't know, but definitely a performance hit.
This is subjective reasoning, though. If we want to talk performance
hits, we should know where we stand. When bytecode isn't full of
PMC thrashing, and actually uses the low level Ix and Sx registers
where possible, the JIT works extremely well and the performance
beats Perl5 by several orders of magnitude in many cases. Hopefully
the hints in Perl6 will help us write better libraries, but some of it
may have to be written in IMC or slightly higher level language (on
the equivalent of C, compilable to bytecode).
  But how many times are you going to need to parse formats
  like '3 weeks from next Wednesday?'.

 This sort of creeping featuritis is why date formatting and especially
 parsing do NOT belong as opcodes. It's too big a problem to solve in the
I agree.

But I don't see the 'creeping featuritis' that you see. As well as the
memory imprint problems that you see. Is parrot going to link with libc?
Yes, Parrot will link with libc.

Regardless of what we implement as opcodes, there will never be a single
solution that fits all, and it will never, ever end. Just look at Linux.
-Melvin




Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
 I don't think optimising for X is the reason. Parrot should have
 concise, necessary, complete opcode primitives upon which anything
 else can be built.

how about opcode formatting primitives? That is what I would argue 
strftime and relatives are... generic low-level ways of turning strings
into dates into numbers (seconds) and vice-versa.

That they are part of a standard low-level library (libc) that is widely
available and can be described in terms of parrot primitives (strings, numbers),
and the fact that this low-level library is well known, tested and 
supported on various platforms just seems to me to be a tremendous timesaver.

 Date parsing can be done all with opcodes, but please not inside 
 opcodes.

 If we cannot provide a decently performing VM that makes people want to
 write stuff in bytecode (or compiled to bytecode) we have failed anyway.

I agree that facilitating easy bytecode writing is really important - but 
reimplementing a pretty standard wheel and having that pretty standard wheel 
be slower than what is available doesn't seem to be useful to me. Taking 
the standard wheel and augmenting it seems more useful IMO.

 This is subjective reasoning, though. If we want to talk performance
 hits, we should know where we stand. When bytecode isn't full of
 PMC thrashing, and actually uses the low level Ix and Sx registers
 where possible, the JIT works extremely well and the performance
 beats Perl5 by several orders of magnitude in many cases. Hopefully
 the hints in Perl6 will help us write better libraries, but some of it
 may have to be written in IMC or slightly higher level language (on
 the equivalent of C, compilable to bytecode).

I tell you what - why don't base your decision on an empirical test. 
I'll write a c program around strftime that does a given 
set of formatting dates and times, as well as the reverse translation, and 
we can benchmark that program versus the bytecode that parrot offers in a stdlib on 
a list of tasks.

After some optimising iterations, we'll compare the results. And depending 
on the performance difference, you can decide whether or not its worth the effort
to put these primitives in the core.

  This sort of creeping featuritis is why date formatting and especially
  parsing do NOT belong as opcodes. It's too big a problem to solve in the
 
 I agree.


And the more I think about it, the more I think this concern is misplaced. 
Putting it in an opcode will make it *harder* to do this type of thing, not easier.
In perl5 land, backwards - and forwards - compatibility is a big concern. There will
be a large tendency to stabilize any implementation that occurs here.

Ed


Re: Dates and Times

2004-03-09 Thread Gordon Henriksen
Edward,

Want to call strptime? Use NCI. No need for anything new in the core. 
That's WHY it's the CORE.



Gordon Henriksen
[EMAIL PROTECTED]


Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
On Tue, Mar 09, 2004 at 09:53:47PM -0500, Gordon Henriksen wrote:
 Edward, 
 
 Want to call strptime? Use NCI. No need for anything new in the core. 
 That's WHY it's the CORE. 

I think there is a misunderstanding here. I don't think that strftime by itself
in the core - which probably has system dependencies and inconsistancies - 
is a good idea. Or for that matter, calling strftime directly is a good idea.

What I think is a good idea is a light wrapper around strftime, one that 
irons out the inconsistencies inherent in different platforms, and adds a 
reverse function which takes a format and turns it back into a number of seconds.

I don't know of any other function that does this, and I can tell you as a heavy 
user of perl in a production environment having a lightweight, fast, function that
does this is very very useful. The faster the better.

Anyways - like I said, I don't have anything against it being in a standard library,
as long as it doesn't have too much overhead and is reasonably efficient. 

But I'm doubtful that this can really be done vs having it as an op - hence the 
idea of an extensive benchmark. 

Ed

(
ps - I looked for a 'stdlib' directory in parrot-0.1.0.. is it not there? Are stdlibs
going to be shared between languages that host parrot?
)


Re: Dates and Times

2004-03-09 Thread Brent \Dax\ Royal-Gordon
Edward S. Peschko wrote:
On Tue, Mar 09, 2004 at 09:53:47PM -0500, Gordon Henriksen wrote:

Edward, 

Want to call strptime? Use NCI. No need for anything new in the core. 
That's WHY it's the CORE. 
I think there is a misunderstanding here. I don't think that strftime by itself
in the core - which probably has system dependencies and inconsistancies - 
is a good idea. Or for that matter, calling strftime directly is a good idea.
...
But I'm doubtful that this can really be done vs having it as an op - hence the 
idea of an extensive benchmark. 
On a platform with a halfway decent JIT, a pure-PASM implementation
could be as fast as an op-based one, given liberal use of the non-PMC
registers.  Maybe faster--no need to transcode to ASCII, extract a C
string, or hack around platform X's quirks.  And I'd imagine that the
Parrot standard library would be written to be as fast as possible.
Besides, how fast does your date handling really need to be?  I mean,
*really*?  Are you formatting eleventy billion dates in a tight loop or
something?
--
Brent Dax Royal-Gordon [EMAIL PROTECTED]
Perl and Parrot hacker
Oceania has always been at war with Eastasia.

[And once again, I show my incompetence with Thunderbird...]


Re: Dates and Times

2004-03-09 Thread Melvin Smith
Hi Brent,

Welcome back to p6i. ;)

At 08:12 PM 3/9/2004 -0800, Brent \Dax\ Royal-Gordon wrote:
On a platform with a halfway decent JIT, a pure-PASM implementation
could be as fast as an op-based one, given liberal use of the non-PMC
Agree.

Besides, how fast does your date handling really need to be?  I mean,
*really*?  Are you formatting eleventy billion dates in a tight loop or
something?
I actually have Perl programs that parse many many millions
of billing records per day (with 2 dates per record) for certain
wireless companies.
Sometimes, if the customer wants to do an audit, we have to process
over a month's worth, so we are bound by the actual execution
time of the Perl script and the access time of a Sleepycat (Berkeley DB)
database. The Perl programs must be able to scale
with call/message volume, and right now the only thing we can do to
improve it is put faster processors on it. (We have 8-way boxes with
64GB RAM, so 4GB hashes work just fine, but 1.5 hrs per day is still very 
finite
when you have to baby sit scripts for a week to give customers the answers
they want to know). Granted, I could rewrite this stuff in C, but we typically
modify these things on very short notice and Perl gives us the flexibility
to react quickly.

So, when we are discussing dates, I am one very interested party.

-Melvin

PS: Sorry I'm so vague about the numbers. The customers are very
sensitive about those numbers and I could get in trouble, but lets say
they are in the billions for a rather small time sample.



Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
 On a platform with a halfway decent JIT, a pure-PASM implementation 
 could be as fast as an op-based one, given liberal use of the non-PMC 
 registers.  Maybe faster--no need to transcode to ASCII, extract a C 
 string, or hack around platform X's quirks.  And I'd imagine that the 
 Parrot standard library would be written to be as fast as possible.

ok, well cool. We'll see then.

 Besides, how fast does your date handling really need to be?  I mean, 
 *really*?  Are you formatting eleventy billion dates in a tight loop or 
 something?

yes. 

Its a major issue/pain in database conversions, and in funnelling data 
from system to system - in my case, approximately 4 date conversions 
for each of 2.5 billion rows on different systems, some of them live production.  
Dates converted from one system standard oracle format to another oracle format.  
From mysql to db2.  db2 to oracle.  Date comparisons between different formats.  
(and yes,  I have rolled 'my own' wrapper for handling this stuff. I use it 
both from perl and generated c to do the conversions. However, I'm sick of 
rolling my own stuff to 'supplement' what IMO should be native to perl itself.)

In any case, like I said, I don't have any problem with standard 
libraries handling this stuff; as long as whatever library is:

a) reasonably fast - ie: within 20% of C
b) just as robust as the standard system stuff
c) has a reverse formatting function, going back to seconds from dates. 
d) is standard - handles 95% of necessary date manipulations
e) has a tight memory footprint.

I think its a waste to reimplement everything though. There is a 
LOT THERE in libc which could be leveraged. And it definitely would be a 
good idea for parrot to make dates almost as low level an item as 
strings,numbers, etc - ie: native datatypes or close to native.  A
formatting op which tied numbers to strings would do that quite nicely.

Ed


Re: Dates and Times

2004-03-09 Thread Edward S. Peschko
 Sometimes, if the customer wants to do an audit, we have to process
 over a month's worth, so we are bound by the actual execution
 time of the Perl script and the access time of a Sleepycat (Berkeley DB)
 database. The Perl programs must be able to scale
 with call/message volume, and right now the only thing we can do to
 improve it is put faster processors on it. (We have 8-way boxes with
 64GB RAM, so 4GB hashes work just fine, but 1.5 hrs per day is still very 
 finite
 when you have to baby sit scripts for a week to give customers the answers
 they want to know). Granted, I could rewrite this stuff in C, but we 
 typically
 modify these things on very short notice and Perl gives us the flexibility
 to react quickly.

well you could opt for generated C (which is what I do). I generate function
calls based on the content of the sql that is to be executed (ie: a md5 hash-like
thingy) and bound back to flat files and/or perl data structures. Its a pain in 
the , but it works, and we are IO bound rather than processor bound on a 
system with *very* high IO throughput. We also generate the C from perl, of course.

Anyways, I'd much rather be able to have perl be able to handle everything, for 
the reasons you mentioned. Its just too bad that its too slow for the task at hand,
given that the system that we were using. Hence the post.

 So, when we are discussing dates, I am one very interested party.
 
 -Melvin
 
 PS: Sorry I'm so vague about the numbers. The customers are very
 sensitive about those numbers and I could get in trouble, but lets say
 they are in the billions for a rather small time sample.

(oops. didn't think of that one. fortunately, I was thinking about it some
more, and my estimates I gave in my last email weren't completely accurate.. ;-))

Ed


Dates and Times

2004-03-08 Thread Jared Rhine
[Gordon == [EMAIL PROTECTED] on Wed, 3 Mar 2004 16:48:45 -0500]

Gordon gmclock(out Nx)
Gordon UTC clock in seconds since  hrs Jan 1, 2000,
Gordon ignoring leap seconds.

Gordon tolocal out Nx, out Iy, in Nz
Gordon x is set to z converted to the local time zone. y - 1
Gordon if Daylight Savings Time was in effect at z; y - 0
Gordon otherwise.

Gordon splittime Px, Nx
Gordon Splits date up like Perl 5 gmtime. (But without
Gordon annoying y -= 1900 and m -= 1?)

Gordon add_months(out Nx, in Ny, in Nz)
Gordon Sets x to y + z months.

This proposal was perhaps taken offline by the core team, but to avoid
a Warnock, I'll pipe up and say I like this proposal as a core
instruction set.

It'd be nice if the first item, gmclock wasn't defined in terms of
UTC.  Regardless of the future fate of UTC leap seconds, any
UTC-based clock would need to account for leap seconds going back,
right?  So it seems that GMT should be preferred in the core, with any
UTC calculations being performed at the language or module level.

So, gmclock seems the right opcode (not utcclock), making the
definition GMT clock in seconds since  hrs Jan 1, 2000.

Daylight savings time calculation seems appropriate to stay in the
core, but perhaps additional opcodes are need to set the clock's
understanding of the time zone used for DST calculations?

Gordon# years
GordonNz = Py[5]
GordonNz = Nz - 2000# epoch based at year 2000
GordonNz = Nz * 12  # = months per year

inappropriate sarcasmI look forward to the exciting advancement of
changing from subtracting 1900 from all my dates to subtracting 2000
or dealing with negative numbers; that'll change everything and really
advance the state of the art./sarcasm

Of course, as Gordon suggests, what I'll actually be doing is relying
on some Perl 6 module to give me a nice (non-negative date) object
interface.  The Parrot instruction should probably be optimized for
speed.  Formatting can always be kludged together at the language
level, but a module will need solid support from Parrot for good
duration calculations.  Gordon's proposal is tuned for duration
calculations, which is ideal.

It'd be great, if possible, to get a statement here from the DateTime
group sanctioning one or another particular Parrot clock interfaces as
efficient, complete, and preferred.  I haven't poked over to see
if they are chatting about this Parrot issue.

-- [EMAIL PROTECTED]

A black hole is where God is dividing by zero.
-- attributed to Roger Smith


Re: Dates and Times

2004-03-07 Thread Dan Sugalski
At 12:55 PM -0800 3/4/04, Robert Spier wrote:
  I agree.  That's why I'd like to see TAI be the default seconds
 since some epoch.
It seems like we want the default to be the simplest and fastest one
we can support.
Exactly. Which is the count that the system C RTL returns when you 
ask it, normally claimed to be GMT or something very much like it. If 
the local system returns localtime, I can see adjusting to GMT or 
UTC, or whatever, as that ought to be a trivial transform. Past that 
libraries can deal with it.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-07 Thread John Siracusa
On 3/4/04 5:09 PM, Dan Sugalski wrote:
 If the local system returns localtime, I can see adjusting to GMT or UTC, or
 whatever, as that ought to be a trivial transform.

Er, I'm not so sure about that.  That means you'd have to be 100% sure that
you can determine the local timezone without any ambiguity.  That has not
proven to be the case if the DateTime.pm project is any indication...

-John



Re: Dates and Times

2004-03-04 Thread TOGoS
 Interesting -- so the planet's finally gotten
 its act together and settled on a rotational
 speed, huh? Cool. :)

Nobody said anything about a planet. A clock should
tell you how much time has gone by. If I get a time,
sleep(1), and get another time, time 2 should be about
time1 + 1 second, regardless of leap seconds, what
planet I'm on, etc. Translating a timestamp into a
date is a separate issue from keeping track of time
itself, and should be handled separately.

__
Do you Yahoo!?
Yahoo! Search - Find what you’re looking for faster
http://search.yahoo.com


Re: Dates and Times

2004-03-04 Thread TOGoS
  Interesting -- so the planet's finally gotten
   its act together and settled on a rotational
   speed, huh? Cool. :)
 
 Nobody said anything about a planet.
 
 Actually, they did. UTC (which was the original
 reference) is defined such that noon is within .9
 seconds of the sun being as directly overhead as
 it can be, and is thus directly tied to the
 behaviour of the planet.

My point remains. Don't use UTC, then :) That's why we
want to ignore leap seconds.

__
Do you Yahoo!?
Yahoo! Search - Find what you’re looking for faster
http://search.yahoo.com


Re: Dates and Times

2004-03-04 Thread Larry Wall
On Thu, Mar 04, 2004 at 09:12:47AM -0500, Dan Sugalski wrote:
: At 7:30 PM -0800 3/3/04, TOGoS wrote:
:   Interesting -- so the planet's finally gotten
:  its act together and settled on a rotational
:  speed, huh? Cool. :)
: 
: Nobody said anything about a planet.
: 
: Actually, they did. UTC (which was the original reference) is defined 
: such that noon is within .9 seconds of the sun being as directly 
: overhead as it can be, and is thus directly tied to the behaviour of 
: the planet.

The basic problem is that there are times you need to know exactly
how many seconds have passed between two timestamps, and times you
need to know exactly how many days have passed between two timestamps,
and the two are in conflict.  However, I think the more basic problem
of the two is the first one.  If you ignore that problem, you get
all sorts of breakage down in random routines that you don't want
breakage in, and this will only get worse as computers get faster,
and try to syncronize more low level things.

In contrast, the other problem tends to manifest in user interfaces,
where it can typically be solved by some snap-to-grid semantics at the
minute, hour, and day boundaries, at least until the second timer and
the Earth drift apart by 30 seconds or so.  Which will take a while.

And anyone who needs greater UTC accuracy than that should probably
be tracking TAI-UTF offsets anyway, or have some other way of resyncing
their clock at least semiyearly.

So anyway, I don't care whether Parrot builds in support for
complicated time systems like UTC.  (Well, I do care some--it should
probably be a library in any event.)  But I do care that Ctime - $^T
be accurate.  (In fact, I'd like $^T to change to a floater too, on
systems that can support it.  It's way past time for hi-res timing
to be the default, I think.)

Larry


Re: Dates and Times

2004-03-04 Thread Joshua Hoblitt
On Thu, 4 Mar 2004, TOGoS wrote:

  Actually, they did. UTC (which was the original
  reference) is defined such that noon is within .9
  seconds of the sun being as directly overhead as
  it can be, and is thus directly tied to the
  behaviour of the planet.

UTC may stop tracking UT1 and stop having [new] leap-seconds.  Even if this happens 
we'll still have to take leap-seconds into account for dates prior to 1999.

 My point remains. Don't use UTC, then :) That's why we
 want to ignore leap seconds.

I agree.  That's why I'd like to see TAI be the default seconds since some epoch.

-J

--


Re: Dates and Times

2004-03-04 Thread Robert Spier
 I agree.  That's why I'd like to see TAI be the default seconds
 since some epoch.

It seems like we want the default to be the simplest and fastest one
we can support.

If someone wants something different, they can do the moral equivalent
of:

use Time::TAI;

or

use Time::UTC;

or 

use Time::MacEpoch;

-R



Dates and Times

2004-03-03 Thread Dan Sugalski
Yep, time to dive into yet *another* swamp. (Isn't this fun?)

Right now we've got the capability of getting the current time in 
epoch seconds with the time op. This is good. However there's the 
issue of actually *doing* something with it.

I'm torn here as to what to do. On the one hand, it's supremely 
tempting to punt and not have parrot do a darned thing with the time 
and leave it to library code to handle it. On the other, CPAN is 
littered with the carcasses of time and date modules. On the third 
hand, at least some of the date handling stuff is provided by the 
underlying C runtime library (there's a lot of interesting stuff in 
the C89 spec) so it seems silly to reimplement something we're 
guaranteed to have around anyway.

What I'm thinking we may want to do is provide a minimal 
interface--turn the time integer into a string rep or split out into 
an array, something like:

localtime Sx, Iy
gmtime Sx, Iy
Returns a formatted string for either localtime or gmt in X, with the 
value in Y being the return from the time op, and:

localtime Px, Iy
gmtime Px, Iy
returning an array of 
sec/min/hour/day/month/year/weekday/yearday/isDST?/TZ/secsfromUTC in 
X from the time int in Y. Uear, in this case, being the actual real 
year--none of this year-1900 nonsense

And yeah, this is a simple wrapper around the C RTL routines.

FWIW, if we start getting into the What should our base time for the 
epoch be arguments, I'll warn you that the answer if I have to make 
one is probably Nov 17, 1858 at midnight, give or take a bad memory, 
and our time value'll be a 64-bit integer. So think carefully before 
you go there. :)
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Melvin Smith
At 11:37 AM 3/3/2004 -0500, Dan Sugalski wrote:
I'm torn here as to what to do. On the one hand, it's supremely tempting 
to punt and not have parrot do a darned thing with the time and leave it 
to library code to handle it. On the other, CPAN is littered with the 
carcasses of time and date modules. On the third hand, at least some of 
the date handling stuff is provided by the underlying C runtime library 
(there's a lot of interesting stuff in the C89 spec) so it seems silly to 
reimplement something we're guaranteed to have around anyway.

What I'm thinking we may want to do is provide a minimal interface--turn 
the time integer into a string rep or split out into an array, something like:
Simple primitives are good.

My stuff dealing with dates is usually hand written based on top of the 
localtime
and gmtime calls in the standard Time:: module bundled with Perl anyway.
Anything fancier requiring a CPAN download rarely gets used on production
boxes because a lot of administrators don't mind installing a pre-built Perl
package, but they shy away from downloading and compiling a ton of
add-on modules (hey, they can't all be Perl-trained).

I know I've been on this soapbox in the past but...

I hope, with Parrot, people will get away from a common practice of writing
Perl modules in C with a binary interface. Unless the module HAS to be
in C for API interface (complex math computations or performance sensitive
stuff like encryption and compression where 10% matters), I prefer a pure
bytecode implementation for ease of deployment.
Some people write both pure Perl and C implementations of modules; to
get around that, I hope we can provide a low level, optimizable system
programming language for Parrot (or put enough hints in Perl6) so
people can write fast implementations without requiring a real C compiler.
-Melvin




Re: Dates and Times

2004-03-03 Thread mark . a . biggar
 What I'm thinking we may want to do is provide a minimal 
 interface--turn the time integer into a string rep or split out into 
 an array, something like:
 
  localtime Sx, Iy
  gmtime Sx, Iy
 

You almost have to provide at least these, as you have to deal with
how various OS's handle the hardware clock.  Windows insists that the
hardware clock be set to localtime, Solaris and most U*x's insist that
it be set to GMT, while Linus supports setting it to either.  This also
means that the simple second-sense-epoc time() may not be so simple
after all.

--
Mark Biggar
[EMAIL PROTECTED]


Re: Dates and Times

2004-03-03 Thread Larry Wall
On Wed, Mar 03, 2004 at 11:37:09AM -0500, Dan Sugalski wrote:
: FWIW, if we start getting into the What should our base time for the 
: epoch be arguments, I'll warn you that the answer if I have to make 
: one is probably Nov 17, 1858 at midnight, give or take a bad memory, 
: and our time value'll be a 64-bit integer. So think carefully before 
: you go there. :)

Well, you can do whatever you like with Parrot, but I want Perl 6's
standard interface to be floating point seconds since 2000.  Floating
point will almost always have enough precision for the task at hand,
and by the time it doesn't, it will.  :-)

But the overriding consideration is that normal users should
Inever have to remember the units of the fractional seconds.
Is it nanoseconds this week?

That's the sort of arbitrary complexity that doesn't belong in Perl 6.
Solving the real problems is hard enough.

Larry


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 6:03 PM + 3/3/04, [EMAIL PROTECTED] wrote:
  What I'm thinking we may want to do is provide a minimal
 interface--turn the time integer into a string rep or split out into
 an array, something like:
  localtime Sx, Iy
  gmtime Sx, Iy
You almost have to provide at least these, as you have to deal with
how various OS's handle the hardware clock.  Windows insists that the
hardware clock be set to localtime, Solaris and most U*x's insist that
it be set to GMT, while Linus supports setting it to either.  This also
means that the simple second-sense-epoc time() may not be so simple
after all.
Gah. OK, I'm about to declare that the time op *always* returns time 
as GMT, though without specifying an epoch, unless someone's got a 
good reason not to. That takes at least one variable out of the 
problem.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 10:29 AM -0800 3/3/04, Larry Wall wrote:
But the overriding consideration is that normal users should
Inever have to remember the units of the fractional seconds.
Is it nanoseconds this week?
Right, the units will always be seconds. That, at least, will stay constant.
--
Dan
--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Joshua Hoblitt
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 FWIW, if we start getting into the What should our base time for the
 epoch be arguments, I'll warn you that the answer if I have to make
 one is probably Nov 17, 1858 at midnight, give or take a bad memory,
 and our time value'll be a 64-bit integer. So think carefully before
 you go there. :)

TAI is 1958-01-01T00:00:00.

-J

--


Re: Dates and Times

2004-03-03 Thread Joshua Hoblitt
On Wed, 3 Mar 2004, Larry Wall wrote:

 Well, you can do whatever you like with Parrot, but I want Perl 6's
 standard interface to be floating point seconds since 2000.  Floating
 point will almost always have enough precision for the task at hand,
 and by the time it doesn't, it will.  :-)

Aren't there enough epochs already? :)

Anyways, I recall some discussion on p6l from years ago about using TAI (and I think 
specifically libtai) as the internal time format for p6.  Is this still the case?

It would be *really* nice to be able to rely on getting TAI from Parrot.

-J

--


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 10:13 AM -1000 3/3/04, Joshua Hoblitt wrote:
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 FWIW, if we start getting into the What should our base time for the
 epoch be arguments, I'll warn you that the answer if I have to make
 one is probably Nov 17, 1858 at midnight, give or take a bad memory,
 and our time value'll be a 64-bit integer. So think carefully before
 you go there. :)
TAI is 1958-01-01T00:00:00.
And that's a good base time too, other than it being off of clock 
time for everyone by 32 seconds, give or take. Tempting, though.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Larry Wall
On Wed, Mar 03, 2004 at 10:21:37AM -1000, Joshua Hoblitt wrote:
: On Wed, 3 Mar 2004, Larry Wall wrote:
: 
:  Well, you can do whatever you like with Parrot, but I want Perl 6's
:  standard interface to be floating point seconds since 2000.  Floating
:  point will almost always have enough precision for the task at hand,
:  and by the time it doesn't, it will.  :-)
: 
: Aren't there enough epochs already? :)

Aren't there enough programming languages already?  :-)

: Anyways, I recall some discussion on p6l from years ago about using
: TAI (and I think specifically libtai) as the internal time format
: for p6.  Is this still the case?

As I said, I don't care what the internal time format is.  I'm just
sticking up for the average user of the next millenium.  It's my
gut-level feeling that 99% of users would prefer that continuous
time be represented by a pseudo-continuous type like floating pint,
and that we should all settle on an epoch that will still be easy to
remember in the year 2149.  So I think the default public interface
needs to be floating point seconds since 2000.

: It would be *really* nice to be able to rely on getting TAI from Parrot.

It would also be really nice to be able to rely on not having to
write FAQs telling people how to deal with interfaces that are more
complicated than they need to be.  :-)

Don't get me wrong--I think the concept of TAI time is great.
It's just always going to be a fixed number of seconds different than
Perl 6 time, is all, whatever the TAI time is for Jan 1, 2000, UTC.

Yes, I'm a megalomaniac to think that I can set a better standard than
the French...  :-)

Larry


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 12:59 PM -0800 3/3/04, Larry Wall wrote:
On Wed, Mar 03, 2004 at 10:21:37AM -1000, Joshua Hoblitt wrote:
: On Wed, 3 Mar 2004, Larry Wall wrote:
: Anyways, I recall some discussion on p6l from years ago about using
: TAI (and I think specifically libtai) as the internal time format
: for p6.  Is this still the case?
As I said, I don't care what the internal time format is.  I'm just
sticking up for the average user of the next millenium.  It's my
gut-level feeling that 99% of users would prefer that continuous
time be represented by a pseudo-continuous type like floating pint,
and that we should all settle on an epoch that will still be easy to
remember in the year 2149.  So I think the default public interface
needs to be floating point seconds since 2000.
Reasonable enough, though there's something to be said for a 
completely meaningless (to most people) epoch so folks stop treating 
the number as a number with meaning and instead treat it as a black 
box thing they can do offset math with.

Don't get me wrong--I think the concept of TAI time is great.
It's just always going to be a fixed number of seconds different than
Perl 6 time, is all, whatever the TAI time is for Jan 1, 2000, UTC.
That, as they say, turns out not to be the case. UTC has leap 
seconds, TAI doesn't. The two are slowly diverging--off by 32 seconds 
right now, and probably off by 33 this year or next, with extra 
seconds added irregularly. (It's why the decoded time array's seconds 
goes from 0-60 rather than 0-59)
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


RE: Dates and Times

2004-03-03 Thread Gordon Henriksen
Oracle actually has the most elegant Gregorian time manipulation
implementation I've seen. The only operations it really supports are
add_months and add_days. Year +/- can be implemented with add_months*12.
All of add_week|hour|minute|second|ms|us|ns can be synthesized from
add_days. This scarcity of operations yields the elegance, and is
perfect for an instruction set. Based on that model, I'd suggest:

gmclock(out Nx)
UTC clock in seconds since  hrs Jan 1, 2000, ignoring leap
seconds.

gmtime(out Px, in Nx)
Splits date up like Perl 5 gmtime. (But without annoying y -= 
1900 and m -= 1?)

localtime(out Px, in Nx)
Splits date up like Perl 5 localtime. (But without annoying y -=

1900 and m -= 1?)

add_months(out Nx, in Ny, in Nz)
Sets x to y + z months.

That's the minimal core set of operations.

But the redundancy of gmtime and localtime has always bothered me, so I
could see this instead:

gmclock(out Nx)
UTC clock in seconds since  hrs Jan 1, 2000, ignoring leap
seconds.

tolocal out Nx, out Iy, in Nz
x is set to z converted to the local time zone. y - 1 if 
Daylight Savings Time was in effect at z; y - 0 otherwise.

splittime Px, Nx
Splits date up like Perl 5 gmtime. (But without annoying y -= 
1900 and m -= 1?)

add_months(out Nx, in Ny, in Nz)
Sets x to y + z months.



By contrast, date manipulation in Perl 5 is truly horrid. I've seen
modules which turned a gmtime array back into an epoch-base value by
using localtime to converge on the correct value using progressive
approximation, as if finding the root of an arbitrary mathematical
function. Doing the same using the above instructions can easily be
implemented in 17 instructions flat with no branches:

# out Nx: clock-style seconds-since-epoch
# in Py: splittime-style array
# Nz: temp 

Nx = 0

# years
Nz = Py[5]
Nz = Nz - 2000# epoch based at year 2000
Nz = Nz * 12  # = months per year
add_months Nx, Nx, Nz

# months
Nz = Py[4]
add_months Nx, Nx, Nz

# days
Nz = Py[3]
Nz = Nz * 86400  # = 24 * 60 * 60 seconds per day
Nx = Nx + Nz

# hours
Nz = Py[2]
Nz = Nz * 3600   # = 60 * 60 seconds per hour
Nx = Nx + Nz

# minutes
Nz = Py[1]
Nz = Nz * 60 # = 60 seconds per minute
Nx = Nx + Nz

# seconds
Nz = Py[0]
Nx = Nx + Nz


Leave parsing and formatting entirely to libraries. Absolutely no need
for that in the instruction set.

-- 

Gordon Henriksen
IT Manager
ICLUBcentral Inc.
[EMAIL PROTECTED]



Re: Dates and Times

2004-03-03 Thread Larry Wall
On Wed, Mar 03, 2004 at 04:18:14PM -0500, Dan Sugalski wrote:
: Don't get me wrong--I think the concept of TAI time is great.
: It's just always going to be a fixed number of seconds different than
: Perl 6 time, is all, whatever the TAI time is for Jan 1, 2000, UTC.
: 
: That, as they say, turns out not to be the case. UTC has leap 
: seconds, TAI doesn't. The two are slowly diverging--off by 32 seconds 
: right now, and probably off by 33 this year or next, with extra 
: seconds added irregularly. (It's why the decoded time array's seconds 
: goes from 0-60 rather than 0-59)

No, I *am* assuming that Perl 6 time tracks TAI time accurately with
a constant offset, and drifts with respect to UTC.  That does mean
that the translations from internal time to real datetimes have to
be groomed periodically, and people who don't upgrade their Perl for
years on end might find its clock off by a second or two.  But just
as the cable company forces periodic upgrades into your cable box
without your keeping track, any networked Perl ought to be able
to install a new time map automatically over the net without much
user intervention--but only if we design with that in mind in the
first place.  But for sanity's sake, to keep the time continuum flat,
we have to abandon the notion that Dec 31 is always 86400 seconds long,
or any length predictable several years in advance.  We can't afford
to have off-by-one errors when you subtract two standard Perl 6 times.

Larry


Re: Dates and Times

2004-03-03 Thread Dave Whipp
Dan Sugalski [EMAIL PROTECTED] wrote in message
news:[EMAIL PROTECTED]
 Reasonable enough, though there's something to be said for a
 completely meaningless (to most people) epoch so folks stop treating
 the number as a number with meaning and instead treat it as a black
 box thing they can do offset math with.

Don't make a decision when you don't need to. Perhaps the thing to do is to
not return a number at all: just return a time black box that knows how to
subtract an epoch black-box (also of type time), resulting in a value
that is the number of seconds since the epoch. Supply various epoch
black-boxes as constants.

Dave.




Re: Dates and Times

2004-03-03 Thread Leopold Toetsch
Dan Sugalski [EMAIL PROTECTED] wrote:
 At 10:13 AM -1000 3/3/04, Joshua Hoblitt wrote:

TAI is 1958-01-01T00:00:00.

 And that's a good base time too, other than it being off of clock
 time for everyone by 32 seconds, give or take. Tempting, though.

Bahh, these few seconds. Dan, the year, the year is that what counts.
Good year, though.

leo, SCNR


Re: Dates and Times

2004-03-03 Thread Joshua Hoblitt
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 At 12:59 PM -0800 3/3/04, Larry Wall wrote:
 On Wed, Mar 03, 2004 at 10:21:37AM -1000, Joshua Hoblitt wrote:
 : On Wed, 3 Mar 2004, Larry Wall wrote:
 : Anyways, I recall some discussion on p6l from years ago about using
 : TAI (and I think specifically libtai) as the internal time format
 : for p6.  Is this still the case?
 
 As I said, I don't care what the internal time format is.  I'm just
 sticking up for the average user of the next millenium.  It's my
 gut-level feeling that 99% of users would prefer that continuous
 time be represented by a pseudo-continuous type like floating pint,
 and that we should all settle on an epoch that will still be easy to
 remember in the year 2149.  So I think the default public interface
 needs to be floating point seconds since 2000.

UTC may stop having leapseconds all together. :)  That would make the year 2000 epoch 
attractive as negative values would have leapseoncds while positive values would not.  
The problem is that Wall's Clock system is going to have to documented and explained 
as much as another other choice would.

 That, as they say, turns out not to be the case. UTC has leap
 seconds, TAI doesn't. The two are slowly diverging--off by 32 seconds
 right now, and probably off by 33 this year or next, with extra
 seconds added irregularly. (It's why the decoded time array's seconds
 goes from 0-60 rather than 0-59)

It actually needs to goto 61 to properly support UTC. :)

-J

--


Re: Dates and Times

2004-03-03 Thread Joshua Hoblitt
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 Gah. OK, I'm about to declare that the time op *always* returns time
 as GMT, though without specifying an epoch, unless someone's got a
 good reason not to. That takes at least one variable out of the
 problem.

The GMT system is dead... do you mean UTC or UT1? :)

-J

--


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 2:19 PM -1000 3/3/04, Joshua Hoblitt wrote:
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 At 12:59 PM -0800 3/3/04, Larry Wall wrote:
 On Wed, Mar 03, 2004 at 10:21:37AM -1000, Joshua Hoblitt wrote:
 : On Wed, 3 Mar 2004, Larry Wall wrote:
 : Anyways, I recall some discussion on p6l from years ago about using
 : TAI (and I think specifically libtai) as the internal time format
 : for p6.  Is this still the case?
 
 As I said, I don't care what the internal time format is.  I'm just
 sticking up for the average user of the next millenium.  It's my
 gut-level feeling that 99% of users would prefer that continuous
 time be represented by a pseudo-continuous type like floating pint,
 and that we should all settle on an epoch that will still be easy to
 remember in the year 2149.  So I think the default public interface
 needs to be floating point seconds since 2000.
UTC may stop having leapseconds all together. :)  That would make 
the year 2000 epoch attractive as negative values would have 
leapseoncds while positive values would not.  The problem is that 
Wall's Clock system is going to have to documented and explained 
as much as another other choice would.
Interesting -- so the planet's finally gotten its act together and 
settled on a rotational speed, huh? Cool. :)

  That, as they say, turns out not to be the case. UTC has leap
 seconds, TAI doesn't. The two are slowly diverging--off by 32 seconds
 right now, and probably off by 33 this year or next, with extra
 seconds added irregularly. (It's why the decoded time array's seconds
 goes from 0-60 rather than 0-59)
It actually needs to goto 61 to properly support UTC. :)
Really? I didn't realize that there were any days where there were 
two extra seconds added. How... inconvenient.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Dan Sugalski
At 2:21 PM -1000 3/3/04, Joshua Hoblitt wrote:
On Wed, 3 Mar 2004, Dan Sugalski wrote:

 Gah. OK, I'm about to declare that the time op *always* returns time
 as GMT, though without specifying an epoch, unless someone's got a
 good reason not to. That takes at least one variable out of the
 problem.
The GMT system is dead... do you mean UTC or UT1? :)
Y'know, I'm not sure. UTC, I expect, if GMT is well and truly dead. 
Whatever gmtime and its ilk in the C runtime return.
--
Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk


Re: Dates and Times

2004-03-03 Thread Zellyn Hunter
For those of you not up to speed on how much date and time confusion there is, 
I remember this article by Dave Rolsky as being interesting:

http://www.perl.com/pub/a/2003/03/13/datetime.html