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 CodeMemberMethod
kullanı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.