Baru -baru ini, saya mulai bekerja di Delphi dan menemukan bahwa banyak paket digunakan dalam program asli, tetapi saya selalu dalam keadaan bodoh. Mungkin perlu waktu untuk mempelajari masalah ini. Jadi daftar pertanyaan pertama yang perlu dianalisis:
Apa itu tas? Apa itu EXE? Apa perbedaan komposisi mereka? Apa hubungan antara paket dan DCU? Apa yang dilakukan DCP? Apa hubungan antara file -file ini pada waktu kompilasi? Bagaimana cara dimuat? Bagaimana cara mengoperasikan paket setelah dimuat? DLL dapat mengekspor, tetapi mengapa Delphi membantu tidak memunculkan ekspor paket, tetapi beberapa kode menggunakan Express dalam paket?
Pertama, mari kita lihat proses kompilasi Delphi. Ada dua jenis proyek di Delphi: paket dan program. Mulailah dengan yang sederhana, mari kita mulai dengan DPR. Menurut dokumentasi bantuan Delphi, struktur file DPR khas adalah sebagai berikut:
1 Editor Program;
2
3 Penggunaan
4 Formulir, {Ubah ke QForms di Linux}
5 Reabout di 'reabout.pas' {tentang kotak},
6 tetap di 'tetap.pas' {MainForm};
7
8 {$ r *.res}
9
10 Mulai
11 Application.Title: = 'Teks Editor';
12 application.createForm (tMAintForm, MainForm);
13 Application.run;
14 akhir.
Di antara mereka, 10 hingga 14 baris, mulai ... Akhir secara alami adalah pintu masuk eksekusi program. Bagian penggunaan menunjukkan beberapa unit yang perlu digunakan program, yang agak kabur. membutuhkan? Maka setiap unit akan menggunakan unit lain, dan masalah ini tampaknya semakin rumit. Mari kita lihat struktur seluruh kode sumber terlebih dahulu:
Saya kira langkah pertama dari kompiler adalah untuk melintasi grafik terarah ini, mengkompilasi setiap unit, jika perlu, dan menghasilkan DCU yang sesuai. Adapun masalah "perlu" ini, saya awalnya berpikir bahwa pernyataan unit penggunaan ada, tetapi kemudian saya menemukan bahwa itu salah. Karena dalam kasus di atas, Unit3 tidak menentukan jalur dalam klausa Penggunaan Unit1, tetapi file DCU yang sesuai masih dihasilkan dengan benar. Kemudian, Filemon digunakan untuk memantau situasi pembukaan file, dan proses penemuan adalah sebagai berikut: Untuk setiap node dalam grafik, kompiler mencari node yang sesuai di jalur pencarian di direktori saat ini - atribut proyek - jalur perpustakaan di perpustakaan Lingkungan.
Sekarang kompilasi selesai, setiap unit (mis., File PAS) telah menghasilkan file DCU untuk itu. Ketika datang ke koneksi, masalahnya rumit. Koneksi statis berarti menggabungkan semua DCU ini bersama -sama. Dengan cara ini, panggilan satu unit ke unit lain menjadi masalah internal program. Manfaat ini adalah cepat dan sederhana, dan masalah seperti berbagi bersamaan mudah ditangani. Kerugiannya adalah bahwa program target besar, dan jika program lain ditulis sekarang dan Unit3 dapat digunakan kembali, unit3.dcu akan disalin lagi saat terhubung. Dengan cara ini, ketika dua program berjalan pada saat yang sama, akan ada dua salinan Unit3 dalam memori, yang merupakan pemborosan. Koneksi dinamis berarti bahwa ketika dua program terhubung, mereka hanya menyimpan referensi ke Unit3, dan tidak menyalin konten Unit3. Saat runtime, muat unit3 ke dalam memori dan buat kedua program itu umum. DLL dan BPL adalah solusi untuk koneksi dinamis. Masalahnya adalah satu -satunya opsi untuk koneksi di Delphi muncul di menu Project | Options | Paket, dan kalimat "Bangun dengan paket runtime" benar -benar terlalu kabur. Jadi kita perlu mempelajarinya lagi.
Ketika program dieksekusi, kita dapat menggunakan View | Debug Window | Moudles untuk melihat hal -hal apa yang dimuat ke dalam memori dan konten apa yang dikandungnya.
Menjadi sederhana, kami mengatur program dengan struktur berikut:
Program Projectexe;
penggunaan
Bentuk,
Windows,
UnitFormMain di 'unitFormMain.pas' {formmain};
{$ R *.res}
Mulai
Application.Initialize;
Application.createForm (tFormMain, formmain);
Application.run;
akhir.
unit unitFormMain;
antarmuka
penggunaan
Windows, stdctrls, formulir, unitformanother, kelas, kontrol;
jenis
Tformmain = class (tform)
Button1: tbutton;
Prosedur Button1Click (pengirim: Tobject);
Pribadi
{Deklarasi Pribadi}
publik
{Deklarasi Publik}
akhir;
var
Formmain: tFormMain;
Pelaksanaan
{$ R *.dfm}
Prosedur tformmain.button1click (pengirim: tobject);
var
Lform: tformanother;
Mulai
Lform: = tformanother.create (aplikasi);
Lform.showmodal;
Lform.free;
akhir;
akhir.
unit unitformanother;
antarmuka
penggunaan
Bentuk;
jenis
Tformanother = class (tform)
Pribadi
{Deklarasi Pribadi}
publik
{Deklarasi Publik}
akhir;
Pelaksanaan
{$ R *.dfm}
akhir.
Mari kita dapatkan beritanya sekarang. "Bangun dengan paket runtime" diperiksa, dan sekarang ditemukan bahwa file runtime Projectexe.exe hanya berisi empat bagian: dua bentuk, satu sysinit.pas, dan satu proyeke.dpr; Di pohon proses: RTL60 dan VCL60, kontennya adalah unit yang muncul dalam koneksi statis sekarang. Projectexe.exe hanya 16k sekarang. Dengan kata lain, bagian dari unit dalam grafik terarah ditempatkan di EXE dan bagian lain ditempatkan di BPL. Tapi apa itu divisi? Apakah didasarkan pada klausa Penggunaan, atau berdasarkan daftar di "Build With Runtime Packages" di sini? Melanjutkan tes, saya menemukan bahwa jika daftar hanya berisi VCL60, maka dua BPL plus satu EXE dimuat ke dalam memori masih dimuat ke dalam memori; EXE telah berubah: jumlah unit di dalam telah meningkat, dan pada dasarnya ada dalam paket VCL60. Saya kira harus ada hubungan persyaratan antara paket RTL dan VCL. Ini akan diuji pada langkah berikutnya. Namun, selama proses estimasi awal, daftar paket pasti akan digunakan untuk mengecualikan unit yang sudah ada dalam paket dari EXE.
Setelah koneksi dinamis, ada masalah lain: memuat. Ada dua strategi untuk memuat, statis, juga dikenal sebagai otomatis, yang menghasilkan kode dari Delphi, dan secara otomatis memuat paket sebelum memuat EXE; itu. Masalahnya adalah saya harus mencari tahu dalam keadaan apa Delphi akan secara otomatis memuat paket dan dalam keadaan apa saya dapat menghindari Delphi menjadi pintar sehingga saya dapat menggunakan paket secara fleksibel. Dalam percobaan sebelumnya, hanya dapat dilihat bahwa sebelum file DPR dieksekusi untuk dimulai, paket yang terhubung secara statis telah dimuat ke dalam memori. Saya tidak tahu proses spesifiknya.