Hacker News new | past | comments | ask | show | jobs | submit login
Single assignment C (sac-home.org)
69 points by oinksoft on Dec 22, 2013 | hide | past | favorite | 22 comments



This is neat. I studied APL recently (through Ted Nelson's fantastic intro in Computer Lib), and ever since I've been intrigued by some of the neat ideas/conciseness that array languages offer. (I have too many side projects/side project ideas already, but would love to write a toy "modern" APL just for fun)


Check out J[1]. It's basically ASCII-APL though it lacks a toy modern implementation (in case you don't know, APL has one[2]).

What really annoyed me about array languages is that idiomatic code is nearly impossible to follow after a month, so I ended up aliasing many of the commands to more verbose alternatives and using longer traditional constructs like IF-THEN-ELSE.

That pretty much turned the language into weird-C-limited-to-binary-functions-with-an-array-stdlib, which kind of defeated the point.

  [1] http://www.jsoftware.com/
  [2] https://github.com/ngn/apl


Oh My God.. I tried to learn APL for about two days some years ago and all I gorked was just basic stuff. Then I found out J and recommended that to our APL loving Prof. who converted from his about $2000 expensive prorietary APL symbolic minfu to the free J alternative. I could write much more with J, but Julia still feels more natural.

I've not made any speed comparisons, but maybe you can give APL, J, Julia and SAC a bench? That would be neat! A simple hello world like example, for example using the same FFT algorithm, or "addition" loop would be enough.


Is it being maintained? Last release seems to be from February 2012.


It's still being actively worked on, due to a recent move to a different university a lot of the infrastructure (such as building new releases) is still offline, so the website hasn't updated in a while. Blame university IT departments.


Any public repository to track?


The compiler implementation isn't really open source at the moment. On the other hand, they're very interested in new collaborations. Getting access to the source is not much harder than just dropping them an email.

If you (or anyone else) is interested, drop me an email (see HN profile) and I can get you in contact with them as most of the people involved are either current or old colleagues of mine.


Arrays by row? Why?


Because normal C is also row-major?


C only has vectors (1D arrays), the implementation of higher dimensions is up to programmer. I know there is this idea to use vectors of vectors to emulate matrices but it is not at all a part of the language (nor efficient).


So what do you call x in the definition

    int x[100][83];
Sure looks like a 2D array of ints for all intents and purposes.


Everyone always trots this out when talking about multidimensional array programming in C, but it's effectively useless because it only works for statically declared, fixed-size arrays. Since those never occur when writing real numerical code, the fact that the compiler in this one very particular case can turn x[i][j] into x[i*s+j] for me is essentially useless for any real work with dynamically allocated, variably sized multidimensional arrays.


In which case the correct statement would have been something like "Multidimensional arrays in C are not very useful in practice," rather than "they don't exist".


Vector of vectors, as I wrote; quoting cdecl "declare x as array 100 of array 83 of int".


That's not a 2D array, it's a jagged array. You're paying for an extra pointer dereference.


You're wrong. Operationally, it is equivalent to:

  int x_1d[8300];
Where x[a][b] is x_1d[a + 83*b];

An array of arrays is contiguous in memory. There are no pointers involved until you take the (r)value of the array or one of the inner arrays, at which point it is degraded to be a pointer to the array's first element, as always.


Where hello_hi might have gotten confused is that in usage, a pointer of array pointers looks the same as a 2D array. So if you only see x[a][b] it could actually be dereferencing an array of pointers to integers.

Since we have the declaration, it's unambiguously the 2D array that you described.

EDIT: I might be seeing things, but I think you have your order mixed up, x[a][b] is not x_1d[a + 83b], but rather x_1d[a83+b]


Your edit is correct, thanks for the correction!


And I'll also add that this is not an optimization, it's guaranteed by the standard.


Whether it's row-major or "row-major" is not the point, what matters that it is the ordering C programmers will be most familiar with.


any one call telme how can i submit a link





Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: