Difference between revisions of "Program/fi"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{Program}} '''Program''' on joko suoritettava ohjelma, eli täydellinen ajettava sovellus, tai se on Pascal Sour...")
 
 
Line 4: Line 4:
  
 
== Pääohjelma ==
 
== Pääohjelma ==
Sana <syntaxhighlight lang="pascal" enclose="none">program</syntaxhighlight> on [[Reserved word/fi|varattu sana]]
+
Sana <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> on [[Reserved word/fi|varattu sana]]
 
sillä voidaan esitellä klassisen ohjelman lähdekoodin:
 
sillä voidaan esitellä klassisen ohjelman lähdekoodin:
 
<syntaxhighlight lang="pascal" highlight="1">
 
<syntaxhighlight lang="pascal" highlight="1">
Line 16: Line 16:
 
Käännöstiedoston nimi määräytyy lähdekooditiedoston nimen perusteella. Ohjelman nimestä tulee kuitenkin varattu [[Identifier/fi|tunniste]]. Jos edellä olevassa esimerkissä, esim. yritetään määritellä joku muu hiWorld-niminen tunniste niin se aiheuttaa kaksoiskappale [[Compile time/fi|käännösaikaisen]] virheen.
 
Käännöstiedoston nimi määräytyy lähdekooditiedoston nimen perusteella. Ohjelman nimestä tulee kuitenkin varattu [[Identifier/fi|tunniste]]. Jos edellä olevassa esimerkissä, esim. yritetään määritellä joku muu hiWorld-niminen tunniste niin se aiheuttaa kaksoiskappale [[Compile time/fi|käännösaikaisen]] virheen.
  
Tiedoston kuvauksen luettelo jätetään kokonaan huomiotta, paitsi [[Mode iso|<syntaxhighlight lang="pascal" enclose="none">{$mode ISO}</syntaxhighlight>]].  
+
Tiedoston kuvauksen luettelo jätetään kokonaan huomiotta, paitsi [[Mode iso|<syntaxhighlight lang="pascal" inline>{$mode ISO}</syntaxhighlight>]].  
[[Text|<syntaxhighlight lang="pascal" enclose="none">Text</syntaxhighlight>]] [[Variable/fi|muuttujat]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" enclose="none">input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" enclose="none">output</syntaxhighlight>}} ja {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" enclose="none">stderr</syntaxhighlight>}} avataan aina ja niiden nimiä ei voi muuttaa muissa tiloissa. (vrt. {{Doc|package=RTL|unit=system|identifier=sysinitstdio|text=<syntaxhighlight lang="pascal" enclose="none">SysInitStdIO</syntaxhighlight>}}  
+
[[Text|<syntaxhighlight lang="pascal" inline>Text</syntaxhighlight>]] [[Variable/fi|muuttujat]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" inline>input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" inline>output</syntaxhighlight>}} ja {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" inline>stderr</syntaxhighlight>}} avataan aina ja niiden nimiä ei voi muuttaa muissa tiloissa. (vrt. {{Doc|package=RTL|unit=system|identifier=sysinitstdio|text=<syntaxhighlight lang="pascal" inline>SysInitStdIO</syntaxhighlight>}}  
 
kutsutaan aina [https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/linux/system.pp?view=markup#l367 <tt>rtl/linux/system.pp</tt>])
 
kutsutaan aina [https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/linux/system.pp?view=markup#l367 <tt>rtl/linux/system.pp</tt>])
  
Line 31: Line 31:
 
Ohjelmatiedoston on noudatettava tiettyä [[Program Structure|rakennetta]].
 
Ohjelmatiedoston on noudatettava tiettyä [[Program Structure|rakennetta]].
 
# Program otsikko (Riippuen käytetystä kääntäjästä. Voi olla mahdollisesti valinnainen).
 
# Program otsikko (Riippuen käytetystä kääntäjästä. Voi olla mahdollisesti valinnainen).
# Käytössä voi olla enintään yksi [[Uses/fi|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-lauseke]] ja sen on oltava ohjelman yläosassa heti ohjelman otsikon (program) jälkeen.
+
# Käytössä voi olla enintään yksi [[Uses/fi|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-lauseke]] ja sen on oltava ohjelman yläosassa heti ohjelman otsikon (program) jälkeen.
# Vain yksi [[Block|lohko]], joka päättyy <syntaxhighlight lang="pascal" enclose="none">end.</syntaxhighlight>  (huomaa [[period/fi#Modulin loppu|piste]]). Tämä lohko voi sisältää - toisin kuin tavallisissa lohkoissa - <syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-osion(osiot)
+
# Vain yksi [[Block|lohko]], joka päättyy <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>  (huomaa [[period/fi#Modulin loppu|piste]]). Tämä lohko voi sisältää - toisin kuin tavallisissa lohkoissa - <syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>-osion(osiot)
Eri osioiden tarkka järjestys ja lukumäärä (vapaaehtoinen) <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-lausekkeen jälkeen, kunnes lopullinen kokoomalauseke [[Begin|<syntaxhighlight lang="pascal" enclose="none">begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" enclose="none">end.</syntaxhighlight>]] on vapaa.  
+
Eri osioiden tarkka järjestys ja lukumäärä (vapaaehtoinen) <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-lausekkeen jälkeen, kunnes lopullinen kokoomalauseke [[Begin|<syntaxhighlight lang="pascal" inline>begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>]] on vapaa.  
 
On kuitenkin joitakin huomioitavia näkökohtia.
 
On kuitenkin joitakin huomioitavia näkökohtia.
* [[Type/fi|<syntaxhighlight lang="pascal" enclose="none">type</syntaxhighlight>-osio]] tulee ennen kaikkia niitä osioita, jotka voivat käyttää tyyppejä, esim. [[Var/fi|<syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-osiot]] tai [[Routine/fi|rutiinien]] määrittelyt.
+
* [[Type/fi|<syntaxhighlight lang="pascal" inline>type</syntaxhighlight>-osio]] tulee ennen kaikkia niitä osioita, jotka voivat käyttää tyyppejä, esim. [[Var/fi|<syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-osiot]] tai [[Routine/fi|rutiinien]] määrittelyt.
* Koska [[Goto|<syntaxhighlight lang="pascal" enclose="none">goto</syntaxhighlight>]] tunnetaan ''paholaisen'' työkaluna, [[Label|<syntaxhighlight lang="pascal" enclose="none">label</syntaxhighlight>-osio]], jos sellainen on, on mahdollisimman lähellä lausekehystä, jonka sen on tarkoitus määritellä label:lle
+
* Koska [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]] tunnetaan ''paholaisen'' työkaluna, [[Label|<syntaxhighlight lang="pascal" inline>label</syntaxhighlight>-osio]], jos sellainen on, on mahdollisimman lähellä lausekehystä, jonka sen on tarkoitus määritellä label:lle
* Yleensä siirrytään yleisistä erityispiirteiseen: Esimerkiksi <syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-osio tulee [[Threadvar|<syntaxhighlight lang="pascal" enclose="none">threadvar</syntaxhighlight>-osion]] eteen. [[Const/fi|<syntaxhighlight lang="pascal" enclose="none">const</syntaxhighlight>-osio]] tulee ennen [[Resourcestring/fi|<syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-osiota]].
+
* Yleensä siirrytään yleisistä erityispiirteiseen: Esimerkiksi <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-osio tulee [[Threadvar|<syntaxhighlight lang="pascal" inline>threadvar</syntaxhighlight>-osion]] eteen. [[Const/fi|<syntaxhighlight lang="pascal" inline>const</syntaxhighlight>-osio]] tulee ennen [[Resourcestring/fi|<syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>-osiota]].
* <syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-osiot voivat olla joko staattisia tai globaaleja, mikä tarkoittaa, että niiden pitäisi näkyä suhteellisen pian <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-lausekkeen jälkeen.
+
* <syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>-osiot voivat olla joko staattisia tai globaaleja, mikä tarkoittaa, että niiden pitäisi näkyä suhteellisen pian <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-lausekkeen jälkeen.
* [[Global variables/fi|Globaalien muuttujien]] suoraa käyttöä rutiineissa (tai jopa pelkkää mahdollisuutta) pidetään huonona tyylinä. Sen sijaan julkista / määritä ne rutiinien <syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-osiossa. (varovaisuus: toista se turvallisesti ja aseta <syntaxhighlight lang="pascal" enclose="none">{$writeableConst off}</syntaxhighlight>).
+
* [[Global variables/fi|Globaalien muuttujien]] suoraa käyttöä rutiineissa (tai jopa pelkkää mahdollisuutta) pidetään huonona tyylinä. Sen sijaan julkista / määritä ne rutiinien <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-osiossa. (varovaisuus: toista se turvallisesti ja aseta <syntaxhighlight lang="pascal" inline>{$writeableConst off}</syntaxhighlight>).
* [[global compiler directives/fi|Globaalit kääntäjän ohjeet]], erityisesti sellaiset, jotka sallivat tai rajoittavat sitä, mitä voidaan kirjoittaa (esim. <syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight> joka sallii goto-käskyn käytön) tai implisiittisesti lisätä yksikköriippuvuuksia, kuten [[Mode ObjFPC|<syntaxhighlight lang="pascal" enclose="none">{$mode objfpc}</syntaxhighlight>]] pitäisi näkyä pian ohjelman otsikon jälkeen.
+
* [[global compiler directives/fi|Globaalit kääntäjän ohjeet]], erityisesti sellaiset, jotka sallivat tai rajoittavat sitä, mitä voidaan kirjoittaa (esim. <syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight> joka sallii goto-käskyn käytön) tai implisiittisesti lisätä yksikköriippuvuuksia, kuten [[Mode ObjFPC|<syntaxhighlight lang="pascal" inline>{$mode objfpc}</syntaxhighlight>]] pitäisi näkyä pian ohjelman otsikon jälkeen.
  
Kun otetaan huomioon kaikki näkökohdat niin karkea ohjelmarakenne näyttää tältä (paitsi <syntaxhighlight lang="pascal" enclose="none">label</syntaxhighlight> ja [[sGoto|<syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight>]], jotka mainitaan vain täydellisyyden vuoksi):
+
Kun otetaan huomioon kaikki näkökohdat niin karkea ohjelmarakenne näyttää tältä (paitsi <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> ja [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight>]], jotka mainitaan vain täydellisyyden vuoksi):
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
program sectionDemo(input, output, stderr);
 
program sectionDemo(input, output, stderr);

Latest revision as of 17:16, 6 August 2022

Deutsch (de) English (en) suomi (fi) français (fr) Bahasa Indonesia (id) italiano (it) português (pt) русский (ru)

Program on joko suoritettava ohjelma, eli täydellinen ajettava sovellus, tai se on Pascal -lähdekooditiedoston tai tiedostojen osa, jotka voidaan kääntää ja joita ei määritelty käännösyksikköksi (unit) tai kirjastoksi. Tätä kutsutaan joskus pääohjelmaksi.

Pääohjelma

Sana program on varattu sana sillä voidaan esitellä klassisen ohjelman lähdekoodin:

program hiWorld(input, output, stderr);

begin
	writeLn('Hi!');
end.

Koska FPC hylkää ohjelman otsikon, eli ensimmäisen rivin. Käännöstiedoston nimi määräytyy lähdekooditiedoston nimen perusteella. Ohjelman nimestä tulee kuitenkin varattu tunniste. Jos edellä olevassa esimerkissä, esim. yritetään määritellä joku muu hiWorld-niminen tunniste niin se aiheuttaa kaksoiskappale käännösaikaisen virheen.

Tiedoston kuvauksen luettelo jätetään kokonaan huomiotta, paitsi {$mode ISO}. Text muuttujat input, output ja stderr avataan aina ja niiden nimiä ei voi muuttaa muissa tiloissa. (vrt. SysInitStdIO kutsutaan aina rtl/linux/system.pp)

Näin ollen FPC:ssa seuraava kokonainen lähdekoodin esimerkki kääntyy identtisesti kuten edellinen esimerkki.

begin
	writeLn('Hi!');
end.

Ohjelman rakenne

Ohjelmatiedoston on noudatettava tiettyä rakennetta.

  1. Program otsikko (Riippuen käytetystä kääntäjästä. Voi olla mahdollisesti valinnainen).
  2. Käytössä voi olla enintään yksi uses-lauseke ja sen on oltava ohjelman yläosassa heti ohjelman otsikon (program) jälkeen.
  3. Vain yksi lohko, joka päättyy end. (huomaa piste). Tämä lohko voi sisältää - toisin kuin tavallisissa lohkoissa - resourcestring-osion(osiot)

Eri osioiden tarkka järjestys ja lukumäärä (vapaaehtoinen) uses-lausekkeen jälkeen, kunnes lopullinen kokoomalauseke beginend. on vapaa. On kuitenkin joitakin huomioitavia näkökohtia.

  • type-osio tulee ennen kaikkia niitä osioita, jotka voivat käyttää tyyppejä, esim. var-osiot tai rutiinien määrittelyt.
  • Koska goto tunnetaan paholaisen työkaluna, label-osio, jos sellainen on, on mahdollisimman lähellä lausekehystä, jonka sen on tarkoitus määritellä label:lle
  • Yleensä siirrytään yleisistä erityispiirteiseen: Esimerkiksi var-osio tulee threadvar-osion eteen. const-osio tulee ennen resourcestring-osiota.
  • resourcestring-osiot voivat olla joko staattisia tai globaaleja, mikä tarkoittaa, että niiden pitäisi näkyä suhteellisen pian uses-lausekkeen jälkeen.
  • Globaalien muuttujien suoraa käyttöä rutiineissa (tai jopa pelkkää mahdollisuutta) pidetään huonona tyylinä. Sen sijaan julkista / määritä ne rutiinien var-osiossa. (varovaisuus: toista se turvallisesti ja aseta {$writeableConst off}).
  • Globaalit kääntäjän ohjeet, erityisesti sellaiset, jotka sallivat tai rajoittavat sitä, mitä voidaan kirjoittaa (esim. {$goto on} joka sallii goto-käskyn käytön) tai implisiittisesti lisätä yksikköriippuvuuksia, kuten {$mode objfpc} pitäisi näkyä pian ohjelman otsikon jälkeen.

Kun otetaan huomioon kaikki näkökohdat niin karkea ohjelmarakenne näyttää tältä (paitsi label ja {$goto on}, jotka mainitaan vain täydellisyyden vuoksi):

program sectionDemo(input, output, stderr);

// global compiler directives ----------------------------
{$mode objfpc}
{$goto on}

uses
	sysutils;

const
	answer = 42;

resourcestring
	helloWorld = 'Hello world!';

type
	primaryColor = (red, green, blue);

procedure doSomething(const color: primaryColor);
begin
end;

// M A I N -----------------------------------------------
var
	i: longint;

threadvar
	z: longbool;

label
	42;
begin
end.

[Esimerkissä tietoisesti jätetään huomiotta mahdollisuus kirjoittaa “typed constants”, eli tartutaan pikemminkin perinteisiin käsitteisiin kuin tarpeettomasti sekoitetaan aloittelijoita]

Katso myös