Kendi programlama dilimi ve bunun için bir derleyicimi nasıl oluşturabilirim [kapalı]


427

Programlama konusunda kapsamlıyım ve BASIC, FORTRAN, COBOL, LISP, LOGO, Java, C ++, C, MATLAB, Mathematica, Python, Ruby, Perl, JavaScript, Assembly vb. Gibi dillerle karşılaştım. İnsanların programlama dillerini nasıl yarattıklarını ve bunun için derleyiciler nasıl geliştirdiklerini anlamıyorum. İnsanların nasıl Windows, Mac, UNIX, DOS ve benzeri işletim sistemleri yarattıklarını da anlayamadım. Bana gizemli olan bir diğer şey, insanların OpenGL, OpenCL, OpenCV, Kakao, MFC ve benzeri kütüphaneleri nasıl yarattıkları. Anlayamadığım son şey, bilim adamlarının bir mikroişlemci için bir meclis dili ve bir meclis geliştirmesidir. Bunların hepsini öğrenmek isterdim ve 15 yaşındayım. Her zaman Babbage, Turing, Shannon veya Dennis Ritchie gibi bir bilgisayar bilimcisi olmak istemiştim.


Aho'nun Derleyici Tasarımı ve Tanenbaum'un işletim sistemi kavramları kitabını okudum ve hepsi sadece kavramları ve kodları yüksek düzeyde tartışıyorlar. Ayrıntılara ve nüanslara ve bir derleyici veya işletim sisteminin nasıl tasarlandığına girmiyorlar. Somut bir anlayış istiyorum, böylece kendim bir tane yaratabilirim, sadece bir iş parçacığının, semaforun, sürecin veya ayrıştırmanın ne olduğunun bir anlayışını yaratmayacağım. Bütün bunları kardeşime sordum. MIT'de EECS'de SB öğrencisidir ve tüm bunları gerçek dünyada nasıl yaratacağı hakkında hiçbir fikri yoktur. Tek bildiği, sizin belirttiğiniz gibi (örneğin Thread, Senkronizasyon, Eşzamanlılık, bellek yönetimi, Lexical Analysis, Orta Kod üretimi vb.), Derleyici Tasarımı ve İşletim Sistemi kavramlarını anlamaktır.


Eğer Unix / Linux üzerinde iseniz, özel araçlar hakkında bilgi alabilirsiniz: lex, yaccve bison.
mouviciel

İlk önerim Aho'nun Ejderha Kitabını Okumak. amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/…
Julian

1
Belki de pek yardımcı olmamakla birlikte, sites.google.com/site/steveyegge2/blog-rants (Steve Yegge'nin blogu) ve steve-yegge.blogspot.com/ (Steve Yegge'nin diğer blogu) 'ndan geçmenizi öneririm.
KK.

3
Mümkün olduğu kadar çok sayıda programlama dili öğrenin. Bu şekilde onların kavramlarından ve hatalarından ders alacaksınız. Devlerin omzunda dururken neden cücelerden memnun olmalısınız?
sbi

1
ipucu: bir tercüman derleyiciden daha kolaydır; bu sadece satır satır okuduğu giriş metnine dayanarak “bir şeyler yapan” bir sınıftır. başka bir ipucu: bunu yansımalara bağlayın ve rastgele nesneleri betiğinizle kontrol edebilirsiniz.
Dave Cousineau,

Yanıtlar:


407

Temel olarak, sorunuz "bilgisayar yongaları, komut setleri, işletim sistemleri, diller, kütüphaneler ve uygulamalar nasıl tasarlanır ve uygulanır?" Bu, çoğu uzman olan milyonlarca insanı istihdam eden dünya çapında milyarlarca dolarlık bir endüstridir. Sorunuzu biraz daha odaklamak isteyebilirsiniz.

Bu, bir çatlak alabilir dedi:

İnsanların programlama dillerini nasıl yarattıklarını ve bunun için derleyiciler nasıl geliştirdiklerini anlamıyorum.

Benim için şaşırtıcı, ama birçok insan programlama dillerini büyülü olarak görüyor. Partilerde veya ne olursa olsun insanlarla tanıştığımda, bana ne yaparsam sorarsam, onlara programlama dilleri tasarladığımı ve derleyicileri ve araçları uyguladığımı söylüyorum ve insanların - profesyonel programcıların, aklınızdakilerin - söylediklerini şaşırtmak şaşırtıcıdır. "vay, bunu hiç düşünmedim, ama evet, birisinin bunları tasarlaması gerekiyor". Sanki dillerin tamamen çevrelerindeki alet altyapılarıyla oluşturulduğunu sanıyorlardı.

Sadece görünmüyorlar. Diller, diğer ürünler gibi tasarlanır: Rekabetçi olasılıklar arasında dikkatlice bir dizi takas yaparak. Derleyiciler ve araçlar, diğer herhangi bir profesyonel yazılım ürünü gibi inşa edilmiştir: sorunu ortadan kaldırarak, her seferinde bir satır kod yazarak ve ardından ortaya çıkan programın dışına çıkarak test edin.

Dil tasarımı çok büyük bir konudur. Bir dil tasarlamakla ilgileniyorsanız, başlamak için iyi bir yer, eksikliklerin zaten bildiğiniz bir dilde olduğunu düşünmektir. Tasarım kararları genellikle başka bir üründe bir tasarım hatası düşünülmesinden kaynaklanır.

Alternatif olarak, ilgilendiğiniz bir etki alanını göz önünde bulundurun ve ardından o etki alanındaki sorunların çözümünü belirleyen etki alanına özgü bir dil (DSL) tasarlayın. LOGO'dan bahsettiniz; bu, "çizgi çizme" alanı için bir DSL örneğidir. Normal ifadeler, "bir dizgede bir kalıp bulma" alanı için bir DSL'dir. C # / VB'deki LINQ, "süzme, birleştirme, sıralama ve proje verileri" alanı için bir DSL'dir. HTML, "sayfadaki metin düzenini tanımla" etki alanı vb. İçin bir DSL'dir. Dile dayalı çözümlere uygun çok sayıda alan var. Favorilerimden biri, "metin tabanlı macera oyunu" alanı için DSL olan Inform7; Muhtemelen şimdiye kadar gördüğüm en üst düzey ciddi programlama dilidir.

Dilinizin nasıl görünmesini istediğinizi çizdikten sonra , yasal ve yasadışı bir programın ne olduğunu belirlemek için kuralların ne olduğunu tam olarak yazmaya çalışın . Genellikle bunu üç düzeyde yapmak istersiniz:

  1. sözcüksel : dildeki kelimelerin kuralları nelerdir, hangi karakterlerin yasal olduğunu, sayılar neye benziyor, vb.
  2. Sözdizimsel : Dilin kelimeleri nasıl daha büyük birimler halinde birleşir? C # 'de daha büyük birimler ifadeler, ifadeler, yöntemler, sınıflar vb.
  3. semantik : sözdizimsel olarak geçerli programı verilen, nasıl bir program anlamaya mı yapar ?

Bu kuralları mümkün olduğunca tam olarak yazınız . Eğer iyi bir iş çıkarsa, derleyici veya tercüman yazmak için bunu temel olarak kullanabilirsiniz. Ne demek istediğimi görmek için C # şartnamesine veya ECMAScript şartnamesine bir bakın; yasal bir programın neyi yaptığını ve neyin ne yaptığını çözmeyi tanımlayan çok kesin kurallarla doludurlar.

Derleyici yazmaya başlamanın en iyi yollarından biri, yüksek seviyeli bir dilden yüksek seviyeli bir dil derleyici yazmaktır. Dilinizde dizeleri alan ve C # veya JavaScript'te veya bildiğiniz dilde dizeleri yayan bir derleyici yazın; derleyicinin bu dil için kullanmasına izin verin, sonra çalıştırılabilir koda dönüştürerek ağır kaldırma işlemine özen gösterin.

C #, VB, VBScript, JavaScript ve diğer dillerin ve araçların tasarımı hakkında bir blog yazıyorum; eğer bu konu sizi ilgilendiriyorsa, kontrol edin. http://blogs.msdn.com/ericlippert (tarihsel) ve http://ericlippert.com (geçerli)

Özellikle bu yazıyı ilginç bulabilirsiniz; Burada C # derleyicisinin anlamsal analizi sırasında sizin için gerçekleştirdiği görevlerin çoğunu listelerim. Gördüğünüz gibi, çok fazla adım var. Büyük analiz sorununu bireysel olarak çözebileceğimiz bir dizi soruna ayırıyoruz.

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx

Son olarak, eğer yaşlandığınızda bu işleri yapan bir iş arıyorsanız, Microsoft'a üniversite stajyeri olarak gelmeyi ve geliştirici bölümüne girmeyi denemeyi düşünün. Bugün işimden böyle çıktım!


CLR bunları otomatik olarak yapabildiğinden, artık derleyici optimizasyonlarının hangi dereceye kadar yapılmadığını yazdınız mı?

6
@ Thorbjørn: Terminoloji hakkında açık konuşalım. Bir "derleyici", bir programlama dilinden diğerine çeviri yapan herhangi bir cihazdır. C # 'ı IL'ye dönüştüren bir C # derleyicisine ve IL'yi makine koduna dönüştüren bir IL derleyicisine ("jitter") sahip olmanın iyi yanlarından biri, C # derleyicisini IL'ye (kolay!) Yazmanızdır, ve İşlemciye özgü optimizasyonları jitterin içine yerleştirin. Derleyici optimizasyonları "yapılmıyor" değildir, jit derleyici ekibi bunları bizim için yapar. Bkz blogs.msdn.com/b/ericlippert/archive/2009/06/11/...
Eric Lippert

6
@ Cyclotis04: Inform6, bytecode tabanlı bir sanal makinenin son derece erken bir örneği olan Z kodunu derler. 1980'lerde bütün bu Infocom oyunları hem hafızadan daha büyük, hem de çoklu mimarilere taşınabilir; oyunlar z koduna derlendi ve daha sonra birden fazla makine için kod belleği çağırma özelliğine sahip z kodu tercümanları uygulandı. Bugünlerde elbette bir kol saatinde bir zcode yorumlayıcısı çalıştırabilir, ancak yüksek teknolojiye sahip bir güne dönebilirsiniz . Ayrıntılar için en.wikipedia.org/wiki/Z-machine adresini ziyaret edin.
Eric Lippert

@EricLippert Compiler bir cihaz değil, cihaz bir donanım içeriyor. Girdi verilerini makine koduna dönüştürmek için bir dizi kurala sahip olan önceden tanımlanmış bir program söyleyebiliriz
dharam

2
@ dhams: Bir cihaz belirli bir amaç için yapılmış herhangi bir şeydir. Şimdiye kadar yazdığım her derleyici, derleyicilerin var olmasına izin vermek için üretilmiş bir donanımda çalıştırıldı.
Eric Lippert

127

Jack Crenshaw tarafından Derleyiciler ve derleme dili yazmak için ilginç bir giriş olan Lets Build derleyicisini bulabilirsiniz .

Yazar çok basit tuttu ve gerçek işlevsellik oluşturmaya odaklandı.


2
Crenshaw'ın introlarıyla ilgili ilginç olan, sona ermesi (spoyler: eksik), sizi farketmenize neden olacak meselelere tam anlamıyla bakmaya başladığınız andan itibaren, hey, gerçekten benim dilimi uygulamaya başlamadan önce tamamen tasarlamalıydım. Ve sonra diyorsunuz ki, eğer tam bir dil belirtimi yazmak zorunda kalırsam, neden ayrıştırıcı oluşturmak için bir araca koyabileceğim resmi bir gösterimde yapmıyorsunuz? Ve sonra herkes gibi yapıyorsun.
tür

3
@kindall, araçları kullanmak için bir neden olduğunun farkına varmak için el ile yapmış olmanız gerekir.

72

" Bu şeyleri gerçekten öğrenmek isterdim ". Uzun vadeli ciddi iseniz:

  • Üniversiteye git, yazılım mühendisliği konusunda uzmanlaş. Alabileceğiniz her derleyici dersine katılın. Sınıfları sağlayanlar sizden daha iyi eğitimli ve deneyimlidirler; Uzman perspektiflerinin, size kodu okumadan asla alamayacağınız şekilleri size sunmak için kullanılmış olması iyidir.

  • Lise boyunca matematik derslerine devam et ve 4 yıl boyunca üniversitede devam et. Standart olmayan matematiğe odaklanın: mantık, grup teorisi, meta-matematik. Bu sizi soyut düşünmeye zorlar. Derleme konusundaki ileri teorilerdeki makaleleri okumanızı ve bu teorilerin neden ilginç ve faydalı olduğunu anlamanızı sağlayacaktır. Sonsuza dek sanatın arkasında olmak istiyorsanız, bu ileri teorileri görmezden gelebilirsiniz.

  • Standart derleyici metinlerini toplayın / okuyun: Aho / Ullman, vb. Topluluğun genel olarak kabul ettiği şeyleri içerir. Bu kitaplardan her şeyi kullanmayabilirsin, ama var olduğunu bilmeli ve neden kullanmadığını bilmelisin. Muchnick'in harika olduğunu düşünmüştüm, ama bu oldukça ileri konular için.

  • Bir derleyici oluşturun. ŞİMDİ bir çürük inşa ederek başlayın. Bu size bazı sorunları öğretecektir. İkinci bir tane yap. Tekrar et. Bu deneyim, kitap öğrenmenizle birlikte büyük bir sinerji yaratır.

  • Başlamak için gerçekten iyi bir yer, BNF (Backus Naur Form), ayrıştırıcılar ve ayrıştırıcı üreteçleri öğrenmektir. BNF, derleyici topraklarında evrensel olarak etkin bir şekilde kullanılır ve bilmiyorsanız, derleyici sınıflarınızla gerçekçi bir şekilde konuşamazsınız.

Eğer derleme için büyük ilk tanıtım ve sadece dokümantasyon için ancak bir araçtır işlenebilir üstdil olarak BNF'un doğrudan değerini istiyorsanız, bunu görmek öğretici bir dayanan "meta" derleyiciler (derleyiciler inşa derleyiciler) oluşturmaya (benim değil) 1964'ten bir makale (evet, doğru okudunuz) ["META II sözdizimi odaklı bir derleyici yazı dili" Val Valhorre tarafından. (http://doi.acm.org/10.1145/800257.808896)] Bu IMHO, bugüne kadar yazılmış en iyi tek bilgisayarlı bildiri belgelerinden biridir: size 10 sayfada derleyici derleyiciler oluşturmayı öğretir. Başlangıçta bu makaleden öğrendim.

Yukarıda yazdığım şey kişisel deneyimden çok şey ifade ediyor ve sanırım bana oldukça iyi hizmet etti. YMMV, ancak IMHO, çok değil.


54
-1 Yukarıdakilerin hiçbiri gerekli değildir.
Neil Butterworth

77
@ nbt Yukarıdakilerin hiçbiri gerekli değil. Ancak yukarıdakilerin hepsi yardımcı olur. Gerçekten çok fazla.
Konrad Rudolph

1
Ben özellikle "Soyut düşünmeyi öğrenmek için matematik öğren" e katılmıyorum. öneri. "Özetle düşünmeyi öğrenmek" nin kendi programlama dilinizi ve derleyicinizi oluştururken özellikle yararlı olduğunu düşünüyorsanız bile (yapmam - bu dolambaçlı, dolaylı yollardan gitmekten ziyade, bunu yaparak öğrenmeyi daha faydalı buluyorum) matematik soyut düşünceye sahip tek alan değil! (Ben bir matematikçi btw, bu yüzden genel olarak matematik kullanımını
reddetmiyorum

26
Derleyici teorisi ile ilgili ileri teknik makaleleri okumak istiyorsanız, daha iyi matematiksel yetkin olmalısınız. Bu literatürü görmezden gelmeye karar verebilirsiniz; teoriniz ve dolayısıyla derleyicileriniz bunun için daha zayıf olacaktır. Buradaki hesap uzmanları, çok fazla resmi eğitim olmadan bir derleyici oluşturabileceğinizi belirtirler ve ben de aynı fikirdeyim. Onlar olmadan gerçekten iyi derleyiciler oluşturabileceğiniz anlamına geliyor gibi görünüyor. Bu almak istediğim bir bahis değil.
Ira Baxter,

7
CS, dil tasarımı ve uygulaması için gerçekten yararlı olan bir disiplindir. Elbette zorunlu değil, ancak on yıllarca süren bir araştırma yapıldı ve kaldıraç edilebilir ve başkalarının hatalarını tekrarlamak için hiçbir sebep yok.
Donal Fellows

46

İşte Bilgisayar Sistemlerinin Öğeleri: İlk İlkelerden Modern Bir Bilgisayar Oluşturmak adında takip edebileceğiniz bir çevrimiçi kitap / kurs .

Simülatörleri kullanarak, aslında baştan sona eksiksiz bir bilgisayar sistemi kuruyorsunuz. Birçok yorumcu sorunuzun çok geniş olduğunu belirtmiş olsa da, bu kitap aslında çok yönetilebilir kalırken cevap veriyor. İşiniz bittiğinde, kendi işletim sisteminizin işlevselliğini kullanan (kendi tasarladığınız) yüksek seviyeli bir dilde bir oyun yazmış olacaksınız. bilgisayar sisteminizde çalışan ve Boole mantığı kullanarak tasarladığınız çiplerden bir araya getirdiğiniz bilgisayar sisteminizde çalışan, montajcınız tarafından makine koduna (tasarladığınız) montaj yapan VM çevirmeniniz tarafından bir montaj diline (sizin tasarladığınız) çevrilmiş ve basit bir donanım açıklama dili.

Bölümler:

  1. Kurs Genel Bakış
  2. Boole mantığı
  3. Kombinatoryal Cipsler
  4. Sıralı Cipsler
  5. Makine dili
  6. Bilgisayar Mimarisi
  7. montajcı
  8. Sanal Makine I: Aritmetik
  9. Sanal Makine II: Kontrol
  10. Programlama dili
  11. Derleyici I: Sözdizimi Analizi
  12. Derleyici II: Kod Üretimi
  13. İşletim sistemi
  14. Liste öğesi

Gitmek Daha Eğlenceli


Düzenlemeler için teşekkürler, bilinmeyen bir kişi. Birkaç kez denedim, ancak düşüncelerimi açıklama için yeterince odaklayamadım ... ama kitaptan bahsetmek istemedim. Kitap şimdi Çalışma Planı bağlantısında çevrimiçi durumda: www1.idc.ac.il/tecs/plan.html . Ayrıca çevrimiçi olarak oldukça makul fiyatlı. Herkese iyi eğlenceler.
Joe Internet,

Bunu kendim önerecektim ... tembeller için, 10 dakikalık giriş bölümüne bir göz
Richard Anthony Hein

46

Bir adım geri at. Derleyici, bir belgeyi bir dilde başka bir dilde belgeye çeviren bir programdır. Her iki dilde iyi tanımlanmış ve özel olması gerekir.

Dillerin programlama dilleri olması gerekmez. Onlar olabilir herhangi kimin kuralları aşağı yazılabilir dili. Muhtemelen Google Translate'i gördünüz ; bu bir derleyicidir çünkü bir dili (diyelim ki, almanca) diğerine çevirebilir (belki de Japonca).

Derleyicinin bir başka örneği bir HTML işleme altyapısıdır. Girdileri bir HTML dosyasıdır ve çıktı, ekrandaki pikselleri çizmek için bir dizi talimattır.

Çoğu insan bir derleyici hakkında konuştuğunda, genellikle yüksek seviyeli bir programlama dilini (Java, C, Prolog gibi) düşük seviyeli bir dile (montaj veya makine kodu) çeviren bir programa atıfta bulunur. Bu korkutucu olabilir. Ancak bir generalin bir derleyicinin bir dili diğerine çeviren bir program olduğu görüşünü aldığınızda o kadar da kötü değildir.

Bir dizedeki her kelimeyi tersine çeviren bir program yazabilir misiniz? Örneğin:

When the cat's away, the mice will play.

olur

nehW eht s'tac yawa, eht ecim lliw yalp.

Bu yazmak zor bir program değil, fakat bazı şeyleri düşünmeniz gerekir:

  • "Kelime" nedir? Hangi karakterlerin bir kelime oluşturduğunu tanımlayabilir misiniz?
  • Kelimeler nerede başlar ve biter?
  • Kelimeler tek bir boşlukla mı ayrılmış, yoksa daha mı fazla mı olabilir?
  • Noktalama işaretlerinin de tersine çevrilmesi gerekiyor mu?
  • Ya bir kelimenin içindeki noktalama işaretleri?
  • Büyük harflere ne olur?

Bu soruların cevapları dilin iyi tanımlanmasına yardımcı olur. Şimdi devam et ve programı yaz. Tebrikler, az önce bir derleyici yazdınız.

Buna ne dersin: Bir dizi çizim talimatı alan ve bir PNG (veya JPEG) dosyası çıktısı alan bir program yazabilir misiniz? Belki böyle bir şey:

image 100 100
background black
color red
line 20 55 93 105
color green
box 0 0 99 99

Yine, dili tanımlamak için biraz düşünmeniz gerekir:

  • İlkel talimatlar nelerdir?
  • "Satır" kelimesinden sonra ne gelir? "Renk" den sonra ne geliyor? Aynı şekilde "arka plan", "kutu" vb.
  • Sayı nedir?
  • Boş bir giriş dosyasına izin verilir mi?
  • Kelimeleri büyük harf yapmak uygun mudur?
  • Negatif sayılara izin verilir mi?
  • “İmaj” direktifini vermezseniz ne olur?
  • Renk belirtmeme uygun mudur?

Tabii ki, cevaplayacak daha çok soru var ama eğer onları alt etmek için bir dil tanımladınız Çeviriyi yapmak için yazdığınız program, bir derleyici.

Derleyici yazmak o kadar zor değil. Java veya C'de kullandığınız derleyiciler bu iki örneğin yalnızca daha büyük sürümleridir. Öyleyse git! Basit bir dil tanımlayın ve bu dilin bir şeyler yapmasını sağlamak için bir program yazın. Er ya da geç dilinizi genişletmek isteyeceksiniz. Örneğin, değişkenler veya aritmetik ifadeler eklemek isteyebilirsiniz. Derleyiciniz daha karmaşık hale gelecektir ancak her parçasını anlayacaksınız çünkü kendiniz yazdınız. Budur dilleri ve derleyiciler hakkında nasıl oluyor.


7
myFirstCompiler = (str) -> ("" + (str || "")). split (''). reverse (). join (''); jsfiddle.net/L7qSr
Larry Battle

21

Derleyici tasarımıyla ilgileniyorsanız, Dragon Book'a göz atın (resmi başlık: Derleyiciler: İlkeler, Teknikler ve Araçlar). Yaygın olarak bu konuyla ilgili klasik bir kitap olarak kabul edilir.


4
Not: Bu kitaptan en iyi şekilde yararlanmak için biraz daha gerçek bir deneyime ihtiyacınız olabilir. Yine de harika bir referans.

13
-1 Sadece okumayan biri ejderha kitabının iyi olduğunu düşünebilir. ve özellikle soruyu ele almıyor.
Neil Butterworth

33
Ejderha Kitabı? Onbeş yaşındaki bir hevesli için? Coşkusunu bir süre daha tutmasını tercih ederim.
David Thornley

1
Daha erişilebilir bir alternatif: 'Programlama Dili Pragmatik' 3e .
willjcroz

@DavidThornley Onu tamamen sayma (Evet, bunun çok eski bir mesaj olduğunun farkındayım). Dillerin 15 yaşında nasıl çalıştığını araştırmaya başladım ve özellikle sanal makinelere odaklandım. Şimdi 16 yaşındayım ve aylarca süren araştırma, yazı ve yeniden yazımdan sonra, mutlu olduğum çalışan bir tercüman ve derleyici var.
David,


10

Bir derleyici veya bir işletim sistemi hakkında sihirli bir şey olduğuna inanmayın: yoktur. Bir dizedeki tüm ünlü harfleri saymak için yazdığınız programları hatırlayın ya da bir dizideki sayıları ekleyin. Bir derleyici kavram olarak farklı değildir; Sadece bir sürü daha büyük.

Her programın üç aşaması vardır:

  1. bazı şeyler oku
  2. o şeyi işlemek: giriş verisini çıkış verisine çevirmek
  3. başka şeyler yazmak - çıktı verileri

Bir düşünün: derleyiciye girdi nedir? Kaynak dosyadaki karakter dizisi.

Derleyiciden çıktı nedir? Hedef bilgisayara makine talimatlarını temsil eden bir bayt dizisi.

Peki derleyicinin "süreç" aşaması nedir? Bu aşama ne işe yarıyor?

Diğer programlar gibi - - Eğer derleyici düşünürsek sahip bu üç aşamalı olarak, bir derleyici nasıl oluşturulduğuna dair iyi bir fikriniz olur.


3
Neil'in dediği gibi doğru ama işe yaramaz. Özyinelemeli dilbilgisi ve sembol tabloları gibi temel derleyici özellikleri sezgisel olarak açık değildir.
Mason Wheeler

1
@Mason Wheeler: Ben derleyici yazmak (ve hedef dili tasarlamak?) Gerçekçi bir şekilde istekli herkes muhtemelen özyinelemeli dilbilgisi ve sembol tabloları oldukça temel kavramlar olacağını düşünüyorum .
FumbleFingers 16:11

8

Ben uzman değilim, ama işte bıçağım:

Bir derleyici yazmak hakkında görünmüyor, sadece bir montajcı. Bu gerçekten sihir değil.

Birinin SO'dan cevabını çalmak ( https://stackoverflow.com/questions/3826692/how-do-i-translate-assembly-to-binary ) cevabı şöyle der :

label:  LDA #$00
        JMP label

Sonra onu bir montajcıdan geçirir ve şöyle bir şeye dönüşürsün:

$A9 $00
$4C $10 $00

Sadece hepsi ezildi, şunun gibi:

$A9 $00 $4C $10 $00

Bu gerçekten sihir değil.

Bunu not defterine yazamazsınız, çünkü not defterinde ASCII kullanılır (onaltılık değil). Onaltılı bir editör kullanır veya baytları programlı olarak yazarsınız. Bu onaltılı dosyayı bir dosyaya yazın, "a.exe" veya "a.out" olarak adlandırın, sonra işletim sistemine çalıştırmasını söyleyin.

Tabii ki, modern CPU ve işletim sistemleri gerçekten oldukça karmaşık, ama bu temel fikir.

Yeni bir derleyici yazmak istiyorsanız, işte böyle yapılır:

1) Pyparsing (veya başka herhangi bir iyi ayrıştırma çerçevesi) içinde hesap makinesi örneği gibi bir şey kullanarak yorumlanmış bir dil yazın. Bu, ayrıştırma işleminin temellerini hızlandırmanıza yardımcı olacaktır.

2) Bir tercüman yazın. Dilinizi Javascript diline çevirin. Şimdi diliniz bir tarayıcıda yayınlanacak.

3) LLVM, C veya Assembly gibi daha düşük bir seviyeye bir tercüman yazın.

Burada durabilirsin, bu bir derleyici. Bu bir optimizasyon derleyici değil, ama sorun bu değildi. Bir linker ve assembler yazmayı da düşünmeniz gerekebilir, ancak gerçekten istiyor musunuz?

4) (Insane) Bir optimizer yazın. Büyük takımlar on yıllarca bu konuda çalışıyor.

4) (Sane) Mevcut bir topluluğa katılın. GCC, LLVM, PyPy, herhangi bir tercüman üzerinde çalışan çekirdek ekip.


8

Bazıları mükemmel cevaplar verdi. Birkaç öneri daha ekleyeceğim. İlk olarak, yapmaya çalıştığınız şey için iyi bir kitap Appel'in Modern Derleyici Uygulama metinleridir ( C , Java veya Standart ML seçiminizi yapın ). Bu kitap, basit bir dil için bir derleyicinin, bir emülatörde çalıştırılabilen MIPS düzeneğine ve minimum çalışma zamanı destek kitaplığına sahip tam bir uygulamasından geçer. Derlenmiş bir dil çalışması için gerekli her şeyi tek bir geçişte, oldukça iyi bir kitap 1 .

Appel, önceden tasarlanmış bir dili nasıl derleyeceğinizi, ancak çeşitli dil özelliklerinin ne anlama geldiğini veya kendi dilinizi tasarlamada göreceli değerleri açısından nasıl düşünüleceğini çok fazla zaman harcamaz. Bu açıdan, Programlama Dilleri: Kavramlar ve Yapılar nezihdir. Kavramlar, Teknikler ve Bilgisayar Programlama Modelleri, dil tasarımı hakkında derinlemesine düşünmek için iyi bir kitaptır, ancak bunu tek bir dil ( Oz ) bağlamında yapar .

Sonunda, Appel'in metninin C, Java ve Standard ML'de olduğunu belirtmiştim - derleyici yapımı ve programlama dilleri konusunda ciddiysen, ML öğrenmeyi ve Appel'in bu versiyonunu kullanmanızı öneririm. ML-familyası dilleri güçlü tip sistemlere sahiptir ve çoğunlukla işlevseldir - diğer birçok dilden farklı olacak özellikler, bu nedenle eğer zaten işlevsel bir dili bilmediğinizde bunları öğrenmek, dil teknenizi geliştirecektir. Ayrıca, örüntü eşleme ve işlevsel zihniyetleri, bir derleyicide sık sık yapmanız gereken manipülasyon türlerine son derece uygundur, bu nedenle ML tabanlı dillerde yazılmış derleyiciler, tipik olarak C ile yazılmış derleyicilerden daha kısadır ve daha kolaydır. Java veya benzer diller. Harper'ın kitabıStandart ML'de başlamanız için oldukça iyi bir rehber; bunun üzerinden çalışmak sizi Appel'in Standart ML derleyici uygulama kitabına almaya hazırlamalıdır. Standart ML öğrenirseniz, daha sonra çalışmak üzere OCaml'ı almak oldukça kolay olacaktır; IMO, çalışan programcı için daha iyi bir donanıma sahiptir (çevresindeki işletim sistemi ortamına daha temiz bir şekilde entegre olur, çalıştırılabilir programlar oluşturur ve ulex ve Menhir gibi bazı muhteşem derleyici oluşturma araçlarına sahiptir).


1 Uzun süreli referans için, ayrıştırıcı algoritmaların iç çalışmaları gibi başvurduğum şeyler hakkında daha fazla ayrıntıya sahip olduğu ve farklı yaklaşımların daha geniş kapsama alanına sahip olduğu için Dragon Book'u tercih ediyorum. ilk geçiş için. Temel olarak, Appel size derleyicide bir şeyler yapmanın bir yolunu öğretir ve size rehberlik eder. Dragon Book, farklı tasarım alternatiflerini daha ayrıntılı olarak ele alıyor, ancak bir şeyin nasıl çalışılacağı konusunda çok daha az rehberlik sağlıyor.


Düzenlendi : yanlış Aho referansını Sethi ile değiştirin, CTMCP'den bahsedin.


Üniversitedeki tercümanlar dersim için Programlama Dillerinin Temelleri vardı. Berbattı. Ben şemayı kişisel olarak bile beğeniyorum ve sözdizimini umursamıyorum, yazarın benim için mahvettiği kavramların zayıf açıklamalarıydı.
Greg Guida

Appel'in sürekliliğini derlemekten hoşlanıyorum ama kitaplarının çok fazla ön bilgi edindiğini gördüm.
Jon Harrop

6

Üniversitede ders için bir derleyici oluşturmak zorunda kaldım.

Bunu yapmanın temelleri, düşündüğünüz kadar karmaşık değildir. İlk adım gramerinizi oluşturmaktır. İngilizce'nin gramerini düşünün. Aynı şekilde, eğer bir öznesi varsa ve öngördüğü takdirde bir cümleyi çözümleyebilirsiniz. İçerik Gramerleri hakkında daha fazla bilgi için .

Dilbilgisini düşürdüğünüzde (dilinizin kuralları), bir derleyici yazmak sadece bu kuralları takip etmek kadar kolaydır. Derleyiciler genellikle makine koduna çevrilir, ancak x86 öğrenmek istemiyorsanız, MIPS'ye bakmanızı veya kendi Sanal Makinenizi yapmanızı öneririm.

Derleyiciler tipik olarak iki bölümden oluşur, bir tarayıcı ve bir ayrıştırıcı. Temel olarak, tarayıcı kodda okur ve belirteçlere ayırır. Ayrıştırıcı bu belirteçlerin yapısına bakar. Ardından, derleyici içinden geçerek ihtiyacınız olan koda (montaj, bayt kodu gibi ara kod vb.) Dönüştürmek için basit kurallar uygular. Daha küçük ve daha küçük parçalara ayırırsanız, bu sonuçta göz korkutucu değildir.

İyi şanslar!


8
Kavramsal olarak basit? Evet. Aslında basit mi? Hayır.
Neil Butterworth

7
Uhm. Derleyici, taramadan / ayrıştırmadan sonra tip kontrolü / çıkarım, optimizasyon, kayıt tahsisi vb. (Yorumlanan kodu kullanırken, bu kısımları çalışma zamanına sadece ertelersiniz.)
Macke

Benden oy yok: derleyiciler iki temel bölüme sahipken, bunlardan biri programın soyut bir tanımını (tipik olarak taramaya ve ayrıştırmaya ayrılır) ve diğerini de bu özet tanımın bir versiyonunu tekrar yazmayı diğer formlar (örneğin, makine kodu). (Yan not: Derleyicileri en iyi duruma getirme , yazmadan önce soyut açıklamayı iyileştirmeye çalışır, ancak bu bir ayrıntılandırmadır.)
Donal Fellows,

6

Petzold'un kitap kodu , ilke olarak başlayan teknik olmayan teknik ve teknolojilere harika bir giriş. Çok okunaklı ve çok fazla tıkanmadan kapsamı çok geniş.

Şimdi bunu yazdım, yeniden okumak zorunda kalacağım.



5

Bu konuda mükemmel cevaplar var, ama ben de aynı soruya sahip olduğum için benimkine eklemek istedim. (Ayrıca, Joe-Internet tarafından önerilen kitabın mükemmel bir kaynak olduğunu belirtmek isterim.)

Birincisi, bilgisayar nasıl çalışır? Bu: Giriş -> Hesaplama -> Çıkış.

İlk önce “Hesapla” kısmını düşünün. Giriş ve Çıkış'ın daha sonra nasıl çalıştığına bakacağız.

Bir bilgisayar temel olarak bir işlemci (veya CPU) ve bir miktar hafızadan (veya RAM) oluşur. Hafıza, her biri sınırlı sayıda bit saklayabilen bir konumlar topluluğudur ve bu hafıza konumlarının her birine bir numara ile referans verilebilir, buna hafıza konumunun adresi denir. İşlemci veri alabilen bir cihazdır. bellekten, verileri temel alarak bazı işlemleri gerçekleştirin ve bazı verileri belleğe geri yazın. İşlemci, verileri bellekten okuduktan sonra ne okunacağını ve ne yapacağını nasıl bulur?

Buna cevap vermek için bir işlemcinin yapısını anlamamız gerekir. Aşağıdaki oldukça basit bir görünümdür. Bir işlemci esasen iki bölümden oluşur. Bunlardan biri, işlemcinin içinde çalışan ve hafızası olan bir dizi bellek konumu. Bunlara “kayıtlar” denir. İkincisi, kayıtlardaki verileri kullanarak belirli işlemleri gerçekleştirmek için oluşturulmuş bir grup elektronik makinedir. “Program Sayacı” veya bilgisayar ve “Talimat Kaydı” veya ir olarak adlandırılan iki özel kayıt vardır. İşlemci hafızanın üç bölüme ayrıldığını düşünüyor. İlk bölüm, yürütülen bilgisayar programını saklayan “program hafızası” dır. İkincisi “veri belleği”. Üçüncüsü bazı özel amaçlar için kullanılır, daha sonra konuşuruz. Program Sayacı, Program Belleğinden okumak için bir sonraki talimatın yerini içerir. Talimat Sayacı Gerçekleştirilmekte olan işlemi ifade eden bir numara içerir. Bir işlemcinin gerçekleştirebileceği her işleme, işlemin opcode'u adı verilen bir numarayla atıfta bulunulur. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Talimat Sayacı Gerçekleştirilmekte olan işlemi ifade eden bir numara içerir. Bir işlemcinin gerçekleştirebileceği her işleme, işlemin opcode'u adı verilen bir numarayla atıfta bulunulur. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Talimat Sayacı Gerçekleştirilmekte olan işlemi ifade eden bir numara içerir. Bir işlemcinin gerçekleştirebileceği her işleme, işlemin opcode'u adı verilen bir numarayla atıfta bulunulur. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Bir işlemcinin gerçekleştirebileceği her işleme, işlemin opcode'u adı verilen bir numarayla atıfta bulunulur. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Bir işlemcinin gerçekleştirebileceği her işleme, işlemin opcode'u adı verilen bir numarayla atıfta bulunulur. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir. Bir bilgisayarın esasen nasıl çalıştığı, Program Sayacı tarafından Başvurulan Hafıza yerini Talimat Kaydı'na okur (ve Program Sayacını bir sonraki komutun hafıza konumuna işaret edecek şekilde arttırır). Daha sonra, Talimat Kaydı'nı okur ve istenen işlemi gerçekleştirir. Örneğin, talimat, belirli bir hafıza konumunu bir sicile okumak veya bir sicile yazmak veya iki sicilin değerlerini kullanarak bazı işlemler yapmak ve çıktısını üçüncü sicile yazmak olabilir.

Bilgisayar nasıl Giriş / Çıkış yapıyor? Çok basitleştirilmiş bir cevap vereceğim. Bkz. Http://en.wikipedia.org/wiki/Input/output ve http://en.wikipedia.org/wiki/Interrupt. daha fazlası için. Hafızanın üçüncü kısmı ve Araya Girme adlı bir şey olmak üzere iki şey kullanır. Bilgisayara bağlı her cihaz, işlemciyle veri alışverişinde bulunabilmelidir. Bunu daha önce belirtilen hafızanın üçüncü bölümünü kullanarak yapar. İşlemci her cihaza bir dilim bellek ayırır ve cihaz ve işlemci bu bellek dilimiyle iletişim kurar. Ancak işlemci hangi konumun hangi cihaza karşılık geldiğini ve bir cihazın ne zaman veri alışverişi yapması gerektiğini nasıl bilir? Bu, kesintilerin gerçekleştiği yerdir. Bir kesinti, işlemciye şu anda ne olduğunu duraklatmak ve tüm kayıtlarını bilinen bir yere kaydetmek ve daha sonra başka bir şey yapmaya başlamak için bir sinyaldir. Birçok kesinti var, her biri benzersiz bir numara ile tanımlanıyor. Her kesme için, onunla ilişkili özel bir program var. Kesinti olduğunda, işlemci, kesmeye karşılık gelen programı yürütür. Şimdi bios'lara ve donanım cihazlarının bilgisayar ana kartına nasıl bağlandığına bağlı olarak, her cihaz benzersiz bir kesinti ve bir dilim bellek alır. İşletim sistemini başlatırken, biosların yardımıyla her cihazın kesme ve hafıza konumunu belirler ve kesme cihazlarının uygun şekilde taşınması için özel programlar kurar. Bu nedenle, bir cihaz bir miktar veriye ihtiyaç duyduğunda veya bir veri göndermek istediğinde, bir kesinti olduğunu bildirir. İşlemci yaptığı şeyi duraklatır, kesmeyi idare eder ve ardından yaptığı işe geri döner. Bunlar hdd, klavye vb. Gibi birçok kesinti çeşididir. Önemli olan, düzenli aralıklarla kesinti yapan sistem zamanlayıcısıdır. Ayrıca, kesintileri tetikleyebilen, yazılım kesintileri denilen opkodlar vardır.

Artık bir işletim sisteminin nasıl çalıştığını neredeyse anlayabiliyoruz. Çalıştırıldığında, os bir zamanlayıcı kesmesi kurar, böylece os'a düzenli aralıklarla kontrol sağlar. Ayrıca, diğer aygıtları vb. İşlemek için başka kesintiler de kurar. programların, doğrudan aygıtlara erişmelerine izin vermek yerine donanım aygıtlarına erişmeleri için soyut bir yol. Bir program bir cihaza erişmek istediğinde, os tarafından sağlanan bazı kodları çağırır ve daha sonra cihazla konuşur. Bunlarla ilgili, eşzamanlılık, iş parçacığı, kilitler, bellek yönetimi vb. İle ilgilenen pek çok teori vardır.

Şimdi, teoride bir kişi doğrudan opcod kullanarak bir program yazabilir. Buna makine kodu denir. Bu açıkçası çok acı verici. Şimdi işlemci için bir meclis dili, bu opcodların anımsatıcılarından başka bir şey değil, bu da program yazmayı kolaylaştırıyor. Basit bir montajcı montajda yazılı bir programı alan ve anımsatıcıları uygun kodlarla değiştiren bir programdır.

Bir işlemci ve assembly dili tasarlama nasıl devam eder? Bilgisayar mimarisiyle ilgili bazı kitapları okumak zorunda olduğunuzu bilmek. (Bkz. joe-internet tarafından belirtilen kitabın 1-7 bölümleri). Bu, boolean cebiri, eklenmesi için basit birleşimsel devrelerin nasıl oluşturulacağı, çarpılacağı, bellek ve sıralı devrelerin nasıl oluşturulacağı, bir mikroişlemcinin nasıl kurulacağı vb.

Şimdi nasıl biri bilgisayar dili yazıyor? Biri makine koduna basit bir montajcı yazarak başlayabilir. Daha sonra basit bir C alt kümesi için bir derleyici yazmak üzere bu assembler'ı kullanın. Sonra C'nin daha tam bir versiyonunu yazmak için o C alt setini kullanın. Sonunda python veya C ++ gibi daha karmaşık bir dil yazmak için C kullanın. Elbette bir dil yazmak için önce onu tasarlamanız gerekir (bir işlemci istediğiniz gibi). Yine bu konuda bazı ders kitaplarına bakın.

Ve nasıl bir os yazmak? İlk önce x86 gibi bir platform hedefliyorsunuz. Öyleyse nasıl çizdiğini anlarsın ve os ne zaman çağrılır. Tipik bir bilgisayar bu şekilde önyükleme yapar. Başlıyor ve bios bazı testler yapıyor. Sonra bios, hdd'nin ilk bölümünü okur ve içeriği bellekteki belirli bir yere yükler. Daha sonra cpu bu yüklü veriyi çalıştırmaya başlamak için ayarlar. Bu, çağrıldığınız nokta budur. Bu noktada tipik bir os kendi belleğinin geri kalanını yükler. Daha sonra cihazları başlatır ve diğer şeyleri ayarlar ve nihayet giriş ekranıyla sizi selamlar.

Yani bir os yazmak için "boot-loader" yazmalısınız. Ardından, kesintileri ve cihazları ele almak için kod yazmanız gerekir. Daha sonra işlem yönetimi, cihaz yönetimi vb. İçin tüm kodları yazmanız gerekir. Daha sonra işletim sisteminizde çalışan programların cihazlara ve diğer kaynaklara erişmesini sağlayan bir api yazmanız gerekir. Sonunda, bir programı diskten okuyan, bir işlem olarak ayarlayan ve çalıştırmaya başlayan bir kod yazmalısınız.

Elbette cevabım açıkça sadeleştirilmiş ve muhtemelen çok az pratik kullanım. Savunmamda artık teoride yüksek lisans öğrencisiyim, bu yüzden bunların çoğunu unuttum. Ancak bu tür şeylerin birçoğunu google'da bulabilir ve daha fazlasını öğrenebilirsiniz.


4

Programlama kariyerimde sizinkine benzer bir karışıklık halindeyken bir noktayı hatırlayabiliyorum: teoriyi biraz okudum, Dragon kitabı, Tiger kitabı (kırmızı), ama yine de pek bir şey yoktu. hepsini bir araya getirmek için bir ipucu.

Bunu birbirine bağlayan şey yapacak somut bir proje bulmaktı (ve sonra sadece bütün teoriden küçük bir alt kümeye ihtiyacım olduğunu bulmak).

Java VM bana iyi bir başlangıç ​​noktası sağladı: kavramsal olarak bir "işlemci" ama gerçek CPU'ların dağınık ayrıntılarından oldukça soyutlandı. Aynı zamanda öğrenme sürecinin önemli ve çoğu zaman gözden kaçan bir kısmını da verir: şeyleri tekrar bir araya getirmeden önce parçalara ayırmak (eski günlerde radyo setlerinde kullanılan çocuklar gibi).

Bir decompiler ve Java'daki Hello, World sınıfı ile oynayın. JVM spesifikasyonunu okuyun ve neler olduğunu anlamaya çalışın. Bu, derleyicinin tam olarak ne yaptığına dair temelli bir fikir verecektir .

Ardından , Merhaba, Dünya sınıfını oluşturan kodla oynayın . (Aslında yalnızca Merhaba, Dünya diyebileceğiniz çok özel bir dil için uygulamaya özel bir derleyici oluşturuyorsunuz.)

Merhaba, Dünyada başka bir dilde yazılmış ve aynı sınıfın çıktısını okuyabilecek kod yazmayı deneyin. Dizeyi "Merhaba Dünya" dan başka bir şeye çevirebilmen için yap.

Şimdi (Java'da) "2 * (3 + 4)" gibi bazı aritmetik ifadeleri hesaplayan bir sınıf oluşturmayı deneyin. Bu sınıfı ayırın, tekrar bir araya getirebilecek bir "oyuncak derleyici" yazın.


3

1) Washington Üniversitesi'nden harika video dersleri:

CSE P 501 Derleyici İnşaatı - Sonbahar 2009 www.cs.washington.edu/education/courses/csep501/09au/lectures/video.html *

2) SICP http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ Ve aynı adı taşıyan kitap. Bu aslında herhangi bir yazılım mühendisi için zorunludur.

3) Ayrıca, işlevsel programlama hakkında, Haskell, lambda hesabı, anlambilim (terimler dahil) ve fonksiyonel diller için derleyici uygulaması. Haskell'i zaten biliyorsanız 2005-SS-FP.V10.2005-05-24.HDV'den başlayabilirsiniz. Uxx videoları cevaplardır. Lütfen önce Vxx videoları izleyin .

http://video.s-inf.de/#FP.2005-SS-Giesl.(COt).HD_Videoaufzeichnung

(videolar İngilizce, diğer dersler ise Almanca.)

  • yeni kullanıcılar en fazla iki köprü gönderebilir.

3

ANTLR iyi bir başlangıç ​​noktasıdır. Lex ve Yacc'a benzer bir dil üreten çerçeve. Süreci kolaylaştıran ANTLRWorks adında bir gui var .

.NET dünyasında, .NET dünyasında kod oluşturmak için kullanılabilecek Dinamik Dil Çalışma Zamanı vardır. DLR kullanarak kod üreten Zentrum adlı bir ifade dili yazdım . Statik ve dinamik olarak yazılan ifadelerin nasıl ayrıştırılacağını ve uygulanacağını gösterir.


2

Derleyicilerin nasıl işlediğine ve kendi programlama dilinizi nasıl oluşturacağınıza dair basit bir giriş için, OS / CPU içindekiler, yani lexers, parsers hakkında bilgi sahibi olmadan, dil tasarım teorisine daha fazla odaklanan yeni kitabı http://createyourproglang.com tavsiye ederim. tercümanlar vs.

Yeni popüler Coffee Script ve Fancy programlama dillerini oluşturmak için kullanılan aynı araçları kullanır .


2

Söyleyeceğiniz her şey doğruysa, gelecek vaat eden bir araştırmacının profiline sahip olursunuz ve somut bir anlayış yalnızca bir yolla elde edilebilir: ders çalışmak. Ve ben de " Bu dahi tarafından yazılan tüm bu yüksek seviyedeki bilgisayar bilimleri kitaplarını (özellikle bunlar ) okuyun !" Demiyorum ; Demek istediğim: Charles Babbage, Alan Turing, Claude Shannon veya Dennis Ritchie gibi bir bilgisayar bilimcisi olmak için üst düzey insanlarla birlikte olmalısınız. Ben kendi kendini yetiştiren insanları küçümsemiyorum (onlardan biriyim) ama dışarıda senin gibi insanlar yok. Ciddi tavsiye Sembolik Sistemler Programı (SSP) de Stanford Üniversitesi . Web sitesinde dediği gibi:

Stanford Üniversitesi'ndeki Sembolik Sistemler Programı (SSP) bilgisayarlara ve zihinlere odaklanır: bilgiyi temsil etmek için semboller kullanan yapay ve doğal sistemler. SSP, insan-bilgisayar ilişkisinin farklı yönleriyle ilgilenen öğrencileri ve fakülteleri bir araya getiriyor.

  • bilişsel bilim : insan zekasını, doğal dilleri ve beyni hesaplamalı süreçler olarak incelemek;
  • yapay zeka : bilgisayarlara insani davranış ve anlayış kazandırmak; ve
  • insan-bilgisayar etkileşimi : bilgisayar yazılımı tasarlamak ve insan kullanıcıları ile iyi çalışacak arayüzler oluşturmak.

2

Biraz sol alan dışında bir şey önereceğim: Python'u öğren (ya da belki Ruby, ama Python'da daha fazla deneyime sahibim, bu yüzden tartışacağım şey bu). Ve sadece onunla uğraşmakla kalmıyor, aynı zamanda onu derin bir seviyede tanıyabiliyorsunuz.

Bunu önermemin birkaç nedeni var:

  1. Python son derece iyi tasarlanmış bir dildir. Birkaç siğile sahip olmasına rağmen, diğer birçok dilden daha az IMHO'ya sahiptir. Bir tomurcuklanan dil tasarımcısıysanız, kendinizi olabildiğince iyi dillere maruz bırakmak iyidir.

  2. Python'un standart uygulaması (CPython) açık kaynaklıdır ve iyi belgelenmiştir, bu da dilin başlık altında nasıl çalıştığını anlamayı kolaylaştırır.

  3. Python, montajdan daha kolay anlaşılan ve Python'un çalıştığı tüm platformlarda aynı şekilde çalışan basit bir byte koduyla derlenmiştir. Böylece derlemeyi (Python kaynak kodunuzu bayt koduna derlediğinden) ve yorumlamayı (bu byte kodu Python sanal makinesinde yorumlandığı için) öğreneceksiniz.

  4. Python'un numaralı PEP'lerde belgelenen birçok yeni özelliği vardır (Python Geliştirme Önerileri). Dil tasarımcılarının gerçekte yaptıklarını seçmeden önce bir özelliği kullanmayı düşündüklerini görmek için okumayı ilginç KEP'ler. (Halen incelenmekte olan KEP'ler bu konuda özellikle ilginçtir.)

  5. Python, çeşitli programlama paradigmalarının bir dizi özelliğine sahiptir, bu nedenle problem çözme yolunda çeşitli yöntemler hakkında bilgi edinecek ve kendi dilinizde de dahil olmak üzere daha geniş bir araç yelpazesine sahip olacaksınız.

  6. Python, dekoratörler, metasınıflar, ithalat kancaları vb. İle dilin çeşitli yollarla genişletilmesini oldukça kolaylaştırır, böylece yeni dil özellikleriyle bir dilden ayrılmadan oynayabilirsiniz. (Bir kenara: kod blokları Ruby'de birinci sınıf nesnelerdir, bu yüzden aslında döngüler gibi yeni kontrol yapıları yazabilirsiniz! Ruby programcılarının dilin genişletmeyi düşündüğünü düşünmüyorlar. Ruby'de program yaparsın. Ama oldukça havalı.)

  7. Python'da, derleyici tarafından oluşturulan bayt kodunu gerçekten sökebilir, hatta kendi baştan yazabilir ve tercümanın çalıştırmasını sağlayabilirsiniz (bunu kendim yaptım ve akıllara eğilmekten başka bir şey değildi).

  8. Python ayrıştırma için iyi kütüphanelere sahiptir. Python kodunu soyut bir sözdizimi ağacında ayrıştırıp, ardından AST modülünü kullanarak değiştirebilirsiniz. PyParsing modülü, tasarladığınız diller gibi rastgele dilleri ayrıştırmak için kullanışlıdır. Teorik olarak ilk dil derleyicinizi Python'a yazabilirsiniz (ve C, assembly ve hatta Python çıktısı oluşturabilir).

Bu araştırmacı yaklaşım, çalıştığınız dilde okuduğunuz kavramları tanımaya başlayacağınız gibi, resmi bir yaklaşımla iyi sonuçlanabilir.

İyi eğlenceler!


Python'da kazı yapmak değil, ama konunun yanında. Çocuğun halihazırda büyük N için N dili var; N artışı, fazla fark yaratmayacaktır. Örneğin, C atın. Bu standart. Çok sayıda kütüphanesi var. Çapraz platformdur (standarda bağlı kaldığınızda). Çıkışı sökebilirsiniz. CFront yazabilirsiniz. Vb Yani orada.
Ian,

1

Eh, sorunuzun "Bilgisayar bilimi derecesinin temel pratik kavramları nedir" ve toplam cevabı elbette, Bilgisayar Bilimleri alanında kendi lisansınızı almak için yazılabilir.

Temel olarak, bir metin dosyasını okuyarak, ondan bilgi çıkararak ve onu okuyabileceğiniz baytlara dönüştürene kadar, okuduğunuz bilgilerden yola çıkarak metinde dönüşümler yaparak kendi programlama dili derleyicinizi yaratırsınız. Yükleyici (cf, Levine'den Linkerler ve Yükleyiciler). Önemsiz bir derleyici ilk kez yapıldığında oldukça titiz bir projedir.

Bir işletim sisteminin kalbi kaynakları yöneten (örn. Bellek ayırma / kaldırma) ve görevler / işlemler / programlar arasında geçiş yapan çekirdek.

Bir assembler bir text-> byte dönüşümüdür.

Bu konuyla ilgileniyorsanız, Linux'ta standart X86 derlemesinin bazı alt kümelerini destekleyen bir X86 derleyici yazmanızı öneririm. Bu oldukça basit bir giriş noktası olacak ve sizi bu konularla tanıştıracak. Bu bir bebek projesi değil ve size birçok şey öğretecek.

C yazarak tavsiye ederim; C, bu seviyedeki çalışmanın lingua franca'sıdır.


1
Öte yandan, burası çok üst düzey bir dil için iyi bir yer. Bir dosyadaki ayrı baytları dikte edebildiğiniz sürece, herhangi bir dilde bir derleyici / assembler (daha kolay olan) yapabilirsiniz. Söylesene Perl. Veya VBA. Gökler, olasılıklar!
Ian,

1

Kenneth Louden'ın "Derleyici İnşaatı" adlı kitabına bakınız.

http://www.cs.sjsu.edu/~louden/cmptext/

Derleyici gelişimine daha iyi bir uygulamalı yaklaşım sağlar.

İnsanlar yaparak öğrenirler. Sadece küçük bir sayı tahtada çizilen sembolleri görebilir ve teoriden uygulamaya hemen atlayabilir. Ne yazık ki, bu insanlar genellikle dogmatik, köktenci ve bu konuda en gürültülü.


1

İlk montaj dilim olarak PDP-8'e maruz kaldığım için kutsandım. PDP-8'in sadece altı talimatı vardı, o kadar basitti ki, aslında birkaç basit parça tarafından uygulandığını hayal etmek kolaydı. Gerçekten bilgisayarlardan "sihir" kaldırıldı.

Aynı açığa çıkmanın bir diğer kapısı, Knuth'un örneklerinde kullandığı "karma" montaj dilidir. "Mix" bugün arkaik görünüyor, ancak hala DE-mystizing etkisi var.


0

Derleyiciler ve programlama dilleri (ve bir inşanın oluşturulmasında da dahil olmak üzere her şey - sonlu bir gramerin tanımlanması ve düzeneğin dönüştürülmesi gibi), sistemler hakkında bir bütün olarak büyük bir anlayış gerektiren çok karmaşık bir iştir. Bu tür bir kurs, tipik olarak, Üniversitede 3. / 4. sınıf bir Comp Sci sınıfı olarak sunulmaktadır.

Öncelikle Genel olarak İşletim Sistemlerini ve mevcut dillerin nasıl derlendiğini / çalıştırıldığını (yani, doğal olarak (C / C ++), VM'de (Java) veya tercüman (Python / Javascript)) anlamanızı şiddetle tavsiye ederim.

İşletim Sistemleri dersimde (2. yılda) Abraham Silberschatz, Peter B. Galvin, Greg Gagne'nin İşletim Sistemi Kavramları kitabını kullandığımızı düşünüyorum. Bu, bir işletim sisteminin her bir bileşeninin kapsamlı bir yol gösterişini veren mükemmel bir kitaptı - biraz pahalı ama buna değer ve eski / kullanılmış kopyalar yüzer olmalıdır.


İşletim sistemi kavramları? Bir derleyici oluşturmak için çok azına ihtiyaç vardır. İhtiyaç duyulan şey yazılım mimarilerini anlamak: boşlukları, yığınları, konuları ele almak (derleyicileri öğrenmek istiyorsa paralelliği ve geleceği hakkında daha iyi bilgi edinmek için).
Ira Baxter

Dil tasarımını ve derleyicileri öğrenmek istediğini söyledikten hemen sonra işletim sistemleri hakkında bilgi edinmek istediğini söyledi.
David Thornley

@Ira - kabul etti. Bir derleyici / dil oluşturmak için işletim sisteminin anlaşılmasının gerekli olduğunu asla söylemedim, bunun kolay bir başlangıç ​​noktası olabileceğini açıkladım. Herkes sorusunun 'derleyici' yönüne odaklanıyor, ancak aynı zamanda işletim sistemi ve kütüphanelerin daha iyi anlaşılmasını istediğini belirtti. 15 yaşındaki hala mimarileri öğrenmeye için bir yacc ile dilbilgisi (IMHO) tanımlamak için öğrenme daha .. g / ç, vs, kilitleme, diş, hafıza yönetimi anlamak için çok daha yararlı olacaktır
plafond

Maalesef, işletim sistemleri hakkında bilgi edinmek isteme noktasını kaçırdım. Demek istediğim şu: derleyiciler için çok fazla işletim sistemi bilgisine ihtiyacı yok. Aslında, derleyicinin ve işletim sisteminin ortak bir amaca ulaşmak için etkileşime girmediği yerler hariç, tamamen farklı bir konu. (Multics, PL / 1 derleyicilerini, örneğin global bir VM'i etkin kılmak için belirli şekillerde işlev çağrıları oluşturmak için gerekli).
Ira Baxter,

0

Bu büyük bir konudur, ancak sizi görkemli bir “kitap oku, evlat” ile fırçalamak yerine, kafanızı sarmanıza yardımcı olmak için memnuniyetle işaretçiler vereceğim.

Çoğu derleyici ve / veya tercüman şöyle çalışır:

Tokenize : Kod metnini tarayın ve bir belirteç listesine bölün.

Bu adım zor olabilir çünkü dizeyi yalnızca boşluklara bölemezsiniz, bunun if (bar) foo += "a string";8 simgeli bir liste olduğunu kabul etmeniz gerekir : WORD, OPEN_PAREN, WORD, CLOSE_PAREN, WORD, ASIGNMENT_ADD, STRING_LITERAL, TERMINATOR. Gördüğünüz gibi, kaynak kodunu boşluklara bölmek işe yaramaz, her karakteri bir sıra olarak okumak zorundasınız, bu nedenle alfanümerik bir karakterle karşılaşırsanız, alfanum olmayan bir karaktere ve o dizgene isabet edene kadar karakterleri okumaya devam edersiniz. sadece okumak, daha sonra sınıflandırılacak bir WORD. Simgenizin ne kadar granül olduğuna kendiniz karar verebilirsiniz: "a string"STRING_LITERAL adlı bir simge olarak daha sonra ayrıştırılmak üzere mi yutulup yutulmadığı veya görüp görmediği konusunda karar verebilirsiniz."a string" OPEN_QUOTE, UNPARSED_TEXT, CLOSE_QUOTE veya her neyse, kodlama yaparken kendiniz için karar vermeniz gereken seçeneklerden sadece biri.

Lex : Şimdi artık bir jeton listeniz var. Muhtemelen bazı jetonları WORD gibi belirsiz bir sınıflandırma ile etiketlediniz, çünkü ilk seferde her karakter dizisinin içeriğini anlamaya çalışmak için fazla çaba harcamak zorunda değilsiniz. Bu yüzden şimdi kaynak belirteçlerin listesini tekrar okuyunuz ve belirsiz belirteçlerin her birini, dilinizdeki anahtar kelimelere göre daha belirgin bir belirteç türü ile yeniden sınıflandırınız. Bu nedenle, "if" ve "if" gibi bir WORD'iniz, IF sembolüne sahip özel anahtar kelimeler listenizdeyse, bu belirtecin sembol tipini WORD'den IF'ye ve özel anahtar kelimeler listenizde olmayan bir WORD'ye değiştirirsiniz. WORD foo gibi, bir tanımlayıcıdır.

Ayrıştırma : Şimdi if (bar) foo += "a string";, şuna benzeyen bir belirteç belirteçleri listesi açtınız: IF OPEN_PAREN IDENTIFER CLOSE_PAREN IDENTIFIER ASIGN_ADD STRING_LITERAL TERMINATOR. Adım, tokenlerin dizilerini ifadeler olarak tanımaktır. Bu ayrıştırıyor. Böyle bir gramer kullanarak bunu yaparsınız:

BİLDİRİM: = ASIGN_EXPRESSION | IF_STATEMENT

IF_STATEMENT: = IF, PAREN_EXPRESSION, STATEMENT

ASIGN_EXPRESSION: = TANIMCI, ASIGN_OP, DEĞER

PAREN_EXPRESSSION: = OPEN_PAREN, DEĞER, CLOSE_PAREN

DEĞER: = TANIMCI | STRING_LITREAL | PAREN_EXPRESSION

ASIGN_OP: = EQUAL | ASIGN_ADD | ASIGN_SUBTRACT | ASIGN_MULT

"|" Kullanan yapımlar terimler arasında "bunlardan herhangi biriyle eşleşin" anlamına gelir, terimler arasında virgül varsa, "terimler dizisinin bu eşleşmesi" anlamına gelir

Bunu nasıl kullanıyorsunuz? İlk belirteçten başlayarak, belirteç dizinizi bu üretimlerle eşleştirmeye çalışın. İlk önce token listenizi STATEMENT ile eşleştirmeye çalışıyorsunuz, bu yüzden STATEMENT kuralını okuyorsunuz ve "bir STATEMENT bir ASIGN_EXPRESSION ya da bir IF_STATEMENT" diyor, bu yüzden önce ASIGN_EXPRESSION ile eşleşmeye çalışıyorsunuz, böylece ASIGN_EXPRESSION için dilbilgisi kuralına bakıyorsunuz ve "ASIGN_EXPRESSION, ardından bir ASIGN_OP ve ardından bir VENTUE izleyen bir IDENTIFIER olduğunu söylüyor, bu yüzden IDENTIFIER için dilbilgisi kuralını araştırıyorsunuz ve IDENTIFIER için dilbilgisi çekirdeği olmadığını görüyorsunuz, bu da IDENTIFIER için daha fazla gerektirmeyen bir" terminal "anlamına geliyor. eşleşecek şekilde ayrıştırma, böylece doğrudan belirtecinizle eşleştirmeye çalışabilirsiniz, ancak ilk kaynak belirteciniz bir IF'dir ve IF bir IDENTIFIER ile aynı değildir, bu nedenle eşleşme başarısız olur. Şimdi ne var? STATEMENT kuralına geri dönüp sonraki terimi eşleştirmeyi deneyin: IF_STATEMENT. IF_STATEMENT'i ararsınız, IF ile başlar, IF'yi arar, IF bir terminaldir, terminali ilk jetonunuzla karşılaştırın, IF jetonu eşleşmeleri, harika devam edin, gelecek dönem PAREN_EXPRESSION, PAREN_EXPRESSION'a bakın, terminal değil, ilk terimdir, PAREN_EXPRESSION OPEN_PAREN ile başlar, OPEN_PAREN'i arar, bu bir terminaldir, OPEN_PAREN ile bir sonraki belirtecinizle eşleşir, eşleşir, vb.

Bu adıma yaklaşmanın en kolay yolu, eşleştirmeye çalıştığınız kaynak kod belirtecini ve eşleştirmeye çalıştığınız dilbilgisi terimini ilettiğinizde parse () adında bir işleve sahip olmanızdır. Dilbilgisi terimi bir terminal değilse, yinelenirsiniz: yine aynı kaynak belirteci ve bu dilbilgisi kuralının ilk terimini geçen parse () işlevini çağırırsınız. Bu nedenle “özyinelemeli iniş ayrıştırıcı” olarak adlandırılır. Parse () işlevi kaynak belirteçleri okurken geçerli konumunuzu döndürür (veya değiştirir), esasen eşleşen sıradaki son belirteci geri döndürür ve bir sonraki çağrıya devam edersiniz. ayrıştır () oradan.

Her seferinde parse (), ASIGN_EXPRESSION gibi bir üretimle eşleşir ve bu kod parçasını temsil eden bir yapı yaratırsınız. Bu yapı orijinal kaynak belirteçlerine referanslar içerir. Bu yapıların bir listesini oluşturmaya başlarsınız. Bu yapının tamamına Özet Sözdizimi Ağacı (AST) diyoruz.

Derleme ve / veya Yürütme : Dilbilginizdeki bazı üretimler için, bir AST yapısı verilirse, AST'nin bu yığınını derleyeceği veya yürüteceği işleyici işlevleri oluşturdunuz.

Öyleyse, AST'nizin ASIGN_ADD tipindeki parçasına bakalım. Yani tercüman olarak bir ASIGN_ADD_execute () işlevine sahipsiniz. Bu işlev, ayrıştırma ağacına karşılık gelen AST'nin bir parçası olarak geçirilir foo += "a string", bu nedenle bu işlev bu yapıya bakar ve yapıdaki ilk terimin bir TANIMCI olması gerektiğini ve ikinci terimin DEĞER olduğunu bilir, yani ASIGN_ADD_execute () VALUE terimini, bellekte değerlendirilen değeri temsil eden bir nesneyi döndüren bir VALUE_eval () işlevine geçirir, ardından ASIGN_ADD_execute (), değişkenler tablonuzda "foo" ifadesini arar ve eval_value () öğesinin ne döndürdüğüne bir başvuru saklar. işlevi.

Bu bir tercüman. Bir derleyici bunun yerine, işleyici işlevlerinin AST'yi yürütmek yerine bayt koduna veya makine koduna çevirmesini sağlar.

Adım 1 ila 3 ve bazı 4, Flex ve Bison gibi araçlar kullanılarak daha kolay hale getirilebilir. (aka. Lex ve Yacc) ancak sıfırdan kendinize bir tercüman yazmak muhtemelen herhangi bir programcının başarabileceği en güçlendirici egzersizdir. Diğer tüm programlama zorlukları, bunu yaptıktan sonra önemsiz görünüyor.

Tavsiyem küçük başlıyor: küçük bir dilbilgisi içeren küçük bir dil ve birkaç basit ifadeyi ayrıştırıp yürütmeyi deneyin, sonra oradan büyütün.

Bunları oku ve iyi şanslar!

http://www.iro.umontreal.ca/~felipe/IFT2030-Automne2002/Complements/tinyc.c

http://en.wikipedia.org/wiki/Recursive_descent_parser


2
İnsanlar derleme hakkında düşündüğümde klasik bir hata olarak düşündüğüm şeyi yapıyorsunuz: Sorunun ayrıştırma olduğuna inanıyor. PARSING TEKNİK olarak KOLAY; Bunu yapmak için harika teknolojiler var. Derleme ile ilgili zor kısım, bugünlerde PARALLEL koduna daha fazla ağırlık vererek, anlamsal analiz, yüksek ve düşük program gösterimi seviyelerinde optimizasyon ve kod oluşturmadır. Bunu cevabınızda tamamen önemsizleştiriyorsunuz: "bir derleyici AST'yi bayt koduna çevirmek için işleyici işlevlerine sahip olacaktır". Orada geçen 50 yıllık derleyici teorisi ve mühendisliği var.
Ira Baxter

0

Bilgisayar alanı sadece karmaşık, çünkü birçok yönden gelişmeye vakti oldu. Kalbinde sadece hesaplama yapan makineler var.

En sevdiğim çok temel bilgisayar Harry Porter'ın Röle Bilgisayarı . Bir bilgisayarın taban seviyesinde nasıl çalıştığını gösterir. Ardından, diller ve işletim sistemleri gibi şeylere neden ihtiyaç duyulduğunu anlamaya başlayabilirsiniz.

Mesele şu ki, neye ihtiyacı olduğunu anlamadan bir şeyi anlamak zor . İyi şanslar ve sadece bir şeyler okuma . Bir şeyler yap.



-1

Bir başka iyi tanıtım kitabı ise N. Wirth'in 1986'dan (derleyici yapımı) yaklaşık 100 sayfa uzunluğunda olan ve "ayrıştırıcı, kod üreteci ve sanal makine dahil" PL / 0 oyuncak dili için özlü, iyi tasarlanmış bir kodu açıklayan "Derleyici" dir. Ayrıca, EBNF notasyonunda ayrıştırmak için gramerde okuyan bir ayrıştırıcının nasıl yazılacağını gösterir. Kitap Almanca yazıyor ancak bir özet yazdım ve kodu Python'a alıştırma olarak çevirdim, bkz. Http://www.d12k.org/cmplr/w86/intro.html .


-1

Programlama dillerinin özünü anlamakla ilgileniyorsanız, kavramları anlamak için PLAI (http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/) kitabında çalışmanızı öneririm ve onların uygulanması. Ayrıca kendi dilinizin tasarımı ile size yardımcı olacaktır.


-1

Derleyiciye gerçekten ilgi duyuyorsanız ve daha önce hiç yapmadıysanız, aritmetik formülleri hesaplamak için bir hesap makinesi tasarlayarak başlayabilirsiniz (Eric'in söylediği gibi bir DSL). Bu tür bir derleyici için göz önünde bulundurmanız gereken birçok husus vardır:

  • İzin verilen sayılar
  • İzin verilen operatörler
  • Operatör öncelikleri
  • Sözdizimi doğrulaması
  • Değişken arama mekanizması
  • Döngü algılama
  • Optimizasyon

Örneğin, aşağıdaki formüllere sahipsiniz, hesap makineniz x'in değerini hesaplayabilmelidir:

a = 1
b = 2
c = a + b
d = (3 + b) * c
x = a - d / b

Başlamak çok zor bir derleyici değil, bir derleyicinin ne olduğu hakkında bazı temel fikirler hakkında daha fazla düşünmenize ve programlama becerilerinizi geliştirmenize ve kodunuzun kalitesini kontrol etmenize yardımcı olabilir (bu gerçekten mükemmel bir sorundur Test Odaklı Gelişme TDD, yazılım kalitesini artırmak için uygulanabilir.

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.