← rfc/
╔══════════════════════════════════════════════════════════════════════════╗
RFC 242 · data

PAYLAŞILAN VERİLER İÇİN VERİ TANIMLAYICI DİL

Yazar
L. Haibt, A. Mullery
Kurum
Thomas J. Watson Research Center
Tarih
19 Temmuz 1971
Durum
Network Working Group Yorum Talebi
Kanal
data/

| Yazar | L. Haibt, A. Mullery | | Kurum | Thomas J. Watson Research Center | | Tarih | 19 Temmuz 1971 | | Durum | Network Working Group Yorum Talebi | | RFC Numarası | 242 |


L. Haibt

A. Mullery

Thomas J. Watson Research Center

Yorktown Heights, N.Y.

19 Temmuz 1971

Introduction

Bilgisayar ağlarının kullanılmasının başlıca sonuçlarından biri, verilerin daha verimli biçimde paylaşılarak kullanılmasına yönelik talebin artmasıdır.

Verilerin kolayca paylaşılmasının önündeki birçok engel, aynı veriyi temsil etme ve ona başvurma konusunda kullanılan çok çeşitli yöntemlerden kaynaklanır. Bu sorunların neredeyse tamamı, veriler bilgisayar ağları aracılığıyla paylaşılmadan önce de biliniyordu; ancak ağ olanakları bu sorunları yalnızca daha belirgin hâle getirmiştir.

Tartışma kolaylığı açısından, temsil farklılıkları üç kategoriye ayrılacaktır. İlk kategori çok yerel temsil ile ilgilidir—karakter kümesi için bit desenleri, sabit noktalı ve kayan noktalı sayılar gibi. Bu farklılıklar genellikle CPU’lar ve depolama aygıtları arasındaki farklılıklardan kaynaklanır. Bu düzeyde bir temsilden diğerine dönüşüm genellikle birim birim yapılabilir (örneğin bilgisayar sözcüğü başına bilgisayar sözcüğü). En ciddi sorunlar, bir temsil şemasındaki bazı değerlerin diğer temsil şemasında karşılık gelen bir anlama sahip olmadığı durumlarda ortaya çıkar; örneğin sekiz bitlik baytları altı bitlik baytlara dönüştürmeye çalışırken olduğu gibi.

İkinci bir farklılık kategorisi, veri koleksiyonlarının temsili ile ilgilidir; örneğin boyutları, sıraları ve konumları.

Biraz tanımlaması zor olan üçüncü kategori ise veri koleksiyonlarının sahip olabileceği daha karmaşık yapıların tümüyle ilgilidir—örneğin indeksli dosyalar, iç işaretçiler ve çapraz başvurular içeren alanlar ve OS/360 içindeki partitioned data sets ve generation data sets gibi dosya koleksiyonları.

Network/440 projemiz kapsamında bu sorunlarla başa çıkmak için benimsediğimiz yaklaşım, ağ içinde verilerin taşınması sırasında dönüşüme tabi olacak veri temsili yönlerinin tanımlanmasına olanak sağlayacak betimleyici bir dil geliştirmeye çalışmak olmuştur. Böylece ağ veri yönetim sistemi, veri yönetimi işlevi sırasında gerektiğinde bu tanımlamalara başvurabilecektir. Örneğin büyük ölçüde, veri yöneticisine iki açıklama sağlanabilir: biri verinin şu anda nasıl temsil edildiğini, diğeri ise bir kopyasının nasıl görünmesi gerektiğini belirtir; veri yönetim sistemi de uygun kopyayı elde etmek için gerekli dönüşümleri gerçekleştirebilir.

Veri dönüşümünü belirtmeye yönelik bu yaklaşım, RAND Form Machine gibi, bir biçimden diğerine geçiş için belirli çeviri algoritmalarını tanımlayan biçimsel bir yapı sunan sistemlerle bir ölçüde karşıtlık oluşturur. Tanımlayıcıdan tanımlayıcıya yaklaşımı, yeni alan biçimleri geliştirilirken programlama yükünü basitleştiriyor gibi görünmektedir. Çevirileri belirtmenin bu iki yöntemi de bir Network Standard Representation kullanımını dışlamaz.

Structure

Betimleyici dil, verinin; ad gruplamaları, kilitleme gruplamaları vb. gibi sonradan uygulanan diğer gruplamalardan bağımsız olarak kendine özgü bir iç yapıya sahip olabileceğini varsayar. Bir veri yapısı tanımı, yerleşik veri değer türü kodlarının gruplamalarından oluşur. Yerleşik veri değer türleri listesi, uygun gruplamalar yoluyla, verinin herhangi bir hiyerarşik yapısını tanımlamak için yeterli olmalıdır.

Veri türü, veri değerinin nasıl yorumlanacağını belirler. Aşağıda veri türü kodlarının bir listesi verilmiştir. Bu liste, ağdaki herhangi bir makinedeki bir veri kümesinde bulunabilecek her veri türünü tanımlayabilecek kapasitede olmalıdır. Bununla birlikte, yalnızca saklandığı makinenin veri türlerini içeren veri kümeleri için, farklı makinelerde mevcut olabilecek tek bir türün farklı biçimleri için ayrı bir kod tanımlanması gerekli değildir. Tanımda belirtilen veri türü, verinin saklandığı makinenin kimliğiyle birlikte, veri türlerinin tüm bu biçimlerini eksiksiz biçimde tanımlamak için yeterlidir. G. Howe ve T. Kibler tarafından derlenen makineye bağımlı tür kodlarının geçici listesi aşağıdaki gibidir:

Veri kümesinin saklandığı makinede izin verilmeyen veri türlerini veya hatta ağdaki hiçbir makinede bulunmayan türleri içeren veri kümeleri oluşturabilmek arzu edilir. Örneğin bir kişi, sekiz bitlik veriyi altı bitlik bir makinede saklamak isteyebilir. Bu, en azından ilkesel olarak, sekiz bitlik baytlar içeren mantıksal bir veri kümesinin altı bitlik karakterler içeren gerçek bir veri kümesi cinsinden tanımlanmasıyla yapılabilir. Bunun için ise makineden bağımsız veri değer türü tanımlayıcılarının tanımlanması gerekir. Temel makineden bağımsız veri türü aşağıdaki gibidir:

Şu anda başka türlerin gerekli olup olmadığı açık değildir; çünkü diğerleri bu türden türetilebilir. Kolaylık sağlamak amacıyla ileride başka standart makineden bağımsız veri türleri de tanımlanabilir.

Yapıları tanımlamak için yararlı olan iki makineden bağımsız tür daha vardır. Bunlar:

Boş türü, bu öğeye karşılık gelen bir veri bulunmadığını belirtir; ancak öğe yapıda varmış gibi sayılmalıdır. Atla türü ise tam tersini belirtir: sayılmaması gereken veri vardır; yok sayılmalıdır.

Veri değerlerinin bir gruplaması, gruplamanın öğelerinin parantez içinde verilen listesiyle tanımlanır. Bir gruplamanın öğesi, veri değer türü kodlarından biriyle tanımlanan bir veri değeri ya da bir gruplama olabilir. Liste, virgüllerle ayrılmış bu öğelerden oluşur ve öğelerin gruplama içinde belirtilen sırayla yer aldığını gösterir. Örneğin aşağıdaki tanım:

((C,C),(F,F,I))

iki alt gruplamadan oluşan bir veri koleksiyonunu tanımlar; ilk alt gruplama C türünde iki veri değerinden, ikinci alt gruplama ise iki F türü veri değerini takiben bir I türü veri değerinden oluşur. Bu veri koleksiyonunun yapısı üç seviyeli bir ağaçtır ve iki boyutta aşağıdaki gibi gösterilebilir:

( )
|
( )---( )
|     |
C-C   F-F-I

Properties

Veri kümesinin yapısı ve bileşimi dışında kalan diğer veri özelliklerinin de tanımlanması gerekir. Bunlar veri koleksiyonunun öğelerine atanabilir; burada bir öğe, tek bir veri değeri veya bunların bir gruplaması olarak tanımlanabilir. Bu atama, öğe tanımının ilgili özelliklerin belirtilmesiyle değiştirilmesi yoluyla yapılır. Kullanılacak gösterim, aşağıdaki biçimde bir infiks gösterim olacaktır:

operand operator |[extent]|

Burada operatör özellik türünü, operand özellik değerini ve isteğe bağlı extent ise özelliğin uygulanacağı öğe sayısını belirtir. Normalde özelliğin yalnızca tanımdaki bir sonraki öğeye uygulanacağı varsayılır. Eğer özellik yalnızca bir sonraki öğe tanımından daha fazlasına uygulanacaksa, extent olarak bir sayı verilerek bu belirtilir; bu sayı, aynı seviyedeki kaç adet sonraki öğe tanımına özelliğin uygulanacağını gösterir.

Type

Veri kümesinin yapı tanımı, veri kümesinin yapısal veya sözdizimsel bir tanımıdır. Bazı durumlarda bir öğenin kullanımını veya anlamını tanımlamak gerekir. Örneğin bazı karmaşık veri yapılarında, yapıların bağlantıları veri kümesinde veri değerleri olarak temsil edilebilir. Böylece daha karmaşık veri yapısı hiyerarşik biçimde temsil edilse ve sonuç olarak yukarıdaki gösterimle tanımlanabilir bir biçimde olsa bile, bağlantıları temsil eden veri değerleri ve bunların anlamı veri tanımında bir şekilde temsil edilmelidir ki karmaşık veri yapısı gerçekten tanımlanmış olsun. Başka bir örnek olarak, veri yapısının bazı seviyelerine record türü atanmak istenebilir; böylece veri kümesi, verilere erişimde record kavramını kullanan bir sistem tarafından kullanılabilir.

Bu türlerden oluşacak ilk kümenin ne olması gerektiğine henüz karar verilmemiştir.

Names

Bir veri yapısının öğelerine, aşağıdaki biçimde bir gösterim kullanılarak ad verilebilir:

name n |[extent]|

Kullanım bağlamına bağlı olarak ad, tanımın kendisine veya tanımın adlandırılmış kısmına ait verilere başvurabilir. Aksi belirtilmedikçe adın yalnızca bir üst kapsayıcı adın extent kapsamı içinde benzersiz olduğu varsayılır. Bu kapsam, örneğin tüm veri kümesinin veya tanımın adı olabilir. Bir adın kapsamı, iç adın önüne nokta ile ayrılmış dış ad veya adlar getirilerek belirtilir. Örneğin şu ad:

A.BETA

BETA adının kapsamının A olduğunu gösterir.

Ad, extent parametresi verilmedikçe yalnızca tanımdaki bir sonraki öğeye uygulanır. Örneğin aşağıdaki tanım:

(An(C,C),(Bn[2]F,Cn[2]F,I))

A adının iki adet C türü veri değeri içeren öğeye, B adının her ikisi de F türünde olan iki veri değerine ve C adının son iki veri değerine—biri F, diğeri I türünde—verildiğini belirtir. Bu gösterimde extent'lerin örtüşebileceğine dikkat edin. Örneğin yukarıdaki tanımda B adının kapsamı C adının kapsamıyla örtüşmektedir.

Bir tanımda aynı ad, extent parametresi kullanılarak veya adın kapsamına dahil edilecek her öğede açıkça belirtilerek birden fazla öğe tanımına uygulanabilir. Eğer bir ad aynı kapsam içinde birden fazla kez uygulanırsa, bu adın verildiği öğelerin toplamına uygulandığı varsayılır. Böylece sıralı olmak zorunda olmayan öğe kümelerine ad vermek mümkündür.

Lock

Verilerin işlenmesi sırasında, verinin bir bölümünün diğer kullanıcılar tarafından kullanılmasını engellemek gerekebilir. Kilitleme amacıyla bir veri kümesinin bölümlere ayrılması aşağıdaki gösterimle belirtilebilir:

k |[extent]|

Verinin kilitli olup olmadığı ve uygulanan kilidin türü (örneğin yazma korumalı veya okuma/yazma korumalı) verinin kullanıldığı anda belirlenir.

Authorization

Bir kullanıcının verilere erişim yetkisi, verilere atanmış bir erişim kodu tarafından yönetilebilir. Bu erişim kodu, tanımın istenen öğeleri erişim kodu belirtilerek değiştirilerek tanım içinde belirtilebilir. Gösterim şu şekildedir:

code a |[extent]|

Control

Tanım içindeki öğelerin varlığını yöneten iki değiştirici sağlanmıştır. Birincisi tekrar değiştiricisidir:

factor r |[extent]|

Bu değiştirici, onu izleyen öğe tanımının veya öğe tanımlarının (extent birden fazla olduğunu belirtiyorsa) tekrarlanmasına neden olur. Dolayısıyla aşağıdaki tanım:

(3rC)

şu tanıma eşdeğerdir:

(C,C,C)

Diğer kontrol değiştiricisi koşul değiştiricisidir:

condition c |[extent]|

Belirtilen koşul doğru değilse, onu izleyen öğe tanımı yok sayılır. Koşul bir Boolean ifadesi ile belirtilir.

Bir öğe tanımına birden fazla değiştirici uygulanabileceği için, bunların birbirleriyle ilişkisi konusunda bir sorun ortaya çıkar. Örneğin bir tekrar değiştiricisi ile bir koşul değiştiricisi aynı öğeye uygulanıyorsa, koşul tüm tekrarlanan öğelere mi uygulanır yoksa yalnızca ilkine mi uygulanır (koşul değiştiricisinin extent değeri bir ise)? Birden fazla değiştiricinin etkisi, hangi sırayla değerlendirildiklerine bağlıdır. Aklımıza iki olası kural gelmektedir. Birincisi, tekrarların önce genişletildiğini, ardından özelliklerin uygulandığını ve en sonunda koşulların ortaya çıkan genişletilmiş öğe tanımlarına uygulandığını söyler; bu, değiştiricilerin tanımda hangi sırayla yazıldığına bakılmaksızın yapılır. Böylece aşağıdaki tanım:

(A=3c[4]4rF,I)

şuna eşdeğerdir:

(4rA=3c[4]F,T)

ve koşul doğruysa şu anlama gelir:

(F,F,F,F,I)

veya koşul doğru değilse şu anlama gelir:

(T)

Diğer kural ise değiştiricilerin tanımda göründükleri sırayla değerlendirilmesidir; belki ters sırayla—yani bir öğe tanımının hemen öncesindeki değiştirici önce değerlendirilir, ardından ondan önceki vb. Bu yaklaşım birden fazla değiştiriciye daha esnek bir anlam kazandırır. Örneğin aşağıdaki tanımlar:

(A=3c3rC)

ve

(3rA=3cC)

eşdeğer değildir. İlkinde üç tekrarın yalnızca ilki koşuldan etkilenir; ikincisinde ise üç tekrarın tamamı etkilenir. Bu ikinci kural daha esnek olduğu için kabul edilecektir. Bu kural, örneğin tekrar değiştiricisinin aşağıdaki gibi adlandırılmış bir öğeye uygulanmasına izin verir:

(3rAnC)

A adı üç öğeye uygulanır (başka bir deyişle A adı üç kez uygulanmış olur). Bu özellik, örneğin aşağıdaki tanım kullanılarak iki boyutlu bir dizide dikey bir sütuna ad verilmesine olanak sağlar:

(3r[3]C,AnC,C)

Bu tanım, 3×3 dizinin ikinci sütununa A adını verir.

Reference

Daha önce tanımlanmış adlandırılmış tanımlar veya tanımların bölümleri, aşağıdaki gösterim kullanılarak bir tanım içine eklenebilir:

$ specification

Bir tanım içinde bu başvuru, bir öğe tanımı veya bir öğe tanımları dizisi olarak kullanılır. Kullanılan öğe tanımları, verilen ad tarafından tanımlananlardır. Tanım içinde bütün olarak adlandırılmış öğe veya öğelere uygulanan adlar, başvurunun yapıldığı tanımda dikkate alınmaz. Ancak adlandırılmış öğenin parçalarına uygulanan adlar, başvurunun yapıldığı tanıma taşınır. Örneğin aşağıdaki tanım:

(An(F,F),I,$A)

şuna eşdeğerdir:

(An(F,F),T,(F,F))

A adının, başvurunun yapıldığı yere taşınmadığına dikkat edin; çünkü bu ad, başvurulan öğe veya öğelere bütün olarak uygulanıyordu.

Bir veri kümesinin veya tanımın bölümlerinin, bir başvuruda kullanılmak üzere belirtilebilmesi gerekir. Bu belirtim, veri kümesinin veya tanımın yapısı açısından yapılır. Belirtim, bir veri kümesi adı veya tanım adı ile başlar ve istenen bölümü belirginleştiren değiştiricilerle devam eder. Dört tür değiştirici vardır: bir seviyeden aşağı gitmek, bir seviyeden yukarı çıkmak, aynı seviyede ileri gitmek ve geri gitmek.

Down

Daha önce belirtilmiş seviyeden bir alt seviyeye inmek için kullanılan değiştirici aşağıdaki biçimdedir:

. item

veya

. (item |,extent| |,=value|)

Bir seviye aşağı inildikten sonra, öğe bu seviyede istenen ilk (ya da tek) belirli öğenin hangisi olduğunu belirtir. Bu bir sayı ya da bir ad olabilir. Birden fazla öğe isteniyorsa, kapsam kaç öğenin seçileceğini belirtir. (* kapsam olarak kullanıldığında o seviyede kalan tüm öğeler anlamına gelir; ! ise sonraki değiştiricilerde kendisi ya da alt öğeleri üzerinde belirlenebilecek koşulları sağlayan ilk öğe anlamına gelir.) Seçilen öğeler içeriklerine göre koşullandırılabilir. Bir değer verilmişse, yalnızca belirtilen değere sahip öğeler seçilir.

Örneğin:

A.1.1

A veri kümesinin ilk kaydının ilk alanını belirtir.

A.(1,*).1

A'nın tüm kayıtlarının ilk alanını belirtir.

A.1.(1,2)

A veri kümesinin ilk kaydının ilk iki alanını belirtir.

A.(1,*).(1,="768174")

"768174" değerine sahip olan A'nın tüm kayıtlarının yalnızca ilk alanlarını belirtir.

A.(1,!)-(1,="768174")

"768174" değerine sahip ilk alanı bulur.

Yukarı

Daha önce belirtilmiş olandan bir seviye yukarı çıkmak için değiştirici aşağıdaki biçimdedir:

' item

veya

' (item |,extent| |,=value|)

Bir seviye yukarı çıkmak, daha önce belirtilmiş olan öğeyi içeren bir üst seviyedeki öğeyi belirtir. Öğenin kendisi, bu seviyede hangi belirli öğenin istendiğini gösterir; burada kapsayan öğe birinci öğe olarak kabul edilir.

Örneğin:

A.(1,!).(1,="768174")'1

ilk alanı "768174" değerine sahip olan ilk kaydı belirtir.

İleri

Daha önce belirtilmiş olanla aynı seviyede ileri gitmek için değiştirici aşağıdaki gibidir:

+ item

veya

+ (item |,extent| |,=value|)

Bu değiştirici, bir alanda belirli bir değere sahip olan öğeyi takip eden bir öğe istendiğinde kullanışlıdır. Ayrıca veri kümesi adı aslında veri kümesi içine işaret eden ve daha önce ayarlanmış bir işaretçi olduğunda da kullanılabilir. İşaretçiler başka bir bölümde açıklanmış olabilir ya da olmayabilir.

Geri

Daha önce belirtilmiş olanla aynı seviyede geri gitmek için değiştirici aşağıdaki biçimdedir:

- item

veya

- (item |,extent| |,=value|)

Bu değiştiricinin kullanımına bir örnek, bir alanda belirli bir değere sahip olan öğeden önce gelen bir öğenin istenmesidir. Bu şu şekilde belirtilebilir:

A.(1,!).(2,="768174")'1-1

Bu RFC, çevrimiçi RFC arşivlerine eklenebilmesi için makine tarafından okunabilir biçime dönüştürülmüştür.

Gottfried Janik, 9/97