Šiandien apžvelgsime būdą, kaip parašyti programos kodą, kurį būtų galima sukompiliuoti su gcc kompiliatoriumi ir interpretuoti su perl. Dauguma galėtų pasakyti, jog tai įgyvendinti nėra sudėtinga, bet ne visi programuotojai galėtų sugalvoti, kaip teisingai parašyti tokią programą.
Apačioje pateikiame sukurtą kodą.
Programa įgyvendinta C programavimo kalba:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int sum=0;
int i;
for (i=1; i<argc; i++)
sum+=atoi(argv[i]);
printf("%d\n", sum);
return 0;
}
Tikriname programos veikimą:
cyber@punk:/opt# gcc test.c -o test1
cyber@punk:/opt# ./test1 -2 15 -13
0
cyber@punk:/opt# ./test1 2 4 6
12
Dabar įgyvendiname tą pačią programą ant perl kalbos:
#!/usr/bin/perl
$sum=0;
foreach (@ARGV) {
$sum+=$_;
}
print "$sum\n";
Vėl tikriname parašytos programos veikimą:
cyber@punk:/opt# perl test.pl 3 15 10 20
48
Dabar galime realizuoti užsibrėžtą užduotį. Žemiau galite pamatyti galutinį kodo realizavimą.
#include <stdio.h>
#include <stdlib.h>
#define $ /* */
#define ARGV argv
#define if($x) int main(int argc, char *argv[])
#define $start 1
#if PERL
sub atoi { $_[0] }
$ argc=@ARGV;
$ start=0;
$ x=1;
#endif
if($x)
{
int $ sum;
int $ i;
$ sum=0;
for ( $ i = $start; $ i < $ argc ; $ i++) {
$ sum += atoi ($ ARGV [$ i]);}
printf("%d\n", $ sum);
exit(0);
}
Testuojam gautuosius rezultatus:
cyber@punk:/opt# perl test4.c 3 15 10 20
48
cyber@punk:/opt# gcc test4.c -o test4
cyber@punk:/opt# ./test4 3 15 10 20
48
Dabar įsigilinkime kokios gudrybės mums leido parašyti tokį kodą, kurį galime įgyvendinti dvejomis programavimo kalbomis.
Perl kalba simbolį # interpretuoja, kaip komentarą iki eilutės pabaigos ir tai mums leidžia naudoti C kalbos komandas, kurias perl kalba ignoruoja.
Perl leidžia padėti tarpo simbolį tarp $ ir kintamojo pavadinimo. Todėl turime naudoti #define $/**/ . Tai leidžia C kalboje interpretuoti kintamuosius $ var, kaip var, o perl kalba jį interpretuos, kaip $ var.
C kalboje kintamieji iš komandinės eilutės priimami ,kaip char *argv[] ,o perl kalboje — ARGV. Šią problemą galime išpręsti su #define ARGV argv.
<C kalboje nulinis argumentas yra programos pavadinimas, o perl kalboje yra pirmasis parametras. Apeiti šį dalyką galima sukuriant start kintamajį, kuris C kalboje nustatomas į vienetą, o perl kalboje į nulį. Šis kodo fragmentas ekranuojamas C direktyvoje, kaip #if PERL.
for ir printf sintaksė tiek C ir perl kalbose yra vienoda, todėl nieko keisti nereikia.
Pasiremta: habrahabr.ru
Komentarų nėra:
Rašyti komentarą