Bir dil geliştirme çerçevesinin kullanımı ne kadar kolay olmalı?


11

Bu, dil tasarımında kullanılan kavramları bir çerçeve şeklinde soyutlamayı amaçlayan Soyutlama Projesi adlı bir projeye odaklanan bir dizi sorunun bir parçasıdır.

Yapısal yazımla ilişkili başka bir sayfa burada görülebilir . Çerçeve ve gönderilecek uygun yerle ilgili bir soruşturmayla ilişkili meta-konu burada bulunabilir .

Bir Dil Geliştirme Çerçevesi kullanmak ne kadar kolay olmalı?

Sonucu dile özgü derleyiciye gönderme yeteneğini de içeren büyük ölçekli kod oluşturma çerçeveleri yazdım. Kullanım kolaylığı konusu böyle bir çerçeve örneğinden gelir: CodeDOM veya Kod Belgesi Nesne Modeli.

Microsoft tarafından yazılmış ve ortak kod yapılarını tanımlayan bir çerçevedir, ancak genel olarak çok fazla şey bırakmıştır (ifade zorlamaları) ve yaptığınız şeylere dayanarak kötü kodları düzelten, belirli yapıları temsil ederken biraz soyut olma eğilimindedir: CodeDOM kötü yayan ele PrivateImplementationTypeüzerinde CodeMemberMethodkullanılan tip bir genel arabirim iken,. CodeDOM ilk kod üreticimi yazmamın orijinal nedeniydi.

Çerçeveyi basitleştirmek için yapmaya çalıştığım bir şey, bir şey yapmanız gereken iş miktarını azaltmak ve bu eylemleri oluşturan belirli türlere karşı eylemlere odaklanmaktır.

İşte yazdığım çerçevenin nasıl çalıştığının yan yana karşılaştırması:

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

CodeDOM'a karşı:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

Çerçevenin odak noktası dil meraklılarının yanı sıra kod veya uygulama oluşturmakla ilgilenenlerdir. Derleme, kod üretimi ve dil gelişimine odaklandığı için, çerçeve kullanım kolaylığı veya ham güç üzerine mi odaklanmalıdır?

Öncelikli hedefim, bu tür araçların kullanılabilirliğini artırmaktır, bu nedenle alanla ilgilenenler kendi dil merkezli projelerinde çalışmaya başlamadan önce dil teorisi alanında çok fazla deneyime ihtiyaç duymazlar.

Çerçevenin yazarı olduğum göz önüne alındığında, "kullanılabilirlik" konusundaki görüşüm önyargılı. Bu nedenle, bir diğerine, odaklanma ve hedefin projeyle ilişkili olmayan diğerlerine anlamlı olup olmadığını sormalıyım.



6
Bir çerçevenin ham güç pahasına kolay kullanılması gerekip gerekmediği sorusu, "Yüksek seviyeli mimari ve yazılım sistemlerinin tasarımı" nın açık olmadığı Code Review.SE için hiç uygun görünmüyor. orada konu ve burada konu üzerinde. Kod İnceleme, çalışma koduna sahip olduğunuz ve bir eleştiri istediğiniz zaman içindir.

Bir kod üretecine giriş sadece başka bir programlama dilidir. Kod oluşturma arzusu, ürettiğiniz dilin yeterince güçlü olmadığı anlamına gelir. Daha iyi diller yerleşik kod üreteçlerine sahiptir.
kevin cline

@kevincline Bir kod üreticisi için tipik kullanım durumu, genel amaçlı bir kod oluşturma çerçevesi kullanan alana özgü bir dildir. Bu gerçekten bir seçim değil, alternatif, kendi iç ara dilinize derlemek ve bir VM aracılığıyla yorumlamak veya kendinizi daha düşük seviyeli bir yapıya çevirmek olacaktır, ancak sonunda aynı şeyi yapıyorsunuz . Bu çerçevenin yapmayı amaçladığı şey, dinamik olarak kod üretmek için işi yapmanız gerektiğinde, bunu aynı şeyi kendi uygulamanızı kanatlandırmaya karşı kullanacaksınız.
Allen Clark Copeland Jr

Kaynak dilin yetersiz olduğu kadar çok değil, kaynak metinden hedef platforma çevirmek için bir aracı yazılım yazılana kadar bir dil gramerinin sadece metin olması. Bu durumda, Ortak Dil Altyapısı (CLI) veya CLI'yi hedefleyen genel amaçlı dillerde kodlanır. Çerçeve, üst düzey temsiller almak ve bunları IL üretimi için yeterince düşük seviyeli yapılara dönüştürmek konusundaki işlerini ele almayı amaçlamaktadır. Yani bir derleyici, sadece bir derleyiciye ihtiyacınız olduğu için dilinizin yeterince güçlü olmadığı anlamına gelmez. Gereklidir.
Allen Clark Copeland Jr

Yanıtlar:


2

Bir dil geliştirme çerçevesi oluşturmak zor. Ne tür şeyleri desteklemesini istediğinize karar vermelisiniz, o zaman hangisini nasıl yapacağınızı ve bunları nasıl uyumlu bir bütün haline getireceğinize karar vermelisiniz. Son olarak, gerçek dillerle (örneğin, tipik bilgisayar dilleri ve DSL'ler) çalışabilmesi için yeterli yatırım yaptınız ve aslında yararlı bir şey yapıyorlar. Şapkam denemek için sana kapalı.

Çabalarınızı 15 yıl önce başladığım DMS Yazılım Yenileme Araç Seti ile karşılaştırabilirsiniz . DMS, kodun genel amaçlı ayrıştırma, analiz ve dönüşümünü sağlamayı amaçlamaktadır. Açık bir dil spesifikasyonu verildiğinde, kodu ayrıştıracak, AST'leri oluşturacak, AST'lerden kodu yeniden oluşturacak (güzel baskı), hedeflenen programlama dilinde yazılmış kalıpları kullanarak kodu dönüştürecek, sembol tabloları oluşturacak, hesaplama kontrolü ve veri akışı vb. DMS'nin çok çeşitli etkileri gerçekleştirmesini sağlar. (Sitedeki araçlara bakın; hepsi bir şekilde DMS'dir).

İşte DMS teknik bir kağıt is birkaç yıl önce olduğu gibi. (Geliştirmeye devam ediyoruz)

DMS'nin kendisinin oluşturulması zor olsa da, IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (ve diğerleri) dahil olmak üzere DMS'ye gerçek dillerin tanımlanmasında buna karşılık gelen büyük bir mühendislik yığını aldık.

Ne düşündüğümüz (makul derecede iyi): inşaat aletlerinin maliyetini 1-2 büyüklükte azaltın. Bunun anlamı, aksi takdirde 1-10 yıl alabilecek görevlerin sadece ölümlüler tarafından 1 ay-1 yıllık projeler olarak düşünülebilmesidir. Hala kolay olmayan şey:

  • Yeni diller tanımlamak
  • Mevcut dillerin tüm deyimlerini işleme
  • Görevinize özgü özel kodu yazmayı kolaylaştırır
  • Yeni, karmaşık analizlerin tanımlanması
  • Kısmi programları veya hata içeren programları işleme
  • (Başlangıç ​​noktanıza) Uzman olmayanların bu araçları kullanmasını kolaylaştırın

Yani, iyileştirilmesi gereken çok şey var. Birçok çiçek açsın.


0

Bu soru Efsanevi Adam Ayı, "Kavramsal Bütünlük" bölümünde yanıtlanmış olabilir. Değilse, en azından sorunuzla alakalı. Brooks bütün bir bilgi işlem sistemini tasarlamayı açıklasa da, makale çerçeveler ve yeni diller için mükemmel bir şekilde geçerlidir.

Herhangi bir teknolojinin benimsenme hızı ile kavramsal bütünlüğü ve kullanım kolaylığı arasında pozitif bir korelasyon olduğuna inanıyorum. Bu korelasyonu kanıtlamak için diller, çerçeveler ve işletim sistemleri gibi son teknolojiler hakkında bir vaka çalışması yapılmalıdır, ancak henüz bilmiyorum.


Bu cevapla ilgili tek sorunum, gerçek bir değer vermemesi. Kaynaklar bir kitabın bir bölümüdür ve açıklamanızdan yalnızca yazılım paketi yayınlandıktan sonra uygulanabilir. Yayınlanmadan önce bana bir cevap vermiyor, çünkü temelde 'kullanımı kolay ve alanla alakalıysa iyi olacak' diyor. Ne kadar iyi yapacağını söyleyemem çünkü henüz kullanabileceğiniz bir noktaya gelmiyor. Derleyicilerle ilgili olan şey, çok fazla iş yaparsınız, sadece dağın sadece yarısına kadar olduğunuzu anlamak için, ve bu kolay kısmı.
Allen Clark Copeland Jr
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.