Bir programlama dili tam olarak nedir? Böyle bir dilde yazmamızı sağlayan nedir?


26

Tamam, programlamada yeniyim ve bunun oldukça soyut bir soru olduğunu kabul ediyorum.

Her gün konuştuğumuz doğal dil var çünkü insanlar birbirlerini anlayabiliyor. Bilgisayarlar kodumu belli bir dilde yazılmış olarak nasıl anlayabilir?

Diyelim ki Bay A yeni bir dil yaratıyor. Bu makineler tarafından nasıl kabul edilir? Yaratıcı, yeni bir dil oluşturmak için makine dilini kullanarak makine ile iletişim kurmalı mı? Makine tarafından tam olarak anlaşılırken bir dilde yazabilmemizin garantisi nedir?


1
Böyle bir dilde yazmamızı sağlayan nedir? - "Beyin: Yeni harika baş dolgu!" - Spike Milligan.
Stephen C

6
Biraz geniş, ama yine de iyi bir soru. Çok fazla insan nasıl çalıştığını merak etmeden sadece dilleri kullanır. Merak etmen iyi.
riwalk,

4
Bu Vikipedi tarafından kolayca ve önemsizce cevaplanan genel bir referans sorusudur .
Aaron,

Yanıtlar:


39

"Derleyici" kelimesi ile soru setinize verdiğiniz cevabın tamamını özetleyebilirsiniz . Bir derleyici, işlevi girdi olarak kaynak kod almak, kodun ne anlama geldiğini anlamak için dil tasarımcısı tarafından belirlenen dil kurallarını uygulamak ve çıktı ile başka bir dilde aynı anlama sahip kod üretmek olan özel bir programdır. Bu, genellikle makine kodu veya bir tür bytecode'dur (sanal makineler için "makine kodu"), ancak kodu diğer üst düzey dillere çeviren özel derleyiciler vardır. Yine de bu sorunun kapsamı dışındalar.

Her dilde bir derleyici yoktur. Bazıları bir sahip tercüman yerine program araçları, sadece hemen programı çalıştırır neyi belirledikten sonra makine kodu üretme dışında bir derleyici yapar hepsi aynı şeyi gerçekleştirir, bunun yerine. Ancak, kodun ayrıştırılması (okunması) ve ne anlama geldiğinin belirlenmesi temel ilkeleri aynıdır.

Bundan daha derinine cevap vermek, çok geniş bir konu olan derleyici teorisine girecektir. Konuyla ilgileniyorsanız, "derleyici" için Wikipedia makalesini okuyarak ve buradaki bağlantıları kontrol ederek başlamalısınız ve özel sorularınız varsa, burada sormaktan çekinmeyin.


11
+1 - Yeni bir dil yazarken, derleyiciyi veya tercümanı başka bir dilde yazmanız gerektiğini de ekleyeceğim. Derleyici veya tercümanın sonraki sürümleri daha sonra dilin önceki sürümlerinde yazılabilir ve eski derleyici ile derlenebilir. İlk montajcı makine kodunda yazılmıştır. İlk C derleyicisi (büyük olasılıkla) vb.
Derlemede

1
Derleyici tanımını değiştiririm. Hepsi makine kodu vermiyor. Özellikle bugünlerde, MSIL gibi “ara kod” yayan çok sayıda derleyici bulunmaktadır. JavaScript yayan derleyiciler bile var!
Neil N,

3
Derleyicilerin yeni başlayanlara açıklama yaparken bile tanım gereği makine kodu ürettiğini söylemekte tereddüt ederim. Bu, işlevlerin gerçek sayıları, anlamsız bir aşırı basitleştirmeyi döndürdüğünü söylemek gibidir. Tüm derleyici yapımı, aslında silikondan yapılmış ancak yalnızca soyut olarak tanımlanmış bir bilgisayar için kod üretmediğinde geçerlidir (VM veya üst düzey bir dil olsun; C standardının soyut bir makine tanımlamasının bir nedeni var. çok düşük seviyeli LLVM IR'den JavaScript'i zorlayan bir derleyicidir ). Yeni başlayanlar bunu almalı, ne kadar erken olursa o kadar iyi.

2
Derleyici kitaplarının çoğunun kullandığı basitleştirme, derleyicinin bir kaynak dilden bir hedef dile çıktı olarak dönüştürmek için dil kurallarını uygulamasıdır. (C'yi, örneğin, özellikle giriş dersi için) derlemek nadir değildir.
JasonTrue

4
@delnan, daha da fazlası - her dil kendi soyut makinesi için bir makine kodudur . Dil ne kadar yüksek olursa olsun.
SK-mantık

11

Sizin de belirttiğiniz gibi, insanlar birbirleri arasında İngilizce, Fransızca, Almanca gibi "doğal" bir dille iletişim kurarlar. Doğal olarak adlandırılırlar, çünkü onları kasten icat etmek yerine doğal olarak elde ederiz (Esperanto bir istisna).

Resmi bir dil, bir amaç için veya başka bir şekilde icat edilmiştir. Örneğin, C gibi bir programlama dili bilgisayarları programlama amacıyla icat edilmiş resmi bir dildir.

Tüm diller, bir gramer kullanılarak tanımlanabilir. 1956'da Noam Chomsky tarafından gramer hiyerarşisi tanımlandı. Bu, aşağıdaki seviyelerden oluşur:

0 tipi gramerler (sınırsız gramerler). Bunlar en genel olan ve bir Turing Makinesi'ne eşdeğerdir. Bu nedenle, verilen bir dizgenin sınırlandırılmamış dilbilgisinin bir parçası olup olmadığına karar verme sorunu belirlenemez.

Tip 1 gramerleri (içeriğe duyarlı gramerler). İngilizce gibi hemen hemen tüm doğal diller bağlama duyarlıdır. İngilizce'deki bağlam duyarlılığına bir örnek iki kelime grubudur: "Zaman bir ok gibi uçar." ve "Meyve muz gibi uçar." Genel olarak, bilgisayarların içeriğe duyarlı dilleri anlaması zordur.

Tip-2 gramerleri (bağlamsız). Bağlamsız diller, çoğu programlama dilinin sözdiziminin teorik temelini oluşturur.

Tip 3 gramerleri (normal gramerler). Düzenli dil ailesi, düzenli ifadelerle elde edilebilir. Düzenli diller, arama kalıplarını ve programlama dillerinin sözcüksel yapısını tanımlamak için yaygın olarak kullanılır.

Tip 2 (bağlamsız) ve tip 3 (normal) dilbilgileri en çok bilgisayarlar tarafından kullanılır çünkü bunlar için ayrıştırıcılar verimli bir şekilde uygulanabilir.

BNF (Backus Normal Form veya Backus – Naur Form) , hesaplamada kullanılan dillerin sözdizimini tanımlamak için kullanılan bağlamsız gramerler için kullanılan bir gösterim tekniğidir.

Örneğin, bir tanımlayıcı şöyle tanımlanabilir:

<identifier> ::= <letter> { <letter> | <digit> }

bu, bir harfle başlaması gerektiği ve ek harf veya rakam içerebileceği anlamına gelir.

Daha önce bir harf 'a' olarak tanımlandı | 'b' | 'c' vb. ve aynı rakamı kullanarak rakam '0' ile '9' arasında tanımlanır.

AC "for" ifadesi şöyle tanımlanabilir:

 <for_statement> ::=
    'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement> 

Sözlüksel analizörler ve ayrıştırıcılar (bir derleyicinin veya tercümanın ilk aşamaları), BNF tarafından belirli bir dil için tarif edilen özel gramerleri kabul etmek için yapılmıştır. Sözlüksel analizörler tipik olarak bir dilin çeşitli belirteçlerini (örneğin bir anahtar kelime, tanımlayıcı veya sayı gibi) ayırmak için kullanılır ve ayrıştırıcı, belirteçlerin "nasıl" ifadesinin nasıl oluşturulduğu gibi birlikte nasıl çalıştığını bulmak için kullanılır. .


+1 harika yazma. Fakat bunun cevap olarak kabul edilmemesine şaşırmadım. OP'nin sorduğunu düşündüğüm şey buydu, ancak seçtikleri cevaba göre, çok daha yüksek bir seviyeye ihtiyaçları varmış gibi görünüyor.
Matthew Rodatus

5

İlk önce “dili” ne olduğu ile tanımlayalım. Dil önce bir kelime haznesi (iletişimin nesnesi olan kavramları tanımlayan kelimelerin listesi) ve daha sonra bir sözdizimi (bir "primer" veya iletişimin yapısını tanımlayan bir dizi kural) gerektirir.

Bu en temel seviyede, C # İngilizceden o kadar da farklı değil. C # 'ı "programlama dili" yapan şey, amacı ve dolayısıyla tasarımıdır; bireysel düşük seviyeli komutlara sindirilecek şekilde tasarlanmıştır. Bu nedenle, önceden tanımlanmış kelime hazinesi sınırlıdır, sözdizimi çok katı bir şekilde uygulanır ve tüm dil, "izleyici" (bilgisayar; daha doğru bir şekilde, sindirilecek olan derleyici tarafından) çok iyi bilinen bir önceden tanımlanmış şekilde tüketilmek üzere tasarlanmıştır. kaynak kodu daha sonra "çalışma zamanı" ile makine koduna çevrilebilen basit komutların "ara diline" dönüştürülür). C # 'da nesir veya şiir yazmazsınız; Bilgisayara bir işi mümkün olan en net şekilde yapmalarını söylersiniz.

Bilgisayarlar için, evet, genellikle derleyici olarak adlandırılan bir araç, kodunuzu yazdıklarınızı alıp, bilgisayarın kullanabileceği talimatlara dönüştürmek için gereklidir. Bilgisayar bilimi, çoğu teknoloji gibi, doğası gereği yinelemeli, "katmanlı" bir işlemdir. Bilgisayarlar ilk icat edildiğinde, ikili talimatları manuel olarak girerek programlandılar. Bu talimatlar her işlemci için onaltılık “makine kodlarına” göre standartlaştırıldı; fark sadece ikili rakamların insanlara gösterilmesi için nasıl gruplandığıdır. Daha sonra assembler kodunda, komutlar listesi ve sicil isimleri gibi bazı temel tanımlayıcılar programları yazarken onaltılık kodları ile değiştirildi; ASM hala 1: 1 yerel makine koduna dönüştürülebilir. Kuantum sıçraması 3. kuşak "zorunlu" programlamaya yapıldı, temelde daha çok insan tarafından anlaşılabilir olan, değişkenler ve mantık gibi soyut kavramları alır ve bunları anahtar kelimelere ve sözdizime dayalı kalıpları kullanarak bunları yerel talimatlara dönüştürür ve özetler. COBOL, FORTRAN, Pascal ve C gibi erken diller, bir insan tarafından belirli bir makine diline (genellikle 8086 ASM) hala "çevrilebilir". Ardından, temelde bir durum ve mantık kombinasyonuna sahip olan "nesneler" in içine kavramsal olarak kaplanmış olarak kod tanımlayan sözdizimi kuralları olan nesne yönelimli programlama devrimi geldi. Bir insan tarafından belirli bir makine diline (genellikle 8086 ASM). Ardından, temelde bir durum ve mantık kombinasyonuna sahip olan "nesneler" in içine kavramsal olarak kaplanmış olarak kod tanımlayan sözdizimi kuralları olan nesne yönelimli programlama devrimi geldi. Bir insan tarafından belirli bir makine diline (genellikle 8086 ASM). Ardından, temelde bir durum ve mantık kombinasyonuna sahip olan "nesneler" in içine kavramsal olarak kaplanmış olarak kod tanımlayan sözdizimi kuralları olan nesne yönelimli programlama devrimi geldi.

Günümüzde, doğrudan makineyle değil, diğer programlarla iletişimi tanımlamak için yazılmış diller olan "4. nesil" dilleri içerisindeyiz. Yaygın olarak tanımlanmış, buna XML / HTML gibi "işaretleme" dilleri, JavaScript ve SQL gibi "komut dizileri" ve Java ve .NET Framework gibi "sanal alan" dillerinin çoğunu (daha sonra daha sonra yorumlanan bir IL'de derlenen) dahildir. makineyi ve platforma özgü ayrıntıları uzaklaştıran bir çalışma zamanı). Ayrıca, yalnızca makineye özgü ayrıntıların değil, işleme özgü ayrıntıların soyutlanmasını sağlamak için bir çalışma zamanına AĞIR BAĞLI olan işlevsel programlama dilleri alanını da kapsadığını söyleyebiliriz. Bu dördüncü nesil dilleri, bir insanın yerel makine talimatlarına çevrilmesi için az ya da çok olanaksızdır. ve mesele şu ki, değerli bir çaba olmayacaktı; Bu dillerin kuvveti, sonunda bir bilgisayara düşük seviyelerde ne yapacaklarını söylemek için kullanıldığı katmanlı bir süreçtir.


Teşekkürler. Programlama dilinin gelişiminin tarihine bir göz atmıştım.
Erica Xu,

2
@KeithS: Biraz daha okunabilir hale getirmek için son paragrafta yeniden biçimlendirmek isteyebilirsiniz.
Ivan Vučica

4

Güzel bir soru. Uygun bir cevap, "Bilgisayar Bilimi" denilen şeyin yarısını oluşturur.

Başlangıç ​​olarak, terim ve işlemsel anlambilimden geçmeyi ve sonra bu kitabı okumanızı tavsiye ederim . Programlama dilinin ne olduğu ve biçimsel olarak nasıl tanımlanabileceği hakkında size az ya da çok sağlam bir anlayış verecektir.

Yukarıdakiler biraz fazla akademik ise, Petzold, "Code" ile başlayabilir ve sonra semantiklere geri dönebilirsiniz.


1
Gerçekten bu soruyu cevaplamak için 18 yo noob'un bazı ağır teorileri okumasını mı düşünüyorsunuz?
Meslek

2
@Job, önceki sorusuna göre, üniversitede Scheme dozlarını (ve muhtemelen SICP'yi) alıyor. O zaman biraz anlambilim ile iyi olmalı. Her neyse, bu soruya ağır teori olmadan uygun bir cevap yok.
SK-mantık

"Kod" u bahsettiğiniz için +1. Her giriş seviyesi CS öğrencisi için bu kitap okunmalıdır.
Daniel Pryden

4

Bir programlama dilinde bir program yazarsanız, farklı bir program programınızdaki sembolleri bilgisayarın anladığı sembollere dönüştürür. Bazen bu birkaç adım alır. Örneğin C:

  1. Kullanıcı, CPU tarafından anlaşılmayan, ancak programlayıcı tarafından doğrudan anlaşılan, yüksek seviyede bir dilde (C) program yazar (umarız!).

  2. Derleyici, C'yi doğrudan CPU tarafından anlaşılmayan ancak başka bir şeye dönüştürmek kolay olan Assmebly diline dönüştürür.

  3. Assempler, Assembly'yi doğrudan CPU tarafından anlaşılan ikili kodlar dizisine dönüştürür. Bazı derleyiciler yukarıdaki adımı atlar (2. adım) ve derlenmiş ikili dosyayı doğrudan kaynak koddan üretir.

Bilgisayarın programınızı anladığından emin olmak için, derleyici veya tercüman size bir hata verir ve sözdizimi hatası gibi derlenemeyen bir şeyle karşılaşırsa genellikle durur. Programınız derlenemezse, programınızın onu çalıştırmayı deneyeceği ve başarısız olacağı bir aşamaya asla ulaşamaz, çünkü programı “anlamadı”.

Yeni bir dil oluşturmak için, önce yüksek seviyeli dilinizi tasarlayın, sonra yeni dilinizin sembollerini CPU'nuzun anladığı assembly dili komutlarıyla eşleştirmenin bir yolunu bulmalısınız.


2
Pek sayılmaz; Modern derleyiciler 2. adımı yapmaz ve doğrudan doğrudan ikili kod üretir. Ancak montaj ve ikili kod zaten neredeyse eşdeğerdir; çok yüksek kaliteyle sökebilir (ikili kodu montaja geri dönüştürebilirsiniz).
MSalters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.