5 ms·
By the way, why does Rust need a C compiler anyway? I admit I am ignorant here because I never cared. I know that many academic/niche programming languages bun
by copx 13y ago
By the way, why does Rust need a C compiler anyway?
I admit I am ignorant here because I never cared. I know that many academic/niche programming languages bundle MinGW/depend on a MinGW or even Cygwin installation.. I always assumed that was to cut some corners. I mean, I have used multiple programming languages on Windows which compile to native code and have no dependency on a C compiler.
- Ygg2 13y agoSo it (Firefox with Servo) would work on Windows as close to native as possible? It would be funny to start Firefox and have a console windows poping in/out of existence or some other visual quirk.
- tmzt 13y agoI believe the reason in the past was due to C++ implemented NPAPI plugins like Flash. Only MSVC builds of Mozilla/Firefox were officially supported.
- steveklabnik 13y ago> By the way, why does Rust need a C compiler anyway? I'm not 100% sure, but I do know that zero.rs requires 'the following libc functions: malloc, free, abort, memcpy, and memcmp'. So I'd imagine it's that.
- pjmlp 13y agoThose functions could be easily done via syscalls to the underlying OS or simple Assembly routines, as they are quite simple to implement. I have not yet looked at Rust's code, but I guess it is required for some bootstrapping code.
- njs12345 13y agoI think malloc/free at least are certainly far from simple to implement..
- pjmlp 13y agoSimple does not mean easy.
- zxcdw 13y agoWhat's the definition of "hard to implement" if not complexity?
- pjmlp 13y agoIf you are targeting an existing OS, malloc/free can be simple wrappers to OS syscalls for memory allocation. Not very efficient, but pretty straightforward to implement. If targeting direct hardware, any CS student should have learned how to implement a memory allocator on their compiler design, data structures or OS classes. Back when I graduated, this would be a home work exercise. If you want to implement a high performance memory allocator that works under pressure in a multi-core context, then yes it is complex to implement. Now something that allocates/releases memory with a general purpose algorithm? That is quite simple and many compiler design books even provide such examples.
- ahomescu1 13y ago> If you are targeting an existing OS, malloc/free can be simple wrappers to OS syscalls for memory allocation. Not really, there's no such thing as malloc/free syscalls. On Linux, you have mmap/munmap (at page granularity) and brk/sbrk (which only extend the current heap). You could implement malloc as either a mmap() of one or more pages, or by using sbrk() to extend the heap by exactly the memory you need, but then freeing that memory becomes much harder.
- srgpqt 13y agoTo take the example of Windows, wouldn't this qualify as a malloc/free syscall equivalent? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366597(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa36...
- colanderman 13y agoThose functions could be easily done via syscalls to the underlying OS or simple Assembly routines, as they are quite simple to implement. None of those four functions use syscalls, nor are any of them simple to implement efficiently in assembly. Consider that memcpy, under GCC, * generates different code based on any known alignment of the source or destination * generates simpler code if the size is known at compile time * generates only register accesses if one or both of the arguments live in registers * is elided entirely if GCC determines that it may do so safely The other three have similar complex behavior. The Rust developers didn't use them just because they were too dumb to know how to write a for loop in assembly.
- pjmlp 13y agoSimple is not the same as easy. Anyone with compiler development experience can implement them without much trouble, hence simple. Sadly that is a skill many seem to lack nowadays.
- Confusion 13y agoYeah, back in the old days everyone had that kind of compiler development experience, didn't they?
- pjmlp 13y agoCompared to what kids seem to know nowadays, yes. They can grok HTML5 page full of JavaScript stuff, but then mix language with implementation, think that strong typing is only possible with VM based languages and faith at the look of Assembly code.
- marshray 13y agoThose functions should be available in %systemroot%\system32\msvcrt.dll.
- pjmlp 13y agomsvcrt.dll is not an OS API library, Kernel32.dll is.
- marshray 13y agohttp://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).as... The msvcrt.dll is now a "known DLL," meaning that it is a system component owned and built by Windows. It is intended for future use only by system-level components. Msvcrt.dll began shipping as part of the OS around the Win2K/XP timeframe, IIRC.
- pjmlp 13y agoIt still does not make it an OS API, it is the C runtime library which is quite different even if bundled with the OS.
- marshray 13y agoI know some folks who think of the NT syscall interface as the 'true' OS API and see kernel32.dll as an add-on. I'll ask, but I don't think these folks make a distinction between user32.dll and the msvcrt.dll that ships with the OS.
- pjmlp 13y ago> I know some folks who think of the NT syscall interface as the 'true' OS API and see kernel32.dll as an add-on. This is 100% correct, many of the real syscalls are located in Ntoskrnl, while kernel32.dll is actually part of the Win32 subsystem, given the personalities feature from Windows. So you could be using another subsystem. However, given that the POSIX and OS/2 subsystems are no longer supported, the only available subsystem is Win32. Metro is another matter as it uses another architecture not based on the subsystems mechanism. But in the end these are all OS APIs, not language runtimes.
- pjmlp 13y ago> By the way, why does Rust need a C compiler anyway? Bootstrapping.
- eridius 13y agoRust bootstraps by downloading an existing snapshot of the rust compiler, which it then uses to build the stage0 rust compiler, which then builds the stage1 rust compiler, which then builds the stage2 rust compiler.