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

371

    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. Katso: Ohhoh! Miina Äkkijyrkkä sai käskyn lähteä pois Farmi-kuvauksista -Kommentoi asiaa: "En ole.."

      Tämä oli shokkiyllätys. Oliko tässä kyse tosiaan siitä, että Äkkijyrkkä sanoi asioita suoraan vai mistä.... Tsemppiä, Mi
      Tv-sarjat
      130
      4915
    2. Voi kun mies rapsuttaisit mua sieltä

      Saisit myös sormiisi ihanan tuoksukasta rakkauden mahlaa.👄
      Ikävä
      30
      3106
    3. Haluan jutella kanssasi Nainen

      Olisiko jo aika tavata ja avata tunteemme...On niin paljon asioita joihin molemmat ehkä haluaisimme saada vastaukset...O
      Ikävä
      16
      1807
    4. Poliisiauto Omasp:n edessä parkissa

      Poliisiauto oli parkissa monta tuntia Seinäjoen konttorin edessä tänään. Haettiinko joku tai jotain pankista tutkittavak
      Seinäjoki
      22
      1760
    5. Onko mies niin,

      että sinulle ei riitä yksi nainen? Minulle suhde tarkoittaa sitoutumista, tosin eihän se vankila saa olla kummallekaan.
      Tunteet
      18
      1611
    6. Voitasko leikkiä jotain tunnisteleikkiä?

      Tietäisi ketä täällä käy kaipaamassa.. kerro jotain mikä liittyy sinuun ja häneen eikä muut tiedä. Vastaan itsekin kohta
      Ikävä
      71
      1481
    7. Miksi näin?

      Miksi vihervassut haluaa maahan porukkaa jonka pyhä kirja kieltää sopeutumisen vääräuskoisten keskuuteen? Näin kotoutumi
      Maailman menoa
      19
      1237
    8. Armi Aavikko Malmin hautausmaa

      Haudattiinko Armi arkussa Malmin hautausmaalle vai tuhkattiinko hänet? Kuka tietää asiasta oikein?
      Kotimaiset julkkisjuorut
      10
      1223
    9. Haluisin suudella ja huokailla

      ja purra kaulaasi ja rakastella sinua. Haluisin puristella rintojasi ja pakaroitasi. Ei sinulla taida olla kuitenkaan ni
      Ikävä
      16
      1197
    10. Ison Omenan uhri tukahdutettiin kuoliaaksi. Kuolinsyynä sydämen pysähdys.

      Eli naisen hengittäminen estettiin ja tästä oli suorana seurauksena sydämen pysähdys. Ihan oppikirjan mukainen tapaus. H
      Maailman menoa
      17
      1187
    Aihe