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

434

    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. Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa

      En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod
      Ikävä
      22
      5124
    2. Huomenta ihana

      Kauniskasvoinen ihanuus 😘 saan sut vielä
      Ikävä
      25
      4278
    3. Hei rakas...

      Miten on työpäivä sujunut? Rakastan sinua 💗
      Ikävä
      27
      2441
    4. Edelleen sitä on vaikea uskoa

      Että olisit oikeasti rakastunut muhun
      Ikävä
      34
      2234
    5. Toiveikas vai toivoton

      torstai? Ajatuksia?
      Ikävä
      37
      1988
    6. Vitsi mihin menit. Heti takasin.

      Mä näin sut tuu takasin! Oli kiire, niin en ehtiny sin perään!
      Ikävä
      15
      1908
    7. En ole koskaan kokenut

      Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka
      Ikävä
      19
      1587
    8. Mukavaa päivää

      Mun rakkauden kohteelle ❤️ toivottavasti olet onnellinen
      Ikävä
      12
      1521
    9. Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...

      Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons
      Suomalaiset julkkikset
      21
      1237
    10. Kerranki asiat oikein

      Ilkka ja muut pienpuolueeet...teitte hyvän työn kun valitsitte pätevän henkilön virkaan eikä kepulle passelia!! Jatkakaa
      Haapavesi
      10
      1164
    Aihe