2 poin oleh GN⁺ 2023-07-18 | 1 komentar | Bagikan ke WhatsApp
  • Forth berawal dari interpreter kecil yang dibuat Chuck Moore untuk mengurangi alur kompilasi dan kartu pons yang panjang, lalu berkembang menjadi sistem yang menyerap editor, sistem operasi, hingga kompiler
  • Notasi postfix (RPN), stack data, dan word (dictionary) bukan sekadar sintaks yang asing, melainkan rancangan untuk mengurangi pemborosan dan pekerjaan berulang di perangkat keras yang penuh keterbatasan
  • Inti Forth ada pada struktur yang bisa melakukan bootstrap, di mana elemen seperti :, ;, IF, komentar, dan variabel dapat didefinisikan maupun didefinisikan ulang di dalam bahasa itu sendiri
  • Implementasi seperti JonesForth, nasmjf, PlanckForth, dan sectorforth menunjukkan bahwa Forth dapat dimulai dari puluhan hingga ratusan byte atau sejumlah kecil primitive, lalu diperluas menjadi interpreter, kompiler, assembler, dan DSL
  • Contoh pesawat antariksa, Open Firmware, Jupiter Ace, Canon Cat, Harris RTX2010, dan GreenArrays menunjukkan bahwa Forth sangat selaras dengan pengembangan interaktif, kode kecil, kedekatan dengan perangkat keras, dan komputasi berdaya rendah

Dari legenda Usenet ke penjelajahan Forth

  • Dave Gauer merangkum perjalanan pribadinya menemukan Forth dan menempatkannya dalam sejarah komputasi, dan halaman ini diadaptasi dari slide presentasi singkat
  • Grup comp.* di Usenet pada 1990-an, terutama comp.lang.*, merupakan tempat penting untuk belajar dan mendiskusikan pemrograman
    • Pengumuman pertama Linux oleh Linus Torvalds juga disebut sebagai contoh yang diposting ke comp.os.minix pada 1991
    • Pada akhir 1990-an, Perl memegang porsi besar di Web awal sebagai bahasa untuk halaman dinamis dan pemrosesan formulir melalui CGI
  • Legenda seperti bahasa keluarga Lisp, Y combinator, The Little Schemer, dan The Story of Mel yang ditemui pada era Usenet berlanjut menjadi rasa ingin tahu terhadap Forth
  • Forth pada awalnya hadir sebagai kisah tentang “bahasa yang cukup lentur untuk mengubah nilai integer itu sendiri”, dan Chuck Moore dikenang seperti “mad wizard” yang bisa menulis program apa pun hanya dengan beberapa layar kode
  • Seri blog James Hague, programming in the twenty-first century, menjadi pemicu terakhir untuk mendalami Forth

RPN dan stack hanyalah titik awal

  • Kesan pertama terhadap Forth adalah notasi postfix atau Reverse Polish Notation (RPN)
    • Berbeda dari notasi infix umum 3 + 4, Forth menaruh operator setelah operan seperti 3 4 +
    • Contoh Forth 3 4 * 5 6 * + . menghasilkan 42
    • Di dc, perhitungan yang sama ditulis sebagai 3 4 * 5 6 * + p
  • RPN memungkinkan ekspresi bertingkat dihitung dalam urutan yang diinginkan tanpa tanda kurung
    • 3 4 * menghasilkan 12, 5 6 * menghasilkan 30, dan + terakhir menghasilkan 42
    • Dalam Forth, . mengambil nilai dari stack lalu mencetaknya
  • Kalkulator HP-35 adalah contoh sejarah penting yang membuat RPN dikenal di luar ilmu komputer
    • Pada awal 1970-an, HP sudah memiliki kalkulator desktop yang kuat, dan HP-35 diperkenalkan sebagai contoh yang membawa kemampuan hitung itu ke kalkulator “shirt pocket”
    • Kalkulator HP terkenal dengan sintaks RPN, dan meski efisien, RPN terlihat agak sulit dipahami bagi orang luar
  • Ciri kedua adalah stack data
    • Operasi seperti PUSH, POP, SWAP, dan DUP juga merupakan word di Forth
    • Saat angka dimasukkan, angka itu naik ke stack, dan operator mengambil nilai dari stack, menghitungnya, lalu menaruh kembali hasilnya
  • Stack mengurangi kebutuhan memberi nama pada nilai antara
    • Dalam banyak imperative language, nama sementara seperti result2 atau matched_part3 sering diperlukan
    • Cara kerja tanpa nama ini juga disebut implicit, tacit, atau point-free programming
    • Memahami Forth hanya sebagai RPN dan stack saja masih belum cukup, tetapi itu tetap titik awal yang masuk akal untuk memahami asal-usul sejarahnya

Pemrograman concatenative, Joy, dan perbedaannya dengan Forth

  • Saat menelusuri Forth, kita akan bertemu konsep concatenative programming
    • Contoh applicative adalah eat(bake(prove(mix(ingredients))))
    • Contoh concatenative adalah ingredients mix prove bake eat
    • Fungsi disusun berurutan, dan nilai dari tiap tahap diteruskan secara implisit ke tahap berikutnya
  • Joy adalah contoh representatif dari concatenative language
    • Manfred von Thun terinspirasi oleh kuliah ACM Turing Award 1977 dari John Backus, “Can Programming Be Liberated from the von Neumann Style?”
    • Dalam Joy, semua fungsi menerima satu stack sebagai masukan dan mengembalikan satu stack sebagai keluaran
    • Program adalah daftar fungsi yang dibaca dari kiri ke kanan
  • Quotation dan combinator di Joy menunjukkan cara berhitung tanpa variabel
    • [1, 2, 3, 4].map(n => n + 1) di JavaScript menghasilkan [2,3,4,5]
    • Dalam Joy, hasil yang sama diperoleh dengan [1 2 3 4] [1 +] map
    • [] di Joy adalah mekanisme quotation yang dapat menampung bukan hanya data, tetapi juga program
  • Combinator diperlakukan sebagai fungsi tingkat tinggi yang menerima fungsi sebagai masukan
    • map() adalah contoh yang mengabstraksikan boilerplate penelusuran daftar
    • Combinator I, K, S dan kalkulus SKI muncul sebagai susunan untuk menjelaskan komputasi universal
    • Hanya dengan S dan K, sistem sudah bisa menjadi lengkap untuk komputasi universal
  • Forth juga dapat membuat fungsi tingkat tinggi dengan execution token dan word EXECUTE
    • FOO EXECUTE menjalankan word yang dikembalikan oleh word FOO
    • Word combinatorial seperti MAP, FOLD, dan REDUCE dapat didefinisikan
  • Forth dan Joy tampak mirip secara sintaks, tetapi cara mereka menafsirkan ekspresi berbeda
    • Di Forth, 2 3 + dibaca sebagai “push 2 dan 3 ke stack lalu jumlahkan”
    • Di Joy, itu dibaca sebagai “komposisi fungsi 2, 3, dan + setara dengan fungsi 5”
    • Forth lebih tepat dipahami sebagai bahasa yang tumbuh dari interaksi dengan perangkat keras daripada dari prinsip komputasi concatenative yang abstrak

Jalur yang ditempuh Chuck Moore untuk menciptakan Forth

  • Pada 1958, Chuck Moore menggunakan Fortran dan IBM 704 saat berada di Smithsonian Astrophysical Observatory dan MIT
    • Dalam Forth, the Early years, Moore mengatakan, “Compiling took 30 minutes...you got one shot per day”
    • IBM 704 adalah komputer tabung vakum sebesar satu ruangan, dan turut disertakan kutipan bahwa mesin itu rata-rata rusak setiap sekitar 8 jam
  • Moore membuat interpreter sederhana yang membaca kartu pengendali program untuk mengurangi kebutuhan kompilasi ulang
    • Tanpa recompile, ia bisa menyusun equation berbeda untuk beberapa satellite
    • Format input free-form lebih andal bagi manusia untuk ditulis dibanding kolom terformat Fortran
    • Sistem ini kemudian menjadi asal-usul sistem yang kelak disebut Forth
  • Pada 1961 di Stanford, Moore menggunakan Burroughs B5500 dan menulis aplikasi matematika bernama CURVE
    • CURVE memiliki interpreter yang lebih canggih, data stack, dan operator control flow
    • Fungsinya kira-kira setara dengan word Forth seperti IF ELSE DUP DROP SWAP + - *
    • Dengan penambahan parameter stack dan kemampuan mendefinisikan procedure baru, mulai tampak struktur yang mendekati Forth
  • Sekitar 1965, dengan munculnya lingkungan teletype, paper tape, timesharing, dan terminal interaktif, Forth menjadi lebih interaktif
    • Ditambahkan word seperti KEY, EMIT, CR, SPACE, DIGIT
    • Word-word ini mengubah sistem Moore menjadi program editor, sehingga pengguna bisa mengedit program dari dalam program
  • Pada 1968 di Mohasco, Moore bekerja dengan IBM 1130 dan memberi nama “FORTH”
    • IBM 1130 berkonfigurasi 16-bit dengan RAM 8KB, dan nama file dibatasi 5 karakter
    • Sistem “fourth generation” milik Moore menjadi FORTH karena batas 5 karakter tersebut
    • Pada masa ini, return call stack dan word dictionary ditambahkan
  • Word dictionary bernama dalam Forth berfungsi sebagai abstraksi utama
    • : DOUBLE DUP + ;
    • : QUAD DOUBLE DOUBLE ;
    • Tanpa return stack, setelah menjalankan DOUBLE sistem tidak bisa kembali ke posisi sisa milik QUAD

NRAO, porting, indirect threaded code

  • Pada awal 1970-an, Moore menulis perangkat lunak kendali komputer untuk radio telescope di National Radio Astronomy Observatory
    • NRAO memiliki kebijakan menggunakan Fortran pada minicomputer, tetapi Moore mendapat izin memakai Forth berdasarkan keberhasilan sebelumnya
    • Dalam spectral-line observing, sistem ini bisa menampilkan spectra yang sedang dikumpulkan dan menyesuaikan line-shapes dengan least-squares
    • Pekerjaan ini memajukan state-of-the-art online data reduction, dan para astronom memakainya untuk menemukan serta memetakan inter-stellar molecules
  • Elizabeth “Bess” Rather menerima Forth dan menulis manual Forth pertama pada 1972
    • Setelah itu ia ikut mendirikan FORTH, Inc bersama Chuck Moore
    • Hingga pensiun pada 2006, ia tetap menjadi salah satu pakar dan promoter utama bahasa Forth
  • Forth dipindahkan ke berbagai mesin seperti IBM 360/50, Honeywell 316, Honeywell DDP-116, dan DEC PDP-11
    • Implementasi Forth untuk H316 diprogram pada komputer itu sendiri dan digunakan untuk membuat Forth lain, sehingga dianggap sebagai implementasi lengkap dan mandiri pertama
    • PDP-11 adalah minicomputer penting yang terkait dengan sejarah Unix dan bahasa pemrograman C
  • Latar belakang mengapa Forth bisa di-port ke banyak mesin adalah indirect threaded code
    • Di sini threaded code tidak berhubungan dengan concurrency atau multi-threaded programming
    • Threaded code menyimpan daftar alamat subroutine alih-alih instruksi pemanggilan subroutine
    • Untuk mengeksekusi daftar alamat itu, diperlukan code interpreter
  • Indirect threaded code menyimpan daftar alamat yang menunjuk ke alamat yang menunjuk ke code, bukan alamat yang langsung menunjuk ke code
    • Indirection kedua memungkinkan adanya inner interpreter terpisah untuk tiap jenis subroutine yang berbeda
    • Dalam Forth, outer interpreter adalah bagian tempat pengguna berinteraksi lewat terminal, sedangkan inner interpreter menjalankan sisa word
  • Pada titik ini, Forth telah berkembang melampaui command interpreter sederhana menjadi bahasa interaktif, editor, operating system, serta metode penyimpanan dan eksekusi code
    • Dirangkum karakteristiknya: postfix notation, stack-oriented, concatenative style, interpreted, sangat mudah diadaptasi ke machine architecture, dan extremely compact
    • Forth bukan bahasa yang dirancang sekaligus pada 1958, melainkan hasil pertumbuhan yang dibentuk Moore sesuai kebutuhannya dan hardware baru

Untuk memahami Forth, Anda harus mengimplementasikan Forth

  • Dalam nasihat “To understand Forth, you have to implement a Forth”, kata pentingnya adalah a Forth
    • Dari sudut pandang Chuck Moore, sistem Forth paling baik ketika di-custom-tailor agar sesuai dengan system dan task
  • Sebelum membahas source JonesForth, penulis menulis Assembly Nights untuk mempelajari dasar assembly dan Linux ABI
    • JonesForth menggunakan source assembly i386 yang ditulis dengan GNU GAS assembler
    • Ini khusus 32-bit dan langsung menggunakan Linux system call ABI
    • Penulis menghabiskan sekitar satu tahun untuk mem-port JonesForth ke salinan yang berjalan dengan NASM assembler, dan port ini adalah nasmjf
  • Dalam proses porting nasmjf, penulis mempelajari cara kerja Forth indirect threaded tradisional
    • jonesforth.S milik JonesForth adalah satu file yang memuat bagian assembly, dan Richard W.M. Jones memandu alur interpreter dengan ASCII art dan penjelasan
    • Penulis membuat berbagai diagram ASCII art di source nasmjf untuk merangkum pemahamannya sendiri
  • Macro NEXT adalah alur inti yang memindahkan eksekusi ke word berikutnya setelah sebuah word dijalankan
%macro NEXT 0
    lodsd     ; NEXT: Load from memory into eax, inc esi to point to next word.
    jmp [eax] ; Jump to whatever code we're now pointing at.
%endmacro
  • lodsd memindahkan double word dari memory ke eax dan memperbaruinya agar menunjuk ke posisi berikutnya
  • jmp [eax] memindahkan eksekusi ke lokasi yang sedang ditunjuk, dan menjadi inner interpreter untuk subroutine tersebut
  • Dalam Forth tradisional, pada dasarnya ada code word dan colon word
    • Code word adalah primitive yang ditulis dalam machine code
    • Colon word adalah word biasa yang ditulis dalam bahasa Forth dan dirakit oleh compiler :
    • Colon word berakhir dengan EXIT, dan EXIT menangani return stack lalu meneruskan alur ke NEXT
  • Forth adalah struktur tempat potongan-potongan yang sangat kecil bekerja bersama membentuk running system
    • Di level rendah, ini memberi fleksibilitas dan kesederhanaan, tetapi di level tinggi, kemudahan pemahaman bisa dikorbankan

Code word, colon word, dan compiler berjalan di atas interpreter yang sama

  • SWAP, DUP, DROP menunjukkan seberapa langsung primitive Forth dapat diimplementasikan sebagai machine code
DEFCODE "SWAP",SWAP,0
    pop eax
    pop ebx
    push eax
    push ebx
NEXT
DEFCODE "DUP",DUP,0
    mov eax, [esp]
    push eax
NEXT
DEFCODE "DROP",DROP,0
    pop eax
NEXT
  • JonesForth menggunakan i386 call/return stack sebagai Forth parameter stack, sehingga operasi stack diimplementasikan dengan pop dan push native
  • nasmjf memiliki 130 code word, dan sebagian besar ada demi efisiensi
    • ada batas minimum teoretis untuk jumlah machine-code word yang dibutuhkan sistem Forth yang bisa di-bootstrap
    • jika jumlah primitive dikurangi terlalu jauh, sisa kode Forth bisa menjadi tidak efisien dan terdistorsi
    • Frank Sergeant A 3-INSTRUCTION FORTH FOR EMBEDDED SYSTEMS WORK membahas Forth 3-instruction yang hanya membutuhkan 66 byte pada Motorola MC68HC11
    • sectorforth adalah Forth x86 16-bit yang muat dalam boot sector 512 byte
  • colon word adalah cara membuat word baru dari composition word yang sudah ada
: SDD SWAP DROP DUP ;
  • SDD menghasilkan efek yang sama seperti memanggil SWAP DROP DUP secara berurutan
  • dari sudut pandang indirect threaded code, colon word telah dikompilasi sebagai alamat inner interpreter dari tiga code word
  • : dan ; terlihat seperti syntax, tetapi sebenarnya adalah Forth word
    • : mengambil nama word baru dan menyalakan compile mode
    • ; menyelesaikan dictionary entry baru dan mematikan compile mode
    • pengguna dapat mengganti : itu sendiri dengan definisi buatan mereka untuk memperluas atau mengubah Forth
    • satu-satunya syntax di Forth ditangani sebagai whitespace di antara input token
  • dalam Forth, compiling berarti menaruh alamat word atau literal beserta kode push ke memori
    • dalam mode normal, word langsung dieksekusi
    • dalam compile mode, alamat word disimpan ke memori
    • interpreter yang sama menangani eksekusi kode dan compiling kode
  • control structure seperti IF...THEN juga dapat diimplementasikan dalam Forth itu sendiri
: IF IMMEDIATE ' 0BRANCH , HERE @ 0 , ;

: THEN IMMEDIATE DUP HERE @ SWAP - SWAP ! ;
  • Fakta bahwa elemen sefundamental IF pun didefinisikan di dalam bahasa itu sendiri menjadi dasar utama judul “The programming language that writes itself”
  • nested comment ( ... ) juga diimplementasikan dalam Forth di jonesforth.f
    • bahkan comment diimplementasikan di dalam bahasa, dan pengguna bisa mendefinisikannya ulang atau menambahkan gaya comment mereka sendiri
    • contoh ini menekankan bahwa Forth hampir tidak memiliki syntax native

Dictionary dan redefinisi menciptakan ekstensibilitas

  • Dictionary Forth secara tradisional menggunakan linked list, dan pencocokan kata dimulai dari entry terbaru
    • definisi kata terbaru dengan nama yang sama menutupi definisi sebelumnya
    • kata apa pun bisa didefinisikan ulang, termasuk kata yang awalnya didefinisikan dalam assembly
    • word yang sudah dikompilasi menyimpan alamat, bukan nama, sehingga tetap menunjuk ke alamat word sebelum redefinisi
  • Kita bisa memanggil word lama dengan nama yang sama dari definisi baru untuk memperluas word tersebut
    • saat membuat recursive word, : menyembunyikan word yang sedang dikompilasi dari dictionary atau menandainya sebagai tidak aktif
    • untuk memanggil dirinya sendiri dari dalam word saat ini, diperlukan RECURSE
  • contoh variabel apel yang diambil dan dimodifikasi dari Leo Brodie Thinking Forth menunjukkan fleksibilitas Forth
    • VARIABLE APPLES membuat word APPLES yang saat dipanggil meletakkan alamat memori ke stack
    • 20 APPLES ! menyimpan 20 ke alamat tersebut
    • APPLES ? mengambil nilainya lalu mencetaknya
    • Thinking Forth (PDF) tersedia gratis
  • bahkan jika apel merah dan apel hijau perlu dilacak secara terpisah, kode yang sudah memakai APPLES tidak perlu diubah
VARIABLE COLOR

VARIABLE REDS
: RED REDS COLOR ! ;

VARIABLE GREENS
: GREEN GREENS COLOR ! ;

: APPLES COLOR @ ;
  • APPLES yang baru juga merupakan word yang meletakkan alamat ke stack, jadi cara penggunaan APPLES ! dan APPLES ? tetap sama
  • hanya alamatnya yang berubah menjadi REDS atau GREENS sesuai warna apel yang aktif
  • dari sudut pandang bahasa umum, ini terlihat seperti variabel berubah menjadi fungsi, tetapi di Forth variabel juga word yang meletakkan alamat dan fungsi juga word, jadi tidak ada perubahan konsep di level bahasa
  • token yang terlihat seperti angka pun dapat didefinisikan ulang sebagai dictionary word
: 4 12 ;
  • jika ." The value of 4 is " 4 . CR dijalankan, output-nya adalah The value of 4 is 12

Meow5 dan Forth sebagai “jalur dengan resistansi paling kecil”

  • nasmjf, port JonesForth ke NASM, bukanlah upaya mereproduksi proses Moore, melainkan latihan yang lebih mirip “master copy” yang mengamati hasil akhirnya secara rinci
  • setelah itu, penulis menjalankan eksperimen pemrograman concatenative ekstrem bernama Meow5
    • Meow5 adalah eksperimen yang selalu menyambung dan meng-inline semua kode
    • ia bersifat concatenative karena memakai konsep parameter stack seperti Forth
    • ini adalah eksperimen pemikiran yang mendorong gagasan: bagaimana jika alih-alih menyimpan alamat pemanggilan fungsi, kita menyimpan salinan lengkap fungsi itu
  • inti Meow5 adalah membuat semua word 100% inline
    • berangkat dari inline expansion, optimasi umum untuk menghindari overhead pemanggilan fungsi kecil
    • memanggil primitive satu-instruksi seperti DROP melalui beberapa lompatan terasa seperti pemborosan
  • Meow5 berakhir sebagai “kegagalan kecil yang menyenangkan”
    • inline machine code itu sendiri bekerja dengan baik, dan executable ELF yang dihasilkan juga berjalan sesuai maksud
    • masalahnya ada pada data string; string harus disalin setiap kali atau perlu pelacakan rumit tentang word mana yang menggunakan string
    • INLINE word milik Forth yang menyediakan selective inlining dinilai sebagai pendekatan yang lebih baik
  • pada syntax string pun nasihat Moore kembali terbukti
    • di Forth digunakan word ", sehingga diperlukan spasi seperti " Hello World."
    • Meow5 mengadopsi quoting style yang lebih alami berbentuk "Hello World." serta escape sequence seperti \n, \"
    • pilihan ini membuat tokenizer dan interpreter membutuhkan penanganan pengecualian " di banyak tempat, sehingga kemurnian dan kesederhanaannya berkurang
  • begitu mulai mengikuti jalur Forth, sisanya terasa seperti “menulis dirinya sendiri”
    • Forth bisa menjadi bootstrap, metaprogramming, serta OS dan IDE/editor
    • ini mengarah pada klaim bahwa saat membuat interpreter paling sederhana untuk arsitektur CPU yang sepenuhnya baru, kita bisa berakhir menulis sesuatu yang mirip Forth

Implementasi Forth kecil dan penggunaan nyatanya

  • Forth dapat mendefinisikan lebih banyak Forth di dalam Forth, dan banyak Forth juga menyertakan assembler
    • Di bagian akhir JonesForth ada stub assembler yang berjalan di dalam Forth
    • ;CODE memperbarui header agar codeword menunjuk ke kode hasil assembly, bukan DOCOL
  • PlanckForth adalah Forth biner buatan tangan berukuran kurang dari 1KB
    • Biner ELF lengkap dan implementasi Forth yang berfungsi muat dalam ukuran kurang dari 1KB
    • bootstrap.fs dimulai dari operator-operator awal yang sulit dipahami, lalu beberapa ratus baris kemudian menjadi Forth yang mudah dibaca
  • Contoh implementasi kecil menunjukkan tingkat keterpadatan Forth yang ekstrem
    • SmithForth adalah machine code Forth buatan tangan karya David Smith, dan diperkenalkan sebagai sistem Forth 1.000 byte dan 1.000 baris
    • sectorforth adalah boot sector Forth 512 byte
  • Forth digunakan di pembangkit listrik, robotika, sistem pelacakan misil, otomasi industri, bahasa tertanam dalam video game, basis data, akuntansi, pengolah kata, grafis, sistem komputasi, boot loader Open Firmware, serta berbagai prosesor dan mikrokontroler
  • Open Firmware adalah contoh penting yang lahir dari engineering Sun Microsystems
    • Karena berbasis interactive programming language, perangkat keras baru dapat diuji dan di-bring-up dengan efisien
    • Dalam kasus Space Shuttle ESN, Open Firmware dibahas sebagai alat yang bisa men-debug perangkat keras, perangkat lunak, driver plugin, hingga firmware itu sendiri
  • Jupiter Ace adalah komputer rumahan Inggris tahun 1982 yang sistem operasinya memakai Forth
    • OS dan routine library termuat dalam ROM 8KB
    • Ada kutipan tahun 1982 yang menyebut Forth bawaan “10 kali lebih cepat” daripada interpreted BASIC dan memerlukan kurang dari setengah kebutuhan memori
  • Canon Cat pada 1987 memakai Forth sebagai sistem operasi, dan memuat OS, office suite, serta lingkungan pemrograman dalam ROM 256KB
    • Produk ini mewujudkan antarmuka berpusat pada keyboard dan filosofi desain Jef Raskin dalam perangkat keras dan perangkat lunak
    • Prosedur masuk ke antarmuka Forth tampaknya bukan alur penggunaan paling utama, tetapi jika mengetahui caranya, itu bisa dilakukan hanya dengan beberapa penekanan tombol

Perangkat lunak antariksa dan Forth

  • Salah satu penggunaan Forth yang menarik adalah eksplorasi antariksa
    • Karena wahana antariksa mahal dan sulit atau tidak mungkin diperbaiki, keandalan perangkat lunak menjadi penting
    • Daftar proyek NASA yang menggunakan Forth sangat panjang; tautan aslinya hilang, tetapi ada salinan di Wayback Machine dan forth.com
  • Space Shuttle Small Payload Accommodations Interface Module (SPAIM) adalah salah satu contoh penggunaan Forth
    • Tim pengembang menulis routine Forth di PC, mengunduhnya, lalu mengujinya secara interaktif
    • Ada kutipan yang menyebut perangkat lunak penerbangan SPAIM berjalan tanpa masalah selama misi Shuttle STS-45
    • Sistem Forth SPAIM mendukung multitasking, setiap task memiliki stack sendiri, dan task watchdog memantau kondisi stack
  • Space Shuttle Robot Arm Simulator adalah contoh perangkat kompleks yang dikembangkan satu programmer hanya dalam 5 minggu
    • Ia harus menerima perintah joystick 3 sumbu dan mengendalikan lengan sepanjang 50 kaki dengan 6 sendi dan 6 sistem koordinat
    • Disebutkan bahwa sistem ini memiliki 14 process terpisah
    • Ada kutipan bahwa simulation test dilakukan sangat menyeluruh sehingga algoritme executive control tidak diubah setelah instalasi di lapangan
  • Shuttle Mission Design and Operations System (SMDOS) adalah perangkat lunak kontrol berbasis darat milik JPL
    • Selama misi SIR-B, beberapa kerusakan perangkat keras ditangani di lapangan melalui modifikasi perangkat lunak
    • Karena masalah antena dan perubahan orbit, diperlukan strategi pengumpulan data baru, dan SMDOS dipakai untuk menampilkan rencana yang sesuai dengan kondisi baru
    • Banyak data hilang, tetapi 20% data berhasil dipulihkan melalui metode putar-tangkap-putar-kirim
  • Harris RTX2010 adalah perangkat keras Forth yang dipakai dalam banyak aplikasi antariksa
    • Menjalankan Forth secara langsung
    • Dua hardware stack dengan kedalaman 256 word
    • Clock 8MHz dan latency rendah
    • Karakteristik radiation-hardened
  • Rosetta dan Philae diperkenalkan sebagai misi pertama yang mengirim wahana mengorbit komet dan menurunkan pendarat ke permukaan komet
    • Ion and Electron Sensor milik Rosetta menggunakan Harris RTX2010
    • Pendarat Philae menggunakan 2 RTX2010 untuk CDMS dan 2 lagi untuk kontrol ADS
    • Rosetta melakukan perjalanan dari 2004 hingga 2014 sebelum bertemu 67P/Churyumov-Gerasimenko
    • 67P berdiameter 4 km dan mengorbit Matahari setiap 6 setengah tahun
  • Philae mengalami bounce di permukaan dalam gravitasi rendah karena kegagalan harpun dan thruster pendaratan, tetapi tetap cukup tangguh untuk menjalankan “80%” misi sainsnya
  • Contoh patch kode magnetometer Galileo tahun 1993 juga disebutkan
    • Magnetometer itu memiliki RCA1802, RAM 2KB, ROM 2KB, dan diprogram dalam Forth dengan sistem pengembangan berbasis Apple II
    • Sebuah byte memori rusak muncul di tengah kode instrumen, sehingga perlu dibuat patch agar byte itu tidak digunakan
    • Orang yang dikutip menulis dari nol lingkungan pengembangan Forth dan simulator perangkat keras untuk instrumen tersebut dalam Lisp guna menghasilkan patch, dan itu memakan waktu kurang dari 3 bulan sambil bekerja paruh waktu

Forth lebih dekat ke ide dan garis keturunan daripada satu implementasi tunggal

  • Forth lebih dekat pada sebuah ide dengan konsep bersama dan garis keturunan daripada satu implementasi representatif tunggal
  • Salah satu alasan Forth sulit dipelajari adalah tidak adanya satu implementasi tunggal yang secara eksklusif mewakili nama “Forth”
    • Beberapa Forth awal bahkan mendahului nama “Forth” itu sendiri
    • Standar Forth berlanjut dalam dokumen ANS Forth, dan disebutkan Forth 2012 Standard serta komite Forth200x
  • Berbagai Forth berbagi konsep dan word yang sama, tetapi Forth yang dikhususkan untuk tujuan tertentu memiliki kosakata khususnya sendiri
  • Chuck Moore mendirikan Forth, Inc pada 1973 dan sejak itu telah mem-porting Forth ke berbagai sistem, serta terus membuat sistem baru
  • colorForth adalah lingkungan karya Chuck Moore pada periode akhir
    • Warna dalam source code menggantikan sebagian tanda baca dalam Forth standar untuk menentukan cara word diproses
    • Warna dibahas sebagai cara menyederhanakan semantik Forth, meningkatkan kecepatan compile, dan juga membantu penglihatan Moore yang kurang baik
    • colorForth menyertakan sistem operasi 63KB miliknya sendiri
  • Moore memandang bahwa perangkat lunak menjadi makin kompleks karena fitur terus ditambahkan, dan akhirnya tak seorang pun berani mengubahnya karena takut pada akibat yang tidak diinginkan
    • Ini mengarah pada argumen bahwa yang dibutuhkan adalah programmer khusus yang mendedikasikan kariernya pada satu aplikasi tunggal, menulis ulangnya berulang kali sampai sempurna

Kedekatan dengan mesin, chip Forth, GreenArrays

  • Chuck Moore telah menentang kompleksitas perangkat lunak sejak tahun 1950-an, dan muncul kutipan yang memandang sistem operasi seperti Windows, UNIX, dan DOS sebagai sesuatu yang tidak dapat dipahami atau tidak perlu
  • Penulis menjelaskan filosofi Moore dengan Mechanical Sympathy
    • Istilah ini berasal dari kutipan pembalap Formula One Jackie Stewart, dan dalam konteks perangkat lunak digunakan dalam Why Mechanical Sympathy? karya Martin Thompson
    • Forth cenderung populer di kalangan “orang hardware” seperti insinyur listrik dan perancang sistem embedded
  • Kecintaan sejati Chuck Moore tampaknya terletak pada perancangan prosesor
    • Harris RTX2000 dan RTX2010 diperkenalkan pada dasarnya sebagai chip Moore
    • Moore merancang hardware sejak gate array Novix N400 pada 1983, dan desain yang telah ditingkatkan dijual ke Harris lalu menjadi chip RTX
  • Moore merancang prosesor dengan perangkat lunak VLSI buatannya sendiri, OKAD, yang ditulis dalam 500 baris Forth
    • VLSI Design Tools (OKAD) menjelaskan bahwa 500 baris colorForth menyediakan semua yang diperlukan untuk merancang chip
    • OKAD adalah kumpulan alat yang mencakup teknologi gerbang logika, layout sirkuit, simulation perilaku elektrik, dan export GDSII
  • Novix NC4000 adalah mesin pemrosesan ultra-cepat yang dirancang untuk mengeksekusi perintah Forth tingkat tinggi secara langsung
    • Kinerja diperoleh dengan menghilangkan assembly language biasa dan microcode internal
    • Architecture tumpukan ganda sangat mengurangi overhead implementasi subroutine
  • Chip GreenArrays diperkenalkan dengan berfokus pada presentasi Moore tahun 2013, “Programming a 144-computer chip to minimize power”
    • Satu chip memiliki 144 komputer asinkron
    • Core yang menganggur menggunakan 100 nW, core aktif menggunakan 4 mW dan berjalan pada 666 Mips sebelum kembali ke keadaan idle
    • Saat semua komputer berjalan pada kecepatan maksimum, konsumsi dayanya 550 mW, sekitar 0,5 W
  • Dokumen GreenArrays Architecture menekankan “NO CLOCKS”
    • Dijelaskan bahwa pembuatan dan distribusi clock pada komputer biasa menghabiskan banyak energi bahkan saat menunggu, tetapi tidak melakukan apa pun
    • GreenArrays diperkenalkan bukan sebagai Multi-Core CPU, melainkan sebagai Multi-Computer System

Masa depan kesederhanaan, efisiensi, dan komputasi berdaya rendah

  • Penulis melihat bahwa perangkat lunak dan hardware terus bergerak ke arah penumpukan lapisan kompleksitas yang makin banyak
    • Komputasi di pusat data besar terasa murah atau gratis karena secara tidak langsung dibayar lewat biaya iklan
    • Yang sebenarnya dibayar adalah perhatian pengguna dan data pribadi mereka
  • Penulis berpendapat tidak ada alasan untuk terus memakai perangkat lunak yang makin tidak efisien dan dibuat asal-asalan, serta menuntut hardware yang makin tinggi
  • Bahasa mirip Forth dapat memiliki masa depan yang kuat di bidang berikut
    • komputer kecil yang ada di mana-mana
    • tenaga surya
    • VM yang sangat dibatasi
  • Dennard scaling hampir berhenti sekitar tahun 2006
    • Hubungan yang memungkinkan transistor lebih kecil memberi kecepatan lebih tinggi dan tegangan lebih rendah mencapai kebuntuan sekitar 4GHz karena kebocoran arus dan panas
    • The Free Lunch Is Over karya Herb Sutter adalah tulisan yang membahas bahwa cara peningkatan performa CPU sedang beralih ke hyper-threading dan multicore
  • Sutter berpendapat bahwa aplikasi perlu didesain ulang agar sesuai dengan konkurensi, atau kita harus menulis kode yang lebih efisien dan tidak terlalu boros
    • Ia mengatakan bahwa optimasi performa bukan akan menjadi kurang penting, melainkan lebih penting
  • Saat ini, kita bisa membeli microcontroller yang jauh lebih kuat daripada IBM 704 hanya dengan harga beberapa koin, lalu menulis system Forth yang kuat di atasnya
    • microcontroller dapat berjalan dengan baterai coin cell atau panel surya kecil
    • Lalu diikuti dengan pernyataan bahwa belum pernah ada masa yang lebih menakjubkan untuk komputasi skala kecil daripada sekarang
  • Untuk memahami Forth, kita perlu mempertimbangkan perbedaan antara “simple” dan “easy”
    • Simple Made Easy karya Rich Hickey diperkenalkan sebagai presentasi yang memberi cara untuk membicarakan pembedaan ini
    • Forth tidak mudah dan mungkin tidak selalu menyenangkan, tetapi jelas merupakan bahasa yang sederhana
  • Growing a Language karya Guy Steele adalah presentasi yang menunjukkan bagaimana sebuah bahasa dibangun dari primitive
    • Kutipan Lisp bahwa bahasa menjadi lebih besar tanpa jahitan ketika kata baru yang didefinisikan pengguna terlihat seperti primitive, dan primitive juga terlihat seperti kata yang didefinisikan pengguna, dapat diterapkan juga pada Forth
  • Ajakan penutupnya adalah membuat bahasa pemrograman sempurna untuk diri sendiri

1 komentar

 
GN⁺ 2023-07-18
Komentar Hacker News
  • Begitu mengenal Forth, saya langsung berpikir harus mencoba membuatnya sendiri, lalu membuat MiniForth hanya dalam satu minggu dua tahun lalu
    Awalnya ditujukan untuk Blue Pill dan Arduino asli, tetapi dikembangkan sebagai cross-compiler agar bisa diuji di host
    Saya begitu tenggelam sampai selalu menantikan waktu untuk mengutak-atiknya setiap hari sepulang kerja, dan selesai hanya dengan lima malam kerja serta satu akhir pekan; membuat Forth memang seseru itu
    Saya sangat merekomendasikan proses ini, dan satu-satunya pengalaman serupa yang memberi pencerahan seperti ini adalah saat pertama kali mengenal macro Lisp(https://www.thanassis.space/score4.html#lisp)
    • Benar. Di kelas arsitektur komputer tahun pertama, saya harus mengerjakan proyek akhir bebas untuk LC-3, dan karena sebelumnya pernah sedikit mencoba Forth lewat mod Minecraft RedPower 2, saya pikir akan seru jika mengimplementasikannya
      Hampir seluruh waktu luang saya semester itu habis untuknya, dan suatu hari saya baru sadar begadang semalaman setelah matahari mulai terbit saat melihat jam
      Saya belum pernah memakai Forth secara praktis di kehidupan nyata, tetapi pengalaman membangun satu dari nol memang paling tepat digambarkan sebagai pengalaman yang nyaris religius
      Rasanya seperti sari pati paling murni dari pemrograman seperti yang dikatakan Fred Brooks: programmer, seperti penyair, bekerja sangat dekat dengan bahan murni pikiran; membangun istana di udara semata dengan imajinasi; dan program adalah sihir nyata yang membuat sesuatu yang sebelumnya tidak ada menjadi hidup di layar ketika mantranya dimasukkan dengan benar
    • Sepenuhnya setuju. Sangat lama dulu saya pernah membuat compiler Forth dengan ZX81 BASIC
      Yang tadinya butuh 19 detik untuk menampilkan 1000 angka di layar berubah menjadi selesai seketika
      Saya juga mendapat pelajaran besar: setelah melihat kode mesin yang dihasilkan, saya mengira itu sudah sempurna dan tak bisa diperbaiki lagi, tetapi keesokan harinya saya kembali dan membuatnya jauh lebih cepat
  • Orang mungkin bertanya, “Bagaimana maksudnya menulis dirinya sendiri? Bukankah itu cuma berarti bisa menulis fungsi?”
    Sampai batas tertentu benar, tetapi Forth melangkah lebih jauh karena Anda bisa mendefinisikan word baru dan menjadikannya bagian dari bahasa itu sendiri
    Word-word ini bisa dipakai seperti operasi bawaan, dan bahkan dapat mengubah cara kerja bahasanya
    Karena ini bahasa yang bisa diperluas, Anda juga bisa membuat word yang mendefinisikan struktur kontrol baru atau mengubah sintaks, dan keluwesan seperti ini jarang ada di bahasa lain
    Dalam arti ini, Forth bisa dianggap sebagai bahasa yang “menulis dirinya sendiri” karena memungkinkan programmer menyesuaikan dan memperluas bahasa pada tingkat yang sangat mendasar
    Ini juga mirip dengan sistem macro Lisp: sebagaimana macro Lisp memungkinkan transformasi saat waktu kompilasi untuk membuat struktur sintaks baru dan bahasa spesifik domain, word Forth juga memungkinkan perluasan sintaks dan fungsi
    • Keren memang, tetapi selama hampir 40 tahun bekerja sebagai programmer profesional, masalahnya tidak pernah pada sintaks, melainkan selalu pada semantik
      Mungkin ada situasi seperti perkalian matriks di mana menulis A = B + C * D; lebih baik daripada menuliskan satu per satu fungsi yang harus dipanggil, tetapi saya belum pernah benar-benar menemui masalah seperti itu
      Saya jadi penasaran apakah ini karena imajinasi saya kurang, atau hanya berguna di bidang tertentu yang belum pernah saya geluti, atau karena sintaks Forth terlalu miskin sehingga harus diperluas agar layak dipakai, atau karena orang ingin mengutak-atik bahasa seperti men-tuning mobil
      Saya kurang paham mengapa orang benar-benar tertarik pada hal ini
  • Salah satu proyek Forth yang paling menarik saat ini adalah Dusk OS, sistem operasi 32-bit yang ditulis dalam Forth dan mencakup compiler C-nya sendiri, dengan berbagai upaya porting juga sedang berlangsung
    https://duskos.org/
    • Saya tidak begitu tahu tentang DuskOS itu sendiri, tetapi secara historis memang benar bahwa Forth adalah semacam “sistem operasi miliknya sendiri”, hanya saja dibandingkan dengan apa yang dibayangkan pembaca modern sebagai sistem operasi, itu cukup kasar
      Memang wajar bertanya apa yang bisa diharapkan dari sesuatu yang berjalan di RAM 8KB, tetapi meskipun menyediakan fungsi-fungsi dasar, secara historis ia hampir tidak punya driver maupun sebagian besar konsep abstraksi
      Kode dimuat dari source sehingga lambat, dan linking lebih mirip memuat blok dalam urutan yang benar, serta untuk memuat program baru Anda harus lebih dulu membuang program yang sedang aktif
      Sulit dibilang jauh lebih baik daripada CP/M, yang bahkan sering melakukan cold start pada mesin saat program berakhir, tetapi setidaknya CP/M memang memisahkan BIOS dan BDOS
    • Saya melewatkan ini. Saya baru saja membaca “Beyond the Collapse”, dan merasa dengan kemampuan Lisp atau APL/J maupun C saya, saya sulit mendekati kesederhanaan Forth di level sistem operasi
      Saya pasti akan memeriksanya sebelum akhir pekan depan
  • Bahasa pemrograman pertama saya adalah assembly x86 dan Forth. Ayah saya sangat menyukai Forth, dan saya belajar pemrograman darinya
    Saat remaja saya membuat beberapa sistem Forth x86 untuk DOS, dan yang terakhir bahkan menjadi implementasi kompatibel ANS yang cukup matang bernama “Third”: https://github.com/benhoyt/third
    Cukup menakjubkan bahwa Anda bisa memiliki compiler Forth yang sepenuhnya bootstrap, lengkap dengan assembler, hanya dalam beberapa ribu baris kode
    Belum lama ini saya juga menyalin ulang artikel lama yang dulu saya tulis bersama untuk majalah Forth Dimensions
    Gagasan-gagasan Forth masih bagus sampai sekarang, tetapi manipulasi stack cepat terasa melelahkan dan juga menjadi sangat sulit dibaca
    Itu terlihat dari contoh kode di https://benhoyt.com/writings/forth-lookup-tables/, khususnya Search-Table. Memang memberi nama itu sulit, tetapi tampaknya tidak memberi nama jauh lebih sulit lagi
    • Manipulasi stack yang melelahkan itu mungkin karena Anda dan saya bukan Chuck Moore
      Kodenya umumnya sangat minim pengacakan stack. Contoh: http://www.merlintec.com/download/color.html
    • Saya sempat melihat sekilas source code Third dan menarik
      Saat bootstrap tampaknya ia memanggil kernel.com; saya penasaran bagaimana kernel.com dibangun
  • Ceramah Chuck Moore yang terkait: “Programming a 144 Computer Chip to Minimize Power” (2013)

https://www.youtube.com/watch?v=0PclgBd6_Zs
Katanya, beginilah cara Forth menjalankan komputer berdaya ultra-rendah: GreenArrays sedang mengirimkan chip asinkron 144-core, dan energinya hanya membutuhkan 7 pJ/inst
Core yang idle tidak menggunakan daya (100 nW), sedangkan core yang aktif berjalan cepat pada 4 mW (666 Mips) lalu menjadi idle sambil menunggu komunikasi

  • “Saya selalu menganggap ukuran dan kecepatan hanya penting bagi amatir. Tetapi dalam konteks modern, hanya ada tiga parameter yang penting. Daya, daya, daya
    --Chuck Moore
    https://youtu.be/0PclgBd6_Zs?t=389
  • Saya sungguh penasaran apakah struktur topologi seperti ini akan kembali lagi dalam beberapa tahun ke depan
  • Buku pengantar yang sangat bagus adalah Starting Forth
    Berisi ilustrasi paling menarik yang pernah saya lihat di buku pelajaran
    [0] https://www.forth.com/starting-forth/
  • Dulu sekali ketika OS/2 keluar, seorang teman memberi tahu saya bahwa “program OS/2 tidak bisa ditulis dalam assembler dan harus ditulis dalam C”
    Saya bereaksi menentang itu dengan membuat Forth/2
    Itu adalah kompiler Forth native code direct-threaded untuk OS/2 yang ditulis dalam assembler, Brian Matthewson menuliskan manual yang sangat bagus untuknya, dan kami mendapatkan puluhan pengguna
    [1] https://sourceforge.net/projects/forth2/
  • Ini sedikit cerita lain, tetapi saya ingat pernah membaca bentuk prototipe presentasi asli dari tulisan ini
    Isinya pada dasarnya sama dengan tulisan sekarang, tetapi teksnya jauh lebih sedikit dan celah-celahnya lebih banyak
    Saya menyebutkannya karena materi itu juga menunjukkan keindahan minimalisme dari sisi teknologi situs web yang digunakannya
    [0] http://ratfactor.com/forth/forth_talk_2023.html
    [1] http://ratfactor.com/minslides/
  • Menarik bahwa ternyata ada juga kompiler Forth di Rust. Materi terkait ada di [1]
    Cara memakainya masih agak kurang jelas[2], tetapi sebelumnya juga pernah dibahas di sini[3], dan implementasinya tampak solid
    Ini memang bukan mesin virtual Forth dengan REPL, tetapi merupakan implementasi mesin virtual yang mengesankan
    Jika FORTH adalah mesin virtual, saya sudah lama berpikir bahwa ini mungkin pilihan optimal untuk sistem kecil dan efisien yang perlu menangani data streaming dengan performa yang mendekati bare metal
    Ada juga fakta bahwa Anda tidak perlu bergulat dengan sistem operasi
    Rasanya ini pada dasarnya seperti melakukan apa yang dilakukan FPGA pada CPU standar
    Namun, saya membayangkannya sebagai sistem khusus yang tidak mengharuskan Anda membuat semua driver sendiri untuk terhubung ke perangkat keras yang dibutuhkan
    [1] https://docs.rs/rust-forth-compiler/latest/src/rust_forth_co...
    [2] https://docs.rs/fortraith/latest/fortraith/
    [3] https://news.ycombinator.com/item?id=23501474
  • Saya juga pernah mengimplementasikan Forth sendiri
    Tujuannya bukan menyalin ide aslinya dengan setia, jadi cara kerjanya agak berbeda
    Karena tulisan ini menyebut Anda bisa menemukan Forth di mana-mana, saya juga meninggalkan implementasi saya di sini: https://github.com/loscoala/goforth
    Perbedaan terbesarnya adalah, dalam varian Forth ini, teks sumber sepenuhnya diubah menjadi bytecode, dan tidak ada runtime dalam pengertian Forth klasik
    Karena itu bytecode-nya mudah diterjemahkan ke C
    Saya menggunakan Forth ini untuk menghasilkan kode C, lalu memakai kode tersebut dengan menanamkannya ke perangkat lunak lain
    • Pendekatan seperti itu bisa sangat produktif dan cerdas, tetapi kita harus terus sadar bahwa solusi bergaya multibahasa seperti ini mudah menjadi mimpi buruk pemeliharaan dalam jangka panjang
      Ada proyek open source yang sangat bagus untuk melatih pendengaran dan membaca notasi secara langsung, tetapi ditulis dalam bahasa buatan penulisnya sendiri, dan bahasa itu dikompilasi ke JavaScript
      Kerumitan menyiapkan toolchain-nya begitu besar sampai-sampai saya tidak pernah berani mencoba memperbaikinya, meskipun saya tahu ada cukup banyak bug di sana
      https://sightreading.training/
      https://github.com/leafo/sightreading.training
      Proyek ini ditulis dalam bahasa bernama ‘Moonscript’: https://github.com/leafo/moonscript
      Moonscript dikompilasi ke Lua, dan Lua dikompilasi ke JS
      Gila. Kegilaan yang keren, tetapi tetap saja itu membuat saya tidak jadi berkontribusi