PostScript İşlenenler Yığıtı: İşlemler ve Matematiksel İşleyiciler
Çeviri: Berk Onat (Gözden geçirilmekte)
-PostScript Dizilerinin İkinci Metni-
Damlaya damlaya göl olur
-Türk Deyimi-.
Özet:
Yazar PostScript dilinin işlemsel yığınını tanıtıyor. Yığın yönetimleri ve matematiksel işletmenler burada sunulmuş.
Bu metin işlemsel yığının tüm özelliklerini kapsıyor. Gelecekteki metinler bu konu hakkında bilgi vermeye devam edecek.
Giriş
Bu PostScript hakkındaki metinler dizisinin ikinci metni. Bu metindeki temel amaç Yığın işletmenlerini
anlatmak. İşlemsel Yığın PostScript'in en önemli bölümüdür. Tüm bu; görevler, aritmetiksel ve matematiksel
işlemler, döngüler ve mantıksal işlemler bu belirli hafıza parçasında ele alınır. Evet! Yığın, PostScript'in
,ondan yapmasını istediğimiz hemen hemen herşeyi çalıştırmak için kullandığı, özel hafıza bölgesidir. Yığın,
bilgiyi en son girilen veri ilk önce çıkacak şekilde saklar. Bunu, bir ucu kapatılmış bir boruya benzetebiliriz.
Bu boruya birşey koyduğumuzda, boru kendine yer açmak için içinde bulunan herşeyi kapalı uç tarafına doğru
itecektir. Bu nedenle son girilen birim her zaman açık olan uca yakın olacaktır. Yığında bulunan birimler dizi
, sayısal sabit, anahtar, blok vs... olabilirler.
Yığın Yönetimi
Birimler yığın içinde düzenlenmesine karşın birimleri yeniden düzenlememize izin veren yığın işlemleri vardır.Yönetimler yığındaki bir veya daha çok birime uygulanır. Tanıma göre, işletmenler yığındaki birimleri yönetirler.
Yönetimin niteliğine dayanarak birimlerin parametreye(PostScript tanımlamalarında(Terminolojisinde,özeliğinde) işlemsellerdir)gereksinimleri olabilir. Eğer parametreye veya parametrelere gereksinim duyarlarsa ilk önce bu parametreler yığına atanmalıdır.Bundan sonra işletmen bu işlemsellere önem vererek hareket edecektir. Burada yeterince örnekle birlikte bu işletmenlerin bir listesini veriyoruz. Daha sonra ayrıntıları aydınlatmak için örnekler verilecektir.
pop: Bu işletmen, işlemsel yığındaki en üst üyeyi(son girilen)
yok sayar.
exch: Bu işletmen, işlemsel yığının en üst iki üyesinin yerlerini
değiştirir.
dup: Bu işletmen, işlemsel yığının en son girilen üyesinin bir kopyasını yaratır ve bunu işlemsel yığına atar.
Diğer bir deyişle, en üst üyeyi ikizleştirir(duplicate).
copy: Bu işletmenin, işletmen harekete geçmeden önce işlemsel yığına verilmesi gereken
tamsayılara gereksinimi vardır. Eğer bu tamsayıyı n olarak alırsak komut(emir)
n copy şeklinde verilecektir. Bu yapıldığında n en üst üyeler kümesi yaratılacak ve
son girilen üye gibi işlemsel yığına yerleştirilecektir. Diğer bir deyişle, copy düzenlenmiş
ikizleştirme(duplication) işletmenidir.
index: Bu işletmenin, işletmen harekete geçmeden önce işlemsel yığına verilmesi gereken
tamsayı işlemseline gereksinimi vardır. Eğer bu tamsayıyı n olarak düşünürsek, komut(emir)
n index şeklinde olacaktır. Bu yapıldığı zaman; n 'inci en üst üyenin kopyası(eşi)
yaratılacak ve en son girilen üye gibi işlemsel yığına yerleştirilecektir. Diğer bir deyişle, index
dahili bir üye seçebilir, yaratabilir ve kopyasını işlemsel yığına yerleştirebilir.
Üyelerin sıralanması 0 ile birlikte en üst üyeden başlar.
roll: Bu işletmenin, işletmen harekete geçmeden önce işlemsel yığına verilmesi gereken
iki tamsayı parametresine gereksinimi vardır. Eğer bu tamsayı parametreleri m
ve n gibi alınırsa komut m n index şeklinde verilecektir. Burada, n döngü sayısını
nitelendirirken, m ne kadar üyenin devineceğini belirtir. Tek üye öyle tanıtılır ki, en üst
üyenin altındaki m-1 üyeler kümesi bir üste taşınırken, işlemsel yığının en üst üyesi m'inci
üye durumuma gelir.Bu tasarı n 1'e eşit olduğunda geçerlidir. Eğer n 2 olursa
iki ardışık döngü meydana gelecektir. Başka bir şekilde söylersek, m 2 roll m 1 roll m 1 roll
ile aynıdır. n parametresi eksili değerleri alabilir. Eğer n'e eksili değer verilirse, n pozitifken
olan hareketi ters çevirecektir.Bu da m n roll m -n roll emrinin(komutunun) doğal hareketini meydana getirecektir.
İşlemsel yığın değişmeden bırakılacak, üyelerin sıralanması 0 ile birlikte en üst üyeden başlayacaktır.
clear: Bu işletmen işlemsel yığının tüm üyelerini etkisiz bırakır.
count: Bu işletmen işlemsel yığının üyelerini sayar. Sonuç, işlemsel yığına yeni bir üye olarak atılır.
Eğer bu yeni üyeyi istemiyorsanız count pstack pop karma emrini(komutunu) verebilirsiniz.
Burada pop, count tarafından yeni yaratılan üyeleri, sayım sonucu pstack dosya işletmeninin hareketiyle
gösterildikten sonra siler.
mark: Bu işletmen işlemsel yığının içine etiketlenmiş (-marktype-) üye koyar.
Bu üye işlemsel yığındaki üyeler kümesini alt kümelere bölmek için kullanılabilir.Diğer iki işletmen,
cleartomark ve counttomark bu üyeyi işlem sırasında ararlar. Eğer bulamazlarsa
hata iletisi verilecektir.
cleartomark: Bu işletmen en üst üyeden başlayarak ilk etikete (-marktype-) kadar olan tüm üyeleri siler.
Bu etiket (-marktype-) de birlikte silinir. Eğer işlemsel yığında hiç bir etiket yoksa bir hata
iletisi verilir.
counttomark: Bu işletmen en üst üyeden başlayarak etikete rastlayana kadar üyeleri sayar.
Tamsayı değeri olan sonuç, işlemsel yığına son üye olarak konur. Sonuç ilk karşılaşılan etiket
üyesini içermez.Eğer işlemsel yığında etiket yoksa PostScript yanılgıya düşer ve hiçbir şey yapmaz.
İsterseniz şimdi de biraz Yığın hakkında bilgi verelim.
Eğer yukarıdaki işletmenleri hareket halinde görmek
istiyorsanız ilk önce, PostScript çeviricisini etkinleştirmelisiniz.
İlk metinde de belirtildiği gibi, Linux dünyası serbest bir çevirici olan
ghostscript'i kullanır. Ghostscript, komut satırında uygun parametreler
verilerek farklı yollardan etkinleştirilebilir. Genel yöntem, X Windows ortamında
gs komutunu kullanmaktır. Bazen X'deki bazı ayarlama sorunları yüzünden bu işlemez.
Bu durumda elverişli çizgisel veribiriminin(console) yaratılamadığı gösterilecektir.
Bundan sonra ya bu sorunlar çözülmelidir yada ghostscript'in x11 aygıtını kullanması sağlanmalıdır.
Bu amaçla gs -sDEVICE=x11 girersiniz. Bu yada sadece gs (eğer çalışırsa), oturum
sırasında yaratılan görüntüler için kullanılan arkaplanı beyaz boş bir pencere yaratır.
Bu kısımda görüntüler bulunmadığı için bu pencereye gereksiniminiz yoktur ve bu pencereden kurtulabilirsiniz.
Bunun için, ghostscript çeviricisi görüntüsüz olarak gs veya gs -sDEVICE=x11 ile birlikte
komut satırına -dNODISPLAY parametresi girilmesiyle canlandırılabilir. Eğer bu yapılırsa ilk önce
telif hakkı başlığı gözükecek, sonra bunu yeni bir satırın başında ghostscriptin hazır olduğunu belirten
GS> yazısı izleyecektir. Bu noktada ghostscript, komutlarınıza hazırdır ve işlemsel yığın boştur.
İşlemsel yığının içeriğini görmek için bir dosya işletmeni olan pstack'i kullanabilirsiniz.
Bu komut, dosya işletmeni olarak çağrılır çünkü içerik bilgisini öngörüsüz(default) ekran olarak
belirlenmiş genel sonuç dosyasına gönderir. Eğer bu komutu hazır imlecinde girerseniz hiçbir şey
görüntülenmeyecek ve yeni bir satırın başında yeni bir GS> hazır imleci görüntülenecektir.
Bu işlemesel yığının boş olduğu anlamına gelir.
İşlemsel yığına üye girmek için hazır imlecinde üyeleri girebilirsiniz. Örnek; eğer 1'i üye olarak girmek
istiyorsanız hazır imlecinde 1 girmeniz yeterlidir. Bundan sonra yeni bir satırda yeni hazır imleci yaratılır.
Fakat bu sefer, hazır imleci GS> değil GS<1> dir. Hazır imlecinin bu yeni şekli işlemsel yığındaki üyelerin sayısını belirtir.
Bu nedenle, eğer ghostscript oturumunda herhangi bir anda GS<123> bulunuyorsa, işlemsel yığında 123 üyenin olduğunu
anlamına gelir.
Tek bir atamayla işlemsel yığına birden fazla üye girebilirsiniz. Bunun için tüm üyeleri sırasıyla yazmalı fakat boşluklar ile
ayırmalısınız. Örnek vermek gerekirse; eğer hazır durumundaki imlece 1 2 3 4 5 6 girerseniz,
1, 2, 3, 4,5, 6 olan üyelerden her biri girildiği sıraya göre işlemsel yığına
konulacaktır. Eğer bundan sonra pstack komutunu girerseniz son girilen üye ilk gösterilecek şekilde üyelerin dikey bir düzende gösterileceğini görürsünüz.
Bu iki komut ortamının görüntüsü şu şekilde verilebilir:
GS>1 2 3 4 5 6
GS<6>pstack
6
5
4
3
2
1
GS<6>
Tek bir atamayla işlemsel yığına üyeler girmek ve yığının içeriğini görmek de mümkündür.
Tek yapmanız gereken üyeler verildikten sonra pstack komutunu girmektir:
GS>1 2 3 4 5 6 pstack
6
5
4
3
2
1
GS<6>
Şu ana kadar üyeler girmek için sayıları kullandık. Sayılar tek üye çeşidi değildir, değişkenler,
açıklamalar, diziler, kalıplar vs... gibi diğer çeşit üyeleri
de girmek mümkündür. Sonra bunları ayrıntılı olarak inceleyeceğiz. Yine de şimdi birşeyler söylersek;
eğer sadece örnek olarak a veya abc dizisi girmeye çalışırsanız bir hata iletisi
verilecektir. Bunun nedeni PostScript'in bunları anlayamamasıdır. Eğer bir değer veya dizi girmek
istiyorsanız etraflarını () ile sarmalısınız. Burada özel bir üye olan ve etiket(marktype) diye
anılan üye çeşidinden söz edeceğiz. Bunu görmek için aşağıdaki oturum örneğini verebiliriz
:
GS>1 2 3 mark 4 5 6 pstack
6
5
4
-marktype-
3
2
1
GS<7>
Şimdi işlemsel yığın yönetilerinin işletmenleri için birkaç örnek göreceğiz.
Bu işletmenlerin nasıl davrandığını gösteren oturum örneğini sizlere sunuyorum ve
bu bölümü daha ileri açıklamalar yapmadan sona erdiriyorum.
.
GS>1 2 3 mark 4 5 6 pstack
6
5
4
-marktype-
3
2
1
GS<7>pop pstack
5
4
-marktype
3
2
1
GS<6>exch pstack
4
5
-marktype
3
2
1
GS<6>dup pstack
4
4
5
-marktype-
3
2
1
GS<7>2 copy pstack
4
4
4
4
5
-marktype
3
2
1
GS<9>5 index pstack
-marktype-
4
4
4
4
5
-marktype
3
2
1
GS<10>cleartomark cleartomark pstack
3
2
1
GS<3>3 1 roll pstack
2
1
3
GS<3>count pstack
3
2
1
3
GS<4>mark 7 8 pstack
8
7
-marktype-
3
2
1
3
GS<7>counttomark pstack
2
8
7
-marktype-
3
2
1
3
GS<8>clear pstack
GS>
Matematiksel İşletmenler
Yönetim işletmenlerinden farklı olarak aritmetiksel ve matematiksel işletmenler de vardır.
Bu işletmenler aşağıda verilmiştir. Bu bölüm için örnek verilmeyecektir. Bundan sonrası
bunları yaratabilen ve yukarıdaki örnek oturumlar ile donatılmış okuyucuya bırakılmıştır.
.
add: Bu komutun, değerleri toplama işletmenine girilecek olan iki sayısal parametreye
gereksinimi vardır. Eğer bu değerler m ve n şeklinde alınırsa komutun m n add
şeklinde olması beklenir. Bu durumda ilk önce m ve n işlemsel yığına atılır.
add işletmeninin işlemsel yığının en üst iki üyesi üzerindeki işlemi son kısımdır.
Bu, m ve n 'in toplamına eşit olan değerde yeni bir üye yaratır. İşlem
bittikten sonra m ve n işlemsel yığında tutulmaz. Bunun yerine sonuç, işlemsel
yığının en üst üyesine dönüşür.
div: Bu komutun değerleri bölme işlemine girilecek olan iki sayısal parametreye gereksinimi
vardır. Eğer bu değerlere m ve n denirse komutun m n div şeklinde verilmesi gerekecektir.
Bu işlemin işleyiş biçimi add ile aynıdır. Bölme işlemi aritmetik düzeyin yüzen bir noktasındadır.
İşlem yapıldıktan sonra sadece sonuç işlemsel yığında yeni bir üye olarak bırakılır.
m ve n tutulmaz.
idiv: Bu komutun değerleri tamsayı bölme işlemine girilecek iki sayısal parametreye gereksinimi
vardır. Eğer bu değerler m ve n şeklinde seçilirse komut m n idiv şeklinde verilir.
Bölme düzeyi dışında herşey div ile aynıdır. Bu tamsayı aritmetik bölme işlemidir. Parametreler
tamsayı olmasa da çalışır.
mod: Bu komutun iki tamsayı parametresine gereksinimi vardır. Bu komut birinci parametrenin
kalanıyla ikinci parametreninkini değerlendirir. Eğer herhangi bir parametre tamsayı değilse çalışma
başarısız olur. Sonuç işlemden sonra işlemsel yığında tek tutulan değerdir.
mul: add ve div ile aynıdır. İki sayısal değere gereksinimi olan ikilik düzen
işletmenidir. Sonuç parametrelerin çarpımıdır ve işlemsel yığında yeni bir üye olarak korunur.
sub: add,div ve mul ile aynıdır. Tek fark işlem çeşitidir. İkinci parametrenin değerini
birincisinden çıkartır. Parametreler ve sonuç sayısal değerlerdir ve sonuç işlem tamamlandıktan
sonra işlemsel yığında tutulur.
exp: İkilik düzende matematiksel işletmendir. İki parametreye gereksinimi vardır.
İlki taban, ikincisi üstür. Tabanın değerini, değeri üst olan kuvvete arttırır. Parametreler üstel
işlem sınırlarında olmalıdır. Yüzen bir noktasal sayı olan sonuç işlemsel yığında yeni bir üye
olarak tutulur.
.
atan: Açısal değer için ikilik düzende matematiksel işletmendir.
Açı 0 ile 360 arasında bir değerde verilir. İki
parametreye gereksinimi vardır. İlk parametrenin ikncisine oranı,
hesaplanacak olan açının tanjantına(tegetine) eşittir. Parametrelerin
işareti sonucun bulunacağı çeyrek çemberi belirler. İlk parametrenin pozitif
değerleri pozitif y düzlemine karşılık gelir. Oysa, ikinci
parametrenin pozitif değerleri pozitif x düzlemini anlatacaktır.
.
abs: Matematiksel işletmene ait değildir. Sonucu mutlak değer olan
sadece bir parametreye gereksinimi vardır. Yukarıdakine benzer şekilde,
sonuç işlemsel yığında yeni bir üye olarak tutulur.
neg: Sadece teriminin işaretini değiştirir. Aritmetik işletmene
ait değildir.
ceiling: Terime üstten en yakın olan tamsayı değerini
hesaplayan bir işletmendir.
floor: Terime alttan en yakın olan tamsayı değerini saptayan
bir işletmendir.
round: Terime en yakın olan tamsayı değerini değerlendiren
işletmendir.
truncate: Terimin ondalık bölümünü silen bir işletmendir.
sqrt: Terimin kare kökünü hesaplayan bir işletmendir.
cos: Terimin kosinüsünü hesaplayan işletmendir. Terimin derece
cinsinden verilmesi beklenir.
sin: Terimin sinüsünü hesaplayan işletmendir. Terimin derece
cinsinden verilmesi beklenir.
ln: Terimin doğal logaritmasını hesaplayan işletmendir.
log: Terimin 10 tabanındaki logaritmasını hesaplayan işletmendir.
Metni bitirmeden önce bir hatırlatma daha; yukarıda söz etmemize rağmen,
kesin bir açıklıkla komut değerleri (PostScript tanımlamasında işlemseller)
bazı tatsız sorunlar yaratabilir. Komut, (yada PostScript tanımlamasında
işletmen) parametresini işlemsel yığında arar. Bulduğunda kullanır ve
işlemsel yığından siler. Bu nedenle, tedbirle veya hatayla parametrelere
gereksinimi olan komutun, işlemsel yığına parametre değerleri olmadan
verilmesi, ya işlemsel yığındaki bazı üst üyelerin parametrelerinde
sapmalara yada bazı üst işlemsel yığın üyelerinin silinmesine sebep olur.
Bu sunumu tamamlamadan önce PostScript`te ilerlemek isteyen kullanıcılara
daha karmaşık ve geniş programlar yazmalarını tavsiye ediyoruz. Bu dizinin
ileriki yazılarında PostScript dili hakkında daha fazla ayrıntıya
girilecektir. Sunumumuz hakkında tüm sorularınızı ve fikirlerinizi bekliyoruz. |