REXX adalah bahasa yang agak kuno dan maju untuk zamannya. Dia muncul, menurut Wikipedia, pada tahun 1979, yaitu, dia baru saja berusia 40 tahun. Bukan bahasa yang paling kuno, tentu saja, tetapi usia yang layak.
Rexx adalah singkatan, itu artinya Restructured Extended Executor, yang mungkin merujuk kita kepada leluhurnya EXEC / EXEC2. Saya bertemu dengannya di sistem operasi VM / SP 3, di mana ia datang untuk mengganti bahasa skrip ini dengan tepat. Kemudian populer di OS / 2, digunakan di banyak OS lain, dan banyak implementasi dan dialek turunan dibuat.
Dia tidak terlalu memperhatikan Habré, saya akan mencoba mengisi kekosongan dalam artikel ini.
Leluhur, Origins, Penulis
Implementasi bahasa asli memiliki satu penulis, seorang karyawan IBM Mike Cowlishaw. Implementasi ini ditulis dalam assembler S / 360.
Wikipedia percaya bahwa REXX dipengaruhi oleh PL / 1, EXEC dan EXEC2, dan Algol. Secara keseluruhan, ya, bahasa ini tidak diragukan lagi dalam sintaksisnya - pewaris Algol (atau Pascal, jika Anda mau). Yaitu, loop, blok, dll. konstruksi tidak dikelilingi oleh kurung kurawal, tetapi oleh kata kunci, lakukan / akhiri, misalnya. Adapun EXEC dan EXEC2, REXX telah dibuat sebagai pengganti mereka, dan mungkin tidak ada hubungannya dengan mereka. Tetapi dibandingkan dengan PL / 1 REXX jauh lebih sederhana, dan tujuan bahasanya sangat berbeda.
Seperti apa kode REXX:
/* 1 10 */ sum = 0 do count = 1 to 10 say count sum = sum + count end say " " sum"."
Fitur
Menurut saya, apa yang paling menarik atau tidak biasa dalam bahasa ini?
1. Sintaks bahasa ini cukup gratis, bukan Fortran, tentu saja. Algol dan Pascal paling terlihat. Pada dasarnya secara umum juga.
Ada operator khas pemrograman struktural.
Ada fungsi dan prosedur. Di sini, ini sedikit tidak biasa bahwa prosedur menyembunyikan semua variabel dari kode panggilan secara default, tetapi beberapa dari mereka dapat dibuat dengan menggunakan konstruksi kunci <variabel daftar>.
Mengetik itu dinamis. Variabel dapat diartikan sebagai string atau sebagai angka, pada saat-saat eksekusi yang berbeda, dan juga mungkin tidak didefinisikan (ini dapat diperiksa, meskipun bengkok). Bahkan, bahasa memiliki satu tipe data primitif - string di mana operasi aritmatika dapat dilakukan jika string adalah angka yang benar.
Ini adalah contoh Wikipedia kecil:
say hello /* => HELLO */ hello = 25 say hello /* => 25 */ hello = "say 5 + 3" say hello /* => say 5 + 3 */ interpret hello /* => 8 */ drop hello say hello /* => HELLO */
Ini menunjukkan bahwa variabel tidak terdefinisi dalam baris pertama (dan terakhir) dihitung dalam namanya dalam huruf kapital. Ini adalah cara untuk memeriksa ketidakpastian.
Pernyataan interpretasi adalah analog dari apa yang sekarang disebut eval.
Penanganan kesalahan mungkin paling mirip dengan Dasar:
signal on halt do forever ... /* */ end halt: /* . halt, */ exit
Ini adalah proses penyelesaian program (dengan tombol dari terminal). Selain berhenti, ada "sinyal" lainnya, termasuk, misalnya, sintaks (kesalahan sintaks dalam kode yang ditafsirkan). Saya tidak ingat bahwa saya secara praktis menerapkannya, tetapi cukup logis untuk memeriksa kebenaran sintaksis, misalnya, apa yang diumpankan ke input interpretasi.
2. Itu tidak memiliki ekspresi reguler, seperti yang kita katakan di Perl (hampir 10 tahun tersisa sebelum Perl, namun). Konsep ekspresi reguler muncul sebelumnya, dan tentu saja sudah, katakanlah, utilitas grep sudah ada. Sebagai gantinya, ada operator parse, yang merupakan analog sederhana dari pelanggan reguler, dengan penggantian kelompok menjadi variabel.
parse [origin] [template]
Yaitu kami menganalisis konten sumber (yang bisa berupa argumen untuk fungsi, variabel, ekspresi, dll.) untuk kepatuhan dengan templat. Templat dapat berisi literal yang memisahkan nilai dan variabel yang menerima nilai dari sumber di antara pemisah ini. Di satu sisi, ini tampak seperti grup dalam ekspresi reguler.
fio = ', ' parse var fio firstName ',' LastName say firstName say LastName
Ini, tentu saja, jauh lebih sederhana daripada ekspresi reguler, jika hanya karena tidak ada karakter meta seperti \ d, tidak ada pengulangan dalam bentuk * atau +, tidak ada alternatif, tidak ada yang seperti itu.
3. Rexx memiliki API yang memungkinkannya digunakan sebagai bahasa scripting tidak hanya untuk OS (CMS), tetapi juga untuk program lain yang mendukung API ini. Yaitu sebenarnya, itu adalah bahasa penulisan DSL. Mungkin salah satu yang pertama. Pada saat yang sama, runtime dapat mengimplementasikan dan menyediakan fungsi atau perintah tambahan kepada interpreter yang tersedia sebagai hasil dari program.
Itu terlihat seperti ini: ketika memulai editor teks XEDIT, ia mencari di suatu tempat pada disk yang dapat diakses file bernama PROFILE XEDIT, yang berisi skrip REXX. Skrip ini dapat menetapkan tombol fungsi, dan menentukan perintah tambahan yang tersedia dari XEDIT. Dalam hal makna, hari ini yang paling dekat dengan .bashrc, misalnya. Atau analognya dengan vim.
Dengan demikian, prosedur dan fungsi REXX yang didefinisikan dalam PROFIL XEDIT dapat menjalankan perintah editor dan mengakses informasi tentang file yang terbuka, termasuk konten file itu sendiri.
4. Itu tidak memerlukan sintaks khusus untuk mengirimkan perintah ke lingkungan host (yaitu, OS, atau, katakanlah, editor teks). Sebagai gantinya, semua ekspresi yang tidak dikenali Rexx diteruskan ke eksekusi. Jadi, untuk menulis perintah OS di dalam skrip, cukup dengan melampirkannya dalam tanda kutip, misalnya:
'list * * * (stack'
Perintah dapat dibangun dengan menggabungkan konstanta string dan variabel. Simbol operasi penyatuan hanyalah sebuah ruang.
Untuk mentransfer perintah ke aplikasi lain, ada pernyataan alamat. Misalnya, ketika menggunakan editor teks XEDIT di lingkungan, untuk mengeksekusi bukan perintah XEDIT, tetapi OS (CMS), Anda harus melakukan ini:
address cms 'list * * * (stack'
5. CMS menerapkan API untuk mengakses tumpukan perintah OS, yang juga digunakan Rexx untuk bertukar data. Perintah di atas mengembalikan daftar file yang dihasilkan ke stack, dari mana script dapat mengambilnya, membaca satu baris sebagai input standar. Dalam beberapa hal, ini mirip dengan pipa Unix, tetapi agak berbeda dari mereka. Pipa masih berupa aliran byte, dan tumpukan dalam CMS adalah kumpulan string. Secara umum, ini adalah perbedaan khas antara ideologi Unix dan OS dari IBM, di mana file sebagian besar berorientasi pada string tetap atau variabel (tetapi pada saat yang sama diketahui) panjang.
6. Sebagai bagian dari API, aplikasi dapat memiliki akses ke variabel skrip Rexx, mereka dapat membaca dan memodifikasinya. Ini adalah cara lain untuk bertukar data.
7. Aritmatika yang cukup efektif dari akurasi arbitrer diterapkan. Sewenang-wenang - ini berarti misalnya 100 karakter atau lebih - berapa banyak memori yang cukup.
8. Manajemen memori - otomatis. Meskipun ada, misalnya, operator drop untuk menghapus nilai variabel (array asosiatif atau elemen-elemennya), tetapi dalam hal apa pun, Anda tidak memiliki bisnis dengan pointer dan ukuran blok.
9. Sebagai satu-satunya, tetapi pada saat yang sama struktur data yang sangat universal ada array asosiatif, sangat mirip dengan javascript, misalnya. Yaitu, jika Anda menulis a.1, ini adalah elemen array a dengan kunci 1. Jika Anda menulis ab, maka ini adalah elemen dengan kunci b.
Katakanlah prosedur untuk menambahkan kata ke kamus:
add_word: procedure expose dictionary. parse arg w n = dictionary.0 + 1 dictionary.n = w dictionary.0 = n return
Variabel kamus dalam fragmen ini adalah array asosiatif kami. Prosedur tidak mengembalikan array ini, tetapi membuatnya dapat diakses dari luar (menggunakan expose). dictionary.0 menyimpan sejumlah elemen dalam kamus (ini hanya sebuah konvensi, dan seperti yang Anda lihat, kami mengeksekusi sendiri), dictionary.n adalah kata ke-n kamus.
10. Bahasa tidak memiliki akses tingkat rendah ke memori atau ke OC API, meskipun pada prinsipnya sangat mungkin untuk menulis sesuatu yang serupa untuk itu. Saya dapat menyebutkan beberapa contoh ekstensi bahasa, satu dirancang untuk bekerja dengan database SQL / DS (DB2), dan yang kedua - untuk bertukar pesan antara mesin virtual dalam VM / SP. Artinya, segala sesuatu yang Anda dapat mengatur sebagai DSL, pada prinsipnya, dapat diimplementasikan.
Dukungan REXX dalam Aplikasi
Selain CMS itu sendiri, REXX segera mendukung editor teks XEDIT utama. Itu memungkinkan Anda untuk menulis makro di REXX, yang bisa digantung pada tombol fungsi, atau untuk memanggil perintah, baik dari baris perintah atau sebagai apa yang disebut. Perintah "Awalan", yang dimasukkan di sebelah baris teks, dan membiarkannya dimanipulasi. Misalnya, perintah d memungkinkan Anda untuk menghapus baris di sebelah yang Anda masukkan, ada perintah salin atau pindahkan, dan lainnya. Makro pada REXX dapat, misalnya, mengubah string menjadi huruf besar atau kecil.
Aplikasi kedua yang mendukung bahasa dalam memori saya disebut DMS (Display Management System for CMS (DMS / CMS)), dan itu adalah alat untuk mengembangkan program interaktif yang terdiri dari panel. Dari REXX dimungkinkan untuk memilih salah satu dari formulir yang telah ditentukan sebelumnya, mengisi bidang-bidangnya dengan nilai, dan menampilkannya di layar. Setelah pengguna menekan tombol fungsi, program menerima kontrol kembali, dan variabel REXX berisi nilai bidang yang diubah. Analog fungsional terdekat dari DMS yang saya sebut HTML dan bentuknya. Dan dalam hal kompleksitas (kesederhanaan) pengembangan, ini mungkin bahkan sedikit lebih mudah, meskipun HTML tentu saja menang dalam hal kemampuan ekspresif (misalnya, tidak ada gambar sama sekali dalam DMS, yang dapat dimengerti oleh terminal teks).
Aplikasi lain yang layak disebut disebut ISPF. Tapi itu sudah jauh lebih luas daripada DMS, dan itu lebih seperti lingkungan pengembangan terintegrasi, seperti yang terlihat sekarang, disesuaikan dengan terminal teks. Dan ya, editor teks juga diprogram dalam REXX.
Dimulai dengan VM / SP 6, CMS memperkenalkan alat untuk membuat jendela virtual ukuran variabel pada layar terminal dan menampilkan teks di dalamnya. API yang sesuai muncul untuk REXX (lebih tepatnya, itu terutama merupakan perpanjangan dari REXX).
Aplikasi lain yang sangat menarik dari REXX adalah yang disebut sebagai auto-operator. Ini adalah aplikasi yang berjalan di mesin virtual operator OS, yang menerima semua pesan yang biasanya datang ke terminal operator dan memungkinkan mereka untuk diproses oleh perangkat lunak. Penangan perintah - skrip REXX. Jadi, misalnya, adalah mungkin untuk memberikan beberapa kemampuan operator kepada banyak orang, di mana orang-orang ini hanya mengirim pesan ke mesin virtual operator, dan pawang (atas nama pengguna istimewa, operator) menjalankan beberapa perintah untuk mereka. Yah, misalnya, saya memasang volume disk atau kaset di sistem.
Tetapi kemungkinan tidak terbatas pada hal-hal sederhana seperti itu. Misalnya, Anda tidak dapat mengirim pesan kepada pengguna jika tidak ada dalam sistem. Kirim ke operator otomatis, menyimpannya dalam antrian, dan kemudian (setelah menerima pesan bahwa pengguna login) mengirimkannya kepada siapa diperlukan. Sebenarnya, ini adalah implementasi email sederhana dengan skrip REXX kecil.
Dampak Pembangunan
Saya akan mengatakan bahwa dengan munculnya REXX di VM / SP 3, kami mulai menulis di atasnya bagian penting dari apa yang sebelumnya ditulis misalnya pada PL / 1. Ini adalah bahasa yang cukup kuat dan pada saat yang sama masih sederhana yang memungkinkan Anda untuk menyusun aplikasi yang relatif besar dengan benar. Pertama-tama, mungkin karena kemampuan integrasinya, ketika itu digunakan sebagai DSL.
Kemampuan untuk memenuhi permintaan basis data (SQL / DS), menampilkan formulir layar, membaca dan menulis file mencakup bagian penting dari kebutuhan pengembangan aplikasi bisnis.
Jelas, banyak orang menyukai bahasa itu. Dia di OS / 2, ada di Amigami, di bawah Windows, dan banyak lagi di mana. Kemudian ada Object REXX dengan ekstensi objek, dan NetREXX untuk JVM. Yang utama adalah bahwa bahasa ini masih hidup. Dan secara umum, jika saya harus memilih apa yang akan ditulis skrip pada hari ini, maka mempertimbangkan misalnya Rexx, bash, cmd.exe bahasa burung sepenuhnya - saya pasti akan memilih yang pertama. Tetapi dibandingkan dengan bahasa yang sudah lebih baru, seperti Perl, Python, dan banyak lagi, banyak lainnya - semuanya tidak begitu jelas. Katakanlah, gagasan Rexx tentang mentransfer perintah dan variabel ke runtime adalah baik - tetapi gagasan, katakanlah COM, dengan orientasi objeknya, masih lebih fungsional.
Meskipun 40 tahun terakhir, masih digunakan di IBM z OS, dan sebuah buku bahasa, menurut Wikipedia, dirilis baru-baru ini, sekitar 2012. Untuk OS yang berbeda, sangat mungkin untuk mengunduh implementasi langsung dan mencobanya sendiri.