7 , 2 byte
7 menggunakan set karakter 3-bit, tetapi mengambil input yang dikemas ke dalam byte (dan menurut meta, bahasa dengan set karakter sub-byte dihitung menggunakan byte untuk file pada disk ). Berikut adalah xxd
dump program:
00000000: 4cf4 L.
Saat memberikan file ini ke 7 interpreter, itu akan menampilkan program berikut:
00000000: 4fa6 7f O..
yang kemudian akan menampilkan program aslinya lagi.
Jadi apa yang terjadi di sini? Tidak ada pembacaan sumber yang terlibat (sebenarnya, saya tidak berpikir itu mungkin untuk membaca sumber dalam 7), meskipun bisa dibilang program ini curang dengan cara lain; biarkan aku tahu apa yang kamu pikirkan. Begini cara program bekerja. (Perhatikan bahwa setiap perintah 7 memiliki dua varian, beberapa di antaranya tidak memiliki nama dan tidak dapat muncul dalam program asli. Ada dua belas perintah total, dalam enam pasangan. Saya menggunakan huruf tebal untuk perintah aktif, nonbold untuk pasif perintah, dan dalam kasus di mana perintah aktif tidak memiliki nama, saya memberinya nama yang sama dengan perintah pasif yang sesuai dan bergantung pada huruf tebal untuk membedakan. Dalam kasus di mana keduanya bernama, misalnya 7
yang merupakan varian aktif dari1
, setiap perintah mendapatkan namanya sendiri dan huruf tebal hanya penyorotan sintaks.)
231 7 23 Program asli, dibongkar menjadi oktal
231 Dorong 237 ke tumpukan
23 Dorong 23 ke tumpukan
(implisit) menambahkan salinan bagian atas tumpukan ke program
2 Duplikat atas tumpukan (saat ini 23 )
3 Keluaran atas tumpukan, pop elemen tumpukan kedua
Pada titik ini, 7 penerjemah melihat bahwa bagian atas tumpukan berisi perintah ( 2
dan 3
) yang tidak dapat diwakili, sehingga lolos dari bagian atas tumpukan, menghasilkan 723
(yang mana). Output perintah pertama memilih format output; dalam hal ini, formatnya 7, "format output dengan cara yang sama seperti program". Jadi perintah mendapatkan output dikemas dalam byte. Kemudian program berlanjut:
231 7 23 23
(implisit) menambahkan salinan bagian atas tumpukan ke program
2 Duplikat atas tumpukan (saat ini 237 )
3 Keluaran atas tumpukan, pop elemen tumpukan kedua
7 Dorong elemen kosong ke tumpukan
Pada titik ini, tidak ada yang lain selain elemen stack kosong pada stack, sehingga program keluar. Kami output 23
sebelumnya. Jika kita melarikan diri 237
(dan kita harus, karena itu berisi perintah yang tidak terwakili), kita dapatkan 7231
. Itu mendapatkan output secara langsung, membuat output akhir dari program 237231
(diformat dengan cara yang sama seperti program, yaitu dikemas dalam byte). Itu 4fa67f
. (Dapat dicatat bahwa 1
sepenuhnya tidak ada gunanya dalam hal mempengaruhi output; satu-satunya alasan di sana adalah untuk membuat dua program berbeda.)
Menjalankan 237231
menghasilkan hampir dengan cara yang persis sama; perbedaannya adalah bahwa sia-sia 1
berjalan tepat setelah cetakan pertama (dan elemen kosong akan dihapus secara implisit saat kedua akhir program saat ini tercapai). Sekali lagi, 231
akhirnya keluaran itu sendiri, 23
akhirnya keluaran itu sendiri didahului oleh 7
, dan kita dapatkan 231723
, program aslinya.
Pengamat mungkin mencatat bahwa kedua program, meskipun memiliki panjang yang sama dalam oktal "asli" bahasa, adalah panjang yang berbeda pada disk. Itu karena program 7 dapat diisi dengan angka 1 bit sewenang-wenang, dan format yang dikemas membuang lapisan tambahan. Begini cara encoding terjadi:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Dengan kata lain, dua byte, 4C
F4
cukup untuk mewakili program, jadi hanya itu yang saya gunakan.