9

Üniversitede bir derleyiciler kursu aldım ve çok fazla bilgi olmasına rağmen çok bilgilendirici ve eğlenceli geçti. Uygulama için bir dil belirtimi verildiğinden, fazla bir şey öğrenemediğim bir şey dil tasarımıydı. Artık eğlenmek için basit bir oyuncak dili oluşturmayı düşünüyorum, böylece farklı dil tasarım ilkeleriyle uğraşabilir ve deneyebilirim.Oyuncak derleyici için çıkış dili/biçimi

Henüz karar vermediğim bir şey, derleyicimin çıkmasını istediğim dil veya biçim. İdeal olarak, kullanımı kolay bir sanal makine için bayt kodu çıkarmayı ve ayrıca hata ayıklama için bazı olanaklara sahip olmayı (örneğin yürütmeyi duraklatmayı ve herhangi bir noktada yığına bakmayı) istiyorum. Yine de benim fanteziim.

  • elimden çıktı metinsel x86 assembly dili: Onları gördüğünüz gibi size aradığım bir fikir vermek için, burada artıları ve eksileri ile birlikte ben kabul ettik seçeneklerden bazıları vardır ve daha sonra NASM veya FASM gibi bir derleyicisini çağırır. Bu, önceki derleyici çalışmamın bir VM üzerinde yapıldığı için, gerçek donanım için derleme deneyimi yaşayacaktı. Gdb'yi kullanarak oluşturulan programlarda hata ayıklama yapabilirim, ancak hata ayıklama desteğiyle bir VM kullanmak kadar kolay olmayabilir. Bunun en önemli dezavantajı x86 montajı konusunda sınırlı tecrübem var ve CISC talimatı olarak biraz göz korkutucu.

  • Ben JVM veya Lua sanal makine gibi popüler bir sanal makine için bytecode çıkış bytecode olabilir. Bunların artıları ve eksileri, seçtiğim özel VM'ye göre değişebilir, ancak genel olarak burada gördüğüm olumsuz sonuç, gelecekteki projelerime sınırlı uygulanabilirlik gösteren bir bayt kodu öğrenmeye potansiyel olarak sahip olmaktır. Ayrıca, hangi SM'nin ihtiyaçlarına en uygun olacağından da emin değilim.

  • Ben de bu amaçla üniversitemde tasarlanmış olan derleyiciler dersi, içinde kullanılan aynı VM kullanabilirsiniz. Tasarım ve talimat setini zaten biliyordum ve iyi hata ayıklama özellikleri var, bu yüzden büyük bir artı. Ancak, yetenekleri ile son derece sınırlıdır ve orta düzeyde ilerlemiş bir şey yapmaya çalışırsam hızlıca bu sınırlara karşı çıkacağımı hissediyorum.

  • LLVM'yi ve LLVM Intermediate Representation çıkışını kullanabilirim. LLVM IR çok güçlü görünüyor ve aşina olmak benim için kesinlikle gelecekte olabilir. Diğer yandan, çalışmanın ve hata ayıklamanın ne kadar kolay olduğu konusunda hiçbir fikrim yok, bu yüzden bu alanda deneyimli birisinin tavsiyelerini çok takdir ediyorum.

  • kendi sanal makinemi tasarlayıp uygulayabilirim. Bu muazzam ve bariz bir dezavantajı var: Aslında projemi iki projeye dönüştürüyor olacağım. Bununla birlikte, hala istediğim dil özellikleri için "birinci sınıf" desteği olan bir Sanal Makineyi yapmam için bana izin vermesi oldukça cazip geliyor - örneğin, Lua VM'nin masalar için birinci sınıf desteği var. Lua bayt kodu ile onlarla çalışmak. Yani

, özetlemek için bir VM ya da ben hata ayıklamak için nispeten öğrenmek ve çalışmak kolay ve kolay olduğu hedefleyebilir assembler arıyorum. Bu bir hobi projesi olduğu için, bir daha asla tekrar kullanamayacağım bir araç ya da dili öğrenmek için çok zaman harcadığım şansı en aza indirmek isterim.Bu alıştırmadan kazanmayı umduğum en önemli şey, dil tasarımının karmaşıklıklarını ilk elden anlamaktır, ancak nispeten hızlı bir uygulamayı kolaylaştıran her şey harika olacaktır.

+3

Kod oluşturmayı değiştirdiyseniz, iyi bir derleyici tasarımı IR'nizi herhangi bir şeye dönüştürmenize izin verir.Dilinizi bazı IR'lere dönüştürerek ve ardından C \ C++ 'ya dönüştüren bir arka plan oluşturarak başlayacağım. Bu şekilde, derleyicinin farklı bileşenleri hakkında bilgi edinebilir ve asm veya bytecode'da bazı alt düzey dil yapılarını doğrulama konusunda endişelenmenize gerek yoktur. – linuxuser27

cevap

6

Gerçekten, oluşturmak istediğiniz dilin ne ile tamamlandığını ve bununla ne yapmak istediğinize bağlı olarak değişir. Diğer dillerle etkileşime giren gerçek projeler için tam donanımlı bir dil oluşturmak istiyorsanız, ihtiyaçlarınız, belirli dil özelliklerini derleme karmaşıklıklarını denemek istediğinizden çok daha büyük olacaktır.

Bir assembly dili dosyasına çıkış popüler bir seçimdir. Assembly dil dosyasını programınızdan gerçek kodla (açıklama olarak) not edebilirsiniz. Bu şekilde, derleyicinizin her dil yapısı için tam olarak ne yaptığını görebilirsiniz. ASM dosyasını kaynak düzeyinde hata ayıklamayı mümkün kılacak şekilde ek açıklama yapmak mümkün olabilir (bu araçlarla çalıştığımdan bu yana çok uzun zaman geçti).

Dil tasarımında çalışacaksanız, hemen hemen kesinlikle x86 montaj dilini bilmeniz gerekecektir. Böylece, harcadığınız zaman harcanmaz. Ve CISC talimat seti gerçekten sorun değil. Kayıtları ve farklı adresleme modlarını anlamak için birkaç saatlik bir çalışma sürecek ve bir başka meclis dili ile çalışmış olmanız koşuluyla bir haftadan az bir süre daha az yeter.

JVM, lua veya .NET için bayt kodunun çıkarılması bir başka makul yaklaşımdır, ancak bunu yaparsanız, VM tarafından yapılan varsayımlara kendinizi bağlayabilirsiniz. Ve dediğiniz gibi, VM ile ilgili ayrıntılı bilgi gerektirecektir. Muhtemelen popüler VM'lerin ihtiyaç duyduğunuz özelliklere sahip olması muhtemeldir, bu yüzden seçim gerçekten yeteneklerden ziyade bir tercih meselesidir.

LLVM iyi bir seçimdir. Bu güçlü ve giderek popüler hale geliyor. LLVM IR'yi çıkarırsanız, başkalarının kodlarıyla etkileşime girme olasılığınız çok yüksektir ve onların sizinkilerle etkileşimde bulunmalarını sağlayın. Derleyiciler veya dil tasarımı alanında bir iş arıyorsanız, LLVM'in çalışmalarını bilmek kesin bir artıdır.

Diğer sanal makinelerde biraz daha deneyim kazanmadan önce, kendi sanal makinenizi tasarlamanızı ve uygulamanızı önermemeliyim, böylece uygulamada yaptıkları zorlamaları görebilir ve anlayabilirsiniz. Bu yola girerseniz, JVM, lua, .NET ve diğer birçok VM'leri öğreneceksiniz. Bunu yapmamayı söylemiyorum ama bunu yapmak, dil tasarımını keşfetme amacından uzaklaşmanızı sağlayacaktır. Bilgi nadiren yararsızdır. Kullanmaya karar verdiğiniz şey, yeni şeyler öğrenmenizi gerektirecektir. Ve hepsi bu kadar iyi. Ancak dil tasarımı üzerinde konsantresi'u istiyorsanız, özellikle dil tasarımı olmayan en az miktarda iş gerektiren çıktı biçimini seçin. Elbette yeteneklerle tutarlı.

Seçenekleriniz arasında, üniversitenizin VM'si kapalı gibi görünüyor. Kendi VM'nizi tasarlamanın da dışarıda olduğunu söyleyebilirim. Diğer üçünden, muhtemelen LLVM ile giderdim. Ama sonra, x86 montajına çok aşinayım, bu yüzden LLVM'yi öğrenme fikri biraz çekicidir.

+2

Çok kapsamlı yanıt için teşekkürler! Şimdi LLVM IR'ye çok eğiyorum. Daha sonra kendi x86 arka planımı yaparken ayrı ayrı bakacağım. Dil tasarımı veya derleyicilerde profesyonel çalışma yapmayı planlamıyorum, fakat x86 montajı herhangi bir programcı için değerli bir bilgidir. –

5

Programming Languages ZOO sayfama bakın. Bazı sanal makineler ve bir araya getirilmiş montaj (bir yığın makinesi) de dahil olmak üzere, dillerin bir dizi oyuncak uygulaması vardır. Başlamana yardım etmeli.

+0

Bu eğlenceli faktörü tamamen mahvetmez miydi? Başka birinin derleyicisini kopyalayarak Man Over Machine'in heyecanını alamazsınız. –

+1

Kopyalamayı asla söylemedim, ama tekerleği yeniden icat etme amacı nedir? Bu uygulamalar, çok sayıda yorum da dahil olmak üzere, 500 satıra göre çok kısa. Onlar gerçek programlama dilleri değildir. –

+0

Bence bunlar harika! Dil tasarımında tamamen deneyimsiz olmak, mantığın paradigma ve prensiplerin oldukça geniş bir yelpazesi olduğu düşüncesiyle, ilk denememde tamamen yeni bir şey icat etmeyi beklemiyorum. Farklı fikirlerle uğraşmak, hangileri iyi bir şekilde birbirine bağladığınızı görmek ve onları uygulamak için neler gerektiğini görmek daha çok ilgimi çekiyor. Bu amaçla, bu örneklerin çok yardımcı olabileceğini düşünüyorum. Sağol Andrej! –

1

Sadece dil ile oyun oynamak, yorumlanmış bir dil hakkında ne düşünüyorsunuz? AST'nin hala çalışma zamanında olmasına rağmen, çok güzel şeyler yapmanıza izin verir.