Desain Bahasa: Menggabungkan Gotos dan Fungsi

Saya sedang merancang dan saat ini memikirkan kembali bahasa pemrograman tingkat rendah yang ditafsirkan dengan kemiripan dengan assembler.

Saya segera menemukan masalah keputusan fungsi/loop/gotos dan berpikir bahwa meskipun loop seperti while dan for akan menjadi level yang terlalu tinggi dan tidak sesuai, goto akan menjadi level yang terlalu rendah, tidak dapat dipertahankan, dan umumnya jahat lagi. Fungsi seperti yang Anda ketahui dari sebagian besar bahasa yang memiliki nilai kembalian dan argumen juga tidak sesuai dengan konsep bahasa tersebut.

Jadi saya mencoba mencari tahu sesuatu antara suatu fungsi dan goto yang mampu dilakukannya

  • Pengulangan
  • Loop yang efisien

Setelah beberapa pemikiran saya mendapat ide tentang subrutin:

  • Mereka memiliki awal dan akhir seperti sebuah fungsi
  • Mereka punya nama tetapi tidak ada argumen seperti goto
  • Anda dapat melakukannya dengan jump dan keluar lagi sebelum berakhir dengan return (tidak memberikan hasil apa pun, hanya menghentikan subrutin)
  • Ditangani seperti kode normal -> Cakupan global seperti goto

Jadi saya ingin tahu:

  • Apakah ide di atas bagus? Apa saja (dis) keuntungannya?
  • Akankah ada kombinasi fungsi dan goto yang lebih baik atau bahkan ide yang benar-benar baru?

person sub    schedule 09.04.2010    source sumber
comment
Jadi pada dasarnya Anda menerapkan GOSUB?   -  person David    schedule 09.04.2010
comment
Maksudmu benda itu dari BASIC? Mungkin saja, namun saya tidak tahu apakah GOSUB mendukung rekursi.   -  person sub    schedule 09.04.2010
comment
Jika subrutin Anda tidak memiliki parameter atau variabel, pertanyaan tentang rekursi tidak relevan.   -  person PauliL    schedule 09.04.2010
comment
@PauliL: Apa yang Anda katakan jelas salah.   -  person sub    schedule 09.04.2010


Jawaban (3)


Apakah ide di atas bagus?

No.

Atau setidaknya sampai Anda memberikan penjelasan yang lebih baik tentang masalah apa yang ingin Anda pecahkan dengan merancang bahasa baru.

Apa saja (dis) keuntungannya?

Tidak ada abstraksi fungsional, tidak ada rekursi, pemrograman hanya dengan berbagi keadaan yang bisa berubah. Prinsip komposisi yang sangat lemah. Sulit digunakan untuk pemrogram manusia dan tidak ada gunanya sebagai target kompiler.


Untuk mencapai suatu tujuan dengan proyek seperti ini, Anda harus memiliki tujuan. Jika tujuan Anda adalah mempelajari sesuatu, lebih baik Anda mempelajari beberapa bahasa yang bagus dan mencoba mencari tahu apa yang bisa Anda curi, apa yang bisa Anda gabungkan, atau apa yang bisa Anda terapkan. Jika Anda mempunyai masalah nyata yang ingin Anda pecahkan, dan masalah tersebut tidak dapat diselesaikan dengan bahasa assembly standar, ada baiknya beri tahu kami apa masalahnya.

Anda dapat mencoba mencari "bahasa perakitan portabel" di Google dan melihat apakah Anda menemukan sesuatu yang menarik.

person Norman Ramsey    schedule 10.04.2010

Saya pikir ketika Anda berada di tingkat perakitan, GOTO berhenti menjadi jahat, dan mulai menjadi bagaimana program sebenarnya bekerja.

Namun, apakah subrutin Anda mengambil parameter? Bahkan jika tidak, bagaimana status pendaftaran toko Anda untuk menghindari luapan rekursi?

person Mr. Boy    schedule 09.04.2010
comment
Saya menggunakan tumpukan dengan posisi lompatan sehingga penerjemah tahu ke mana harus kembali setelah subrutin. Namun, untuk menghindari memakan memori, kelambatan dan overflow, tumpukan tidak digunakan ketika subrutin memanggil dirinya sendiri -› loop. - person sub; 09.04.2010
comment
Sub, jika Anda tidak menyimpan alamat pengirim ketika subrutin memanggil dirinya sendiri, itu sebenarnya bukan rekursi. Dan tidak ada gunanya mengimplementasikan loop dengan menggunakan rekursi. Gunakan goto sebagai gantinya. - person PauliL; 09.04.2010

Subrutin yang Anda terapkan sama dengan GOSUB di Basic atau CALL di Majelis.

Rekursi hanya bermakna jika Anda menggunakannya untuk algoritma rekursif. Itu membutuhkan fungsi dengan parameter, variabel lokal, dan nilai kembalian.

Namun, dalam beberapa bahasa skrip sederhana yang hanya memiliki variabel global, terdapat instruksi PUSH dan POP untuk menyimpan variabel dalam tumpukan (seperti register yang didorong dan dimunculkan dalam bahasa Majelis) . Itu dapat digunakan untuk implementasi variabel lokal dan rekursi tingkat rendah.

Saya telah menggunakan metode itu dalam beberapa contoh Bahasa Makro Vedit dalam Kode Rosetta, lihat misalnya Menara Hanoi dan Kurva Bezier.

person PauliL    schedule 09.04.2010