Hacker News new | ask | show | jobs
by BadThink6655321 2323 days ago
Of all the nails that could be used to seal Pascal’s coffin, the one I use is that I can’t write ‘writeln’ in Pascal. Other than that, it was great in it’s time (mid 70’s for me).
4 comments

How do you write malloc() and exit() in C?

You don't, it has to be in Assembly or calling underlying OS APIs.

So also a nail in C's coffin.

malloc: Have a big static block of uint8_t and return pointers from it.

exit: longjmp.

Funny, malloc() implemented that way is UB and doesn't work in all cases, specially when passing pointers around dynamic loaded libraries or threads.

So exit() gets to call longjmp() which definitely can only be done in Assembly, back to step 1.

Isn't this how malloc was done on classic MacOS?
Classic MacOS was written in a mix of Assembly and Apple Pascal.

C was a guest language via MPW, and plugged into those APIs.

> malloc: Have a big static block of uint8_t and return pointers from it.

According to C99 section 6.5 paragraphs 6-7 that would be undefined behavior. The declared type of the object is uint8_t and you're accessing it through an lvalue expression which is not compatible with uint8_t. (You can access any object through a character-type lvalue, but the reverse is not true.) The malloc() function is required to return memory which is disjoint from any other object—that includes your uint8_t array.

Besides aliasing concerns, your character array may not be properly aligned for whatever type is being stored there and there is no way within the C99 standard to determine the alignment of the array or the required alignment for the stored type.

> exit: longjmp.

That might work, in a single-threaded program, if you longjmp() back to main() and return. There's no telling what might happen if you did that from another thread, of course, but then C99 doesn't really cover threads.

Put the block in a struct and use allignment keywords.
If you're lucky enough to be using C11 or C18, sure. There are no alignment keywords in C99. However, that still leaves the aliasing issue, and the fact that objects allocated with malloc() are defined not to overlap with any other object.
well you also need another static block for the allocation bitmap or whatever structure you're going to use. How would the pointers that you're generated be aliased if they're unique according to your free map.
You use "array of const" to write the equivalent of a regular C variadic function in modern Pascal implementations such as Delphi and Free Pascal:

https://www.freepascal.org/docs-html/ref/refsu69.html

That said, as far as at least Free Pascal goes, there isn't actually even a specific function called `writeln` with a real body that you can go and look at somewhere.

It's a magic language-level intrinsic that gets broken down into calls to various other intrinsics by the compiler based on what's passed to it.

> I can’t write ‘writeln’ in Pascal

Let's not talk about Pascal from over 40 years ago, let's talk about today's Pascal. Why can't you write "writeln" in today's Pascal?

According to Rosetta Code [1], “Standard Pascal does not allow variadic functions” — though specific implementations have proprietary extensions which allow this.

[1]: https://rosettacode.org/wiki/Variadic_function#Pascal

None uses that "standard" when writing stuff in Pascal. Real world uses either Delphi or Lazarus+FreePascal. Both of them have Writeln and variadic functions
Note, I think the point wasn't that Pascal didn't have writeln, rather that you couldn't write (implement) writeln in Pascal (presumably due to missing variadic functions).

So having writeln isn't really the issue, the issue is that writeln is magic/a built-in.

Is free pascal self hosted?

You could write something along the lines of `writeln` using `array of const` with today's Free Pascal. It's still strictly better that it's actually implemented as a built-in for various reasons, though.

Also, yes, Free Pascal is entirely self-hosted from the bottom up, making use of inline assembly blocks in some places where it's necessary. It is to Pascal what GCC is to C and C++, basically (which is to say, it has no real dependencies on toolchains other than itself).

> Is free pascal self hosted?

Yes.

Which compiler are you going to use for "standard pascal"? The Pascal compilers you're going to use in practice are either Free Pascal or Delphi. They are what Pascal is today:

https://rosettacode.org/wiki/Variadic_function#Free_Pascal

Things such as "implement the 'writeln' function" fall under the umbrella of "operating system interop" or "Foreign function interface", don't they?

Any general-purpose programming language, pascal or not, will eventually have that. But it might not be in a general language standard.

I think the point is that it’s not so rare that one might run into this type of situation. The article even mentions one.

> It is unfortunate that there is no way to make this convenience available to routines in general.