Ini adalah perintah prima-gencls yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
gencls - kompiler antarmuka kelas untuk modul inti Prima
RINGKASAN
gencls --h --inc --tml -O -I --depend --sayparent filename.cls
DESKRIPSI
Membuat header dengan makro C dan struktur untuk definisi objek modul inti Prima.
ARGUMEN
gencls menerima argumen berikut:
--h Menghasilkan file .h ( dengan deklarasi untuk dimasukkan dalam satu atau lebih file )
--termasuk
Menghasilkan file .inc ( dengan deklarasi untuk dimasukkan hanya dalam file )
-O Mengaktifkan algoritme pengoptimalan untuk file .inc. Algoritma didasarkan pada asumsi,
bahwa beberapa fungsi dideklarasikan secara identik, oleh karena itu bagian kode yang menangani
parameter dan konversi hasil dapat dibagikan. Dengan bendera "-O" menyala, badan thunk adalah
diganti menjadi panggilan ke suatu fungsi, yang namanya dibuat dari semua parameter metode
ditambah hasil. Fungsi sebenarnya tidak ditulis dalam file .inc, tetapi dalam file .tml. Semua
deklarasi duplikat dari satu set file .tml dapat dihapus dan pengingat
ditulis ke satu file oleh utilitas tmlink.
--tml
Menghasilkan file .tml. Menyalakan "-O" secara otomatis.
-Nama Idir
Menambahkan direktori ke jalur pencarian, tempat utilitas mencari file .cls. Dapat
ditentukan beberapa kali.
--bergantung
Mencetak dependensi untuk file tertentu.
--katakan orang tua
Mencetak induk langsung dari kelas di dalam file yang diberikan.
SINTAKSIS
Singkatnya, sintaks file .cls dapat dijelaskan dengan skema berikut:
[ nol atau lebih deklarasi tipe ]
[deklarasi nol atau satu kelas]
Gencls menghasilkan file .h, .inc atau .tml, dengan nama dasar file .cls, jika tidak ada objek atau
nama paket yang diberikan, atau dengan nama objek atau paket sebaliknya.
Dasar skalar data jenis
Gencls memiliki beberapa tipe data skalar bawaan, yang tahu cara menanganinya. Untuk 'berurusan'
berarti dapat menghasilkan kode yang mentransfer data jenis ini antara C dan Perl,
menggunakan antarmuka perpustakaan XS ( lihat perlguts ).
Jenis-jenisnya adalah:
int
Bodoh
Handle
dua kali lipat
SV*
HV*
karakter *
string (deklarasi C adalah char[256] )
Ada juga beberapa tipe bawaan turunan, yaitu
panjang
pendek
tangki
Warna
U8
yang dipetakan ke int. Data tidak mengalami konversi ke int dalam proses transfer, tapi itu
disimpan sebagai ganti perl skalar menggunakan baruSViv() fungsi, yang, pada gilirannya, mungkin kehilangan bit
atau tanda.
Berasal data jenis
Sintaks untuk definisi tipe data baru adalah sebagai berikut:
Lingkup dapat berupa salah satu dari dua pragma, "global" atau "lokal". Mereka mengisyaratkan penggunaan data baru
type, apakah type tersebut akan digunakan hanya untuk satu objek atau lebih. Penggunaan "lokal" adalah
agak menyerupai C pragma statis. Saat ini satu-satunya perbedaan adalah bahwa fungsi
menggunakan tipe lokal yang kompleks dalam daftar parameter atau sebagai hasilnya bukan subjek untuk
optimasi "-O".
Skalar jenis
Jenis skalar baru hanya dapat disamakan dengan yang sudah ada, terutama untuk pengkodean C
kenyamanan. Jenis skalar dapat didefinisikan dengan dua cara:
Aliasing langsung
sintaks:
$id => ;
Contoh:
global $Menangani => int;
ID tipe baru tidak akan terlihat di file C, tetapi tipenya akan diganti
semua file .cls yang menyertakan definisi ini.
C makro
sintaks:
id1 id2
Contoh:
API_HANDLE UV global
Kode tersebut membuat definisi makro C dalam file header .h dalam bentuk
#tentukan id1 id2
Makro C dengan parameter tidak diperbolehkan. id1 dan id2 tidak wajib hadir
di ruang nama .cls, dan tidak ada penggantian selama pemrosesan file .cls dilakukan. Ini
penggunaan pragma sangat terbatas.
Kompleks jenis
Tipe data yang kompleks dapat berupa array, struct, dan hash. Mereka bisa menjadi kombinasi atau
vektor tipe data skalar (tetapi tidak kompleks).
Gencls memungkinkan beberapa kombinasi tipe data kompleks yang tidak dimiliki bahasa C
mengenali. Ini akan dijelaskan di bawah ini.
Tipe data kompleks tidak diimpor ke kode perl. Seorang programmer perl harus mematuhi
tipe data yang digunakan saat meneruskan parameter ke suatu fungsi.
Array
sintaks:
@Indo [dimensi];
Contoh:
global @FillPattern U8[8];
Contoh fungsi menggunakan array:
Array * func(Array a1, Array * a2);
Kode Perl:
@ret = fungsi( @array1, @array2);
Perhatikan bahwa referensi array tidak digunakan, dan jumlah item di semua array
parameter harus persis seperti dimensi array.
Catatan: deklarasi berikut tidak akan dikompilasi dengan kompiler C, karena C tidak dapat kembali
array. Namun itu tidak diperlakukan sebagai kesalahan oleh gencls:
Fungsi larik();
Struktur
sintaks:
@Indo {
;
...
;
};
Contoh:
global @Struc {
int nomor;
nomor string;
}
Contoh fungsi menggunakan struct:
Struktur * func1( Struktur a1, Struktur * a2);
Struktur fungsi2( Struktur a1, Struktur * a2);
Kode Perl:
@ret = func1( @struc1, @struc2);
@ret = func2( @struc1, @struc2);
Perhatikan bahwa referensi array tidak digunakan, dan baik jumlah maupun urutan item secara keseluruhan
parameter array harus diatur persis seperti dimensi dan urutan struct. Struktur
nama bidang tidak digunakan dalam kode perl juga.
Hash
sintaks:
%Indo {
;
...
;
};
Contoh:
%Hash global {
int nomor;
nomor string;
}
Contoh fungsi menggunakan hash:
Hash * func1(Hash a1, Hash * a2);
Hash func2(Hash a1, Hash * a2);
Kode Perl:
%ret = %{func1( \%hash1, \%hash2)};
%ret = %{func2( \%hash1, \%hash2)};
Perhatikan bahwa hanya referensi hash yang digunakan dan dikembalikan. Ketika sebuah hash dilewatkan dari perl
kode itu mungkin memiliki beberapa atau semua bidang yang tidak disetel. Struktur C diisi dan diteruskan ke a
fungsi C, dan bidang yang tidak disetel ditugaskan ke yang sesuai
Nilai C_TYPE_UNDEF, di mana TYPE adalah salah satu literal NUMERIC, STRING dan POINTER.
Konversi kembali tidak mengandalkan nilai-nilai ini dan selalu mengembalikan semua kunci hash dengan a
pasangan yang sesuai.
Namespace bagian
sintaks:
{
...
}
File .cls dapat memiliki nol atau satu bagian namespace, yang diisi dengan deskripsi fungsi.
Fungsi yang dijelaskan di sini akan diekspor ke ID yang diberikan selama kode inisialisasi. A
namespace dapat berupa "objek" atau "paket".
Sintaks namespace paket hanya mengizinkan deklarasi fungsi di dalam "paket"
blok.
kemasan {
...
}
Sintaks namespace objek mencakup variabel dan properti serta fungsi (
disebut metode dalam sintaks objek). Sintaks namespace objek umum adalah
obyek [(ID kelas induk)] {
}
Dalam ruang nama objek, sintaks pewarisan dapat digunakan:
obyek ( ) { ... }
atau deskripsi objek root telanjang (tanpa leluhur)
obyek { ... }
untuk deklarasi kelas objek.
Fungsi
sintaks:
[ ] ( ) [ => ];
contoh:
int package_func1( int a, int b = 1) => c_func_2;
Titik package_func2( Struc * x, ...);
metode void object_func3( HV * profil);
Awalan digunakan dengan fungsi objek (metode) saja. Lebih lanjut tentang awalan di Metode
bagian.
Suatu fungsi tidak dapat mengembalikan apa pun ( void ), skalar ( int, string, dll ) atau kompleks (
array, hash ) jenis. Itu juga dapat menerima parameter skalar dan kompleks, dengan tipe
konversi yang sesuai dengan aturan yang dijelaskan di atas dalam "Tipe data skalar dasar"
bagian.
Jika suatu fungsi memiliki parameter dan/atau hasil dari tipe yang tidak dapat dikonversi
secara otomatis antara C dan Perl, itu dideklarasikan tetapi tidak diekspos ke namespace Perl. NS
peringatan yang sesuai dikeluarkan. Tidak mungkin menggunakan sintaks gencls untuk mendeklarasikan a
berfungsi dengan parameter khusus atau data hasil. Untuk tujuan seperti itu, C . eksplisit
deklarasi kode bersama dengan panggilan "newXS" harus dilakukan.
Contoh: elipsis (...) tidak dapat diubah oleh gencls, namun merupakan C . yang sah
konstruksi.
Titik package_func2( Struc * x, ...);
Sintaks fungsi memiliki beberapa tambahan kenyamanan:
Nilai parameter default
Contoh:
batalkan fungsi( int a = 15);
Sebuah fungsi yang dideklarasikan sedemikian rupa dapat dipanggil dengan parameter 0 atau 1. Jika memang
dipanggil dengan parameter 0, nilai integer 15 akan digunakan secara otomatis. NS
sintaks memungkinkan parameter default untuk tipe int, pointer dan string dan skalarnya
alias.
Parameter default bisa sebanyak mungkin, tetapi harus di akhir
daftar parameter fungsi. Deklarasi "func( int a = 1, int b)" salah.
Mengasingkan
Dalam kode C yang dihasilkan, fungsi C harus dipanggil setelah parameternya
diuraikan. Gencls mengharapkan fungsi konforman hadir dalam kode C, dengan nama tetap
dan daftar parameter. Namun, jika tugas dari fungsi tersebut adalah pembungkus ke yang identik
fungsi diterbitkan dengan nama lain, aliasing dapat dibentuk sebelumnya untuk menyimpan kode dan
kecepatan.
Contoh:
paket Paket {
void func( int x) => internal;
}
Fungsi yang dideklarasikan dengan cara itu tidak akan memanggil Paket_fungsi() fungsi C, tetapi
intern() fungsi sebagai gantinya. Satu-satunya permintaan adalah itu intern() fungsi harus memiliki
parameter identik dan deklarasi hasil ke a fungsi().
hash sebaris
Cara praktis untuk memanggil fungsi dengan hash sebagai parameter dari Perl telah dirancang. Jika sebuah
fungsi dideklarasikan dengan parameter terakhir atau ketik "HV*", lalu terjemahan parameter
dari Perl ke C dilakukan seolah-olah semua parameter yang dilewatkan adalah hash. hash ini adalah
diteruskan ke fungsi C dan kontennya dikembalikan lalu kembali ke Perl sebagai hash lagi.
Konten hash dapat dimodifikasi di dalam fungsi C.
Deklarasi ini banyak digunakan dalam konstruktor, yang merupakan tipikal kode perl
sub init
{
%ret saya = shift-> SUPER::init( @_);
...
kembalikan %ret;
}
dan kode C biasanya
void Obj_init ( HV * profil) {
mewarisi init( profil);
... [ ubah konten profil ] ...
}
metode
Metode adalah fungsi yang dipanggil dalam konteks suatu objek. Hampir semua metode perlu
memiliki akses ke objek yang mereka hadapi. Objek prima terlihat di C sebagai
Menangani tipe data. Handle seperti itu sebenarnya adalah pointer ke instance objek, yang pada gilirannya
berisi pointer ke tabel metode virtual objek ( VMT ). Untuk memfasilitasi OO-like
sintaks, parameter Handle ini hampir tidak pernah disebutkan di semua metode objek
deskripsi dalam file cls, meskipun dihitung secara implisit, jadi setiap metode cls
pernyataan
metode batal a( int x)
untuk kelas objek Objek direfleksikan dalam C sebagai
void Object_a( Menangani diri sendiri, int x)
deklarasi fungsi. Berlawanan dengan fungsi paket, gencls itu tidak dapat memublikasikan jika
itu tidak dapat menangani yang tidak didukung pada parameter yang tidak dapat dikonversi, ada cara untuk
mengeluarkan deklarasi seperti itu dengan metode. Penggunaan utama untuk itu adalah nama metode get
dicadangkan di VMT objek.
Metode dapat diakses dalam kode C dengan dereferensi nama langsung dari "Handle self" sebagai
struktur yang sesuai:
((( PSampleObject) self)-> self)-> sample_method( self, ...);
Sebuah metode dapat memiliki salah satu dari enam prefiks yang mengatur pembuatan kode C:
metode
Ini adalah jenis metode pertama dan paling dasar. Itu nama awalan, "metode" adalah
oleh karena itu dipilih sebagai nama yang paling deskriptif. Metode diharapkan dikodekan dalam
C, pegangan objek bersifat implisit dan tidak disertakan dalam deskripsi .cls.
metode batal a()
hasil dalam
void Object_a( Menangani diri sendiri)
deklarasi C. Metode yang diterbitkan secara otomatis mengonversi parameternya dan hasilnya
antara C dan Perl.
publik
Ketika metode yang memiliki parameter dan/atau hasil yang tidak dapat secara otomatis
dikonversi antara C dan Perl perlu dideklarasikan, atau deklarasi fungsi tidak
cocok dengan sintaks C, awalan "publik" digunakan. Metode yang dideklarasikan dengan "publik" adalah
diharapkan untuk berkomunikasi dengan Perl melalui antarmuka XS ( lihat perlxs ). Itu juga
diharapkan metode "publik" membuat fungsi REDEFINED dan FROMPERL ( lihat
Prima::internal untuk detailnya). Contohnya banyak di seluruh sumber Prima, dan akan
tidak ditampilkan di sini. metode "publik" biasanya memiliki hasil batal dan tidak ada parameter, tetapi
itu tidak masalah, karena gencls tidak menghasilkan konversi untuk metode tersebut.
mengimpor
Untuk metode yang tidak masuk akal untuk dikodekan dalam C tetapi dalam Perl sebagai gantinya, gencls dapat menjadi
diperintahkan untuk menghasilkan pembungkus yang sesuai menggunakan awalan "impor". semacam ini
metode dapat dilihat sebagai "metode" dari dalam ke luar. Fungsi "impor" tidak memerlukan C
rekanan, kecuali kode yang dibuat secara otomatis.
statis
Jika suatu metode harus dapat bekerja baik dengan dan tanpa instance objek, itu perlu
harus diawali dengan awalan "statis". metode "statis" semuanya sama dengan metode "metode",
kecuali bahwa parameter pertama "Handle self" tidak dideklarasikan secara implisit. Jika "statis"
metode dipanggil tanpa objek (tetapi dengan kelas), seperti
Kelas::Object-> static_method();
parameter pertamanya bukan objek tetapi string "Kelas::Objek". Jika suatu metode tidak pernah
berurusan dengan suatu objek, cukup menggunakan deklarasinya sebagai
static a( char * namakelas = "");
tetapi jika ya, a
statis a( SV * class_or_object = nil);
deklarasi diperlukan. Dalam kasus terakhir, kode C itu sendiri harus menentukan apa yang sebenarnya dimiliki
telah berlalu, jika pernah. Perhatikan parameter default di sini: metode "statis" biasanya
terbaca untuk disebut sebagai
Kelas::Objek::static_method();
di mana tidak ada parameter yang diteruskan ke sana. Tanpa parameter default, panggilan seperti itu
menghasilkan kesalahan runtime 'parameter tidak mencukupi berlalu'.
aneh
Kami tidak dapat menemukan nama yang lebih baik untuk itu. Awalan "aneh" menunjukkan metode yang digabungkan
properti baik dari "statis" dan "publik". Dengan kata lain, gencls menghasilkan no
kode konversi dan tidak mengharapkan "Menangani diri sendiri" sebagai parameter pertama untuk metode semacam itu.
Sebagai contoh Prima::Image::load dapat digambarkan, yang dapat disebut menggunakan lebar
spektrum semantik panggilan (lihat Prima::image-load untuk detailnya).
c_hanya
Seperti namanya, "c_only" adalah metode yang ada pada VMT tetapi tidak
dapat diakses dari perl. Itu dapat kelebihan beban dari C saja. Selain itu, diperbolehkan untuk
daftarkan fungsi Perl dengan nama metode "c_only", dan masih entitas ini
akan sepenuhnya independen satu sama lain - kelebihan muatan tidak akan terjadi.
NB: metode yang memiliki tipe data hasil dan/atau parameter yang tidak dapat dikonversi
secara otomatis, ubah awalannya menjadi "c_only". Mungkin ini adalah perilaku yang salah,
dan kondisi seperti itu harus menandakan kesalahan.
Properties
Toolkit Prima memperkenalkan entitas bernama properti, yang diharapkan dapat menggantikan metode
pasangan yang fungsinya untuk memperoleh dan menetapkan beberapa variabel objek internal, misalnya,
nama objek, warna dll. Alih-alih memiliki pasangan metode seperti Object::set_color dan
Object::get_color, sebuah properti Object::color dirancang. Sebuah properti adalah sebuah metode dengan
pertimbangan khusus, khususnya, ketika dipanggil tanpa parameter, mode 'dapatkan'
tersirat. Sebaliknya, jika dipanggil dengan satu parameter, mode 'set' dipicu.
Perhatikan bahwa pada pemanggilan 'set' dan 'get', parameter implisit pertama "Handle self" adalah
selalu hadir.
Properti dapat beroperasi dengan parameter yang berbeda, tetapi tetap, dan melakukan 'set'
dan fungsi 'dapatkan' hanya untuk satu. Secara default, satu-satunya parameter adalah "Pegangan" implisit
diri sendiri":
properti char * nama
memiliki pasangan C
char * Object_name( Menangani diri sendiri, Bool set, char * nama)
Tergantung pada mode, "Bool set" adalah "true" atau "false". Dalam mode 'set' kode C
hasilnya dibuang, dalam mode 'dapatkan' nilai parameter tidak ditentukan.
Sintaks untuk properti multi-parameter adalah
properti piksel panjang( int x, int y);
dan kode C
long Object_pixel( Menangani diri sendiri, Bool set, int x, int y, piksel panjang)
Perhatikan bahwa dalam kasus multi-parameter, parameter yang dideklarasikan setelah nama properti adalah
selalu diinisialisasi, dalam mode 'set' dan 'get'.
Contoh variabel
Setiap objek dicirikan oleh keadaan internalnya yang unik. Sintaks Gencls memungkinkan a
deklarasi variabel, untuk variabel yang dialokasikan untuk setiap instance objek. Meskipun
validasi tipe data tidak dilakukan untuk variabel, dan deklarasi mereka hanya mendapatkan
disalin 'apa adanya', deklarasi C kompleks yang melibatkan pointer array, struct dan fungsi adalah
tidak diakui. Sebagai solusinya, pointer ke entitas typedef'd digunakan. Contoh:
objek SampelObjek {
intx;
daftar daftar;
struct { int x } s; # deklarasi ilegal
}
Variabel dapat diakses dalam kode C dengan dereferensi nama langsung dari "Handle self" sebagai
struktur yang sesuai:
((PSampleObject) sendiri)-> x;
PENULIS
Dmitry Karasik,[email dilindungi]>. Anton Berezin,[email dilindungi]>.
Gunakan prima-gencls online menggunakan layanan onworks.net