Page 1 of 2

Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 6:31 pm
by Cérebro
Pienen tutkinnan ja haxoroinnin jälkeen, olen saanut nostettua CoolBasicin kääntäjän funktiorajaa (127 -> 9999).
Lupa julkaisuun on saatu Zerolta.
Modatulla versiolla käännetyistä ja modatun version bugeista ei pidä valittaa Zerolle, vaan minulle (tässä topicissa).
Tämä siis ei ole virallinen julkaisu, vaan harrastelijamodaus.

CBCompiler_modded.zip
CBCompiler_safe.zip (Safe-versio, funktioraja 2000)
Purkakaa CBCompiler_modded.zip ja kopioikaa CBCompiler.exe CoolBasicin IDE-kansioon korvaten alkuperäisen kääntäjän (josta voi/kannattaa tietenkin ottaa varmuuskopio).

EDIT: Funktiorajaa pienennetty bugin takia.
EDIT 2: Lisätty safe-versio (funktioraja 2000).

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 8:50 pm
by phons
Jes. hyvin toimii... Testasin incluudaamalla kaikki SDK:t ja cbNetwork:n päälle. Siinä pitäisi olla yli 127.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 9:20 pm
by MaGetzUb
Woah, Mahtavaa!!! :D Kerrankin jotain todella hyödyllistä, kiitos! :)
EDIT:

Olisit nostanut sen niin korkealle, kuin 32bittiset numerot riittävät(2 147 483 647).. :D


Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 9:32 pm
by Cérebro
programmer of DSG wrote:Woah, Mahtavaa!!! :D Kerrankin jotain todella hyödyllistä, kiitos! :)
EDIT:

Olisit nostanut sen niin korkealle, kuin 32bittiset numerot riittävät(2 147 483 647).. :D

Se ei ole mahdollista sen takia, että CoolBasicin kääntäjä on tehty Visual Basicilla, joka kaatuu muistin loppumiseen jostain syystä liian isoilla luvuilla. Sen lisäksi niin suuri määrä veisi paljon enemmän muistia ja aiheuttaisi jumittelua. Ja kukaan ei varmaan tarvitsisi niin montaa funktiota.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 9:32 pm
by Jani
programmer of DSG wrote:Woah, Mahtavaa!!! :D Kerrankin jotain todella hyödyllistä, kiitos! :)
EDIT:

Olisit nostanut sen niin korkealle, kuin 32bittiset numerot riittävät(2 147 483 647).. :D

Cérebro kertoi tästä. Ohjelma menee kuulemma aivan liian hitaaksi.

Oli muuten hieno modaus.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 10:48 pm
by SPuntte
Todella mielenkiintoista. Vaikuttaa ainakin todella hienolta. Tein kuitenkin patologista tutkimusta ja löysin älyttömän friikin bugin, joka ilmeisesti on jotain ihan CB:stä itsestään johtuvaa. Kukaan tuskin tarvitsee 16000 funktiota, mutta olipa ihan pakko kokeilla. Kokeilkaapas kääntää ja ajaa tämän koodin generoima lähdekoodi:

Code: Select all

Const FUNC = 16000

filu = OpenToWrite("funktiotesti.cb")

WriteLine filu, Chr(47) + Chr(47) + "This file contains " + FUNC + " functions."
WriteLine filu, ""
For i = 1 To FUNC
    WriteLine filu, "f" + i + "()"
Next i
WriteLine filu, ""
WriteLine filu, "AddText " + Chr(34) + "DONE!" + Chr(34)
WriteLine filu, "Repeat"
WriteLine filu, "    Drawscreen"
WriteLine filu, "Until Escapekey()"
WriteLine filu, ""
For i = 1 To FUNC
    WriteLine filu, "Function f" + i + "()"
    WriteLine filu, "    ClearText"
    WriteLine filu, "    AddText " + Chr(34) + "Function number " + i + " called." + Chr(34)
    WriteLine filu, "    DrawScreen"
    WriteLine filu, "EndFunction"
    WriteLine filu, ""
Next i

CloseFile filu
Ohjelman (siis sen, jonka tämä koodi generoi) on siis tarkoitus olla vain kasa funktioita, joita kutsutaan vuoronperään. Jokainen funktio tulostaa oman järjestyslukunsa, ei muuta. Kuitenkin (ainakin minun koneellani) Tulostus alkaa suoraan 10000:sta, ei luvusta (eli funktiosta) 1. Ja mikä edelleen vain oudompaa, on se, että kun saavutetaan funktio 16000, homma alkaa alusta, muttei taaskaan funktiosta 1, vaan 6000. Tätä kierto ilmeisesti näyttäisi jatkuvan loputtomiin (en jaksanut kuin kaksi ympäripyörähdystä katsoa), vaikka itse generoitua lähdekoodia vilkaisemalla näkee selvästi, että funktiot pitäisi kutsua kerran järjestyksessä 1:stä 16000:een. Pienemmällä funktiomäärällä (kokeilin 512) homma toimii, kuten intuitiivisesti ajatellen pitäisikin.

Että näin :mrgreen:
Kiitoksia joka tapauksessa nykyisen CB:n eliniän pidentämisestä o/

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 11:20 pm
by Jani
- Luen taas liian hutaisten... :roll:

Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 11:27 pm
by Viltzu
Miten niin niitä ei muka suljeta? Suljetaanhan ne.
Ja näyttäisi ihan toimivalta, tosin CB jummas niin paljon että en jaksanut odottaa kun testasin tuota SPuntten ohjelmaa. :D
EDIT:

Code: Select all

WriteLine filu, "EndFunction"
[/edit]
EDIT:

Niin, sanoin vähän sekavasti: Tarkoitin että ei tule virhettä 127 funktiosta, mutta en jaksanut odottaa, että SPuntten ohjelma kääntysi. :P


Re: Modattu CB (funktiorajaa nostettu)

Posted: Fri May 08, 2009 11:53 pm
by SPuntte
Viltzu wrote:Ja näyttäisi ihan toimivalta, tosin CB jummas niin paljon että en jaksanut odottaa kun testasin tuota SPuntten ohjelmaa. :D
Se ON toimiva, kääntämisessä vaan menee jokunen minuutti, ehkä parisen kymmentä jopa.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 12:20 am
by Jare
Kuulostaa erittäin hyvältä!

Mutta ennen kuin lataan sen, olisi hauska kuulla, millainen tuo muutos on käytännössä. Mistä funktioraja ylipäätään johtui?

Enivei. Tekeepä tuo mitätahansa, niin se varmasti auttaa paljon erästä peliprojektiani, joka on kärsinyt funktiorajasta jo lähes kolme vuotta. 8-)

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 12:24 am
by MaGetzUb
Ehmm..
Aviran Antivirus Scannasi paketin ja näin kävi:
Eli Tr/Dropper.Gen Trojan löytyi.. :shock: Mitenköhän on mahdollista?.. Avira on melko luotettavasta päästä..

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 12:40 am
by Ris
programmer of DSG wrote:Ehmm..
Aviran Antivirus Scannasi paketin ja näin kävi:
Eli Tr/Dropper.Gen Trojan löytyi.. :shock: Mitenköhän on mahdollista?.. Avira on melko luotettavasta päästä..
En usko että tuo on mikään haitallinen. Käsittääkseni tuo on exen pakkaukseen(ko?) liittyvä juttu.
Edit: http://www.ohjelmointiputka.net/keskust ... nnus=17960

Mutta juu, hyvä että funktioraja on muokattu korkeammaksi.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 12:41 am
by Henkru
Hienoa homma tämä on :)

Työ exe ei kyllä mikään troijalainen ole. Ainut skanneri joka tuosta huusi oli Avira. Avast, F-Secure, Nortton AVG, Kapersky... eivät löytäneet mitään ;)

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 1:50 am
by MaGetzUb
Kiitos selvennyksestä, meinas olla sydärin paikka ku näki, että Avira huomas jotain kummallista, Norttoni ei tosin minulla sanonut mitään. :)
Nyt saa paljo kivemmasti tehdä kaikkia erikois efektejä funktioilla ja includettaa isompia kirjastoja ilman pelkoa että funktioraja täyttyy, se on tosi hyvä asia. Kiitos! :)

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 1:51 am
by ezbe
Hieno homma tuo funktiorajan nosto, tästä olisi ollut itsellekin hyötyä aikanaan. Nykyään ei CB:hen kyllä tule koskettua, mutta pitihän tätä tietysti kokeilla. Mukava nähdä että CB:tä pidetään vielä hengissä ja parannellaan, vaikka nykyisen version virallinen ylläpito ilmeisesti onkin jo loppunut aikaa sitten, kaikennäköisiä dll-kikkailuitakin on ilmeisesti alkanut valua käyttäjien saataville. Funktiorajan nosto avaa myös mahdollisuuden suurempien apukirjastojen tekemiseen ja käyttämiseen.

Kokeilin itsekkin SPunten koodilla luotua 16000 funktion sorsaa, ja kääntämiseen meni arviolta vajaa 25 minuuttia (Q8200/2.33GHz), tosin virransäästötilassa, jossa kellotaajuus lienee hivenen normaalia matalampi. Funktiosta 10000 tosiaan 16000 funktion systeemi lähtee laskemaan, kokeilin sitä myös 15999 funktiolla, mutta tulos oli sama (ja siinäkin kääntö kesti sen n. 20-25min). 1024:llä funktiolla kääntöaika jäi alle 10 sekunnin ja suoritus alkoi funktiosta 1 kuten pitääkin. 4096:lla funktiolla kääntöaika oli ehkä reilua minuuttia, toiminta taas moitteetonta. Ilmeisesti suuri funktiomäärä hidastaa esikääntämisvaihetta suhteellisen paljon. Viimeisen kokeen tein 8001:llä funktiolla (päätin kokeilla määränä jotain ei-2:n potenssi -arvoa, tosin tuskinpa tuolla mitään vaikutusta on). Tällä kertaa pidin tarkemmin silmällä kääntöön kuluvaa aikaa ja se oli aika tarkalleen 5min 10s. Tässäkin tapauksessa funktio 1:stä kutsuttiin ensimmäisenä, joten ainakin tuohon 8001:een funktioon asti vaikuttaa toimivan kuten pitää, suurempia määriä en enää jaksanut kokeilla, koska kääntämiseen kuluva aika selkeästi nousee hyvinkin nopeasti funktiomäärän kasvaessa. "Toimiva" yläraja lienee kuitenkin vielä tätäkin korkeampi, kokeilkaapa joku vaikkapa 9999, 10000, 10001, jos löydettäisiin joku tarkka raja.

CB-projektien koot lienevät yleensä suhteellisen pieniä, ja tuo 8000 funktiotakin riittää jo aika valtavaan hässäkkään. Luultavasti koodin rakenne ja kaiken muistaminen (ainakin jos tekemässä on vain yksi henkilö) tulee vastaan jo kauan ennen tuota funktiorajaa. Vaikka koodin laajentaminen ja ylläpitö helpottuu jakamalla se sopivan kokoisiin pieniin palasiin, voi tästä tulla suorituskykyongelmia (tai sitten ei, tietenkään en tiedä miten CB sisäisesti nuo kutsut oikeasti hoitaa), jos kutsuja tehdään paljon. Useimmiten kuitenkin syy hitauteen on aivan muualla kuin pelkissä funktiokutsuissa. Alkuperäinen 128 (vai 127) funktion raja oli turhan rajoittava, joten kyllä tästä varmasti on iloa monille.

Mitä tulee tuohon "troijalaiseen", Comodo varoitti myös alkuperäisestä CBCompilerista (siis uusin versio coolbasic.com:sta), muttei modatusta. En kyllä usko että viralliselta sivustolta ladattu versio oikeaa troijalaista sisältäisi.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 09, 2009 9:52 am
by Cérebro
Jare: Funktioraja (127) oli vain asetettu funktiotaulukon kooksi. Piti vain purkaa kääntäjä UPX:n oikealla versiolla, etsiä 127 ja korvata se ja pakata uudestaan UPX:llä.
Jännän bugin olette löytäneet. Testasin luvut 9999 ja 10000, 10000:lla ilmeni tuo bugi, 9999:llä ei. Ensimmäinen viesti ja paketti on päivitetty.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Thu May 14, 2009 10:51 pm
by Nasse-setä
Huimaa jo päätä kun minä koitan miettiä mihin tarvitsee yli 127 funktiota :roll: ja sitten te vielä puhutte että 8000 saa suht koht kivan... huhhuh :shock:

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 16, 2009 8:14 pm
by Ruuttu
Voisitkohan julkaista tästä vielä sellasen "safe-mode" version missä funktioraja liikkuisi "vain" jossain 2000 paikeilla... Kun skeptikkona tietenkin pohdin että minkähänlainen vaikutus tuolla 8000 korotuksella on muistinkäytön / suorituskyvyn kannalta yms.

Ei pakko, mutta jos sulla on päivässä 24 tuntia liikaa vapaa-aikaa, niin voisit sellaisen ohimennen vääntää.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 16, 2009 9:58 pm
by JATothrim
Ei tuossa tuntunut olevan häikkää. ;) Tein nimittäin seuravan testin:

Code: Select all

'CB Beta 2.43 Compiller Test.
' Testataan kunka "syvä" funktio kutsu voi olla.
' Tämä ohjelma luo koodin joka aloittaa callfunc1
' ja kustuu sitten callfunc2 joka kutsuu callfunc3 jne.
' luotu ohjelma ottaa myös aikaa..
Const KUTSUN_SYVYYS = 9000
test = OpenToWrite("CallStackTest.cb")


For i=1 To KUTSUN_SYVYYS-1
	WriteLine test, "Function callfunc"+i+"()"
	'WriteLine test, "Cls"
	'WriteLine test, "Print "+Chr(34)+"in depths of "+i+Chr(34)
	WriteLine test, "callfunc"+Str(i+1)+"()"
	WriteLine test, "EndFunction"
Next i

WriteLine test, "Function callfunc"+KUTSUN_SYVYYS+"()"
WriteLine test, "Cls"
WriteLine test, "Print "+Chr(34)+"in depths of "+KUTSUN_SYVYYS+Chr(34)
WriteLine test, "Wait 1000"
WriteLine test, "EndFunction"

WriteLine test, "t = timer()"
WriteLine test, "callfunc1()"
WriteLine test, "print "+Chr(34)+"Executed in: "+Chr(34)+"+(timer() - t)+"+Chr(34)+"ms."+Chr(34)
WriteLine test, "waitkey"
CloseFile test
Ohjelma luo CallStackTest.cb tiedoston joka siis pitää koettaa kääntää ja suorittaa. Jos käännös onnistuu, ohjelma kutsuu funktion sisältä toista funktioa 9000 kertaa, ei rekursiivisesti. Kääntämisessä voi mennä tovi. :) Tuloskesta voin sanoa että gosub komenton käyttöä pitäs "herätellä" hieman, se kun on 40% nopeampi.

Re: Modattu CB (funktiorajaa nostettu)

Posted: Sat May 16, 2009 11:23 pm
by KilledWhale
Gosubin käyttö on huomattavisti nopeampaa useasta syystä. Ensinnäkin cb tavukoodia katsottaessa gosub vie 2 komentoa siellä itse hyppy ja return. Funktiot taas vievät n. parametrien määrä * 4 + 2 + 7 komentoa mikä cb:n mittapuulla on jo aivan helvetisti ylimääräistä. Jos jollain on mielenkiintoa kikkailla muistipaloilla ja hajoilla koodatessa gosubia voisi hyödyntää muistipalojen + esikäsittelyn avulla tekemällä inline tyyliset funktiot.

Omassa testissäni funktion kutsuminen 500000 kertaa vei 4672 millisekuntia kun gotolla samaan meni vain 344 millisekuntia. Tosin gotoja käyttäessä ei laiteta pystyyn erillistä pinoa ja tauluja muuttujille mutta eniveis.