[Çözüldü] Bir dil ve platform nasıl oluşturulur

Başlatan Neof07, 15 Kasım 2016 - 17:10:57

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

Neof07

     Merhaba, bildiğiniz gibi programlama dilleri ve platformlar piyasada alanlarına göre çeşit çeşit olabiliyor. Hepimiz bunlardan birisini az ya da çok kullanıyor ve faydalanıyoruz. Peki bu dil ve sistemler yani misal; bir C dili veya assembly dili nasıl yazılır. Yani dilden dil yazabilir miyiz yoksa onlar direk makine komut işlemleri ile kodlanıp mı oluşturuluyor ?

   Platformlar işletim sistemleri ve veri tabanı sistemleri ya da ağ sistemleri, bunlarda aynı mantıkla o işe uygun dil ile mi yazılır (tabii ince işler için araya assembly kodlarıda yerleştirilebilir) ? Bu soruyu açıklayan bir makale veya döküman varsa yorum olarak paylaşırsanız sevinirim.


bugra9

Önce dilin özelliklerini kağıt üzerinde tasarlarsın. Daha sonra bu işlemi yapacak derleyiciyi istediğin bir dille yazarsın. Derleyici bitince bu derleyiciyi baştan kendi oluşturduğun dil ile yazarsın ve derleyici yeniden oluşmuş olur. Böylece kendi dilini kendi dilin ile oluşturmuş olursun. Buna örnek olarak c dilini verebiliriz. C dilinin derleyicisi c dili kullanılarak oluşturulmuştur. ("Yumurtamı tavuktan çıkar tavuk mu yumurtadan çıkar" meselesi :) )

Yaptığın bir yazılımın hızlı ve sorunsuz çalışmasını istiyorsan onu assembly diline en yakın bir dili tercih ederek yazarsın ki bu genellikle c dili oluyor. İstersen bu iş için kendi dilini oluşturup o dille sistemini yaratabilirsin. Buna örnek olarak unix çekirdeğini verebiliriz. Sırf unix çekirdeğini geliştirmek için c dilini oluşturmuşlar.

Neof07

@bugra9, Hep bunları merak etmişimdir. Başkasının yaptığı dilden de yararlanıcaksın ama kendi dilini, sistemini yapmak bence çok daha güzel. Bu alanda ilerlemek isterdim.

ekremsenturk

#3
Elektroniğe hüküm etmek için uzun bir süre farklı sonuçlar elde ederek araştırmalar yapılmış ve her farklı bir işlemci mimarisi için kendi komutları ve karşılıkları tasarlanmış, denenmiş, düzeltilmiş. Daha sonra küme komutlar (anlamlı işlemler)içeren ve  yine her biri kendi işlemci mimarisi için tasarlanmış ve Assable adı altında bir sürü (ilk) diller icat edilmiş. Bilgisayarların güç ve yetenekleri arttıkça ve de kullanım alanları da genişledikçe, yüksek seviyeli dillere gerek duyulmuş. Bu yüksek seviyeli dillere de bu gün Programlama dili deniyor. Bilgisayarların üretim sayıları arttıkça, bir standartlaşmaya ihtiyaç duyulmuş ve işlemcinin mimarisi farklı işlese dahi, programlama dilinin kodları bir kalacak protokoller üzerinde anlaşılmış. İlk standart dil C olmuş.

Teknoloji daha da gelişip, kullanım alanı da daha da genişlediğinde, C ve C++ için bazı uzmanlar kendi kütüphanelerini geliştirmişler ve bu özel kütüphanelerden zaman içinde yardımcı diller ortaya çıkmış. Ve bu yardımcı diller zaman içinde ana dil den daha önemli oldukları konumlara erişmişler. Bu dillere 90 yıllarda çok yüksek seviyeli diller denirmiş. Günümüzde daha da yüksek seviyeli diller mevcut ve kısmen oyun motoru gibi işliyorlar. Bu yeni diller en başında sadece belilrli işlemler için kullanırlarken, git gide daha genel alanlar için de geliştiriliyorlar. Her yeni sürümlerinde biraz daha, ihtiyaç duyulabilecek ek işlevler ekleniliyor ve geleceğin dilleri olma yolunda ilerliyorlar.

Lisp grubundan bir örnek vereyim.

70 li yıllarda robot programlama amacıyla daha kolaylaştırılmış ve sadece bir oyuncağı yönlendirme amacı taşıyan basitleştirilmiş lisp olan Logo tasarlanmış. İleriki yıllarda, robot yönlendirmek için kullanılan komutların, ekrana çizim çizmek için de çok kullanışlı olduğu fark edilmiş ve "Turtles graphics" isimli yöntem türemiş. Apple şirketi Logo ve grafik ortamını birleştirerek, Smalltalk isimli programlama dilini piyasaya çıkartmış. Günümüzde bir çok türü var ve açıkkaynaklı olan türü "Squeak" çok yaygın. Logo'nun bir türü olan StarLogo'dan etkilenen MIT Üniversitesi bilişim uzmanları, eğitim amaçlı bir dil olan "Scratch"i, öğrenim görenler ile birlikte piyasaya çıkarmışlar. Scratch tamamen görsel ve ilk sürümü Squeak sanal makinesi (Squeak programlama dili) ile çalışıyor. Son sürümü Adobe Air ile çalışıyor. Scratch kendisi de bir çok benzer girişime ilham olmuş. İlk başta gelişmesini Google'in başlattığı "AppInventor" da bir Scratch türevi. Yine Scratchjr ve PocketCode (Cep Kodu) gibi doğrudan Android cihazlar üzerinde çalışan yeni türevleri de çıktı. Daha fazlası da vardır benim bilmediğim, duymadığım.

Her şey birbiri üzerine inşaa edilir. İlk temeli atanlar bilim adamlarıydı. Sonraları bilim adamı olamayanlarda kullanabilsinler diye programlama dilleri icat edildiler ve daha sonraları ise uzman olamyanlarda kullanabilsinler diye işletim sistemleri icat edildiler. İlk Bilgisayarları derleyiciler ile yönetirlermiş. Günümüzde doğrudan donanıma erişebilen çok az derleyici var ve yine işletim sistemi üzerinden sanal işletim sistemi gibi çalışıyorlar ve artık geliştirilmiyorlar.

İşletim sistemi Bilgisayar kullanımını dahada kolaylaştırarak, bilgisayarlarıı yaygınlaştırmak için geliştirilmiş ve kullanıcıları programlama ile uğraşmaktan kurtaran bir Ana program. Bu ana program üzerinde hazır programlar kullanılarak işlemler kolaylıkla gerçekleştirilir. İşletim sistemi tüm programları, Bilgisayarın kendisini ve de Derleyicilerin de tümünü, hangi türden olurlarsa olsun, çalıştırır. Kendiliğinden çalıştığını sandığımız programalar, işletim sistemine erişen gerekli APİ'leri içerirler ve işletim sistemine erişerek komutları iletirler. İşletim sistemi komutları bilgisayarın beynine iletir ve sonuçlarını da görsel veya yazı türünde çıktılara çevirir. Script ve Bytcode dosyaları ise, önce altyapıya veya yorumlacıya erişirler ve yorumlayıcı veya altyapı işletim sistemine erişir ve komutları iletir.

Neof07

@ekremsenturk, Yani demeniz o ki bir bilgi birikimi mevcut bunda. Peki biz bunları yeni baştan öğrenebilir miyiz ? Bunları anlatan kaynaklar mevcut mu ? Tabii ingilizce olur bunlar ama olsun. Yani bu tür şeyleri araştırıp bulabileceğim bir anahtar kelime önerebilir misiniz peki ? Benim ilgim biraz bu yönde... Sanırım yurt dışında işletim sistemi yazmakla ilgili dersler varmış üniversitelerde ?


bugra9

Alıntı YapSanırım yurt dışında işletim sistemi yazmakla ilgili dersler varmış üniversitelerde ?
Tüm üniversitelerde işletim sistemi dersi bulunuyor. Ödev/Proje olarak işletim sistemi yazdırabilirler orası ayrı. Benim bildiğim bunun için bir proje hazırlayan sadece Stanford Üniversitesi var ismine Pintos diyorlar. Diğer üniversiteler ise aynı ödevi veriyor. :)
https://web.stanford.edu/class/cs140/projects/pintos/pintos.pdf

İstiyorsan kendin yapabilirsin, dökümantasyonun içerisinde ihtiyacın olabilecek her şey yazılı. Bir de yazdıktan sonra test edebiliyorsun ki sana test sonuçlarına göre notunu veriyor. :)

Amenofis

Alıntı yapılan: Neof07 - 15 Kasım 2016 - 23:24:15
@ekremsenturk, Yani demeniz o ki bir bilgi birikimi mevcut bunda. Peki biz bunları yeni baştan öğrenebilir miyiz ? Bunları anlatan kaynaklar mevcut mu ? Tabii ingilizce olur bunlar ama olsun. Yani bu tür şeyleri araştırıp bulabileceğim bir anahtar kelime önerebilir misiniz peki ? Benim ilgim biraz bu yönde... Sanırım yurt dışında işletim sistemi yazmakla ilgili dersler varmış üniversitelerde ?

O birikimi en baştan öğrenmek için 500 yıl ömrün olması lazım. Gelip geçici hevesler yerine modern ihtiyaçlara yönelik spesifik çözümler üretmek, buna yönelik bilgi edinmek daha doğru bana göre. En azından ilgi alanını daraltmalısın.

Neof07

@bugra9, paylaşmaları çok güzel. Ama birde anlamak var :D


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 16 Kasım 2016 - 19:59:40

@Amenofis, Farkettim :D

91011

500 yıl ömür almaz ama kendin yapmak istiyorsan önce otomata teorisinden başlarsın hani o  dedikleri derleyici tasarımı varya onun için buna ihtiyacın var. Bize otomata gösterdiler ama derleyici tasarlamadık. 
Tanrı konuşmaz, şeytan fısıldar...

snorlax

Ben de şunu merak ediyorum C dilinin derleyicisi, C dili ile yazılmışsa C dili hangi dille yazıldı?  :D
ŞɑƑɑƘ ƝЄ ƘɑƊɑƦ ȤЄƝƓƖƝ ƠԼƲƦƧɑ ƠԼƧƲƝ, ƁƖƦ ƓƲ̈Ɲ ƑɑƘƖƦԼЄşMЄƳЄ MɑӇƘƲMƊƲƦ.

ekremsenturk

Google'den veya herhangi bir arama motorundan araştırabilirsin. Bunu yapmanı engelleyen bir şey varmı?

devel0per

Bir dilin nasıl oluştuğunu anlattım bir konum vardı, başka bir forumda. Konuyu buraya yapıştırıyorum, incelerseniz biraz fikir sahibi olabilirsiniz.

Öncelikle şunu bilmek gerekir, programlama dilleri formal dillerdir. Formal diller kavramı Noam Chomsky tarafından temelleri atılmış bir kavramdır. Formal dillerin kuralları katı bir şekilde belirtilmiştir.

Chomsky'nin hiyerarşisinde 4 tip dil vardır : regular languages (sonlu durum otomatları), context-free languages (push down otomatlar), context-sensitive languages (doğrusal-sınırlandırılmış otomatlar), recusively-enumerable languages (turing makineleri). Sondan geriye doğru kapsama durumu mevcuttur.

Burada otomatlar kavramına girmeyeceğim. Merak edenler "finite state automata" diye aratabilirler.

Burada önemli bir kavram var, bildiğimiz "regular expression" yani regex ile tip 0 diller yani "regular language" ifade edilebilir. Regex ile derleyicilerin nasıl bir ilişkisi olduğunu birazdan anlatacağım.

Bu ön bilgilerden sonra, öncelikle "derleyici nedir ?" "ne yapar ?" sorularının cevaplarını veriyim.

Derleyici nedir ?

Derleyici, yüksek seviyeli bir programlama dilini düşük seviyeli programlama diline çevirisini yapar. Kaba tabiri ile böyle açıklayabiliriz.

Peki derleyici ne yapar ?

Derleyiciler iki ana bileşenden oluşurlar, çözümleme işlemleri için kullanılan frontend ve kodun optimizasyonunu ve hedef dile dönüşümü sağlayan backend.

Derleyici yapısı genelde şu şekildedir :

Kaynak dil => sözcüksel çözümleyici -> sözdizimsel çözümleyici -> anlamsal çözümleyici -> ara kod üretici -> ara kod -> kod optimizasyonu -> hedef dil üretici -> hedef dil

Basit bir derleme örneği verirsek :

kaynak dil
Kod:
current_time = start_time + cycles * 60
sözcüksel çözümleme
Kod:
ID(1) ASSIGN ID(2) ADD ID(3) MULT INT(60)
söz dizimsel çözümleme
Kod:
           assign
        |            |
      ID(1)      ADD
                   |      |
               ID(2)   MULT
                          |      |
                      ID(3)   INT(60)
anlamsal çözümleme kısmında yukarıdaki ağacın aynısı lakin int 60 yapısı int2real e dönüşüyor.

Ara kod:
Kod:
temp1 = int2real(60)
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Optimizasyon :

- Adım 1 :
Kod:
temp1 = 60.0
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
- Adım 2 :
Kod:
temp2 = id3 * 60.0
temp3 = id2 + temp2
id1 = temp3
- Adım 3 :
Kod:
temp2 = id3 * 60.0
id1 = id2 + temp2
Optimize edilmiş kod :

Kod:
temp1 = id3 * 60.0
id1 = id2 + temp1
Hedef Dil :

Kod:
MOVF id3 , R2
MULF #60.0 , R2
MOVF id2 , R1
ADDF R2 , R1
MOVF R1 , id1
Gördüğünüz gibi bu örnekte bir derleyicinin kabataslak genel çalışma mantığını göstermiş olduk.

Şimdi gelelim yukarda bahsettiğim regex ile derleyicinin nasıl bir ilişkisi olduğuna. Derleyicinin sözcüksel çözümleme aşamasında yaptığı bazı işlemler vardır.

Örnek verecek olursak :
Kod:
if (i == j)
   z = 1;
else
   z = 0;
endif
şeklinde bir kod bloğu bilgisayar için karakter katarından başka anlam ifade etmez.

Bu sebeple kaynak kodu anlamlı alt parçalara ayırmak gerekir , bu anlamlı alt parçalara "token" adı verilir, tokenları yakalama işlemine de "sözcüksel çözümleme" denir. Ayrıca token belirten alt parçalarada "lexeme" denir.

Bir programlama dili içinde kullanılması mümkün olan tüm lexemeleri tanımlarken patternler kullanılır. Bu patternleri de düzenli ifadeler ile tanımlarız.


Sözcüksel çözümleme ise 3 işlevi yerine getirmelidir , bütün boşlukları ve açıklamaları temizlemeli, tokenları bulmalı, bulunan tokenlar için lexeme ve bulunduğu satır numarası gibi özellikleri döndürmelidir.

Örnek :

Kod:
toplam = 3 + 2;

LEXEME
----------
sum     
=
3
+
2
;

TOKEN
---------
IDENTIFIER
ASSIGN_OP
NUMBER
ADD_OP
NUMBER
SEMICOLON


Evet arkadaşlar, derleyici nedir, ne yapar, temelde bir programlama dili nelerden oluşur, derleyiciler bunları nasıl anlamlı kodlara dönüştürür gibi soruların cevaplarını verdiğimi düşünüyorum.

Yazılım ile ilgilenenlerin özellikle de "Mühendislik" okuyanların hiç değilse genel kültür olarak bilmesi gereken kavramları açıkladım.

Programlama dili nasıl yapılır gibi soruları olanları bir nebze tatmin edecek kapasitede bir yazı olduğunu zannediyorum.

Herkese iyi forumlar dilerim...
Computer Engineer

Neof07

@devel0per, Bu konuyu A'dan Z'ye C klavuzunda da okumuştum. Siz biraz daha karmaşık yapmışınız :D otomat teorisini araştırıcam umarım kayda değer bişiler bulurum. Daha düşük seviyeli işlerle uğraşmak istediğimden ASM tarzı kaynaklar arıyorum.

bugra9

[mention=612858]@Neof07[/mention], zaten @devel0per asm seviyesine kadar inerek çok iyi şekilde anlatmış. Bundan daha düşüğü kendi asm kodlarını oluşturmak yani kendi mikro denetleyicini tasarlamak oluyor. :)

Neof07