summaryrefslogtreecommitdiff
path: root/content/html/gemfeed/2014-03-24-the-fibonacci.pl.c-polyglot.html
blob: 09b89bd9ec4ce29c7dc7ce0a46e9b62eaaa9676e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>The fibonacci.pl.c Polyglot</title>
<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
<style type="text/css">
body {
    margin: auto;
    max-width: 900px;
    background-color: #FFFFEF;
    border: 1px dashed #880000;
    border-radius: 8px;
    padding: 5px;
}
img {
    display:block;
    max-width: 80%;
}
a.textlink:before {
    content: " ⇒ ";
    padding-left: 2px;
}
a.textlink {
    text-decoration: none;
    color: #FF0000;
}
a.textlink:hover {
    text-decoration: underline;
}
i {
    color: #48AAAD;
}
pre {
    background-color: #F1F8E9;
    border: 1px dashed #BB0000;
    border-radius: 8px;
    padding: 5px;
    font-family: "Lucida Console", "Courier New", monospace;
}
h1 {
    text-align: center;
    color: #880000;
}
h2, h3 {
    color: #BB0000;
}
</style>
</head>
<body>
<h1>The fibonacci.pl.c Polyglot</h1>
<p class="quote"><i>Written by Paul Buetow 2014-03-24</i></p>
<p>In computing, a polyglot is a computer program or script written in a valid form of multiple programming languages, which performs the same operations or output independent of the programming language used to compile or interpret it</p>
<a class="textlink" href="https://en.wikipedia.org/wiki/Polyglot_(computing)">https://en.wikipedia.org/wiki/Polyglot_(computing)</a><br />
<h2>The Fibonacci numbers</h2>
<p>For fun, I programmed my own Polyglot, which is both, valid Perl and C code. The interesting part about C is, that $ is a valid character to start variable names with:</p>
<pre>
#include &lt;stdio.h&gt;

#define $arg function_argument
#define my int
#define sub int
#define BEGIN int main(void)

my $arg;

sub hello() {
	printf("Hello, welcome to Perl-C!\n");
	printf("This program is both, valid C and Perl code!\n");
	printf("It calculates all fibonacci numbers from 0 to 9!\n\n");
	return 0;
}

sub fibonacci() {
	my $n = $arg;

	if ($n &lt; 2) {
		return $n;
	}

	$arg = $n - 1;
	my $fib1 = fibonacci();
	$arg = $n - 2;
	my $fib2 = fibonacci();

	return $fib1 + $fib2;
}

BEGIN {
	hello();
	my $i = 0;

	for ($i = 0; $i &lt;= 10; ++$i) {
		$arg = $i;
		printf("fib(%d) = %d\n", $i, fibonacci());
	}

	return 0;
}
</pre>
<p>You can find the whole source code at GitHub:</p>
<a class="textlink" href="https://github.com/snonux/perl-c-fibonacci">https://github.com/snonux/perl-c-fibonacci</a><br />
<h3>Let's run it with Perl:</h3>
<pre>
❯ perl fibonacci.pl.c
Hello, welcome to Perl-C!
This program is both, valid C and Perl code!
It calculates all fibonacci numbers from 0 to 9!

fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13
fib(8) = 21
fib(9) = 34
fib(10) = 55
</pre>
<h3>Let's compile it as C and run the binary:</h3>
<pre>
❯ gcc fibonacci.pl.c -o fibonacci
❯ ./fibonacci
Hello, welcome to Perl-C!
This program is both, valid C and Perl code!
It calculates all fibonacci numbers from 0 to 9!

fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13
fib(8) = 21
fib(9) = 34
fib(10) = 55
</pre>
<p>It's really fun to play with :-).</p>
<p>E-Mail me your thoughts at comments@mx.buetow.org!</p>
<a class="textlink" href="../">Go back to the main site</a><br />
</body>
</html>