C-kääntäjä: tcc

AppDeveloper

tcc on ilmainen ja open source C -kääntäjä.

Imuroitavissa täältä:

http://bellard.org/tcc/

Toimii linuxissa ja MS-windowsissa.

Windows -version voi kääntää windowsissa, mutta sen kääntämiseksi täytyy asentaa ainakin mingw -versio gcc:stä windowsiin.

ming -ohjeita täältä:

http://www.mingw.org/wiki/HOWTO_Install_the_MinGW_GCC_Compiler_Suite

huom: automaattinen installeri toimii (jos toimii, en ole kokeillut) vain koneessa, jossa on internet -yhteys.

Koska itse käytän tietoturvan takia Windows XP konettani ilman nettiyhteyttä siirtämällä siihen tiedostoja linux -koneeltani, jossa on nettiyhteyskin, niin tulipahan huomattua, että tuosta automaatti-installerista ei ole mitään hyötyä, jos koneella ei ole nettiyhteyttä.

Manuaalinen installointikin on mahdollinen, mutta kommentit dir -nimisistä tiedostoista voi unohtaa, ilmeisesti kuuluvat johonkin jo vanhentuneeseen versioon.

mutta:

Aluksi ongelmana oli se, että gcc:llä käännetty tcc toimii, mutta itsellään käännetty tcc ei toimi, vaan herjaa aina puuttuvista kirjastotiedostoista.

Ongelman syy selvisi lopulta:

tcc:n voi kääntää itselläänkin, mutta ennen kääntämistä on syytä kopioida tcc -paketin mukana tuleva config.h samaan hakemistoon, jossa on tcc:n lähdekoodit (varmuuden vuoksi kopioin tcc:n lähdekoodit uuteen hakemistoon, ja homma alkoi lopulta toimia, kun älysin kopioida myös tuon config.h -tiedoston) !

Siis jos on useampi config.h, niin windowsissa oikea on se, jota win32 -hakemistossa oleva build_tcc.bat haluaa käyttää!

Väärä config.h -tiedosto johtaa siihen, että tcc.exe kyllä syntyy, mutta sillä ei voi käämtää mitään, koska se ei löydä tarvittavia kirjastotiedostoja.

Olettaisin syynä olevan (virheilmoituksen muodosta päätellen) se, että vain oikea config.h -tiedosto tuottaa windows -käyttöjärjestelmää varten oikeanlaisen exe:n.

Vääränlaisen exen saa siis aikaan väärällä config.h -tiedostolla, ja tällöin tcc yrittää käyttää "/" -merkkiä hakemistoerottimena (kuten linuxissa) kun windowsissa "\" olisi oikein. Tämä johtaa siihen, että itse (väärin) käännetty kääntäjä ei löydä tarvitsemiaan kirjastotiedostoja.

Sain siis ongelman lopulta ratkaistua.

Tuo tcc on rakenteeltaan huomattavasti linuxissa käytetyintä gcc:tä yksinkertaisempi ja siten helpompi ymmärtää.

Tarkoitus olisi siis käyttää tuon tcc:n C-kielen parseria muihin tarkoituksiin.

"TCC is distributed under the GNU Lesser General Public License"

tuo LGPL tekee myös mahdolliseksi tcc:n hyödyntämisen omissa projekteissa, kunhan tcc:n mahd. muunnetun version lähdekoodit julkaistaan.

Jos joku kääntäjien sisäistä toimintaa tunteva jaksaa, niin voisi tietysti yrittää selvittää, missä vaiheessa koodia tuo tcc tekee eron seuraavien token:ien välillä:

* (kertolasku)
* (pointer dereference)

& (bittitason AND)
& (address-of)

>> (SHR shift logical right)
>> (SAR shift arithmetical right)

esim. next_no_macro()

tulkitsee tokeniksi:

TOK_A_MUL

kun koodista löytyy:

*=

eli "TOK_A_MUL" on ilmeisesti token, jonka merkitys on "assignment_multiply"

MUTTA:

esim. pelkkä '*' palauttaa tokenina "*" eli tuon '*' -merkin ascii -koodin (42).

Eli siis tuo em. tokenizeri ovelasti jättää tekemättä eron *:lle merkityksessä kertolasku tai sitten merkityksessä "pointer dereference".

Tuo ">>" on noista ilmeisesti hankalin, koska tuon selvittäminen onnistuu ainoastaan pitämällä kirjaa muuttujista ja niiden tyypeistä!

Kääntäjä tämän toki tekeekin, mutta jonkun muun tekemän koodin muuntaminen ja soveltaminen ei aina ole niitä helpoimpia tehtäviä.

Mutta jos haluaisin tehdä ohjelman, joka ottaa INPUTtina C -lähdekoodia ja tuottaa OUTPUTtina muun kielistä lähdekodia (esim Java tai Delphi) niin ehkäpä tcc:n parseria voisi soveltaa tähän.

Kutsun siis C -kieltä osaavat tutustumaan tcc:hen, ja väitän sen olevan C -kääntäjien joukossa turhaan aliarvostettu.

tcc siis:

- on ilmainen

- on avointa lähdekoodia

- Toimii linuxissa

- Toimii MS-windowsissa

- sisäiseltään rakenteeltaan gcc:tä yksinkertaisempi

- pystyy kääntämään esim. linux kernelin (ainakin sen 32 -bittiset osat, kernelissähän on pieni määrä 16 -bittistä koodia, jota tarvitaan 32 -bittisen osan muistiin lataamiseen/alustamiseen ennen kuin 32 -bittinen osa käynnistetään; tosin tähän vaaditaan tcc:lle sovitettu skripti kernelin kääntämiseen, eli kernelin mukana tuleva gcc:tä varten tehty make -systeemi ei toimi tcc:n kanssa)

- on nopeampi kuin tcc

- pystyy myös kääntämään RAMmiin ja haluttaessa suorittamaan "lennossa" juuri käännetyn koodin.

3

451

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • citysen-kane

      tcc (Turbo C) kääntäjäkin menty sössimään.

      Minulla on alkuperäinen Borlandin tcc- ja tc-kääntäjä joitain vuodelta
      miekka ja kilpi (en nyt ala tarkistamaan versiota ja vuotta, on eri koneella)
      mutta se käyttäytyy paljon siistimmin.
      Asentuu kaikkiin Windowseihin tuosta vaan ilman mitään temppuja.
      Linuxista en tiedä, tuskin toimii.

      Teen sillä edelleen pikku apuohjelmia, käännetty exe kun on
      salamannopea.

      • GCC on paras.


    • AppDeveloper

      libtcc.h -tiedosto määrittelee tällaisen funktioprototyypin:

      void tcc_enable_debug() ????

      MUTTA:

      etsin koko hakemiston, ja mistään ko. hakemistossa tai sen alihakemistoissa olevista tiedostoista (muista kuin libtcc.h) EI löydy ko. funktion toteutusta !

      MITEN tuollainen voi mennä kääntäjästä läpi ja tuottaa muuten toimivan .dll -tiedoston, vaikka ko. funktion prototyyppi on annettu .h -tiedostossa mutta funktion toteutusta ei ole määritelty missään ?

      Aluksi ihmettelin, kun delphillä tekemäni ohjelma, joka käyttää tuon libtcc.dll: palveluja, ei suostu käynnistymään.

      Sitten poistin ko. ohjelmasta kaikki tämäntapaiset määritykset:

      /* free a TCC compilation context */
      // void tcc_delete(TCCState *s);

      procedure tcc_delete(State:TCCState); cdecl; external 'libtcc.dll';

      ja korvasin ne koodilla, joka lataa ko. funktiot dynaamisesti vasta suorituksen aikana.

      ks: LoadLibrary, FreeLibrary, GetProcAddress

      Tämän jälkeen alkoi selvitä...

      funktiota tcc_enable_debug ei exportata ko. dll:stä !

      lopuksi keksin vielä tutkia libtcc.def -tiedostoa.

      Myöskään siitä en löytänyt tcc_enable_debug -funktiota.

      Onko C:ssä todella luvallista määritellä .h -tiedostossa jonkin funktion prototyyppi, mutta jättää funktion toteutus kokonaan määrittelemättä?

      Kysymys koskee siis windowsin .dll -tiedoston tuottamista C lähdekoodista C -kääntäjällä (tässä: tcc).

      Toisaalta, gcc:n kääntämänä sama lähdekoodi tuottaa myöskin dll -tiedoston, josta ei löydy tcc_enable_debug -funktiota.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      202
      4218
    2. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      146
      3778
    3. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      99
      3157
    4. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      43
      1589
    5. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      19
      1448
    6. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      34
      1380
    7. Sulla on avaimet ja keinot

      Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi
      Ikävä
      25
      1375
    8. Orpo loukkaantui fasismiin viittaavasta sanavalinnasta

      Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk
      Maailman menoa
      27
      1351
    9. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      116
      1130
    10. Martina haluaa Marbellaan

      Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust
      Kotimaiset julkkisjuorut
      215
      1053
    Aihe