Deutsch English Français Italiano |
<864j98diw3.fsf@linuxsc.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch <tr.17687@z991.linuxsc.com> Newsgroups: comp.lang.c Subject: Re: tcc - first impression. Was: Baby X is bor nagain Date: Mon, 01 Jul 2024 12:14:36 -0700 Organization: A noiseless patient Spider Lines: 158 Message-ID: <864j98diw3.fsf@linuxsc.com> References: <v494f9$von8$1@dont-email.me> <v53lf7$34huc$1@dont-email.me> <v53vh6$368vf$1@dont-email.me> <v54se1$3bqsk$1@dont-email.me> <20240624160941.0000646a@yahoo.com> <v5bu5r$va3a$1@dont-email.me> <20240624181006.00003b94@yahoo.com> <v5c86d$11ac7$1@dont-email.me> <JEheO.108086$ED9b.74955@fx11.iad> <v5cblg$11q0j$1@dont-email.me> <gEieO.108089$ED9b.25598@fx11.iad> <20240625113616.000075e0@yahoo.com> <mUzeO.141609$Cqra.55051@fx10.iad> <v5elql$1jmii$1@dont-email.me> <m3BeO.24907$Gurd.16179@fx34.iad> <v5empd$1jndv$2@dont-email.me> <v5eph4$1k6a9$1@dont-email.me> <87ed8jnbmf.fsf@bsb.me.uk> <v5jhls$2m7np$1@dont-email.me> <867ceadtih.fsf@linuxsc.com> <20240701200924.00003d9a@yahoo.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Mon, 01 Jul 2024 21:14:37 +0200 (CEST) Injection-Info: dont-email.me; posting-host="46a61ee24880567c9c214dab31571310"; logging-data="1275880"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18gXkMxGuXnFJp4otIF65OJN9BVdaqZoBo=" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:ioH6dZNn5Gkzo9MH840ZWIvrdVI= sha1:axbRVZVaNq9ni1HU8DyXcsxXbwI= Bytes: 8325 Michael S <already5chosen@yahoo.com> writes: > On Thu, 27 Jun 2024 13:23:50 -0700 > Tim Rentsch <tr.17687@z991.linuxsc.com> wrote: > >> bart <bc@freeuk.com> writes: >> >>> On 26/06/2024 13:15, Ben Bacarisse wrote: >>> >>>> bart <bc@freeuk.com> writes: >>>> >>>>> On 25/06/2024 16:12, David Brown wrote: >>>> >>>> ... >>>> >>>>>> I /do/ use Python. I use it when it is an appropriate language >>>>>> to use, which is very different circumstances from when I use C >>>>>> (or C++). Different tools for different tasks. >>>>> >>>>> And yet neither of you are interested in answering my question, >>>>> which was why its simplistic bytecode compiler is acceptable in >>>>> this scenario, but would be considered useless if applied to C >>>>> code. >>>> >>>> You throw out a lot of these sorts of question, by which I mean >>>> questions that you either /do/ know the answers to or which you >>>> /should/ know the answers to. >>>> >>>> If a software engineering student asked me this sort of "challenge" >>>> question it would immediately become homework: come up with at >>>> least two scenarios in which a simplistic C bytecode compiler >>>> would be an unacceptable tool to use, and two in which Python with >>>> a trivial bytecode compiler would be an acceptable tool to use. >>>> In each case explain why. Anyone who could not would get marked >>>> down on the course. >>> >>> I'm not sure what you're implying here. >>> >>> Some here are consistently saying that any compiler whose internal >>> processes are not at the scale or depth that you find in >>> professional', 'industrial scale' products like gcc, clang, icc, is >>> not worth bothering with and is basically a useless toy. >> >> After reading the above I decided to try tcc. I used tcc for >> the first time earlier today. >> >> First I tried using tcc for my most recent project. That >> didn't go anywhere, because that project relies on C11, >> and tcc doesn't support C11. >> >> Next I tried using tcc on a small part of my larger current >> project. That test involves compiling one .c file to produce a >> .o file, and linking with several other .o files to produce an >> executable, and running the executable. The .c file being >> compiled uses C99 and doesn't need C11. >> >> The first thing that came up is tcc doesn't support all of >> C99. There are some C99 features that tcc just doesn't >> understand. In this case the infringements were minor so I >> edited the source to work around the missing features. >> >> The second thing to come up is some language incompatibilities. >> There are language features that tcc understands, sort of, >> but implements them in a way that didn't work with my source >> code. To be fair, a case could be made that what tcc does >> conforms to the C standard. However, the code I had before >> works fine with gcc and clang, and doesn't with tcc. Here >> again the changes needed were minor so I edited the source >> to work around the problem. >> >> The third thing to come up was the link step. Compiling the >> one .c file with tcc -- and there are three other .o files >> produced using gcc -- implicated the link step, which needed >> to be done with tcc to avoid some undefined symbols. That >> kind of surprised me; I'm used to being able to mix gcc >> object files and clang object files with no difficulty, >> so having the link step fail caught me off guard. >> >> After taking care of all that the build did manage to produce an >> executable, which appears to have run successfully. >> >> After doing a trial run with the produced executable, I looked at >> the tcc man page. As best I can tell, tcc simply silently >> ignores the -fPIC option. (I didn't test that, I only read what >> the tcc man page says.) That project absolutely relies on -fPIC, >> so if tcc doesn't support it that's a deal breaker. >> >> Not offering any conclusion. Just reporting my experience. > > I tried tcc too. > > 1. It is easy to download. It does not need installation apart from > unzip. I installed tcc on linux by using apt-get. Worked with no problem. > 2. It is very fast. Even when used from makefile, which is not an > optimal mode of use, in my tests more than 3 times faster than MSVC in > non-parallel build and more that twice faster in parallel build on > quad-core CPU. And that on project that spends unproportionally long > time in link. I am ready to believe that on more typical projects > (i.e. more compile time, less link time) the difference would be over > 5x. > For the record, on this project 'gcc -O2' was ~1.7x slower than 'MSVC > -O2' and 'gcc -O0' was ~1.1x slower than 'MSVC -O2'; the later > difference probably because somewhat faster compilation by 'gcc -O0' was > outdone by much slower link. > > 3. Exe is slow, but not slower than gcc -O0. About the same. In this > particular test it meant ~2.5 times slower than optimized gcc or MSVC > binary. I didn't measure the speed either of the compiler or the executable. Apparently tcc doesn't understand -S to produce assembly. > 4. In this particular project I encountered few inconvenient > incompatibilities: > 4.1. no support for %zd and %zu. May be, Linux version is better in that > regard? I tried %zu in tcc on linux and it worked fine. > 4.2. Code like below does not compile. I don't know whether it is legal > 'C' or not, > but gcc, clang and MSVC compilers accept it o.k. > label:int bar; Putting a label on a declaration is not supported in either C99 or C11. Maybe those other compilers are using a later version of C or compiler extensions. Did you use a -std=c?? option, along with -pedantic? I used -std=c99 -pedantic. tcc accepts -std=c11 but it seems to make no difference to what is accepted. > 4.3. c11/c17 things that are supported even by MSVC, which is generally > does not claim full C11 support: > _Alignof() Support issues that came up in my tests: 1. tcc doesn't understand _Generic at all. That is in keeping with tcc claiming to be for C99, since _Generic was added in C11. 2. tcc doesn't understand the simplest form of variably modified types, such as int foo( int n, unsigned v[n] ); 3. A tcc header for <stdarg.h> does give a macro definition for va_end(), but it is not as robust as one would like. > It's close to advertised, i.e. it is not C17, but has few features of > C17. I didn't make any effort to do exhaustive testing. I simply grabbed some C source files I had lying around and tried to compile (and later link) them with tcc.