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

413

    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. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      35
      4289
    2. Kuinka kauan

      Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?
      Ikävä
      114
      1586
    3. Milli-helenalla ongelmia

      Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell
      Kotimaiset julkkisjuorut
      248
      1546
    4. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      218
      1400
    5. Mitä siellä ABC on tapahtunut

      Tavallista isompi operaatio näkyy olevan kyseessä.
      Alajärvi
      35
      1266
    6. Ja taas kerran hallinto-oikeus että pieleen meni

      Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ
      Sysmä
      88
      1078
    7. Löydänköhän koskaan

      Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲
      Ikävä
      132
      1072
    8. Kun näen sinut

      tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain
      Ikävä
      47
      1054
    9. Purra saksii taas. Hän on mielipuuhassaan.

      Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht
      Maailman menoa
      267
      1031
    10. Yhdelle miehelle

      Mä kaipaan sua niin paljon. Miksi sä oot tommonen pösilö?
      Ikävä
      62
      994
    Aihe