HomeMapIndexSearchNewsArchivesLinksAbout LF[Top Bar]
[BottomBar] 
 
[Photo of theAuthor] 
Emre Demiralp 
Yazar hakkında: İstanbul Amerikan Robert Kolej'inde öğrenciyim ve aynı zamanda İstanbul Teknik Üniversitesi Fen-Edebiyat Fakültesi Bilgisayar Labaratuvarlarının yöneticilerinden biriyim.Bu labaratuvarlardaki yaygın işletim sistemi LINUX'dur. İlgi alnları: PovRay, PostScript, animasyon, CD tasarımı, programlama,holografi vs... 1994'ten beri LINUX kullanıcısı.  

Yazarla temas 

Giriş

Yığın Yönetimleri

Matematiksel İşletmenler

 

PostScript İşlenenler Yığıtı: İşlemler ve Matematiksel İşleyiciler

Çeviri: Berk Onat

-PostScript Dizilerinin İkinci Metni-
[Ilustration] 
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. 

Jorge M. Paolo and Jose Quesada tarafından gözden geçirilmiştir

 
Bu sanalyörenin bakımı Miguel Angel Sepulveda tarafından yapılmaktadır
© Emre Demiralp 1999 
LinuxFocus 1999