Mielenkiinnosta kysyn, että saako C++:lla tehdyn ohjelman toimimaan koneella, millä ei ole käyttöjärjestelmää. Ohjelma olisi käännetty Windowsilla.
Ohjelma olisi jotain tätä tasoa:
#include <stdio.h> int main() { puts("Terve"); }
Vai olisiko juuri niin, että tuon tasoinen ohjelma ei toimisi, vaan pitäisi olla kaikkea lisähärpäkettä mukana?
Ja ennen kuin joku kysyy, mitä tällaisella tekisin, niin vastaus on, että aivan mielenkiinnosta :)
Ei, ei toimi. Ensinnäkin jonkun pitää lukea se binaari jostain muistiin ja hypätä mainin aloituskohtaan. Eiväthän Windowsin ja Linuxinkaan binaarit toimi tuolla tavalla ristiin. Sitten jostakin pitää löytää tuo käytetty puts-funktio, joka siis toimii aivan eri tavalla riippuen siitä, tulostaako se Windowsin komentorivi-ikkunaan, DOSissa suoraan ruudulle vai jossakin muualla jollakin muulla tavalla (mitenhän se nyt Linuxissakaan toimii, mutkikkaampi homma).
Kuitenkin käyttöjärjestelmän voi suurelta osin halutessaan ohjelmoida C++:lla. Assembly on tarpeen muutamassa perustavanlaatuisessa asiassa, loput voi tehdä C++:lla. Kuitenkaan mitään peruskirjastoja ei voi käyttää, ennen kuin on ohjelmoinut ne. :)
Metabolix kirjoitti:
Kuitenkin käyttöjärjestelmän voi suurelta osin halutessaan ohjelmoida C++:lla. Assembly on tarpeen muutamassa perustavanlaatuisessa asiassa, loput voi tehdä C++:lla. Kuitenkaan mitään peruskirjastoja ei voi käyttää, ennen kuin on ohjelmoinut ne. :)
Eli tuohon tarttuen, perusta asmilla, loput millä tahansa, "järjestelmäriippumattomalla" kielellä (ei mtään system() komentoja C:llä esim :)
Mutta tuota
Metabolix kirjoitti:
Ensinnäkin jonkun pitää lukea se binaari jostain muistiin ja hypätä mainin aloituskohtaan. Eiväthän Windowsin ja Linuxinkaan binaarit toimi tuolla tavalla ristiin. Sitten jostakin pitää löytää tuo käytetty puts-funktio, joka siis toimii aivan eri tavalla riippuen siitä, tulostaako se Windowsin komentorivi-ikkunaan, DOSissa suoraan ruudulle vai jossakin muualla jollakin muulla tavalla (mitenhän se nyt Linuxissakaan toimii, mutkikkaampi homma).
ihmettelen. Kyllä sen uskon, ettei toimi, mutta eikös se ole siihen binaariin sisällyttänyt ne kirjastot, ja binaarissa sitten on ne funktiot sen kirjaston sisällyttämisen puolesta, josta se sitten suorittaa halutun komennon?
Edit: asmista sen verran, että olenko siinä oikeassa, että se on käyttöjärjestelmäriippumatonta, eli sama koodi toimisi Windowsilla, Linuxilla, jne. ? (Sitten se mistä riippuu onkin koneen osat.. vai?)
Onhan C:kin järjestelmäriippumaton kieli, vielä asmiakin paremmin, kun vain et käytä yhtäkään sellaista funktiota, jota et ole itse kirjoittanut. Asmiksi C-kääntäjäkin ohjelman kääntää, asm kun on symbolinen konekieli eli samaa tavaraa kuin binaari mutta käsitettävässä muodossa. (Sitten EXEt ja ELF-binaarit ovat oma juttunsa vielä...)
Se, missä määrin kirjasto sisältyy ohjelmaan, riippuu kääntäjästä ja sen asetuksista. Onhan olemassa dynaamisia kirjastoja (DLL), ja vastaavalla tavalla voinee kutsua myös järjestelmän funktioita. Ja mitäpä hyötyä siitä kirjastosta on, jos se on väärään asiaan? Windows-ohjelmassa kirjasto (sikäli kuin se edes exeen kuuluu) osaa tulostaa Windowsin komentorivi-ikkunaan, joka on aivan eri laitos kuin se PC:n tekstitila, johon kone ennen käyttöjärjestelmän lataamista päätyy.
Eli... C++, jne toimii millä tahansa käyttöjärjestelmällä tahi ilman mitään, jos käyttää vain kielen sisään rakennettuja ominaisuuksia? Eli joku ohjelma
struct TIETUE { int pp, kk, vv; }; int main() { TIETUE muuttuja = {27, 12, 2006}; // Mitenköhän sitä tulostaisi? // esim. muuttuja.pp:n return 0; }
Tästä tosiaankin tuli mieleen, että miten pystyisi kirjastoja käyttämättä tekemään funktion, joka tulostaa tekstiä näytölle?
Mutta tuo ylläoleva periaatteessa toimisi, siitä ei kyllä kellekään olisi mitään iloa :)
Periaatteessa joo, paitsi että sinun pitää edelleenkin saada jokin kutsumaan tuota mainia (eli ns. käynnistämään ohjelma). Siihen tarvitset sitä sopivaa asmia (tai käyttöjärjestelmän).
Mitenköhän tuossa tulostaisi... No katso vaikka PutkaOS, http://putkaos.dy.fi/.
Hmm.. Eli ilman asmia (tjs) ei oikein voi tehdä mitään "näkyvää" ohjelmaa ilman käyttistä.
Muuten, en itse asiassa löytänyt tuosta PutkaOS:sta mitään kohtaa, josta lähdekoodin järkevästi saisi, jos se on saatavaksi tarkoitettu :)
Sivun reunassa olisi poikaa "Lataa"-linkki :)
Jos kelpaa vaikkapa GRUB lataajaksi, niin asmia ei tosiaan tarvitse kuin nimeksi.
SVN:llä noita lähdekoodeja jaetaan, kun ne muuttuvat kuitenkin sen verran elävästi, ettei niitä kannata tarkemmin paketoida. Onhan siellä WebSVN.
Kentti kirjoitti:
Muuten, en itse asiassa löytänyt tuosta PutkaOS:sta mitään kohtaa, josta lähdekoodin järkevästi saisi, jos se on saatavaksi tarkoitettu :)
Sivun reunassa olisi poikaa "Lataa"-linkki :)
No tuolla on tuo WebSVN-linkki, jonka takana voi selailla sorsia.
Hommaa joku subversion-clientti ja lataa sorsat sillä.
Mielestäni Lataa-linkille ei olisi mitään käyttöä.
Varsinaista näkemistä ei vielä ole, ja jos on valmis tutkimaan voi samalla vaivalla hommata svn-clientin.
Sorsatkin saattavat päivittyä vähän väliä.
Voisinhan tietenkin tehä skriptin, joka laittaa jonnekkin päivittäisiä svn-snapshotteja muttenpa nyt kuitenkaan taida...
Juu ny löyty :)
En vaan osannu ettiä tuon nimen alta :)
Assembly alkoi kiinnostamaan :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.