Neden kaynak kodunun yerine sözdizimi ağacını saklamıyoruz?


111

Çok fazla programlama dilimiz var. Her dil ayrıştırılır ve kod yazılmadan önce sözdizimi kontrol edilir, böylece soyut bir sözdizimi ağacı (AST) oluşturulur.

Bu soyut sözdizim ağacımız var, neden bu sözdizimi ağacını kaynak kodu yerine (ya da kaynak kodunun yanında) saklamıyoruz?

Kaynak kod yerine bir AST kullanarak. Bir takımdaki her programcı bu ağacı istediği herhangi bir dile (uygun bağlamda serbest gramer ile) seri hale getirebilir ve bittiğinde AST'ye geri dönebilir. Bu, kodlama stili soruları hakkındaki tartışmayı ortadan kaldıracak ({ve} nereye, boşluk bırakacak, girintiyi vb. Nereye koyacağınız).

Bu yaklaşımın artıları ve eksileri nelerdir?


37
Lisp normalde soyut bir sözdizimi ağacı olarak yazılır. Algol benzeri dilleri bulamadı.
David Thornley

2
David'in LISP programlarının soyut bir sözdizimi ağacı olduğunu söyleyen tek kişi olduğuna inanamıyorum.
WuHoBirçok

3
Diğer noktalara ek olarak: AST bile son şey değil. Ayrıca kod dışı AST oluşturmak için uzun sürmez. StyleCop'u küçük ish, VS2010 projemde çalıştırdığımda, binlerce satır kod üzerinde düzinelerce farklı AST tabanlı kurallar kullanıyor (bazen bir veya iki saniye). StyleCop'u genişletmek ve özel bir kural yazmak oldukça kolaydır. Kaynak kodun bir AST'ye ayrıştırılmasının iyi anlaşılmış ve nispeten kolay bir sorun olduğunu düşünüyorum. Her şeyden önce iyi dil ve en iyi duruma getirme, optimizasyon ve bütün kütüphaneleri ayrıştırma değil.
Meslek

1
Sonra ayrıştırılan kodu, başka bir dil için kod oluşturmak için o kadar kolay değildir. (Prolog'un örtük birleştirilmesini C'ye nasıl çevirirdiniz?). Çoğunlukla sahip olduğunuz orijinal program için bir AST.
Ira Baxter

3
Ayrıştırma sorunu teknik olarak iyi anlaşılmıştır, ancak dağınık ve kötü dilleri olduğu için C veya C ++ 'ı ayrıştırmak kolay bir iş değildir. Birçok derleyici C veya C ++ 'dan AST'leri ayrıştırır: Clang, GCC, ... Program depolaması için tasarlanmamıştır ve GCC kötü bir şekilde bir program analiz aracı değil derleyici olmak ister. DMS Software Reengineering Toolkit, birçok C ve C ++ lehçesini ayrıştırır, AST'ler, sembol tabloları ve çeşitli akış analizi eserleri üretir. Bu yaklaşımın en büyük Pro'su otomatik değişim araçları üretme yeteneğidir. semanticdesigns.com/Products/DMS/DMSToolkit.html
Ira Baxter

Yanıtlar:


72

Boşluk ve Yorumlar

Genellikle bir AST boşluk, satır sonlandırıcılar ve yorumlar içermez.

Anlamlı Biçimlendirme

Çoğu durumda bunun pozitif (kutsal savaşları biçimlendirmeyi ortadan kaldırır) olduğu doğru, orijinal kodun biçimlendirilmesinin çok satırlı dizgenin değişmezleri ve "kod paragrafları" gibi bazı anlamlar taşıdığı durumlar var (blokları ayırarak) boş satırlı ifadeler).

Derlenemeyen kod

Birçok ayrıştırıcı eksik sözdizimine karşı çok dirençli olsa da, hatalı kod sık sık çok garip bir sözdizimi ağacına neden olur; bu da kullanıcının dosyayı yeniden yüklediği noktaya kadar ince ve karanlıktır. IDE'nizde bir hata yaptınız ve sonra aniden tüm dosyanın "dalgalı" olduğu oldu mu? Bunun başka bir dilde nasıl yükleneceğini hayal edin.

Belki kullanıcılar çözülemeyen bir kod vermezler, ancak kesinlikle yerel olarak kaydetmeleri gerekir.

İki dil mükemmel eşleşmiyor

Diğerlerinin de belirttiği gibi, mükemmel özellik paritesine sahip neredeyse iki dil yok. Düşünebileceğim en yakın VB ve C #, veya JavaScript ve CoffeeScript, ancak VB bile C # ile tam olarak eşdeğer olmayan XML Literals gibi özelliklere sahip ve JavaScript'ten CoffeeScript'e dönüşüm birçok JavaScript değişmezine neden olabilir.

Kişisel deneyim:

Yazdığım bir yazılım uygulamasında, kullanıcıların arka planda JS'ye dönüştürülen "sade İngilizce" ifadelerini girmeleri beklendiği için bunu yapmamız gerekiyor. Yalnızca JS sürümünü saklamayı düşündük, ancak güvenilir bir şekilde yüklenen ve kaldırılan şekilde yapmak için neredeyse kabul edilebilir bir yol bulamadık, bu nedenle her zaman hem kullanıcı metnini hem de JS sürümünü ve "düz ingilizce" olarak belirtilen bir bayrağı sakladık. msgstr "sürüm tamamen ayrıştırılmış veya ayrılmamış.


9
AST'de yorum ve düzen yakalayan ayrıştırıcılar var. DMS Software Rengineering Toolkit bunu çok iyi yapıyor. Yasadışı kodla zor zamanlar geçiriyor; Kesin bir dil ayrıştırıcı var.
Ira Baxter

2
Aslında Javascript'i CoffeeScript'e dönüştüren bir araç var , bu yüzden Javascript ve CoffeScript'in Javascript değişmezleri ile karşılıklı olarak çevrilebildiğini düşünüyorum.
Peter Olson

İlginç bir araç, Peter, farkında değildim.
Kevin McCormick

Anlamlı biçimlendirme ve ilginç kişisel deneyim için +1. - Soru için beyaz boşluklar önemsizdir ve yorumlar saklanabilir. Hatalı kodlar yine de düzeltmek daha kolay olurdu ve elbette "hepsine hükmedecek bir dil" sorusunun bir kısmına ulaşılamazdı.
cregox

43

Neden kaynak kodu yerine bu sözdizimi ağacını saklamıyoruz? Bir takımdaki her programcı bu ağacı herhangi bir dile serileştirebilir, istedikleri zaman bitirip AST'ye geri döndürebilirler.

Aslında, bu makul bir fikir. Microsoft’un 1990’larda neredeyse aynısını yapmak için bir araştırma projesi vardı .

Birkaç senaryo akla geliyor.

Birincisi oldukça önemsizdir; Dediğiniz gibi, AST'nin, boşluk bırakma ve benzeri şeyler için farklı programcıların tercihlerine bağlı olarak farklı görünümlerde sunulmasını sağlayabilirsiniz. Ancak, bir AST'yi depolamak bu senaryo için fazla önemlidir; Sadece kendine güzel bir yazıcı yaz. Editörünüze bir dosya yüklediğinizde, tercih ettiğiniz formata koymak için güzel yazıcıyı çalıştırın ve kaydettiğinizde tekrar orijinal formata dönün.

İkincisi daha ilginç. Soyut sözdizimi ağacını saklayabiliyorsanız, o zaman kod farklılaşması bir değişiklik metinsel değil, sözdizimsel hale gelir. Kodun taşındığı yeniden yapılanmaların anlaşılması çok daha kolay hale gelir. Tabii ki, ağaç dibi algoritmalarını yazmanın tamamen önemsiz olmadığı ve genellikle dil bazında yapılması gerektiği elbette. Metin fark hemen hemen her dil için çalışır.

Üçüncüsü, Simonyi'nin Kasıtlı Programlama için öngördüğü şeye benzer: programlama dillerinde ortak olan temel kavramların seri hale getirilmiş olması ve daha sonra farklı dillerde oluşturulan bu kavramların farklı görüşlerine sahip olmanız. Güzel bir fikir olsa da, çirkin gerçek, dillerin ayrıntılarında, en düşük ortak paydalı bir yaklaşımın gerçekten işe yaramadığından yeterince farklı olmasıdır.

Yani, kısacası, bu çok hoş bir fikir ama nispeten küçük bir fayda için muazzam miktarda ekstra iş. Bu yüzden pek kimse bunu yapmaz.


3
Aslında, ağaç farkını bağımsız bir dilde yapabilirsiniz. Ağaçları inşa etmek için dile özgü ayrıştırıcılara ihtiyacınız var. AST'leri birçok dil için karşılaştıran Smart Differencer araç serimize bakın. Hepsi aynı difüzör motorunu kullanır. semanticdesigns.com/Products/SmartDifferencer
Ira Baxter

1
Bir gün Visual Studio'da yüklenen ve benim tarzımda baskı yapan bir ekip stilinde bir gün Visual Studio'da görmeyi umuyorum ... yıllardır umut ediyordum ... henüz şansım yok ...
Roman Starkov

19

Bunun tam olarak bayt kodunun .NET'te olduğunu iddia edebilirsiniz. Infact redgate'in reflektör programı byte kodunu bir dizi .NET programlama diline çeviriyor.

Ancak, bazı sorunlar var. Sözdizimi, bir dilde temsil edebileceğiniz, diğer dillerde temsili olmayan şeyler olduğu sürece dile özgüdür. Bu, C ++ ile tüm 7 erişim seviyelerine erişimi olan tek .NET dili olan .NET'te gerçekleşir.

.NET ortamı dışında çok daha zor olur. Her dil daha sonra kendi kitaplıklarını oluşturmaya başlar. Simüler problemleri çok farklı şekillerde çözdüklerinde aynı talimatların uygulanmasını yansıtan hem C hem de Java dilinde genel bir sözdizimini yansıtmak mümkün olmazdı.


5
Hiç F # tarafından üretilen MSIL çözme denediniz mi?
SK-mantığı

12

Fikrinizden bazılarını beğeniyorum, ancak dili diline çevirmenin ne kadar kolay olduğunu çok abartıyorsunuz. Bu kadar kolay olsaydı, AST'yi saklamanıza bile gerek kalmazdı, çünkü X dilini her zaman AST'ye ayrıştırırdınız, sonra AST'den Y'ye gidersiniz.

Ancak, derleyici özelliklerinin AST'nin bir kısmını bir tür API aracılığıyla gösterme konusunda biraz daha fazla düşünmesini diliyorum. En boy yönelimli programlama, yeniden düzenleme ve statik program analizi gibi şeyler, zaten bir derleyici yazarlar tarafından uygulanmakta olan çalışmaların çoğunu yinelemek zorunda olan bu yeteneklerin uygulayıcısı olmadan, böyle bir API ile uygulanabilir.

Programcının bir programı temsil etmek için veri yapısının dizeleri içeren bir sürü dosya gibi olması gariptir.


5
VBc ve C # derleyicilerini API olarak açmak için Microsoft'un " Roslyn " projesinin geliştirilmesini takip ediyor musunuz? Mevcut bir önizleme sürümü var.
Carson63000

11

En belirgin noktaların şunlar olduğunu düşünüyorum:

  • Avantaj yok. Herkesin evcil hayvan dilini kullanabileceği anlamına geldiğini söylediniz. Ancak bu doğru değil - bir sözdizimi ağacı gösterimi kullanmak yalnızca sözdizimsel olanları değil, sözdizimsel farklılıkları ortaya çıkarır. Çok benzer diller için bir ölçüde çalışır - böyle bir VB ve C # veya Java ve Scala. Ama tamamen orada bile değil.

  • Sorunlu. Dil özgürlüğünü kazandınız, ancak araç özgürlüğünü kaybettiniz. Artık okumak ve bir metin editörü kod, hatta herhangi bir IDE düzenleyebilirsiniz - Eğer bağlı okuma ve kod düzenleme her ikisi için AST temsilini konuşan belirli bir araç üzerinde. Burada kazanılan hiçbir şey yok.

    Bu son noktayı göstermek için, güçlü bir BASIC lehçesinin tescilli bir uygulaması olan RealBasic'e bakın. Bir süre için, neredeyse dilin çıkarabileceği gibi görünüyordu, ancak tamamen satıcıya bağlıydı, yalnızca kendi IDE'sindeki kodu görebiliyordu, çünkü özel bir metin dışı formatta kaydedilmişti. Büyük hata.


4
Potansiyel yararı, basit IDE seçeneklerine çevrilebildiklerinden, "üyeler önünde sekmelere karşı boşluklar", "unix'e karşı pencereler / girinti", "m_ önekleri" gibi bitmeyen tartışmaları sona erdirebilir.
nikie

1
@nikie Doğru, ancak bunu zaten yeniden biçimlendirme araçlarını - like astyleveya UnniversalIndent kullanarak yapabilirsiniz. Arcane ikili formatlarına gerek yoktur.
Konrad Rudolph

2
Asıl yarar, size gerçekten neyin değiştiğini daha iyi anlamanızı sağlayan farklı araç / yama araçlarına sahip olma potansiyeli olacaktır. Ancak bu, sürüm kontrolü için yepyeni bir alet zincirine ihtiyaç duyulduğu anlamına geliyor, bu da ciddi bir sınırlama.
Peter Taylor

1
"Faydası yok" olduğunu düşünüyorsanız, Intentional Software'in Domain Workbench'ini görmediniz.
Craig Stuntz

1
Özetle, aynı mantık, programcı olmayanlar için kuralları erişilebilir kılan, bütün metin tabanlı değil, farklı gösterimlere yansıtılabilir. Örneğin, aktüerler gibi alan uzmanları bir sigorta uygulamasının aktüeryal kısımlarını yazabilirler. Bu sunumla sınırlı olmayan bir DSL gibi. Bununla birlikte, bu soru ile çok ilgili. Orada iyi bir demo .
Craig Stuntz

6

Hem metni hem de AST'yi saklarsanız, o zaman gerçekten bir şey eklememişsinizdir, çünkü metin zaten bir dildedir ve AST, metinden hızla yeniden oluşturulabilir.

Öte yandan, yalnızca AST'yi depolarsanız, geri dönüşü olmayan yorumlar gibi şeyleri kaybedersiniz.


6
ve açıklamaları sözdizimi ağacının bir parçası yaparsanız (herhangi bir şeyin çocuğu olabilecek yorum düğümleriyle)?
cırcır ucube

Araçlarımız tam olarak bunu yapıyor. Bu konudaki diğer yorumlarımı gör.
Ira Baxter

4

Bu fikrin teoride ilginç olduğuna inanıyorum, ancak farklı programlama dilleri, diğer dillerde eşdeğer olmayan farklı yapıları desteklediğinden çok pratik değil.

Örneğin, X ++ 'da, çok fazladan fazla kod olmadan (fazladan sınıflar, fazladan mantık vb.) C # ile yazılamayan bir' while select 'ifadesi vardır. http://msdn.microsoft.com/en-us/library/aa558063.aspx

Burada söylediğim şey, birçok dilin aynı dilin büyük kod bloklarına veya diğerlerinde hiç bulunmayan öğelere bile çeviren sözdizimsel şekere sahip olduğu. AST yaklaşımının işe yaramayacağına bir örnek:

X dili, 4 ifadesinde AST dilinde çevrilmiş bir K anahtar sözcüğüne sahiptir: S1, S2, S3 ve S4. AST şimdi Y diline çevrildi ve bir programcı S2'yi değiştirdi. Şimdi X’e yapılan çeviriyle ne olacak? Kod, tek bir anahtar kelime yerine 4 ifadeye çevrilmiş ...

AST yaklaşımına karşı son argüman platform işlevleridir: bir işlev platforma gömülü olduğunda ne olur? .NET'in Environment.GetEnvironmentVariable gibi. Nasıl çeviriyorsun?


4

Bu fikre dayanan bir sistem var: JetBrains MPS . Bir editör biraz tuhaf, ya da sadece farklı, ama genel olarak böyle büyük bir problem değil. Diğer editörler, - En büyük sorun normal metin tabanlı araçlarından herhangi kullanamaz yüzden, artık bir metin olmadığını, iyi olduğunu grep, sedbirleştirmek ve fark araçları, vb


2
... ancak kutudan çok sayıda editör özelliği elde edersiniz . Bu cevabı biraz daha genişletmeyi düşünün, kaynak kodunu metin olarak saklamamanın avantajlarına biraz daha fazla girmeyi hak eden çok ilginç bir teknoloji. Örneğin, bu soruya tabla boşluklarla ilgili cevap verdim .
Steven Jeuris 11:11

AST, insan tarafından okunabilir biçimde ve ikilik olarak kaydedilmeyebilir. Artık linux araçları ile örneğin serileştirilebilir nesne parametresi olarak alan koddaki her yöntemi değiştirebilir misiniz? yazmak çok zor olurdu, ama AST bunu çok kolaylaştırıyor.
IAdapter

1
İnsanlar sürekli bu hatayı yapar. AST, yalnızca ham metninize sahip olmanızdan daha kolay hale getirir. Ama ilginç bir şey için, bir sürü ek bilgiye ihtiyacınız var: kontrol ve veri akışı, sembol tabloları, aralık analizi,… AST'ler yardım eder ancak gerçekte ihtiyaç duyulanın sadece küçük bir kısmıdır.
Ira Baxter,

@Ira Baxter, elbette AST ile daha kolay. Ancak mevcut altyapıya entegre olmak çok daha zor .
SK-mantığı

4

Aslında, genellikle AST'leri depolayan ve editörlerinde AST'nin bir projeksiyonunu belirli bir dile geri döndüren "dil tezgahları" olarak bilinen birkaç ürün vardır. @ Sk-mantığın dediği gibi, JetBrains'in MPS'si böyle bir sistemdir. Bir diğeri, Kasıtlı Yazılımın Kasıtlı Çalışma Tezgahıdır.

Dil çalışma tezgahları için potansiyel, etki alanına özgü bir projeksiyon oluşturabileceğiniz için, özellikle etki alanına özgü diller alanında çok yüksektir. Örneğin, Kasıtlı, devre şeması olarak projelendirilen elektriğe ilişkin bir DSL gösterecektir - bir alan uzmanının konuşması ve eleştirmesi için metin tabanlı bir programlama dilinde açıklanan bir devreden çok daha kolay ve daha doğru.

Uygulamada, dil tezgahlarının anlaşılması yavaş olmuştur çünkü DSL çalışmasının yanı sıra geliştiriciler muhtemelen tanıdık, genel bir programlama dilinde çalışmayı tercih ederler. Bir metin editörü veya programlama IDE'si ile kafa kafaya karşılaştırıldığında, dil tezgahları tonlarca ek yüke sahiptir ve avantajları neredeyse net değildir. Gördüğüm dil çalışma tezgahlarının hiçbiri kendilerini kendi IDE'lerini kolayca uzatabilecekleri bir noktaya kadar zorlamadılar - yani, eğer çalışma tezgahları üretkenlik için harikaysa, neden çalışma tezgahı araçları daha iyi hale gelmedi? -ve daha hızlı ve daha hızlı fiyatlarda daha iyi?


Bir "dil tezgahı" mutlaka AST'ların depolanmasına dayanmamalıdır. Düz metin sözdizimi de olabilirler, örneğin meta-alternative.net/pfront.pdf dosyasına bakın (ve bu aslında Visual Studio ve Emacs editörünü üzerine uygulanan herhangi bir eDSL ile genişletiyor).
SK-mantığı

Bu ilginç bir makale; bana birkaç hafta önce SPLASH / OOPSLA’de sunulan SugarJ adında bir aracı hatırlatıyor (hırsı değil, uygulamada değil): uni-marburg.de/fb12/ps/research/sugarj
Larry OBrien

ilginç, onu da deneyeceğim.
SK-mantığı

3

Aklımı okuyordun.

Bir kaç yıl önce bir derleyici dersi aldığımda, bir AST alıp seri hale getirdiyseniz, normal infix notasyonu yerine önek notasyonu ile keşfetti ve tüm ifadeleri sınırlandırmak için parantez kullandığınızda Lisp elde ettiğinizi keşfettim. Lisans çalışmalarımda Scheme (Lisp lehçesi) hakkında bir şeyler öğrenmeme rağmen, bunun için hiçbir zaman takdir almadım. Bu kursun bir sonucu olarak Lisp ve lehçeleri için kesinlikle bir takdir kazandım.

Önerdiğiniz ile ilgili sorunlar:

  1. Bir grafik ortamda AST oluşturmak zor / yavaş. Ne de olsa çoğumuz bir fareyi hareket ettirebileceğimizden daha hızlı yazabiliriz. Yine de, ortaya çıkan bir soru "program kodunu bir tabletle nasıl yazıyorsunuz?" Bir tablete yazmak, donanım klavyesine sahip bir klavyeye / dizüstü bilgisayara kıyasla daha yavaş / zahmetlidir. Bileşenleri bir paletteki büyük bir tuval üzerinde bir tuval üzerine sürükleyip bırakarak bir AST oluşturabilirseniz, tabletteki bir dokunmatik ekran cihaz programlaması gerçek bir şey olabilir.

  2. Mevcut araçlarımızdan az / hiç biri bunu desteklememektedir. Giderek daha karmaşık IDE'ler ve gittikçe akıllı hale gelen editörler yaratma konusunda onlarca yıllık gelişimimiz var. Metni yeniden biçimlendirmek, metni karşılaştırmak, metin aramak için tüm bu araçlara sahibiz. Ağaçta normal ifade aramaya eşdeğer olabilecek araçlar nerededir? Ya da iki ağaç arasında bir fark? Bütün bunlar kolayca metinle yapılır. Fakat sadece kelimeleri karşılaştırabilirler. Değişken bir adı değiştirin, öyle ki kelimeler farklıdır, ancak anlamsal anlam aynıdır ve bu farklı araçlar sorunla karşılaşır. Metin yerine AST'ler üzerinde çalışmak üzere geliştirilen bu tür araçlar, anlamsal anlamın karşılaştırılmasında daha yakın olmanızı sağlar. Bu iyi bir şey olurdu.

  3. Program kaynak kodunu bir AST'ye dönüştürmek nispeten iyi anlaşılırken (derleyiciler ve tercümanlarımız var, değil mi?), AST'yi program koduna dönüştürmek o kadar iyi anlaşılmamıştır. Büyük, bileşik bir sayı elde etmek için iki asal sayının çarpılması nispeten basittir ancak büyük, bileşik bir sayıyı asal sayılara geri döndürmek çok daha zordur; AST'leri ayrıştırma vs ayrıştırma ile buradayız. Dillerin arasındaki farklar bir sorun haline gelir. Belirli bir dilde bile, bir AST'yi ayrıştırmanın birçok yolu vardır. Örneğin, bir nesne koleksiyonunda yineleme ve bir tür sonuç elde etme. Bir dizi boyunca yineleme, bir for döngüsü kullanın? Bu kompakt ve hızlı olurdu, ancak sınırlamalar var. Bir çeşit yineleyici kullan, Koleksiyonda mı çalışıyorsunuz? Bu Koleksiyon değişken büyüklükte olabilir ve bu da (mümkün) hız pahasına esneklik katar. Harita indirgeme? Daha karmaşık, ancak örtük olarak paralelleştirilebilir. Ve bu sadece tercihlerinize bağlı olarak Java için.

Zamanla, geliştirme çabası harcanacak ve dokunmatik ekranları ve AST'leri kullanarak geliştireceğiz. Yazma bir gereklilikten daha az olacak. Nerede olduğumuza dair mantıklı bir ilerleme olarak görüyorum, bugün bilgisayarları nasıl kullandığımızı inceliyoruz.

Zaten ağaçlarla çalışıyoruz. Lisp yalnızca seri hale getirilmiş AST'ler. XML (ve HTML, uzantı olarak) yalnızca serileştirilmiş bir ağaçtır. Arama yapmak için zaten birkaç prototipimiz var: XPath ve CSS (sırasıyla XML ve HTML için). CSS tarzı seçiciler ve değiştiriciler oluşturmamızı sağlayan grafiksel araçlar oluşturulduğunda, # 2'nin bir kısmını çözmüş olacağız. Bu seçicilerin regex'leri destekleyecek şekilde genişletilebildiği durumlarda, daha yakın olacağız. İki XML veya HTML belgesini karşılaştırmak için hala iyi bir grafiksel fark aracı arıyorum. İnsanlar bu araçları geliştirdikçe, # 2 çözülebilir. İnsanlar zaten böyle şeyler üzerinde çalışıyor; Onlar henüz orada değiller.

Bu AST'leri programlama dili metnine koyabildiğimi görebilmemin tek yolu, hedef arayan bir şey olabilir. Var olan kodu değiştiriyorsam, hedef, değiştirilmiş kodumu başlangıç ​​koduna mümkün olduğunca benzer yapan bir algoritma ile gerçekleştirilebilir (minimum metinsel fark). Sıfırdan kod yazıyorsam, hedef en küçük, en dar kod olabilir (muhtemelen bir döngü için). Veya olabildiğince verimli bir şekilde paralelleştirilen kod olabilir (muhtemelen bir harita / küçültme veya CSP içeren bir şey). Dolayısıyla, aynı AST, hedeflerin nasıl belirlendiğine bağlı olarak aynı dilde bile önemli ölçüde farklı kodlara neden olabilir. Böyle bir sistemin geliştirilmesi # 3'ü çözecektir. Hesaplamalı olarak karmaşık olacaktı, bu da muhtemelen bir çeşit müşteri-sunucu düzenlemesine ihtiyacımız olacağını,


1

Amacınız, stilleri biçimlendirme hakkındaki tartışmayı ortadan kaldırmaksa, belki de istediğiniz şey bir kaynak dosyada okuyan, kişisel görüntüleme ve düzenleme tercihinize göre biçimlendiren, ancak kaydederken, seçilen stile göre biçimlenen bir editördür. kullanır.

Emacs gibi bir editör kullanıyorsanız oldukça kolaydır . Dosyanın tamamının biçimlendirme stilini değiştirmek üç komutlu bir iştir.

Ayrıca yükleme sırasında bir dosyayı otomatik olarak kendi tarzınıza dönüştürmek ve kaydederken onu takım stiline dönüştürmek için kancalar oluşturabilmelisiniz.


1
O zaman hala anlamsal bir fark ve birleşmeye ihtiyacınız olacak (yani, yine AST seviyesi).
SK-mantığı

Hayır, editör kaynağın depolanması için yeniden takım stiline dönüşür; böylece bir kaynak türünü aynı türle karşılaştırırsınız.
Gustav Bertram

iyi bir nokta, tek bir normalleştirilmiş temsil tüm sorunları çözer
SK-mantık

1
Hayır, sadece kimlik için iki dosyayı bölme problemlerini çözer. Dosyalar arasındaki farkları görmek istiyorsanız, ideal olarak yapıyı anlayan bir şeye ihtiyacınız vardır. Emaclarımı seviyorum ama yapıyı anlamıyor.
Ira Baxter,

Emacs harika, ama ben bunu asla dağılmak için kullanmıyorum. Check-in işleminden önce kaynak ağacımı dağıtmak için her zaman meld kullanıyorum . Aslında SVN ve git'i anlıyor. Windows'ta muhtemelen WinMerge'i kaplumbağa ile birlikte kullanırdım .
Gustav Bertram

1

Kaynak kod yerine AST'yi okumak ve değiştirmek zordur.

Ancak, derleyici ile ilgili bazı araçlar AST kullanımına izin vermez. Java bytecode ve .NET Intermediate kodu bir AST'ye benzer şekilde çalışır.


1
Bir AST'yi mekanik aletlerle güvenilir bir şekilde değiştirmek, metinle yapmaktan daha kolaydır. Bunu desen yönlendirmeli değişikliklerle yapabilirsiniz. Bkz semanticdesigns.com/Products/DMS/ProgramTransformation.html
Ira Baxter

2
Bunu şimdi LİSPERS'lere söyle ...
hugomg

@Ira Baxter. Aslında, doğrudan bir AST ile çalışan özel bir görsel araç üzerinde çalışıyorum, ancak bazen geliştiricilerin görsel yerine metinle çalışması gerekiyor. Bazı AST metinlerde daha kısa bir programlama dili olarak da temsil edilir.
Umlcat

@umlcat, AST'ler için görsel bir araç üzerinde çalışmalarınız hakkında daha fazla bilgi verebilir misiniz?
Daniel Albuschat

@Daniel Albuschat Bir evcil hayvan programlama dili projesi üzerinde çalışıyorum. Uygulaması zor, bu yüzden şu an için atladım ve AST'yi gösterdiğim bir aracı yaptım (ağaç izleme kontrolü ile) ve ifadeleri doğrudan ekle. Ve bunun tersini yapabilir, AST kodunu oluşturabilirsiniz.
umlcat

0

güzel bir fikir; fakat her dilin AST'si diğerinden farklıdır.

Bildiğim tek istisna, microsoft'un "farklı sözdizimiyle aynı dil" olduklarını iddia ettiği VB.NET ve C # için. Diğer .NET dilleri (IronPython, F #, her neyse) bile AST düzeyinde farklıdır.

JVM dilleri ile aynı şey, hepsi aynı bytecode'u hedefliyor, ancak dil yapıları farklı, farklı diller ve farklı AST'ler yapıyor.

CoffeScript ve Xtend gibi 'ince katman' dilleri bile, altta yatan diller teorisinin çoğunu paylaşır (sırasıyla JavaScript ve Java); ancak AST düzeyinde tutulması gereken (ya da olması gereken) daha üst düzey kavramları tanıtın.

Eğer Xtend bir Java AST'den yeniden kurulabilirse, mevcut Java kodundan sihirli bir şekilde daha yüksek seviyelerde soyutlamalar yaratan bir Java'dan Xtend'e 'derleyici' olarak tanımlanacağını düşünüyorum.


1
Hem C # hem de VB derleyicilerini yakından tanıyan biri olarak size kesinlikle benzer olduklarını söyleyebilirim, ancak bunları "farklı sözdizimiyle aynı dil" olarak kabul etmenin pratik olmadığı kadar farklı, yeterince önemli bir ayrıntı var. Bunu Roslyn projesi için yapmayı düşündük; her iki dili de eşit imkanla derleyebilecek tek bir derleyici oluşturmak - ve çok tartışmadan sonra iki dil için iki derleyici ile birlikte çalışmaya karar verdi.
Eric Lippert

@EricLippert: Bu bir utanç. Her iki dili de öğrenmeyi planladığımdan değil, ama hoş bir istisna gibi geldi. Sanırım htat lisp benzeri Dylan ve algol benzeri Dylan'ı 'farklı sözdizimleriyle aynı dilde' bırakıyor.
Javier
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.