Düşük seviye programlama

Sembolik makina dili ile programlama, programın kritik kısımları için bir can sıkıntısıdır.

Doğru görev için uygun araçları kullanmalısınız, dolayısiyle eğer uygun değilse sembolik makina dilini kullanmak için seçmeyin; pekçok durumda C, OCaml, Perl, Scheme daha iyi birer seçim olabilir.

Yine de, makina üzerinde bu araçların makina üzerinde yeterince iyi olanaklar sunmadığı anlar vardır ve sembolik makina dili böylesi durumlar için faydalı veya gereklidir. Böyle bir durumda, sonsuz kere kullanılabilir tanımlamalar içerisine yerleştirilmiş tekrar eden kalıplara izin veren makroprogramlama ve metaprogramlama sistemini takdir edeceksiniz, ki bu sistem aynı zamanda, daha güvenli programlama, model değişiminin otomatik üretimi, vs. sağlamaktadır. Yalın çeviriciler genelde yetersizdir, hatta sadece C ile ilintilenecek küçük yordamlar yaparken bile.

Harici Filtreler

Sizin çeviricinizde her ne makro desteği varsa veya her ne dilini (hatta C!) kullanıyorsanız, eğer dil yeterince sizin için ifadesel değilse, bir Makefile kuralı ile dosyalarınızı harici bir filtreden şu şekilde geçirebilirsiniz:

%.s:    %.S other_dependencies
        $(FILTER) $(FILTER_OPTIONS) < $< > $@

CPP

CPP gerçekten çok anlamlı, ifadesel değildir, fakat kolay şeyler için yeterlidir ve GCC tarafından şeffaf şekilde çağrılır.

Kısıtlamalarına bir örnek olarak, yokediciler de (destructors), bildirim bloğunun sonunda çağrıldıklarından içinde nesne bildirimleri yapamazsınız; bölümlere veya etki alanlarına, vs. sahip olamazsınız.

CPP herhangi bir C derleyicisi ile birlikte gelir. Yine de, ne kadar vasat olduğunu düşünürsek, eğer onu C'siz kullanmayı başarabilirseniz de, ondan uzak durun.

M4

M4 size, Turing dengi bir dil, yinelemeler (recursions), düzenli ifadeler (regular expression) ile, macro işlemenin tüm gücünü vermektedir. CPP'nin yapamadığı herşeyi onunla yapabilirsiniz.

M4 kullanarak yapılan ileri düzey programlama örnekleri için macro4th (this4th) veya Tunes 0.0.0.25 kaynaklarına bakınız.

Yine de, işlevsel olmayan tırnak kullanımı (quoting) ve bunun kaldırılması (disquoting) şeklindeki anlamsal yapı (semantics), eğer ileri düzey makro programlama yapmak istiyorsanız sizi süreklilik gösteren içiçe makro tarzı (continuation-passing tail-recursive macro style) kullanmaya zorlamaktadır (ki bu da insana TeX'i hatırlatıyor - herneyse, TeX'i yazı yazmak dışında bir makroişlemci olarak kullanan kimse var mı?). Tırnak ve yineleme (recursion) kullanımına hiç izin vermeyen CPP'den daha kötü değildir.

M4'ü kullanmak için doğru sürüm, en çok özelliği, en az hatası ve kısıtlamaları olan GNU m4 1.4'tür (varsa daha sonraki sürümleri). m4 herhangi bir şey için yavaş çalışacak şekilde tasarlanmıştır fakat en kolay kullanıma sahiptir, ki bu da çoğu sembolik makina dili için makul bir durumdur (milyonlarca satır sembolik makina kodu yazmıyorsunuz değil mi?).

Kendi filtreleriniz ile makroprogramlama

Bilindik araçlarla kendi basit makro genişleme filtrelerinizi yazabilirsiniz: perl, awk, sed, v.b. Biraz daha hızlı gerçeklenebilir ve herşeyi denetmersiniz. Fakat, elbetteki, makroişlemede güç, "zor yol" anlamına gelmektedir.

Metaprogramlama

Makroları genişleten harici bir filtre kullanmak yerine, işleri yapmanın bir yolu da tüm diğer programların bir kısmını ya da tamamını yazan programlar yazmaktır.

Örneğin, çıktı olarak aşağıdakileri gerçeklemek için kaynak kod üreten bir program kullanabilirsiniz:

  • sinüs/kosinüs/vs. arama tablolarını üretmek için,
  • bir ikilik dosyanın kaynak kodu gösterimini elde etmek için,
  • hızlı ekran yordamlarına biteşlemleri derlemek için,
  • normal kaynak koddan başka, belgelendirme, başlangıç/bitiş kodları, tanımlama tablolarını elde etmek için,
  • perl/shell/scheme betiğinden üretilen rastgele işlem yapan özelleştirilmiş sembolik makina koduna sahip olmak için,
  • çapraz başvuru tabloları ve kod bölümlerinden sadece tek noktada tanımlı veri etkileşimi sağlamak için,
  • v.b.

Bunun hakkında düşünün!

Derleyicilerdeki arka uçlar

GCC, SML/NJ gibi derleyiciler, Objective CAML (OCAML), MIT-Scheme, CMUCL, v.b.'nin, kullanmayı tercih edebileceğiniz, kendi dahili çevirici arkauçları (backend) vardır, eğer yarı otomatik olarak bu dillere göre ya da elden geçirdiğiniz dillerden kod üretmeye niyetlenirseniz: uzun sembolik makina kodları yazmak yerine, bir derleyiciyi değiştirebilirsiniz, böylece uzun sembolik makina kodu çöpe gider!

New-Jersey makina kodu araç seti

Sembolik makina kodunu değiştirecek bir kod üretim tabanı oluşturmak için Icon programlama dilini kullanan (deneme açamasındaki ML sürümü ile) bir proje vardır. http://www.eecs.harvard.edu/~nr/toolkit/ adresine bakınız.

TUNES

Özgür Fikirli Bilgisayar Sistemi (Free Reflective Computing System) için TUNES Projesi, kendi gelişim sürecinin bir parçası şeklinde, Scheme dilinin bir uzantısı olarak kendi çeviricisini geliştirmektedir. Henüz hiç çalışmamıştır, fakat yardımlar kabul edilmektedir.

Çevirici soyut sözdizim ağaçlarını (abstract syntax trees) değiştirmektedir, böylece sembolik makina sözdizimi çeviricisi, tersine çevirici (disassembler), genel sembolik makina dili/derleyici arka ucu, v.b. tabanı olarak eşit şekilde hizmet verebilmektedir. Aynı zamanda, gerçek bir dilin, Scheme, tüm gücü, makroprogramlama ve metaprogramlama için onu karşı konulmaz hale getirmektedir.