Kamis, 11 Maret 2010

[II3602]Self Generating Code

Deskripsi untuk tugas keamanan informasi kali ini adalah:
Tugas Anda adalah membuat self-generating code seperti yang ada di paper Ken Thompson, Reflections on Trusting Trust. Bahasa pemrograman bebas.
Awalnya saya cukup yakin dapat membuat program yang dapat meng-generate codenya dengan mudah. Namun setelah beberapa kali percobaan-yang tentu saja gagal-, akhirnya saya baru menyadari bahwa membuat program demikian tidak semudah yang saya bayangkan. Menurut saya, persoalan ini sangat mirip dengan paradox ayam dan telur - mana yang lebih dahulu, ayam atau telur -.

Karena sudah menyerah,akhirnya mencoba googling dan akhirnya mendapat pencerahan mengenai permasalahan ini. Salah satu solusi untuk permasalah ini dikemukakan oleh Williard Van Orman Quine. Setelah membaca penjelasannya, saya kemudian membuat program dalam bahasa C#. Berikut adalah kode programnya:

using System;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
static void tulis(String isi)
{
TextWriter tw = new StreamWriter("program.cs");
foreach (char c in isi)
{
if ((int)c == 94) { tw.WriteLine((char)34 + isi + (char)34); }
else if ((int)c == 42) { tw.Write((char)34); }
else { tw.Write(c); }
}
tw.Close();
}

static void Main()
{
tulis(@"
using System;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
static void tulis(String isi)
{
TextWriter tw = new StreamWriter(*program.cs*);
foreach (char c in isi)
{
if ((int)c == 94) { tw.WriteLine((char)34 + isi + (char)34); }
else if ((int)c == 42) { tw.Write((char)34); }
else { tw.Write(c); }
}
tw.Close();
}

static void Main()
{
tulis(@^);
}
}
}
"
);
}
}
}
Program ini akan menghasilkan sebuah file bernama "Program.cs" yang merupakan source dari program ini sendiri. Sebenarnya logika dari program ini cukup sederhana : program utama hanya akan memanggil sebuah fungsi tulis yang memiliki masukan bertipe string; fungsi tulis ini akan mencetak tiap karakter dalam string masukan; jika karakter yang akan dicetak adalah ^(nomor ASCII = 94), maka yang dicetak adalah quote(nomor ASCII = 34), string masukan dan quote lagi, bila karakter yang dicetak adalah *(nomor ASCII=42), maka yang dicetak adalah quote; jika bukan ^ dan * maka cetak karakter tersebut.

Bagi yang tertarik ingin mencoba bisa programnya di sini. -Untuk menjalankannya, pastikan komputer anda sudah terinstal .NET Framework 3.5-

Tidak ada komentar: