blob: ab0a162a5b42bb54a9f0fc84cf5f112f7a76f4e8 (
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
<!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;
padding-left: 10px;
padding-right: 10px;
max-width: 900px;
font-family: sans-serif;
font-size: 18px;
background-color: #222;
color: #ffffef;
}
h1,h2,h3 {
color: #ffa500
}
a {
color: #0ca;
text-decoration: none;
}
a:hover {
color: #c0f;
text-decoration: none;
}
li {
color: #00bcd4;
}
img {
max-width: 600px;
max-height: 400px;
display: block;
margin: auto;
}
pre {
display: block;
background-color: #111;
color: #66cdaa;
padding: 5px;
overflow-x: auto;
}
a.textlink:before {
content: " ⇒ ";
padding-left: 2px;
}
p.quote {
color: #82eefd;
}
p.quote:before {
content: " « ";
padding-left: 2px;
}
p.quote:after {
content: " » ";
padding-right: 2px;
}
</style>
</head>
<body>
<h1>The fibonacci.pl.c Polyglot</h1>
<p class="quote"><i>Published 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 exciting part about C is that $ is a valid character to start variable names with:</p>
<pre>
#include <stdio.h>
#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 < 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 <= 10; ++$i) {
$arg = $i;
printf("fib(%d) = %d\n", $i, fibonacci());
}
return 0;
}
</pre>
<p>You can find the full source code at GitHub:</p>
<a class="textlink" href="https://codeberg.org/snonux/perl-c-fibonacci">https://codeberg.org/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 entertaining 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>
|