Transpiling to C vs C++ : range of CPU instructions

718 views Asked by At

I am considering the question of transpiling a language (home-grown DSL) to C vs to C++.

I haven't done any 'native' programming for over 15 years, so I want to check my assumptions.

Am I right into assuming that transpiling to the newest C++ version (17) would enable the native compiler to use a much wider range of 'modern' Intel/AMD CPU instructions, resulting in a more efficient executable (beyond the multi-threading / memory-model part of C++, which already by itself seems a good enough reason to go for C++)?

Put another way, isn't a large part of 'more recent' CPU instructions never generated by a C compiler, simply because it has too little information about the programmer intent, due to the simpler syntax of C? I know I could access all CPU instructions with assembler, but that is precisely what I don't want to do. Ideally, I would want the generated code to still be as platform-independent as possible.

1

There are 1 answers

7
Jonathon Reinhart On BEST ANSWER

All of your assumptions about the relationship between programming language and "modern CPU instructions" are incorrect.

Let's consider the GNU Compiler Collection.

The choice of language here doesn't much matter, as the language front-ends all end up generating the same intermediate form called GIMPLE. The optimizing passes then work on that.

The range of CPU instructions which can be emitted is controlled by the -mtune option. For x86, GCC is capable of emitting modern AVX 512 instructions when optimizing some very plain-looking C code. Automatic loop vectorisation is a powerful thing. Try it out: implement memcpy and look at the generated assembly.

My advice: generate clean, un-clever C code, and crank up the optimization level. Just like you would do if writing code by hand.

You might also consider implementing your language directly as a front-end to GCC or LLVM, without transpiling to C or C++. LLVM was designed for this purpose, intended to make implementing new languages easy, and still taking advantage of modern optimization approaches.