2 puan yazan GN⁺ 2023-07-18 | 1 yorum | WhatsApp'ta paylaş
  • Forth, Chuck Moore’un uzun derleme ve delikli kart akışını azaltmak için geliştirdiği küçük bir yorumlayıcı ile başladı ve editör, işletim sistemi, derleyici gibi bileşenleri de içine alan bir sisteme dönüştü
  • Son ekli gösterim (RPN), veri yığını ve word(dictionary), yabancı bir sözdiziminden ziyade kısıtlı donanımda israfı ve tekrar eden işleri azaltmak için yapılmış tasarımlardı
  • Forth’un özü, :, ;, IF, yorumlar, değişkenler gibi unsurların bile dilin içinde tanımlanıp yeniden tanımlanabildiği bootstrap edilebilir bir yapıda yatıyor
  • JonesForth, nasmjf, PlanckForth, sectorforth gibi uygulamalar, Forth’un onlarca ila yüzlerce bayttan ya da birkaç primitive’den başlayıp yorumlayıcı, derleyici, assembler ve DSL’ye genişleyebildiğini gösteriyor
  • Uzay araçları, Open Firmware, Jupiter Ace, Canon Cat, Harris RTX2010 ve GreenArrays örnekleri, Forth’un etkileşimli geliştirme, küçük kod, donanım dostu yapı ve düşük güçte hesaplamayla güçlü biçimde örtüştüğünü gösteriyor

Usenet efsanelerinden Forth keşfine uzanan başlangıç noktası

  • Dave Gauer, Forth’u keşfedip onu bilişim tarihi içindeki yerine oturtmaya çalışan kişisel yolculuğunu derledi; bu sayfa da kısa bir sunum slaytından uyarlandı
  • 1990’larda Usenet’teki comp.*, özellikle de comp.lang.* grupları, programlama öğrenmek ve tartışmak için önemli yerlerdi
    • Linus Torvalds’ın Linux’a dair ilk duyurusu da 1991’de comp.os.minix üzerinde yapılan bir paylaşım olarak anılıyor
    • 1990’ların sonlarında Perl, erken dönem Web’de CGI üzerinden dinamik sayfalar ve form işleme dili olarak büyük ağırlık taşıyordu
  • Usenet döneminde karşılaşılan Lisp ailesi dilleri, Y combinator, The Little Schemer, The Story of Mel gibi efsaneler, Forth’a duyulan meraka zemin hazırladı
  • Forth, ilk başta “bir tamsayının değerini bile değiştirebilecek kadar esnek bir dil” hikâyesiyle öne çıktı ve Chuck Moore, birkaç ekranlık kodla her türlü programı yazabilen bir “mad wizard” olarak hatırlandı
  • James Hague’in programming in the twenty-first century blog serisi, Forth’u keşfetme sürecindeki son kıvılcım oldu

RPN ve yığın sadece başlangıç noktası

  • Forth’un ilk izlenimi son ekli gösterim, yani Reverse Polish Notation (RPN)
    • Yaygın kullanılan orta ekli gösterim 3 + 4 iken, Forth operatörü operandların arkasına koyarak 3 4 + biçimini kullanır
    • Forth örneği 3 4 * 5 6 * + ., 42 çıktısını verir
    • dc içinde aynı hesap 3 4 * 5 6 * + p şeklinde ifade edilir
  • RPN, parantez olmadan iç içe ifadelerin istenen sırada hesaplanmasını sağlar
    • 3 4 * işlemi 12 üretir, 5 6 * işlemi 30 üretir ve son + işlemi 42’yi oluşturur
    • Forth’ta . yığından bir değer çekip ekrana basar
  • HP-35 hesap makinesi, RPN’nin bilgisayar bilimi dışında da tanınmasında önemli tarihsel örneklerden biri
    • 1970’lerin başında HP’nin güçlü masaüstü hesap makineleri vardı; HP-35 ise bu hesaplama gücünü bir “shirt pocket” hesap makinesine taşıyan örnek olarak anlatılıyor
    • HP hesap makineleri RPN sözdizimiyle ünlüydü; RPN verimliydi ama dışarıdan bakanlara biraz zor anlaşılır görünüyordu
  • İkinci özellik ise veri yığını
    • PUSH, POP, SWAP, DUP gibi işlemler Forth word’leri olarak da bulunur
    • Sayılar girildiğinde yığına eklenir; operatörler yığından değer çekip hesap yapar ve sonucu yeniden yığına koyar
  • Yığın, ara değerlere ad verme ihtiyacını azaltır
    • Birçok imperative language içinde result2, matched_part3 gibi geçici adlar gerekir
    • İsim vermeden çalışma yaklaşımı implicit, tacit veya point-free programming olarak da adlandırılır
    • Forth’u yalnızca RPN ve yığın üzerinden anlamak yetersiz kalır; ancak tarihsel kökenini kavramak için bu geçerli bir başlangıçtır

Concatenative programming, Joy ve Forth’un farkı

  • Forth’u incelerken concatenative programming kavramıyla karşılaşılır
    • applicative örnek: eat(bake(prove(mix(ingredients))))
    • concatenative örnek: ingredients mix prove bake eat
    • Fonksiyonlar sırayla dizilir ve her aşamadaki değer bir sonrakine örtük olarak aktarılır
  • Joy, concatenative language yaklaşımının temsilî örneklerinden biri
    • Manfred von Thun, John Backus’un 1977 ACM Turing Award konuşması “Can Programming Be Liberated from the von Neumann Style?”dan ilham aldı
    • Joy’da her fonksiyon girdi olarak tek bir yığın alır ve çıktı olarak tek bir yığın döndürür
    • Program, soldan sağa okunan bir fonksiyonlar listesidir
  • Joy’un quotation ve combinator yapıları, değişkensiz hesaplama yaklaşımını gösterir
    • JavaScript’te [1, 2, 3, 4].map(n => n + 1), [2,3,4,5] sonucunu üretir
    • Joy’da aynı sonuç [1 2 3 4] [1 +] map ile elde edilir
    • Joy’daki [], yalnızca veriyi değil programı da taşıyabilen bir quotation mekanizmasıdır
  • Combinator, fonksiyonları girdi olarak alan higher-order function olarak ele alınır
    • map(), liste dolaşımındaki tekrar eden kalıpları soyutlayan bir örnektir
    • I, K, S combinator’leri ve SKI calculus, evrensel hesaplamayı açıklayan yapılar olarak ortaya çıkar
    • Yalnızca S ve K ile bile evrensel hesaplama için tam bir sistem kurulabilir
  • Forth da execution token ve EXECUTE word’ü ile higher-order function kurabilir
    • FOO EXECUTE, FOO word’ünün döndürdüğü word’ü çalıştırır
    • MAP, FOLD, REDUCE gibi combinatorial word’ler tanımlanabilir
  • Forth ve Joy, yüzeyde benzer bir sözdizimine sahip görünse de ifadeleri yorumlama biçimleri farklıdır
    • Forth’ta 2 3 +, “2 ve 3’ü yığına push et ve topla” diye okunur
    • Joy’da ise “2, 3 ve + fonksiyonlarının composition’ı, 5 fonksiyonuyla aynıdır” diye okunur
    • Forth, soyut concatenative computing ilkelerinden çok donanımla etkileşim içinde büyümüş bir dile daha yakındır

Chuck Moore'un Forth'u oluşturduğu yol

  • 1958'de Chuck Moore, Smithsonian Astrophysical Observatory ve MIT döneminde Fortran ve IBM 704 kullandı
    • Moore, Forth, the Early years içinde şöyle diyor: “Compiling took 30 minutes...you got one shot per day”
    • IBM 704'ün odayı dolduran bir vakum tüplü bilgisayar olduğu ve ortalama yaklaşık her 8 saatte bir bozulduğuna dair bir alıntı da yer alıyor
  • Moore, yeniden derleme sayısını azaltmak için programı kontrol eden kartları okuyan basit bir interpreter yaptı
    • böylece recompile olmadan birden çok satellite için farklı equation'lar oluşturabiliyordu
    • free-form input format, Fortran'ın sütun bazlı biçimlendirmesine göre insanların yazması açısından daha güvenilirdi
    • bu sistem daha sonra Forth olarak anılacak sistemin kökeni oldu
  • 1961'de Stanford'da Moore, Burroughs B5500 kullanırken CURVE adlı bir mathematical application yazdı
    • CURVE'ün içinde daha gelişmiş bir interpreter, data stack ve control flow operator bulunuyordu
    • işlevler kabaca IF ELSE DUP DROP SWAP + - * gibi Forth word'lerine karşılık geliyordu
    • parameter stack ve yeni procedure tanımlama özelliği eklenince Forth'a daha yakın bir yapı ortaya çıktı
  • 1965 civarında teletype, paper tape, timesharing ve interactive terminal ortamlarının ortaya çıkmasıyla Forth daha interaktif hale geldi
    • KEY, EMIT, CR, SPACE, DIGIT gibi word'ler eklendi
    • bu word'ler Moore'un sistemini bir program editor'e dönüştürdü ve kullanıcılar programın içinden programı düzenleyebilir hale geldi
  • 1968'de Mohasco'da Moore, IBM 1130 üzerinde çalışırken buna “FORTH” adını verdi
    • IBM 1130, 16-bit ve 8KB RAM yapılandırmasına sahipti ve dosya adları 5 karakterle sınırlıydı
    • Moore'un “fourth generation” sistemi, 5 karakter sınırı yüzünden FORTH oldu
    • bu dönemde return call stack ve word dictionary eklendi
  • Forth'un isimlendirilmiş word dictionary'si temel soyutlama olarak çalışır
    • : DOUBLE DUP + ;
    • : QUAD DOUBLE DOUBLE ;
    • return stack olmadan DOUBLE çalıştıktan sonra QUAD içindeki kalan konuma dönmek mümkün olmaz

NRAO, port etme ve indirect threaded code

  • 1970'lerin başında Moore, National Radio Astronomy Observatory'de radio telescope için bilgisayar kontrol yazılımı yazdı
    • NRAO'nun minicomputer üzerinde Fortran kullanma politikası vardı, ancak Moore önceki başarıları sayesinde Forth kullanma izni aldı
    • spectral-line observing sırasında toplanan spectra gösterilebiliyor ve least-squares ile line-shape'ler uydurulabiliyordu
    • bu çalışma online data reduction alanındaki state-of-the-art'ı ilerletti ve gökbilimciler bunu inter-stellar molecules keşfetmek ve haritalamak için kullandı
  • Elizabeth “Bess” Rather, Forth'u benimsedi ve 1972'de ilk Forth manual'ını yazdı
    • daha sonra Chuck Moore ile birlikte FORTH, Inc şirketini kurdu
    • 2006'da emekli olana kadar Forth dilinin başlıca uzmanlarından ve promotörlerinden biri olarak kaldı
  • Forth, IBM 360/50, Honeywell 316, Honeywell DDP-116, DEC PDP-11 gibi çeşitli makinelere port edildi
    • H316 için Forth implementasyonu bilgisayarın kendisinde programlandı ve başka Forth'lar oluşturmakta kullanıldı; bu yüzden ilk complete, stand-alone implementation kabul edilir
    • PDP-11, Unix ve C programming language tarihine bağlı önemli bir minicomputer'dır
  • Pek çok makineye port edilebilmesinin arkasında indirect threaded code vardı
    • buradaki threaded code, concurrency veya multi-threaded programming ile ilgili değildir
    • threaded code, subroutine call instruction yerine subroutine address listeleri saklar
    • bu address list'lerini çalıştırmak için bir code interpreter gerekir
  • indirect threaded code, doğrudan code'u gösteren adresler değil, code'u gösteren adresleri gösteren adres listeleri saklar
    • ikinci dolaylılık katmanı sayesinde farklı subroutine türleri için ayrı bir inner interpreter bulunabilir
    • Forth'ta outer interpreter, kullanıcının terminalde etkileşim kurduğu kısımdır; inner interpreter ise word'ün geri kalanını yürütür
  • Bu noktadaki Forth, basit bir command interpreter'ın ötesine geçerek interactive language, editor, operating system ve code storage and execution method olarak genişledi
    • postfix notation, stack-oriented, concatenative stil, interpreted olma, machine architecture'a son derece uyarlanabilirlik ve aşırı kompaktlık gibi özellikler öne çıkıyordu
    • Forth, 1958'de tek seferde tasarlanmış bir dil değil, Moore'un kendi ihtiyaçlarına ve yeni hardware'e göre büyüttüğü bir sonucun ürünüydü

Forth'u anlamak için Forth implement etmelisiniz

  • “To understand Forth, you have to implement a Forth” tavsiyesinde önemli olan ifade a Forth kısmıdır
    • Chuck Moore'un bakışına göre bir Forth system, system ve task'e göre custom-tailored olduğunda en iyi haline ulaşır
  • Yazar, JonesForth kaynağına girmeden önce assembly ve Linux ABI temellerini öğrenmek için Assembly Nights'ı yazdı
    • JonesForth, GNU GAS assembler ile yazılmış i386 assembly kaynağı kullanır
    • yalnızca 32-bit içindir ve Linux system call ABI'yi doğrudan kullanır
    • JonesForth'u NASM assembler ile çalışan bir kopyaya port etmek için yaklaşık bir yıl harcadı; bu port nasmjf oldu
  • nasmjf port sürecinde geleneksel indirect threaded Forth'un nasıl çalıştığını öğrendi
    • JonesForth'un jonesforth.S dosyası assembly kısmını içeren tek bir dosyadır ve Richard W.M. Jones, ASCII art ve açıklamalarla interpreter akışını anlatır
    • yazar da kendi anlayışını düzenlemek için nasmjf kaynağına çeşitli ASCII art diyagramları ekledi
  • NEXT macro'su, bir word çalıştıktan sonra bir sonraki word'e geçişin temel akışıdır
%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, memory'den double word'ü eax içine alır ve bir sonraki konumu gösterecek şekilde günceller
  • jmp [eax], yürütmeyi o anda gösterilen yere aktarır; bu da ilgili subroutine'in inner interpreter'ı olur
  • Geleneksel Forth'ta temelde code word ve colon word bulunur
    • code word, machine code ile yazılmış bir primitive'dir
    • colon word, Forth language ile yazılmış sıradan bir word'dür ve : compiler ile bir araya getirilir
    • colon word, EXIT ile biter; EXIT, return stack'i işledikten sonra akışı NEXT ile sürdürür
  • Forth, çalışan bir system oluşturan çok küçük parçaların birlikte işlemesiyle kurulur
    • düşük seviyede esneklik ve sadelik sağlar, ancak yüksek seviyede anlaşılabilirlikten ödün verilebilir

Code word, colon word ve derleyici aynı interpreter üzerinde çalışır

  • SWAP, DUP, DROP, Forth primitive’lerinin machine code ile ne kadar doğrudan gerçekleştirilebildiğini gösterir
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, i386 call/return stack’ini Forth parameter stack’i olarak kullandığı için stack işlemlerini yerel pop ve push ile uygular
  • nasmjf içinde 130 code word vardır; bunların çoğu verimlilik içindir
    • bootstrappable bir Forth system’i için gereken machine-code word sayısının teorik bir alt sınırı vardır
    • primitive sayısını aşırı azaltmak, geri kalan Forth code’unu verimsiz ve eğri büğrü hale getirebilir
    • Frank Sergeant’ın A 3-INSTRUCTION FORTH FOR EMBEDDED SYSTEMS WORK yazısı, Motorola MC68HC11 üzerinde yalnızca 66 bytes gerektiren 3-instruction bir Forth’u ele alır
    • sectorforth, 512-byte boot sector’a sığan 16-bit x86 Forth’tur
  • colon word, mevcut word’lerin composition’ı ile yeni bir word oluşturma yöntemidir
: SDD SWAP DROP DUP ;
  • SDD, SWAP DROP DUP ifadelerini sırayla çağırmakla aynı etkiyi üretir
  • indirect threaded code açısından bakıldığında, colon word üç code word’ün inner interpreter address’i ile derlenmiş durumdadır
  • : ve ;, syntax gibi görünür ama gerçekte birer Forth word’üdür
    • :, yeni word adını alır ve compile mode’u açar
    • ;, yeni dictionary entry’sini tamamlar ve compile mode’u kapatır
    • kullanıcı, : ifadesini kendi tanımıyla değiştirerek Forth’u genişletebilir veya değiştirebilir
    • Forth’un tek syntax’ı, input token’ları arasındaki whitespace üzerinden ele alınır
  • Forth’ta compiling, memory içine word address’leri veya literal’ler ile push code koymak anlamına gelir
    • normal mode’da word hemen çalıştırılır
    • compile mode’da word address’i memory’ye yazılır
    • aynı interpreter, hem code execution hem de code compiling işini yapar
  • IF...THEN gibi control structure’lar da Forth’un kendi içinde uygulanabilir
: IF IMMEDIATE ' 0BRANCH , HERE @ 0 , ;

: THEN IMMEDIATE DUP HERE @ SWAP - SWAP ! ;
  • IF gibi temel bir öğenin bile dilin içinde tanımlanması, “The programming language that writes itself” başlığının ana gerekçesidir
  • nested comment olan ( ... ) de jonesforth.f içinde Forth ile uygulanır
    • comment bile dilin içinde uygulanır; kullanıcı bunu yeniden tanımlayabilir veya kendi comment tarzını ekleyebilir
    • bu örnek, Forth’ta yerel syntax’ın neredeyse hiç olmadığını vurgular

Dictionary ve yeniden tanımlama genişletilebilirlik sağlar

  • Forth dictionary’si geleneksel olarak linked list kullanır ve word eşleştirme en yeni entry’den başlar
    • aynı adlı en yeni word tanımı, önceki tanımı gölgeler
    • her türlü word yeniden tanımlanabilir; assembly ile ilk tanımlanan word’ler bile buna dahildir
    • önceden derlenmiş word’ler isim değil address sakladığı için yeniden tanımlamadan önceki word’ün address’ini göstermeye devam eder
  • Aynı adlı önceki word, yeni tanım içinde çağrılarak word genişletilebilir
    • özyinelemeli bir word oluşturulurken :, o anda derlenen word’ü dictionary’de gizler veya pasif durumda işaretler
    • mevcut word içinden kendisini çağırmak için RECURSE gerekir
  • Leo Brodie’nin Thinking Forth kitabından alınıp değiştirilmiş elma değişkeni örneği, Forth’un esnekliğini gösterir
    • VARIABLE APPLES, çağrıldığında memory address’ini stack’e koyan APPLES word’ünü oluşturur
    • 20 APPLES !, ilgili address’e 20 yazar
    • APPLES ?, değeri alıp yazdırır
    • Thinking Forth (PDF) ücretsiz sunulur
  • Kırmızı ve yeşil elmaları ayrı takip etmek gerekse bile mevcut APPLES kullanım code’unu değiştirmeden devam etmek mümkündür
VARIABLE COLOR

VARIABLE REDS
: RED REDS COLOR ! ;

VARIABLE GREENS
: GREEN GREENS COLOR ! ;

: APPLES COLOR @ ;
  • Yeni APPLES de stack’e address koyan bir word olduğu için mevcut APPLES ! ve APPLES ? kullanım biçimi korunur
  • Değişen tek şey, address’in etkin elma rengine göre REDS ya da GREENS olmasıdır
  • Genel amaçlı diller açısından bakıldığında, değişken sanki bir fonksiyona dönüşmüş gibi görünür; ama Forth’ta hem değişkenler address koyan word’lerdir hem de fonksiyonlar word’dür, dolayısıyla dil düzeyinde kavramsal bir değişim yoktur
  • Sayı gibi görünen token’lar bile dictionary word’ü olarak yeniden tanımlanabilir
: 4 12 ;
  • ." The value of 4 is " 4 . CR çalıştırıldığında The value of 4 is 12 çıktısı üretilir

Meow5 ve “en az dirençli yol” olarak Forth

  • JonesForth’un NASM’e taşınmış hali olan nasmjf, Moore’un sürecini yeniden üretmekten çok, ortaya çıkan son ürünü dikkatle inceleyen bir “master copy” çalışmasına daha yakındı
  • Sonrasında yazar, Meow5 adını verdiği aşırı bir concatenative programming deneyi yürüttü
    • Meow5, tüm code’u sürekli birleştirip inline etmeyi deneyen bir çalışmadır
    • Forth gibi parameter stack kavramını kullandığı için concatenative’dir
    • function call address’lerini saklamak yerine tüm fonksiyonun kopyasını saklamanın nasıl olacağını sonuna kadar zorlayan bir düşünce deneyidir
  • Meow5’in özü, bütün word’leri %100 inline etmektir
    • küçük function call overhead’inden kaçınmak için yapılan yaygın optimizasyon inline expansion fikrinden yola çıkar
    • DROP gibi tek komutluk bir primitive’i birden çok jump üzerinden çağırmak israf gibi görünmüştü
  • Meow5, “keyifli küçük bir başarısızlık” olarak sona erdi
    • machine code’u inline etmek kendi başına gayet iyi çalıştı ve dışa aktarılan ELF executable dosyaları da amaçlandığı gibi çalıştı
    • sorun string data’daydı; string’leri her seferinde kopyalamak ya da hangi word’ün string kullandığını karmaşık biçimde takip etmek gerekiyordu
    • seçmeli inline sunan Forth INLINE word’ü daha iyi bir yaklaşım olarak değerlendirildi
  • String syntax’ında da Moore’un tavsiyesi yeniden doğrulandı
    • Forth’ta " bir word olarak kullanıldığı için " Hello World." biçiminde whitespace gerekir
    • Meow5, "Hello World." biçimindeki doğal quoting style’ı ve \n, \" gibi escape sequence’leri benimsedi
    • bu tercih, tokenizer ve interpreter’ın birçok yerinde " için özel durum işleme gerektirdi ve saflığıyla sadeliğini azalttı
  • Forth yolunu izlemeye başlayınca geri kalan her şey “kendini yazıyormuş” gibi ilerler
    • Forth bir bootstrapping aracıdır, bir meta-programming yaklaşımıdır ve bir OS ile IDE/editor olabilir
    • bu da, tamamen yeni bir CPU architecture için mümkün olan en basit interpreter’ı kurmaya çalışırken insanın sonunda Forth’a benzeyen bir şey yazabileceği iddiasına bağlanır

Küçük Forth uygulamaları ve gerçek kullanım alanları

  • Forth, Forth içinde daha fazla Forth tanımlayabilir ve birçok Forth, assembler da içerir
    • JonesForth’un sonunda, Forth içinde çalışan bir assembler stub’ı bulunur
    • ;CODE, codeword’ün DOCOL yerine assembled code’u işaret etmesi için header’ı günceller
  • PlanckForth, elle yazılmış 1KB’den küçük ikili bir Forth’tür
    • Tam bir ELF ikilisi ve çalışan bir Forth uygulaması 1KB’den küçüğe sığar
    • bootstrap.fs, baştaki anlaşılması zor operatörlerden başlayıp birkaç yüz satır sonra okunabilir bir Forth’a dönüşür
  • Küçük uygulama örnekleri, Forth’un ne kadar aşırı derecede kompakt olabildiğini gösterir
    • SmithForth, David Smith’in elle yazdığı bir machine code Forth’tür ve 1.000 baytlık, 1.000 satırlık bir Forth sistemi olarak tanıtılır
    • sectorforth, 512 baytlık bir boot sector Forth’tür
  • Forth; enerji santralleri, robotik, füze takip sistemleri, endüstriyel otomasyon, video oyunları için gömülü diller, veritabanları, muhasebe, kelime işlemciler, grafik, hesaplama sistemleri, Open Firmware boot loader’ı ve çeşitli işlemci ile mikrodenetleyicilerde kullanılır
  • Open Firmware, Sun Microsystems mühendisliğinden çıkan önemli bir örnektir
    • interactive programming language temelli olduğu için yeni donanımı verimli biçimde test etmeyi ve bring-up sürecini mümkün kılar
    • Space Shuttle ESN örneğinde Open Firmware, donanımı, yazılımı, eklenti sürücülerini ve hatta firmware’in kendisini hata ayıklayabilen bir araç olarak ele alınır
  • Jupiter Ace, 1982 tarihli bir Birleşik Krallık ev bilgisayarıydı ve işletim sistemi Forth’tü
    • OS ve routine library, 8KB ROM’a sığıyordu
    • 1982 tarihli bir alıntıya göre yerleşik Forth, interpreted BASIC’ten “10 kat daha hızlıydı” ve bellek gereksinimi bunun yarısından azdı
  • Canon Cat’in 1987’de işletim sistemi Forth’tü ve 256KB ROM içine OS, ofis paketi ve programlama ortamı sığıyordu
    • Bu ürün, Jef Raskin’in klavye merkezli arayüzünü ve tasarım felsefesini donanım ve yazılımla hayata geçiriyordu
    • Forth arayüzüne giriş adımları birincil kullanım akışı gibi görünmese de, prosedür bilindiğinde birkaç tuş vuruşuyla mümkündür

Uzay yazılımı ve Forth

  • Forth’un ilgi çekici kullanım alanlarından biri uzay keşfidir
    • Uzay araçları pahalıdır ve onarıma erişim zor ya da imkânsız olduğundan yazılım güvenilirliği kritik önem taşır
    • NASA’nın Forth kullanan proje listesi uzundur; orijinal bağlantı kaybolmuştur ancak Wayback Machine ve forth.com kopyaları vardır
  • Space Shuttle Small Payload Accommodations Interface Module (SPAIM), Forth kullanılan örneklerden biridir
    • Geliştirme ekibi, PC’de Forth routine’leri yazıp indiriyor ve ardından bunları etkileşimli olarak test ediyordu
    • Bir alıntıya göre STS-45 Shuttle mission sırasında SPAIM flight software’i sorunsuz çalıştı
    • SPAIM’in Forth system’i multitasking destekliyordu, her task’ın kendi stack’i vardı ve bir watchdog task’ı stack durumunu izliyordu
  • Space Shuttle Robot Arm Simulator, karmaşık bir aygıtın tek bir programcı tarafından 5 haftada geliştirildiği bir örnektir
    • 3 eksenli joystick komutlarını alıp 50 feet uzunluğunda, 6 eklemli ve 6 koordinat sistemli bir kolu kontrol etmesi gerekiyordu
    • Bir alıntıya göre system’de 14 ayrı process bulunuyordu
    • Simulation test’in o kadar kapsamlı olduğu, sahaya kurulduktan sonra executive control algoritmasının değiştirilmediği aktarılır
  • Shuttle Mission Design and Operations System (SMDOS), JPL’nin yer tabanlı kontrol yazılımıydı
    • SIR-B mission sırasında sahadaki çeşitli donanım arızalarına yazılım değişiklikleriyle yanıt verildi
    • Anten sorunu ve yörünge değişikliği nedeniyle yeni bir veri toplama stratejisi gerekti ve SMDOS, yeni koşullara uyan planları göstermek için kullanıldı
    • Çok sayıda veri kaybedildi ancak döndürme-yakalama-döndürme-iletme yöntemiyle verilerin %20’si geri kazanıldı
  • Harris RTX2010, birçok uzay uygulamasında kullanılan bir Forth donanımıydı
    • Forth’u doğrudan çalıştırır
    • 256-word derinliğinde iki hardware stack içerir
    • 8MHz clock ve düşük latency sunar
    • radiation-hardened özelliklere sahiptir
  • Rosetta ve Philae, bir kuyruklu yıldızın yörüngesine uzay aracı gönderip yüzeyine iniş aracı indiren ilk görev olarak tanıtılır
    • Rosetta’nın Ion and Electron Sensor’ü Harris RTX2010 kullanır
    • Philae lander, CDMS için 2 adet RTX2010 ve ADS kontrolü için de 2 adet kullanır
    • Rosetta, 2004’ten 2014’e kadar yol alarak 67P/Churyumov-Gerasimenko ile buluştu
    • 67P, 4 km genişliğindedir ve Güneş’in etrafında her altı buçuk yılda bir döner
  • Philae, zıpkın ve iniş thruster’ı arızası nedeniyle yüzeyde düşük yerçekiminde sekmeler yaşamış olsa da, bilim görevlerinin “%80”ini yerine getirecek kadar dayanıklıydı
  • 1993 tarihli Galileo magnetometer kod yaması örneği de verilir
    • Magnetometer, RCA1802, 2KB RAM ve 2KB ROM’a sahipti ve Apple II tabanlı bir geliştirme sistemiyle Forth kullanılarak programlanmıştı
    • Aygıt kodunun ortasında hatalı bir bellek baytı oluştuğu için, bu baytı kullanmayacak şekilde yama yapılması gerekti
    • Alıntıyı aktaran kişi, bu aygıt için Forth geliştirme ortamını ve donanım simülatörünü Lisp ile sıfırdan yazarak yamayı ürettiğini ve bunun yarı zamanlı olarak 3 aydan kısa sürdüğünü söylüyor

Forth, tek bir uygulamadan çok bir fikir ve soy ağacına daha yakın

  • Forth, tek bir temsilî uygulamadan ziyade ortak kavramlar ve bir soy ağacı taşıyan bir fikre daha yakındır
  • Forth’u öğrenmenin zor olmasının nedenlerinden biri, “Forth” adını tek başına temsil eden tek bir uygulamanın bulunmamasıdır
    • İlk dönem Forth’ların bazıları, “Forth” adından bile daha eskiydi
    • Forth standardının ANS Forth belgelerinden devam ettiği, Forth 2012 Standard ve Forth200x committee’den söz edildiği belirtilir
  • Forth’lar kavramları ve ortak word’leri paylaşır, ancak belirli amaçlara özel Forth’ların kendilerine özgü özel sözlükleri vardır
  • Chuck Moore, 1973’te Forth, Inc’i kurdu; o zamandan beri Forth’u çeşitli sistemlere port etmeyi sürdürdü ve yeni sistemler yapmaya devam etti
  • colorForth, Chuck Moore’un sonraki dönem ortamlarından biridir
    • Kaynak koddaki renkler, standart Forth’taki bazı noktalama işaretlerinin yerini alarak word’lerin nasıl işleneceğini belirler
    • Renklerin Forth’un anlambilimini sadeleştirdiği, derleme hızını artırdığı ve Moore’un zayıf görmesine de yardımcı olduğu anlatılır
    • colorForth, kendine ait 63KB’lık bir işletim sistemi de içerir
  • Moore, işlevler sürekli eklendikçe yazılımın karmaşıklaştığını ve kimsenin niyet etmediği sonuçlardan korktuğu için artık değiştirilemediğini düşünür
    • Bu da, tek bir uygulamaya kariyerini adayıp onu tekrar tekrar yazarak mükemmelleştirecek adanmış bir programcıya ihtiyaç olduğu iddiasına bağlanır

Makineye yakınlık, Forth çipleri, GreenArrays

  • Chuck Moore'un 1950'lerden beri yazılım karmaşıklığına karşı çıktığı, Windows, UNIX ve DOS gibi işletim sistemlerini anlaşılmaz ya da gereksiz gördüğünü söyleyen alıntılar yer alıyor
  • Yazar, Moore'un felsefesini Mechanical Sympathy kavramıyla açıklıyor
    • Bu ifade Formula One sürücüsü Jackie Stewart'ın bir sözünden geliyor ve yazılım bağlamında Martin Thompson'ın Why Mechanical Sympathy? yazısında kullanılıyor
    • Forth, elektrik mühendisleri ve gömülü sistem tasarımcıları gibi “donanım insanları” arasında popüler olma eğiliminde
  • Chuck Moore'un asıl tutkusunun işlemci tasarımı olduğu görülüyor
    • Harris RTX2000 ve RTX2010, temelde Moore'un çipleri olarak tanıtılıyor
    • Moore, 1983'te Novix N400 gate array ile donanım tasarlamaya başladı; geliştirilmiş tasarım Harris'e satıldı ve RTX çiplerine dönüştü
  • Moore, işlemcileri 500 satırlık Forth ile yazdığı kendi VLSI yazılımı OKAD ile tasarladı
    • VLSI Design Tools (OKAD), 500 satırlık colorForth'un çip tasarımı için gereken her şeyi sunduğunu açıklıyor
    • OKAD; mantık kapısı teknolojisi, devre yerleşimi, elektriksel davranış simülasyonu ve GDSII export içeren bir araç takımı
  • Novix NC4000, yüksek seviyeli Forth komutlarını doğrudan çalıştırmak için tasarlanmış ultra hızlı bir işleme motoru
    • Performans, genel assembly language ve dahili microcode kaldırılarak elde ediliyor
    • Çift yığınlı architecture, subroutine uygulama overhead'ini büyük ölçüde azaltıyor
  • GreenArrays çipleri, Moore'un 2013 tarihli “Programming a 144-computer chip to minimize power” sunumu etrafında tanıtılıyor
    • Tek bir çipte 144 asenkron bilgisayar bulunuyor
    • Boştaki core 100 nW, aktif core ise 4 mW tüketiyor; 666 Mips hızında çalışıp sonra tekrar boşa dönüyor
    • Tüm bilgisayarlar azami hızda çalıştığında toplam güç tüketimi 550 mW, yani yaklaşık 0.5 W
  • GreenArrays Architecture belgesi “NO CLOCKS” vurgusu yapıyor
    • Normal bilgisayarlarda clock üretimi ve dağıtımı, bekleme halinde bile çok enerji harcıyor ama hiçbir iş yapmıyor
    • GreenArrays, Multi-Core CPU değil Multi-Computer System olarak tanıtılıyor

Sadelik, verimlilik ve düşük güç tüketimli hesaplamanın geleceği

  • Yazar, yazılım ve donanımın sürekli daha fazla karmaşıklık katmanı biriktirecek şekilde ilerlediğini düşünüyor
    • Büyük veri merkezlerindeki hesaplama, reklam bütçeleriyle dolaylı olarak ödendiği için ucuz ya da ücretsiz sanılıyor
    • Asıl ödemenin kullanıcıların dikkati ve kişisel verileriyle yapıldığı anlatılıyor
  • Gelecekte daha verimsiz ve daha kötü inşa edilmiş yazılımlar ile daha sert donanım gereksinimlerini kullanmayı sürdürmek için bir neden olmadığını savunuyor
  • Forth benzeri diller şu alanlarda güçlü bir geleceğe sahip olabilir
    • küçük ve her yerde bulunan bilgisayarlar
    • güneş enerjisi
    • ciddi biçimde kısıtlı VM'ler
  • Dennard scaling, 2006 civarında neredeyse durdu
    • Daha küçük transistor'ların daha yüksek hız ve daha düşük voltaj sağlamasını mümkün kılan ilişki, akım kaçağı ve ısı nedeniyle yaklaşık 4GHz civarında tıkandı
    • Herb Sutter'ın The Free Lunch Is Over yazısı, CPU performans artışının hyper-threading ve multicore'a kaydığını ele alıyor
  • Sutter, uygulamaların eşzamanlılığa uygun şekilde yeniden tasarlanması ya da daha verimli ve daha az savurgan kod yazılması gerektiğini düşünüyor
    • Performans optimizasyonunun daha az değil, daha önemli hale geleceğini söylüyor
  • Günümüzde IBM 704'ten çok daha güçlü bir microcontroller'ı birkaç madeni para fiyatına satın almak ve üzerinde güçlü bir Forth system yazmak mümkün
    • microcontroller'lar düğme pil ya da küçük bir güneş paneliyle çalışabiliyor
    • Metin, küçük ölçekli hesaplama için bundan daha heyecan verici bir dönem olmadığı ifadesiyle devam ediyor
  • Forth'u anlamak için “simple” ile “easy” arasındaki farkı düşünmek gerekiyor
    • Rich Hickey'nin Simple Made Easy konuşması, bu ayrımı ifade etmeyi mümkün kılan bir sunum olarak tanıtılıyor
    • Forth kolay değil ve her zaman keyifli de olmayabilir, ama kesinlikle basit bir dil
  • Guy Steele'in Growing a Language konuşması, bir dilin primitive'lerden nasıl inşa edildiğini gösteriyor
    • Kullanıcının tanımladığı yeni kelimeler primitive gibi göründüğünde ve primitive'ler de kullanıcının tanımladığı kelimeler gibi göründüğünde, ortaya dikişsiz daha büyük bir dil çıktığını söyleyen Lisp alıntısının Forth için de geçerli olabileceği belirtiliyor
  • Son çağrı, kişinin kendisi için kusursuz programlama dilini yapması yönünde

1 yorum

 
GN⁺ 2023-07-18
Hacker News yorumları
  • Forth’la tanışır tanışmaz kendim de bir tane yapmam gerektiğini düşündüm ve iki yıl önce MiniForth’u bir haftada yaptım
    Blue Pill’i ve özgün Arduino’yu hedefliyordu, ama ana makinede test edebilmek için bir çapraz derleyici olarak geliştirdim
    İşten sonra her gün kurcalayacağım zamanı iple çekecek kadar içine gömüldüm; hafta içi 5 akşam ve bir hafta sonuyla bitirdim, Forth yapmak bu kadar eğlenceliydi
    Bu süreci şiddetle tavsiye ederim; benzer bir aydınlanmayı yalnızca ilk kez Lisp makrolarıyla karşılaştığımda (https://www.thanassis.space/score4.html#lisp) yaşamıştım
    • Kesinlikle. Birinci sınıftaki bilgisayar mimarisi dersinde LC-3 için serbest konulu bir dönem sonu projesi yapmam gerekiyordu; daha önce RedPower 2 Minecraft modunda Forth’la biraz oynamış olduğum için bunu uygulamanın eğlenceli olacağını düşündüm
      O dönem boş zamanımın neredeyse tamamını yedi; bir gün güneş doğmaya başladıktan sonra bütün gece ayakta kaldığımı fark edip saate baktım
      Gerçek hayatta Forth’u pratik olarak hiç kullanmadım, ama sıfırdan bir tane yapma deneyimi neredeyse dini bir deneyim diye anlatılmayı hak edecek kadar yoğundu
      Fred Brooks’un sözünü ettiği programlamanın saf damıtılmış hali gibiydi: programcı, şair gibi, saf düşünce malzemesinden yalnızca biraz uzakta çalışır; yalnızca hayal gücüyle havada kaleler kurar; program ise büyülü sözler doğru girildiğinde ekranda daha önce var olmayan bir şeyin canlandığı gerçek dünyadaki sihirdir
    • Tamamen katılıyorum. Çok uzun zaman önce ZX81 BASIC ile bir Forth derleyicisi yapmıştım
      Ekrana 1000 sayı yazdırması 19 saniye süren şey, anında biten bir şeye dönüşmüştü
      Ayrıca büyük bir ders de aldım: üretilen makine koduna bakıp kusursuz olduğunu, daha fazla iyileştirilemeyeceğini düşünmüştüm; ama ertesi gün geri gelip onu çok daha hızlı hale getirdim
  • “Kendi kendini nasıl yazıyor? Sadece fonksiyon yazabilmek anlamına gelmiyor mu?” diye merak edebilirsiniz
    Bir ölçüde doğru, ama Forth yeni kelimeler tanımlayıp bunları dilin kendisinin bir parçasıymış gibi yapabilmesiyle daha ileri gider
    Bu kelimeler yerleşik işlemler gibi kullanılabilir ve dilin çalışma biçimini bile değiştirebilir
    Genişletilebilir bir dil olduğu için yeni denetim yapıları tanımlayan ya da sözdizimini değiştiren kelimeler de oluşturabilirsiniz; bu esneklik başka dillerde pek yaygın değildir
    Bu açıdan Forth, programcının dili çok temel bir düzeyde özelleştirip genişletebilmesini sağladığı için “kendi kendini yazan” bir dil olarak görülebilir
    Lisp’in makro sistemine de benzer: Lisp makroları derleme zamanı dönüşümleriyle yeni sözdizimi yapıları ve alana özgü diller oluşturmaya nasıl izin veriyorsa, Forth’un kelimeleri de sözdizimini ve işlevselliği genişletmeyi sağlar
    • Güzel, ama neredeyse 40 yıldır profesyonel programcı olarak çalışırken sorun olan şey sözdizimi değil, her zaman anlambilim oldu
      Matris çarpımı gibi A = B + C * D; yazmanın çağrılacak fonksiyonları tek tek belirtmekten daha iyi olduğu durumlar olabilir, ama pratikte böyle bir sorunla hiç karşılaşmadım
      Hayal gücüm mü yetersiz, yoksa yalnızca belirli alanlarda mı işe yarıyor da ben o alanlarda bulunmadım, Forth sözdizimi kullanışlı hale gelmek için genişletilmeye muhtaç olacak kadar yoksul mu, yoksa insanlar arabalarını modifiye eder gibi dillerini mi özelleştirmek istiyor, merak ediyorum
      İnsanların buna gerçekten neden ilgi duyduğunu pek anlamıyorum
  • Şu anda en ilginç Forth projelerinden biri Dusk OS; kendi C derleyicisini de içeren, Forth ile yazılmış 32 bitlik bir işletim sistemi ve çeşitli port çalışmaları da sürüyor
    https://duskos.org/
    • DuskOS’un kendisini pek bilmiyorum, ama tarihsel olarak Forth’un “kendi işletim sistemi” olduğu doğru olsa da modern bir okurun işletim sistemi denince aklına getireceği şeylerle karşılaştırıldığında epey ilkel kalır
      8KB RAM’de çalışan bir şeyden ne beklersiniz, denebilir; bu doğru, ama ilkel olanaklar sunsa da tarihsel olarak sürücüler ya da soyutlama kavramlarının çoğu neredeyse yoktu
      Kod kaynaktan yüklendiği için yavaştı; bağlantılama, blokları doğru sırayla yüklemeye daha çok benzerdi; yeni bir program yüklemek için önce mevcut programı kaldırmanız gerekirdi
      Program çıkışında makineye sık sık cold start yaptıran CP/M’den çok daha iyi olduğu da söylenemez, ama en azından CP/M BIOS ile BDOS’u ayırmıştı
    • Bunu kaçırmışım. Tam “Beyond the Collapse”ı okuyordum ve Lisp ya da APL/J, C becerileriyle işletim sistemi düzeyinde Forth’un basitliğine yaklaşmanın zor olacağını hissettim
      Gelecek hafta sonundan önce mutlaka bakmayı düşünüyorum
  • İlk programlama dillerim x86 assembly ve Forth’tu. Babam Forth’a meraklıydı ve programlamayı ondan öğrendim
    Ergenken DOS için birkaç x86 Forth sistemi yaptım; sonunda da oldukça cilalanmış, ANS uyumlu bir uygulama olan “Third”e kadar geldim: https://github.com/benhoyt/third
    Bir assembler da dahil olmak üzere, birkaç bin satır kodla tamamen bootstrap edilmiş bir Forth derleyicisine sahip olabilmek epey şaşırtıcı
    Bir süre önce Forth Dimensions dergisi için birlikte yazdığım eski bir yazıyı da temize çektim
    Forth’un fikirleri hâlâ iyi, ama stack manipülasyonu kısa sürede sıkıcılaşıyor ve okunması da çok zor hale geliyor
    https://benhoyt.com/writings/forth-lookup-tables/ adresindeki kod örneğine, özellikle de Search-Table’a bakarsanız anlarsınız. İsim vermek zor, ama isim vermemek daha da zor gibi
    • Stack manipülasyonunun sıkıcılaşması belki de senin ve benim Chuck Moore olmamamızdandır
      Onun kodunda genelde stack karıştırması çok azdır. Örnek: http://www.merlintec.com/download/color.html
    • Third kaynak koduna kısaca baktım, ilginç
      Bootstrap sırasında kernel.comu çağırıyor; kernel.com’u nasıl derlediğini merak ediyorum
  • İlgili Chuck Moore konuşması: “Programming a 144 Computer Chip to Minimize Power” (2013)

https://www.youtube.com/watch?v=0PclgBd6_Zs
Forth’un ultra düşük güç tüketimli bilgisayarları çalıştırma biçiminin şöyle olduğu söyleniyor: GreenArrays 144 çekirdekli asenkron bir çip sevk ediyor ve yalnızca 7 pJ/inst enerji gerekiyor
Boştaki çekirdekler güç harcamıyor (100 nW); etkin çekirdekler 4 mW ile hızla çalıştıktan sonra (666 Mips) iletişim beklerken boş duruma geçiyor

  • “Boyut ve hızın her zaman amatörlerin önem verdiği şeyler olduğunu düşünürdüm. Ama modern bağlamda önemli olan yalnızca üç parametre var: güç, güç, güç
    --Chuck Moore
    https://youtu.be/0PclgBd6_Zs?t=389
  • Bu tür faz yapısının önümüzdeki birkaç yıl içinde yeniden geri dönüp dönmeyeceğini gerçekten merak ediyorum
  • Harika bir başlangıç kitabı Starting Forth
    Bir ders kitabında gördüğüm en çekici illüstrasyonlardan bazılarını içeriyor
    [0] https://www.forth.com/starting-forth/
  • Çok eskiden OS/2 çıktığında bir arkadaşım “OS/2 programları assembler ile yazılamaz, C ile yazılmalı” diye aktarmıştı
    Bu söze tepki olarak Forth/2’yi yaptım
    OS/2 için assembler ile yazılmış, doğrudan iş parçacıklı native code Forth derleyicisiydi; Brian Matthewson harika bir kılavuz yazdı ve onlarca kullanıcı kazandı
    [1] https://sourceforge.net/projects/forth2/
  • Biraz farklı bir konu ama bu yazının ilk sunum prototipi hâlini okuduğumu hatırlıyorum
    Şimdiki yazıyla temelde aynıydı, ama metin çok daha az, boşluklar ise daha fazlaydı
    Bunu belirtmemin nedeni, o materyalin altta yatan web sitesi teknolojisi açısından da minimalizmin güzelliğini göstermesi
    [0] http://ratfactor.com/forth/forth_talk_2023.html
    [1] http://ratfactor.com/minslides/
  • Rust’ta da bir Forth derleyicisi olması ilginç. İlgili materyal [1]’de
    Kullanımı hâlâ biraz belirsiz olsa da[2], daha önce burada da ele alınmıştı[3] ve implementasyon sağlam görünüyor
    REPL Forth sanal makinesi değil ama etkileyici bir sanal makine implementasyonu
    FORTH bir sanal makineyse, akış verilerini yönetebilecek küçük ve verimli bir sisteme ihtiyaç olduğunda bare-metal’e yakın performans sunan en iyi seçenek olabileceğini düşünüyordum
    İşletim sistemiyle boğuşmak zorunda kalmaması da var
    Bunun özünde FPGA’ların yaptığı işi standart CPU üzerinde yapmak olup olmadığını düşünüyorum
    Yalnız, gerekli donanımla bağlantı kurmak için tüm sürücüleri kendiniz yazmak zorunda olmadığınız özel bir sistem olarak hayal ediyorum
    [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
  • Bir Forth daha kendim implemente ettim
    Amacım özgün fikri sadakatle kopyalamak değildi; biraz farklı çalışıyor
    Yazıda Forth’u keşfedebileceğiniz söylendiğine göre kendi implementasyonumu da bırakayım: https://github.com/loscoala/goforth
    En büyük fark, bu Forth varyantında kaynak metnin tamamen bytecode’a dönüştürülmesi ve klasik Forth anlamında bir runtime olmaması
    Bu yüzden bytecode’u C’ye çevirmek kolay
    Bu Forth’u C kodu üretmek için kullanıyor, sonra o kodu başka yazılımlara gömerek kullanıyorum
    • Böyle bir yaklaşım çok üretken ve akıllıca olabilir; ancak bu tür çok dilli çözümlerin uzun vadede bakım baş ağrısına dönüşmeye yatkın olduğunu hep akılda tutmak gerekir
      Kulak eğitimi ve ilk görüşte okumayı çalıştıran gerçekten iyi bir açık kaynak proje var; yazarın yaptığı bir dille yazılmış ve o dil JavaScript’e derleniyor
      Araç zincirini kurmanın zahmeti o kadar büyük ki, bildiğim epey hata olmasına rağmen düzeltmeye cesaret edemedim
      https://sightreading.training/
      https://github.com/leafo/sightreading.training
      Bu proje ‘Moonscript’ adlı bir dille yazılmış: https://github.com/leafo/moonscript
      Moonscript Lua’ya derleniyor, Lua da JS’ye derleniyor
      Delilik. Harika bir delilik gerçi, ama yine de katkıcı olmamı engelledi