Saya ingin menambahkan bahwa ini bukan kasus untuk bahasa lain daripada R. Saya tahu pertanyaan itu dipecahkan dan tentang R, tapi mungkin orang lain menganggap ini berguna: Kecuali engineR (default), semua potongan dieksekusi dalam sesi terpisah, jadi Variabel tidak bisa langsung dibagikan. Jika kita ingin menggunakan objek yang dibuat pada potongan sebelumnya, biasanya kita harus menuliskannya ke file (sebagai efek samping). Untuk mesin bash, kita bisa menggunakan Sys. setenv () untuk mengekspor variabel dari R ke bash (contoh). Pendekatan lain adalah dengan menggunakan paket runr (eksperimental). Contoh Python 2a): Contoh Python 2b): Museum Transkrip Gambar Bergerak Calon Ruang Tamu Next Century, Clinton, 1996 BILL CLINTON (sulih suara): Izinkan saya mengatakan kepada Anda bahwa saya merasa terhormat diberi kesempatan untuk berdiri Untuk nilai dan kepentingan orang Amerika biasa. TEKS: REFORMASI WELFARE, PERSYARATAN KERJA. MEDICARE, EDUCATION PROTECTED BILL CLINTON (sulih suara): Pekerjaan saya sebagai presiden adalah mengurus orang-orang Amerika. Dan saya telah melakukan yang terbaik untuk mengurus negara ini. TEKS: DEFICIT CUT 60. PAJAK CUT UNTUK 15.000.000 FAMILIES BILL CLINTON (sulih suara): Kami lebih aman. Kami lebih aman, TEXT: KEMATIAN KEMATIAN UNTUK TUMBUHAN KATEGORI BILL CLINTON (sulih suara): Kami lebih makmur, TEKS: EKONOMI TUMBUH: 10.000.000 NEW JOBS BILL CLINTON (sulih suara): Tapi pada akhirnya, apa yang kita perjuangkan, TEKS: DEMI MASA DEPAN. BUKA KELUARGA MEDIS MENINGGALKAN BILL CLINTON (sulih suara): Nilai yang kita rasakan dan hal-hal yang kita perjuangkan, TEKS: UNTUK MASA DEPAN. BAN COP KILLER BULLETS BILL CLINTON (sulih suara): Akan membentuk TEXT masa depan: 1500 KREDIT PAJAK UNTUK TUGAS TUITIONJOB TRAINING BILL CLINTON (sulih suara): Bahwa kita semua akan tinggal bersama. TEKS: MELINDUNGI ANAK-ANAK DARI TOKO LIMBAH TOXIC (sulih suara): Jika kita mengulurkan tangan kita dalam kerja sama, TEKS: KEUNTUNGAN MODAL PAJAK UNTUK PEMILIK RUMAH TANGGA BILL CLINTON (sulih suara): Tapi selalu teguh untuk apa yang kita tahu benar, TEKS: BALANCE THE BUDGE FOR A GROWING EKONOMI BILL CLINTON (sulih suara): Masa depan negara ini akan lebih cerah dari masa lalunya yang cemerlang. BILL CLINTON: Adalah tanggung jawab kami untuk mewujudkannya. TEKS: CLINTONGORE. MEMBANGUN SEBUAH JEMBATAN KE Abad ke-21 Pendahuluan, ClintonGore 03996 General Committee, 1996 Dari Museum Moving Image, Kandidat Ruang Tamu: Iklan Kampanye Kepresidenan 1952-2012. Livingroomcandidate. orgcommercials1996next-century (diakses 25 Februari 2017). Untuk menghubungkan atau meneruskan video ini melalui email, salin dan tempelkan URL ini: Terimakasih pada ekonomi yang kuat dan tidak adanya isu kebijakan luar biasa yang menonjol dalam pemilihan presiden, Bill Clinton menikmati perjalanan yang relatif bebas dari masalah dalam perjalanannya untuk menjadi Demokrat pertama sejak Franklin Roosevelt terpilih untuk masa jabatan kedua penuh. Kemenangan Clintons mewakili sebuah comeback politik yang mengesankan. Pada tahun 1994, Partai Republik telah memenangkan kontrol kedua rumah tersebut. Dengan pengaruh yang sangat besar, Ketua DPR Newt Gingrich telah menempa Kontrak Republik dengan Amerika, sebuah agenda legislatif yang konservatif. Selama pertempuran anggaran yang ketat antara presiden dan Kongres, pemerintah federal ditutup dua kali. Clinton menyalahkan ini pada Partai Republik, yang memungkinkannya untuk menempatkan dirinya di tengah dan menggambarkan kaum Republikan sebagai ekstremis. Kampanye Clinton berulang kali menghubungkan lawannya Bob Dole dengan Gingrich, sekaligus memperjuangkan penyebab utama seperti Undang-undang Tinggalkan Keluarga, kredit perkuliahan, dan sistem penilaian untuk televisi. Dole mencoba, tanpa banyak keberhasilan, untuk menggunakan karakter tersebut untuk keuntungannya. Namun, publik menunjukkan sedikit ketertarikan pada skandal Clinton seperti Whitewater, Filegate, dan Travelgate, dan tuduhan penyalahgunaan kampanye keuangan. Bill Clinton untuk presiden Al Gore untuk wakil presiden Membangun Jembatan ke iklan Bill Clintons abad 21 secara konsisten mengaitkan Bob Dole dengan Ketua DPR Newt Gingrich. Cuplikan berdarah hitam putih Dole yang berdiri di samping Gingrich mengeksploitasi kekecewaan publik kepada Kongres pimpinan Republikan setelah ditutupnya pemerintah federal. Berbeda dengan gambar-gambar mengerikan ini, montase yang penuh warna dan bersemangat menggarisbawahi prestasi Clintons dalam berbagai program sosial. Iklan-iklan ini memanfaatkan ekonomi yang kuat, dan juga bermain karena takut serangan Partai Republik terhadap pemerintah besar dapat mengancam program yang didukung publik, seperti Jaminan Sosial dan Pendidikan. Iklan lain berfokus pada isu-isu mikro, seperti dukungan Clintons untuk seragam sekolah dan sistem rating TV. Dengan menggunakan ungkapan yang melindungi nilai-nilai kita sebagai salah satu slogan mereka, kampanye Clinton berhasil merebut arus utama politik. Clintons mendukung hukuman mati dan niat untuk mengurangi kesejahteraan adalah di antara posisi konservatif tradisional yang digembar-gemborkan dalam iklannya. Yang terpenting, konsistensi, nilai produksi tinggi, dan sifat optimis dari iklan mencerminkan kompetensi sambil mengajukan pertanyaan seputar usia lanjut Doles. Bob Dole untuk presiden Jack Kemp untuk wakil presiden Seorang Pria yang Lebih Baik untuk Iklan Bob Bob yang Lebih Baik menggambarkannya sebagai pahlawan perang dan orang yang memiliki integritas sederhana, berbeda dengan moral Clintons yang patut dipertanyakan. Namun, jajak pendapat berulang kali menunjukkan bahwa, dengan kondisi ekonomi yang baik, masyarakat lebih tertarik pada kinerja pekerjaan Presiden Clintons daripada banyaknya skandal kecil yang muncul selama masa jabatan pertamanya. Iklan Doles, tidak konsisten dalam pesan dan nada, gagal untuk menetapkan target yang efektif. Satu tempat, The Threat, dimulai dengan rekaman dari Lyndon Johnsons yang terkenal pada tahun 1964 Daisy yang berkepentingan tentang bahaya perang nuklir, dan menyatakan bahwa ancaman terbesar adalah narkoba. Namun iklan tersebut tidak pernah menjelaskan bagaimana masalah ini terkait dengan Clinton. Usulan proposal pemotongan pajak 15 persen dikutip dalam banyak iklan, namun tanpa penjelasan tentang bagaimana hal itu akan didanai. Dengan ekonomi yang sehat, dan defisit anggaran yang menyusut, pemotongan pajak bukanlah prioritas tinggi bagi para pemilih. PEMBERIAN FORTH Bagian 1: Keputusan Desain di Kernel Keempat oleh Brad Rodriguez Artikel ini pertama kali dimuat di The Computer Journal 59 (JanuariFebruari 1993). PENDAHULUAN Semua orang di komunitas Forth berbicara tentang betapa mudahnya untuk memasuki Forth ke CPU baru. Tapi seperti banyak kutipan dan pertanyaan kuotomatis, tidak banyak yang tertulis tentang bagaimana melakukannya. Jadi, ketika Bill Kibler menyarankan topik ini untuk sebuah artikel, saya memutuskan untuk memutuskan tradisi lisan Forthwrights yang hebat, dan mendokumentasikan prosesnya dalam warna hitam dan putih. Selama artikel ini saya akan mengembangkan Forths untuk 6809, 8051, dan Z80. Im melakukan 6809 untuk mengilustrasikan model Forth yang mudah dan konvensional plus, saya telah mempublikasikan 6809 assembler ROD91, ROD92, dan Ill membutuhkan 6809 Forth untuk proyek TCJ di masa depan. Saya melakukan Proyek 8.051 untuk sebuah proyek di Universitas, namun juga menggambarkan beberapa keputusan desain yang agak berbeda. Z80 Forth adalah untuk semua pembaca CPM TCJ, dan untuk beberapa teman dengan mengumpulkan sampah TRS-80an. PERANGKAT KERAS PENTING Anda harus memilih CPU. Saya tidak akan menyelidiki kelebihan satu CPU di atas yang lain untuk Forth, karena pilihan CPU biasanya dipaksakan pada Anda oleh pertimbangan lain. Selain itu, objek dari artikel ini adalah untuk menunjukkan bagaimana cara memindahkan Forth ke CPU manapun. Anda bisa mengharapkan kernel 16-bit Forth yang biasa (lihat di bawah) untuk menempati sekitar 8K byte ruang program. Untuk kernel lengkap yang bisa mengkompilasi definisi Forth, Anda harus mengizinkan RAM 1K byte minimum. Untuk menggunakan sistem pengelolaan blok Forths untuk penyimpanan disk, Anda harus menambahkan 3 Kbytes atau lebih untuk buffer. Untuk model Forth 32-bit, dua kali lipat angka ini. Ini adalah minimum untuk mendapatkan kernel dan kernel Forth. Untuk menjalankan aplikasi pada perangkat keras Anda, Anda harus meningkatkan ukuran PROM dan RAM yang sesuai. 16 ATAU 32 BIT Ukuran kata yang digunakan oleh Forth tidak harus sama dengan CPU. Forth praktis terkecil adalah model 16-bit yaitu satu yang menggunakan bilangan bulat 16 bit dan alamat 16 bit. Komunitas Forth menyebut ini ukuran quotcellquot, karena kata kunci mengacu pada definisi Forth. CPU 8-bit hampir selalu mendukung 16-bit Forths. Ini biasanya membutuhkan pengkodean eksplisit dari aritmatika double-byte, walaupun beberapa CPU 8-bit memang memiliki beberapa operasi 16 bit. 16-bit CPU biasanya menjalankan 16-bit Forths, meskipun teknik presisi ganda yang sama dapat digunakan untuk menulis 32-bit Forth pada CPU 16 bit. Setidaknya satu 32-bit Forth telah ditulis untuk 80868088. CPU 32-bit biasanya menjalankan 32-bit Forths. Model Forth yang lebih kecil jarang menghemat panjang kode atau waktu prosesor. Namun, saya tahu setidaknya ada 16 bit Forth yang ditulis untuk 68000. Ini mengurangi ukuran kode aplikasi dengan faktor dua, karena definisi Forth tingkat tinggi menjadi rangkaian alamat 16 bit daripada string 32- Alamat bit (Ini akan menjadi jelas segera.) Kebanyakan 68.000, meskipun, memiliki banyak RAM. Semua contoh yang dijelaskan dalam artikel ini adalah 16-bit Forths yang berjalan pada CPU 8-bit. TEKNIK PENCIPTAANKodeTotot yang dicentang adalah ciri khas Forth. Sebuah kutipan kuantum hanya daftar alamat rutin yang akan dieksekusi. Anda bisa menganggap ini sebagai daftar panggilan subrutin, dengan petunjuk CALL dihapus. Selama bertahun-tahun banyak variasi threading telah dirancang, dan mana yang terbaik tergantung pada CPU dan aplikasi. Untuk membuat keputusan, Anda perlu memahami bagaimana mereka bekerja, dan pengorbanan mereka. Tidak Langsung Threaded Code (ITC) Ini adalah teknik pengarsipan Forth klasik, yang digunakan pada fig-Forth dan F83, dan dijelaskan dalam kebanyakan buku di Forth. Semua skema threading lainnya adalah quotimprovementsquot pada hal ini, jadi Anda perlu memahami ITC untuk menghargai yang lain. Mari kita lihat definisi kata depan SQUARE: Dalam ITC Forth yang khas, ini akan muncul di memori seperti yang ditunjukkan pada Gambar 1. (Header akan dibahas di artikel masa depan yang berisi informasi rumah tangga yang digunakan untuk kompilasi, dan tidak terlibat dalam threading .) Asumsikan SQUARE ditemui saat mengeksekusi kata Forth lainnya. Forths Interpreter Pointer (IP) akan menunjuk ke sel dalam memori - terdapat dalam kata quototherquot tersebut - yang berisi alamat kata SQUARE. (Tepatnya, sel itu berisi alamat Lapangan Kode SQUAREs.) Penafsir mengambil alamat itu, dan kemudian menggunakannya untuk mengambil isi Lapangan Kode SQUAREs. Isi ini adalah alamat lain - alamat subroutine bahasa mesin yang melakukan kata SQUARE. Dalam pseudo-code, ini adalah: Ini menggambarkan sebuah prinsip penting namun jarang dijelaskan: alamat kata Forth yang baru dimasukkan disimpan dalam W. KODE kata-kata tidak memerlukan informasi ini, tapi semua jenis kata-kata Forth lainnya. Jika SQUARE ditulis dalam kode mesin, ini akan menjadi akhir dari cerita: sedikit kode mesin akan dieksekusi, dan kemudian beralih kembali ke interpreter Forth - yang, sejak IP bertambah, mengarah ke kata berikutnya ke dihukum mati. Inilah sebabnya mengapa juru bahasa Forth biasanya disebut NEXT. Tapi, SQUARE adalah definisi quotcolonquot tingkat tinggi - ini berisi quotthreadquot, daftar alamat. Untuk melakukan definisi ini, juru bahasa Forth harus dimulai kembali di lokasi baru: Bidang Parameter SQUARE. Tentu saja, lokasi penerjemah lama harus diselamatkan, untuk melanjutkan kata Quotquot Forth dulu setelah SQUARE selesai. Ini sama seperti panggilan subrutin Tindakan bahasa mesin SQUARE hanyalah untuk mendorong IP lama, mengatur IP ke lokasi baru, menjalankan penerjemah, dan saat SQUARE dilakukan, pop IP. (Seperti yang Anda lihat, IP adalah kuartalan counterquot dari tingkat tinggi Forth.) Ini disebut DOCOLON atau ENTER di berbagai Forths: Fragmen kode yang identik ini digunakan oleh semua definisi Forth tingkat tinggi (yaitu threaded) Thats why a pointer Untuk fragmen kode ini, bukan fragmen itu sendiri, termasuk dalam definisi Forth. Lebih dari ratusan definisi, penghematan bertambah dan inilah mengapa disebut threading tidak langsung. The quotreturn dari subroutinequot adalah kata EXIT, yang dikompilasi saat Forth melihat. (Beberapa orang menyebutnya S bukan EXIT.) EXIT hanya menjalankan rutinitas bahasa mesin yang melakukan hal berikut: Berjalanlah melalui beberapa definisi Forth bersarang, hanya untuk meyakinkan diri Anda bahwa ini berhasil. Perhatikan karakteristik ITC: setiap kata Forth memiliki Field Code satu sel. Definisi usus mengkompilasi satu sel untuk setiap kata yang digunakan dalam definisi. Dan juru bahasa Forth harus benar-benar melakukan tipuan ganda untuk mendapatkan alamat kode mesin berikutnya untuk dijalankan (pertama melalui IP, lalu melalui W). ITC bukanlah teknik threading terkecil maupun tercepat. Ini mungkin yang paling sederhana meski DTC (dijelaskan selanjutnya) sama sekali tidak lebih kompleks. Jadi mengapa begitu banyak Forths tidak langsung threaded Terutama karena sebelumnya Forths, digunakan sebagai model, tidak langsung. Hari-hari ini, DTC menjadi lebih populer. Jadi, kapan sebaiknya ITC digunakan Dari berbagai teknik, ITC menghasilkan definisi terbersih dan paling elegan - tidak lain kecuali alamat. Jika Anda menyesuaikan diri dengan pertimbangan tersebut, ITC dapat mengajukan banding kepada Anda. Jika kode Anda berkutat dengan bagian dalam definisi, kesederhanaan dan keseragaman representasi ITC dapat meningkatkan portabilitas. ITC adalah model Forth klasik, jadi mungkin lebih disukai untuk pendidikan. Akhirnya, pada CPU yang kekurangan instruksi panggilan subrutin - seperti 1802 - ITC seringkali lebih efisien daripada DTC. Kode Berurutan Langsung (DTC) Direct Threaded Code berbeda dari ITC hanya dalam satu hal: alih-alih Kode Bidang yang berisi alamat beberapa kode mesin, Kode Bidang berisi kode mesin sebenarnya. Saya tidak mengatakan bahwa kode lengkap untuk ENTER terdapat dalam masing-masing dan setiap definisi kolon. Dalam kata-kata kuotri tingkat tinggi, Field Kode akan berisi panggilan subrutin. Seperti yang ditunjukkan pada Gambar 2. Definisi usus, misalnya, akan berisi panggilan ke rutinitas ENTER. Kode pseudo-NEXT untuk threading langsung adalah sederhana: Kecepatan keuntungan ini: penafsir sekarang hanya melakukan tipuan tunggal. Pada Z80 ini akan mengurangi rutinitas BERIKUTNYA - fragmen kode yang paling banyak digunakan di kernel Forth - dari sebelas instruksi ke tujuh Ruang biaya ini: setiap definisi tingkat tinggi di Z80 Forth (misalnya) sekarang satu byte lebih lama, Karena alamat 2 byte telah diganti dengan panggilan 3 byte. Tapi ini tidak benar secara universal. 32-bit 68000 Forth dapat mengganti alamat 4 byte dengan instruksi BSR 4-byte, tanpa rugi bersih. Dan pada Zilog Super8, yang memiliki instruksi mesin untuk DTC Forth, alamat 2 byte diganti dengan instruksi ENTER 1 byte, membuat DTC Forth lebih kecil pada Super8 Tentu saja, definisi DTC CODE dua byte lebih pendek, karena mereka Tidak lagi membutuhkan pointer sama sekali Saya biasa berpikir bahwa definisi tingkat tinggi di DTC Forths mengharuskan penggunaan panggilan subrutin di Bidang Kode. Frank Sergeant Pygmy Forth SER90 menunjukkan bahwa lompatan sederhana dapat digunakan dengan mudah, dan biasanya akan lebih cepat. Guy Kelly telah menyusun ulasan hebat tentang implementasi Forth untuk IBM PC KEL92, yang sangat saya rekomendasikan untuk semua penulis kernel Forth. Dari 19 jurusan yang ia pelajari, 10 menggunakan DTC, 7 menggunakan ITC, dan 2 menggunakan thread subrutin (dibahas selanjutnya). Saya merekomendasikan penggunaan Direct-Threaded Code over-Direct Threaded Code untuk semua kernel Forth yang baru. Langsung ke NEXT, atau kode itu in-line The Forth inner interpreter, NEXT, adalah rutinitas umum untuk semua definisi KODE. Anda mungkin hanya menyimpan satu salinan rutinitas umum ini, dan meminta semua kata KODE melompat ke sana. (Perhatikan bahwa Anda Langsung ke NEXT a subroutine Call tidak diperlukan). Namun, kecepatan NEXT sangat penting bagi kecepatan keseluruhan sistem Forth. Selain itu, pada banyak CPU, rutinitas BERIKUTNYA cukup singkat sering hanya dua atau tiga instruksi. Jadi mungkin lebih baik kode NEXT in-line, dimanapun itu digunakan. Hal ini sering dilakukan dengan membuat NEXT sebuah assembler macro. Ini adalah kecepatan sederhana vs keputusan ruang: in-line NEXT selalu lebih cepat, tapi hampir selalu lebih besar. Peningkatan ukuran total adalah jumlah byte tambahan yang diperlukan untuk ekspansi in-line, kali jumlah kata-kata KODE dalam sistem. Kadang-kadang tidak ada tradeoff sama sekali: dalam DTC Forth 6809, in-line NEXT lebih pendek daripada instruksi Jump Subroutine Threaded Code (STC) Definisi Forth tingkat tinggi tidak lain adalah daftar subrutin yang akan dieksekusi. Anda tidak memerlukan juru bahasa untuk melakukannya, Anda bisa mendapatkan efek yang sama dengan hanya merangkai daftar panggilan subrutin bersama-sama: Lihat Gambar 3. Representasi kata-kata Forth ini telah digunakan sebagai titik awal untuk menjelaskan teknik threading ke bahasa assembly programmer KOG82. STC adalah representasi elegan definisi kolon dan kata-kata KODE sekarang identik. QuotDefined wordsquot (VARIABLE, CONSTANTs, dan sejenisnya) ditangani sama seperti di DTC - Field Code dimulai dengan lompatan atau panggilan ke beberapa kode mesin di tempat lain. Kelemahan utama adalah bahwa panggilan subrutin biasanya lebih besar daripada alamat sederhana. Pada Z80, misalnya, ukuran definisi usus besar meningkat sebesar 50 - dan sebagian besar aplikasi Anda adalah definisi usus buntu. Sebaliknya, pada 68000 32-bit mungkin tidak ada peningkatan ukuran sama sekali, ketika alamat 4 byte diganti dengan BSR 4 byte. (Tapi jika ukuran kode Anda melebihi 64K, beberapa alamat tersebut harus diganti dengan JSR 6-byte.) Antrian subroutine mungkin lebih cepat daripada threading langsung. Anda menghemat waktu dengan tidak memiliki juru bahasa, tapi Anda kehilangan waktu karena setiap referensi ke kata Forth melibatkan push and pop dari alamat pengirim. Dalam DTC Forth, hanya kata-kata tingkat tinggi yang menyebabkan aktivitas di tumpukan kembali. Pada 6809 atau Zilog Super8, DTC lebih cepat dari STC. Ada keuntungan lain untuk STC: ini membagi-bagikan dengan register IP. Beberapa prosesor - seperti 8.051 - sangat kekurangan register pengalamatan. Menghilangkan IP benar-benar dapat menyederhanakan dan mempercepat kernel. Satu-satunya cara untuk mengetahui dengan pasti adalah dengan menulis kode contoh. Hal ini terkait erat dengan seleksi register, yang dibahas pada bagian selanjutnya. STC dengan in-line expansion optimization direct compilation Pada CPU lama dan 8-bit, hampir setiap primitif Forth melibatkan beberapa instruksi mesin. Tetapi pada CPU yang lebih kuat, kebanyakan primitif Forth ditulis dalam satu instruksi. Sebagai contoh, pada 32-bit 68000, DROP hanya Dalam subwutine-threaded Forth, menggunakan DROP dalam definisi kolon akan menghasilkan urutan ADDQ adalah instruksi dua byte. Mengapa menulis panggilan subrutin empat byte ke instruksi dua byte Tidak peduli berapa kali DROP digunakan, tidak ada penghematan Kode lebih kecil dan lebih cepat jika ADDQ dikodekan langsung ke arus BSR. Beberapa kompiler Forth melakukan ekspansi kuototometer ini dari kata-kata KODE CUR93a. Kerugian dari ekspansi in-line adalah dekompilasi kembali ke kode sumber asli menjadi sangat sulit. Selama panggilan subrutin digunakan, Anda masih memiliki petunjuk (alamat subrutin) ke kata-kata Forth yang terdiri dari benang. Dengan petunjuk pada kata-kata itu, Anda bisa mendapatkan namanya. Tapi begitu sebuah kata diperluas menjadi kode in-line, semua pengetahuan tentang asal kode itu hilang. Keuntungan dari ekspansi in-line - selain dari kecepatan dan ukuran - adalah potensi pengoptimalan kode. Sebagai contoh, urutan Forth akan disusun dalam 68000 STC karena namun dapat diperluas secara in-line sebagai instruksi mesin tunggal Mengoptimalkan kompiler Forth terlalu luas menjadi topik untuk artikel ini. Ini adalah area aktif penelitian bahasa Forth yang melihat, misalnya, SCO89 dan CUR93b. Puncak terakhir dari STC yang dioptimalkan adalah Forth yang mengkompilasi kode mesin quotpurequot, seperti kompiler C atau Fortran. Token Threaded Code (TTC) DTC dan STC bertujuan untuk meningkatkan kecepatan program Forth, dengan beberapa biaya dalam memori. Sekarang mari kita bergerak arah lain dari ITC, menuju sesuatu yang lebih lambat tapi lebih kecil. Tujuan thread Forth adalah untuk menentukan daftar kata-kata Forth (subrutin) yang akan dilakukan. Misalkan sistem 16-bit Forth hanya memiliki 256 kata yang berbeda. Kemudian setiap kata bisa dikenali secara unik oleh nomor 8-bit. Alih-alih daftar alamat 16 bit, Anda akan memiliki daftar pengenal 8 bit atau quottokens, quot dan ukuran definisi kolon akan dibelah dua. Forth menyimpan sebuah tabel alamat dari semua kata-kata Forth, seperti Ditunjukkan pada Gambar 4. Nilai token kemudian digunakan untuk mengindeks ke dalam tabel ini, untuk menemukan kata Forth yang sesuai dengan tanda yang diberikan. Ini menambahkan satu tingkat tipuan pada juru bahasa Forth, jadi lebih lambat dari pada kuadrat-threadedquot Forth. Keuntungan utama dari token-threaded Forths adalah ukuran kecil. TTC paling sering terlihat pada komputer genggam dan aplikasi dengan ukuran terbatas lainnya. Juga, tabel tanda kutip masuk ke dalam semua kata-kata Forth dapat mempermudah keterkaitan modul yang disusun secara terpisah. Kerugian dari TTC adalah kecepatan: TTC membuat Forths paling lambat. Juga, kompiler TTC sedikit lebih kompleks. Jika Anda memerlukan lebih dari 256 kata terakhir, diperlukan beberapa skema pengkodean terbuka untuk menggabungkan token 8 bit dan lebih besar. Saya dapat membayangkan 32-bit Forth menggunakan token 16 bit, tapi berapa banyak sistem 32-bit yang dibatasi oleh ukuran Segmen Threaded Code Karena ada begitu banyak turunan 8086 di dunia, threading segmen pantas untuk disebutkan secara singkat. Alih-alih menggunakan alamat byte quotnormalquot dalam segmen 64K, alamat paragraf digunakan. (A quotparagraphquot adalah 16 byte di 8086.) Kemudian, penafsir dapat memuat alamat ini ke dalam register segmen, bukan ke register alamat biasa. Ini memungkinkan model Forth 16 bit untuk mengakses memori megabyte 8086 secara efisien. Kelemahan utama dari threading segmen adalah kuotimasi frekuensi 16 byte pada ruang memori. Setiap kata Forth harus disesuaikan dengan batas 16 byte. Jika kata-kata Forth memiliki panjang acak, rata-rata 8 byte akan terbuang per kata Forth. ALOKASI PENDAFTARAN Di samping teknik threading, penggunaan register CPU adalah keputusan desain yang paling penting. Mungkin yang paling sulit. Ketersediaan register CPU dapat menentukan teknik threading apa yang dapat digunakan, dan bahkan peta memori apa yang akan menjadi The Classical Forth Register Model klasik Forth memiliki lima register bilangan bulat. Ini adalah entitas abstrak yang digunakan dalam operasi primitif Forth. NEXT, ENTER, dan EXIT didefinisikan sebelumnya dalam hal register abstrak ini. Masing-masing adalah satu sel lebar - yaitu di Forth 16 bit, ini adalah register 16 bit. (Ada pengecualian untuk aturan ini, seperti yang akan Anda lihat nanti.) Ini mungkin tidak semua register CPU. Jika CPU Anda tidak memiliki cukup register, beberapa di antaranya dapat disimpan di memori. Saya menggambarkannya sesuai urutan kepentingannya, yaitu bagian bawah daftar ini adalah kandidat terbaik untuk disimpan di memori. W adalah register kerja. Ini digunakan untuk banyak hal, termasuk referensi memori, jadi seharusnya register alamat misalnya Anda harus bisa mengambil dan menyimpan memori dengan menggunakan isi W sebagai alamatnya. Anda juga harus bisa melakukan aritmatika pada W. (Dalam DTC Forths, Anda juga harus bisa melompat secara tidak langsung menggunakan W.) W digunakan oleh penafsir dalam setiap kata di Forth. Dalam sebuah CPU yang hanya memiliki satu register, Anda akan menggunakannya untuk W dan menyimpan memori lainnya (dan sistemnya akan sangat lambat). IP adalah Interpreter Pointer. Ini digunakan oleh setiap kata Forth (melalui NEXT, ENTER, atau EXIT). IP harus berupa register alamat. Anda juga perlu untuk bisa kenaikan IP. Subroutine threaded Forths tidak memerlukan register ini. PSP adalah Parameter Stack (atau quotdata stackquot) Pointer, terkadang disebut hanya SP. Saya lebih suka PSP karena SP sering nama register CPU, dan mereka tidak boleh bingung. Sebagian besar kata KODE menggunakan ini. PSP harus berupa stack pointer, atau register alamat yang bisa bertambah dan decremented. Its juga plus jika Anda bisa melakukan pengalamatan terindeks dari PSP. RSP adalah Return Stack Pointer, terkadang disebut hanya RP. Ini digunakan oleh definisi kolon di ITC dan DTC Forths, dan dengan semua kata dalam STC Forths. RSP harus berupa stack pointer, atau register alamat yang bisa bertambah dan decremented. Jika memungkinkan. Letakkan W, IP, PSP, dan RSP di register. Register virtual yang mengikuti dapat disimpan dalam memori, namun biasanya ada keuntungan kecepatan untuk menyimpannya dalam register CPU. X adalah daftar kerja, bukan dianggap sebagai salah satu register Quantum kuotomatis, meskipun ITC Forth klasik membutuhkannya untuk tipuan kedua. Dalam ITC Anda harus bisa melompat secara tidak langsung menggunakan X. X juga bisa digunakan oleh beberapa kata KODE untuk melakukan aritmatika dan semacamnya. Hal ini sangat penting pada prosesor yang tidak dapat menggunakan memori sebagai operan. Misalnya, ADD on a Z80 mungkin (dalam pseudo-code) Kadang-kadang register kerja lain, Y, juga didefinisikan. UP adalah User Pointer, memegang alamat dasar area pengguna tugas. UP biasanya ditambahkan ke offset, dan digunakan oleh kode Forth tingkat tinggi, sehingga bisa disimpan di suatu tempat. Tetapi jika CPU bisa melakukan pengalamatan terindeks dari register UP, kata-kata KODE dapat lebih mudah dan cepat mengakses variabel pengguna. Jika Anda memiliki surplus register alamat, gunakan satu untuk UP. Tugas tunggal untuk tidak membutuhkan UP. X - jika diperlukan - lebih penting untuk tetap mendaftar daripada UP. UP adalah termudah dari register virtual Forth untuk pindah ke memori. Penggunaan Hardware Stack Sebagian besar CPU memiliki stack pointer sebagai bagian dari perangkat keras mereka, yang digunakan oleh interrupt dan subroutine calls. Bagaimana peta ini masuk ke register Forth Jika itu adalah PSP atau RSP Jawaban singkatnya adalah, itu tergantung. Dikatakan bahwa PSP digunakan lebih banyak daripada RSP di ITC dan DTC Forths. Jika CPU Anda memiliki beberapa register alamat, dan PUSH dan POP lebih cepat daripada referensi eksplisit, gunakan tumpukan perangkat keras sebagai Parameter Stack. Di sisi lain, jika CPU Anda kaya dalam mode pengalamatan - dan memungkinkan pengalamatan terindeks - ada nilai tambah dalam memiliki PSP sebagai register alamat tujuan umum. Dalam kasus ini, gunakan tumpukan perangkat keras sebagai Return Stack. Terkadang Anda tidak menggunakan tumpukan perangkat keras TMS320C25 hanya delapan sel dalam - semuanya tapi tidak berguna untuk Forth. Jadi tumpukan perangkat kerasnya hanya digunakan untuk interrupts, dan kedua PSP dan RSP adalah register alamat tujuan umum. (ANS Forth menentukan minimal 32 sel Parameter Stack dan 24 sel dari Return Stack I lebih memilih 64 sel dari masing-masing.) Anda kadang-kadang akan menemukan dogma yang ada di markas Parameter Stack hardware, atau quothust bequot the Return Stack. Sebagai gantinya, catat beberapa contoh primitif Forth, seperti dan lihat pendekatan mana yang lebih kecil atau lebih cepat. (DUP dan DROP, tidak ada ujian - biasanya sangat sepele.) Kadang-kadang Anda mencapai kesimpulan aneh Gary Bergstrom telah menunjukkan bahwa sebuah DTC Forth 6809 dapat dibuat beberapa siklus lebih cepat dengan menggunakan pointer stack pengguna 6809 sebagai IP NEXT menjadi POP. Dia menggunakan daftar indeks untuk salah satu tumpukan Forths. Top-Of-Stack in Register Kinerja lebih jauh dapat ditingkatkan dengan tetap menjaga elemen teratas Parameter Stack dalam daftar Banyak kata-kata Forth (seperti 0) maka jangan perlu menggunakan stack. Kata lain masih melakukan jumlah push dan pops yang sama, hanya di tempat yang berbeda dalam kode. Hanya beberapa kata-kata Forth (DROP dan 2DROP) menjadi lebih rumit, karena Anda tidak bisa lagi mengatur stack stack - Anda harus memperbarui daftar TOS juga. Ada beberapa peraturan saat menulis kata-kata KODE: Kata yang menghilangkan barang dari tumpukan harus memasukkan TOS kuotomatis ke dalam registernya. Sebuah kata yang menambahkan item pada stack harus mendorong TOS quotoldquot ke stack (kecuali, tentu saja, dikonsumsi oleh kata). Jika Anda memiliki setidaknya enam register CPU ukuran sel, saya sarankan untuk menyimpan TOS dalam daftar. Saya menganggap TOS lebih penting daripada UP untuk mendaftar, tapi kurang penting dibanding W, IP, PSP, dan RSP. (KL di register melakukan banyak fungsi register X). Berguna jika register ini bisa melakukan pengalamatan memori. PDP-11, Z8, dan 68000 adalah kandidat yang baik. Sembilan dari 19 PC IBM Forth yang dipelajari oleh Guy Kelly KEL92 tetap melakukan TOS dalam daftar. Saya pikir inovasi ini telah dilawan karena kepercayaan salah bahwa a) ia menambahkan instruksi, dan b) elemen tumpukan teratas harus dapat diakses sebagai memori. Ternyata bahkan kata-kata seperti PICK, ROLL, dan DEPTH sepele dimodifikasi untuk TOS-in-register. Bagaimana dengan menyangga dua elemen tumpukan di register Bila Anda menyimpan tumpukan teratas dalam daftar, jumlah total operasi yang dilakukan tetap pada dasarnya sama. Dorongan tetap mendorong, terlepas dari apakah sebelum atau sesudah operasi yang Anda lakukan. Di sisi lain, menyangga dua elemen tumpukan di register menambahkan sejumlah besar instruksi - dorongan menjadi dorongan diikuti dengan gerakan. Hanya prosesor Forth yang berdedikasi seperti RTX2000 dan kompiler pengoptimalan yang sangat pintar bisa mendapatkan keuntungan dari penyangga dua elemen tumpukan di register. Beberapa contoh Berikut adalah daftar tugas yang dibuat oleh Forths untuk sejumlah CPU yang berbeda. Cobalah untuk menyimpulkan keputusan desain penulis dari daftar ini. QuotSPquot mengacu pada stack stack perangkat keras. QuotZpagequot mengacu pada nilai yang tersimpan di halaman memori 6502, nol, yang hampir sama bergunanya - terkadang lebih berguna daripada - nilai yang disimpan dalam register mis. Mereka bisa digunakan untuk pengalamatan memori. QuotFixedquot berarti bahwa Paynes 8051 Forth memiliki area pengguna tunggal yang tak tergoyahkan, dan UP adalah konstanta dengan kode keras. Register Sempit Perhatikan sesuatu yang aneh dalam daftar sebelumnya The 6502 Forth - model 16-bit - menggunakan pointer 8-bit stack Hal ini dimungkinkan untuk membuat PSP, RSP, dan UP lebih kecil dari ukuran sel Forth. Ini karena tumpukan dan area pengguna keduanya merupakan bidang memori yang relatif kecil. Setiap tumpukan mungkin berukuran sekecil 64 sel, dan area pengguna jarang melebihi 128 sel. Anda hanya perlu memastikan bahwa a) area data ini terbatas pada area memori kecil, jadi alamat pendek dapat digunakan, atau b) bit alamat yang tinggi disediakan dengan cara lain, mis. Halaman memori pilih. Pada 6502, tumpukan perangkat keras terbatas pada halaman satu RAM (alamat 01xxh) oleh perancangan CPU. Penunjuk stack 8-bit dapat digunakan untuk Return Stack. Parameter Stack disimpan di halaman nol dari RAM, yang secara tidak langsung dapat diakses oleh register indeks 8-bit X. (Pertanyaan untuk siswa tingkat lanjut: mengapa menggunakan X 6502, dan bukan Y Petunjuk: lihat mode pengalamatan yang tersedia. ) Pada 8051, Anda dapat menggunakan register 8 bit R0 dan R1 untuk menangani RAM eksternal, asalkan Anda secara eksplisit mengeluarkan 8 bit alamat yang tinggi ke port 2. Ini memungkinkan sebuah quotpage selectquot untuk dua tumpukan. UP berbeda dengan PSP dan RSP: ini hanya menyediakan alamat dasar tidak pernah bertambah atau berkurang. Jadi praktis untuk memasok hanya bit tinggi dari register virtual ini. Bit yang rendah kemudian harus disediakan teknik pengindeksan apapun yang diindeks. Sebagai contoh, pada 6809, Anda dapat menggunakan register DP untuk menahan 8 bit UP tinggi, dan kemudian menggunakan pengalamatan Direct Page untuk mengakses salah satu dari 256 lokasi di halaman ini. Ini memaksa semua area pengguna untuk memulai pada alamat xx00h, yang tidak memiliki kesulitan besar, dan membatasi area pengguna menjadi 128 sel. Pada 8086, Anda dapat menggunakan daftar segmen untuk menentukan alamat dasar area pengguna. DAFTAR PUSTAKA CUR93a Curley, Charles, quotLife di FastForth Lane, menunggu publikasi di Forth Dimensions. Deskripsi dari 68000 subroutine-threaded Forth. CUR93b Curley, Charles, mengutip secara proporsional dalam BSRJSR Threaded Forth, menunggu publikasi di Forth Dimensions. Pengoptimalan kode single pass untuk FastForth, hanya dalam lima layar kode Termasuk daftar. KEL92 Kelly, Guy M. quotForth Systems Comparisons, quot Forth Dimensions XIII: 6 (MarApr 1992). Juga diterbitkan dalam Prosiding Konferensi FORTO 1991. Keduanya tersedia dari Forth Interest Group, P. O. Kotak 2154, Oakland, CA 94621. Menggambarkan rancangan pengorbanan banyak 8086 Forth dengan fragmen kode dan tolok ukur - KOG82 Kogge yang sangat dianjurkan, Peter M. quotAn Trail Arsitektur untuk Sistem Threaded - Code, quot IEEE Computer, vol. 15 tidak 3 (Mar 1982). Tetap deskripsi definitif berbagai teknik threading. ROD91 Rodriguez, B. J. quotB. Y.O. Assembler, quot Bagian 1, Jurnal Komputer 52 (SepOct 1991). Prinsip umum penulisan perwira Forth. ROD92 Rodriguez, B. J. quotB. Y.O. Assembler, quot Bagian 2, Jurnal Komputer 54 (JanFeb 1992). Perakit 6809 di Forth. SCO89 Scott, Andrew, quotAn Pengoptimal Ekstensi untuk Kompilasi Forth, 1989 Prosiding FORML Prosiding. Forth Interest Group, P. O. Kotak 2154, Oakland, CA 94621. Deskripsi bagus tentang pengoptimasi 68000 tidak ada kode yang tersedia. CUR86 Curley, Charles, real-Forth untuk 68.000. Didistribusikan secara pribadi (1986). JAM80 James, John S. fig-Forth untuk PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth untuk Apple II. Mountain View Press (1981). LAX84 Laxen, H. dan Perry, M. F83 untuk PC IBM. Versi 2.1.0 (1984). Didistribusikan oleh penulis, tersedia dari Forth Interest Group atau GEnie. LOE81 Loeliger, R. G. Threaded Interpretive Languages. Publikasi BYTE (1981), ISBN 0-07-038360-X. Mungkin satu-satunya buku yang pernah ditulis tentang pembuatan kernel seperti Forth (contoh yang digunakan adalah Z80). Patutlah jika Anda bisa menemukan salinannya. MPE92 MicroProcessor Engineering Ltd MPE Z8Super8 PowerForth Target. MPE Ltd 133 Hill Lane, Shirley, Southampton, S01 5AF, Inggris (Juni 1992). Produk komersial PAY90 Payne, William H. Embedded Controller FORTH untuk keluarga 8.051. Academic Press (1990), ISBN 0-12-547570-5. Ini adalah kuotot yang lengkap untuk Forth 8051, termasuk metacompiler untuk PC IBM. File hardcopy saja bisa diunduh dari GEnie. Bukan untuk Sersan SER90 pemula, Frank, Pygmy Forth untuk PC IBM. Versi 1.3 (1990). Didistribusikan oleh penulis, tersedia dari Forth Interest Group. Versi 1.4 sekarang tersedia di GEnie, dan sepadan dengan usaha ekstra untuk mendapatkan. TAL80 Talbot, R. J. fig-Forth untuk tahun 6809. Forth Interest Group (1980). Catatan penulis untuk publikasi web: file yang sebelumnya tersedia di layanan online GEnie sekarang tersedia dari server FTP Kelompok Minat Minat, ftp: ftp. forth. orgpubForth.
No comments:
Post a Comment