Kaynak kod üretimi bir kalıp karşıtı mı?


118

Bir şey üretilebiliyorsa, o şey kod değil, veridir.

Buna bakıldığında, kaynak kod üretmenin bütün bu fikri bir yanlış anlama değil midir? Diğer bir deyişle, eğer bir şey için bir kod üreticisi varsa, neden gerekli parametreleri alabilen ve "oluşturulacak" kodun yapacağı doğru işlemi yapan uygun bir fonksiyon yapmıyorsunuz?

Performans nedeniyle yapılıyorsa, derleyiciden bir eksiklik gibi geliyor.

İki dilin köprülenmesi için yapılıyorsa, arayüz kütüphanesi eksikliği gibi geliyor.

Burada bir şey mi eksik?

Bu kodun veri olduğunu da biliyorum. Anlamadığım şey neden kaynak kodu ürettiğim ? Neden onu parametreleri kabul edip bunlara etki edebilecek bir fonksiyon haline getirmiyorsunuz?


11
Kod üretimi ile ilgili bir terim metaprogramlamadır
UselesssCat

4
en.wikipedia.org/wiki/Code_as_data , List, FP, komut dosyası, metaprogramming Von Neumann / modifiye Harvard mimarisi vb kaplı oldu bıktıracak . tl; vb "veri" vs "çıkış kodu", "kod" vs dr ayrım "kaynak kod" içindir basitleştirmek şeyler. Asla dogmatik olmamalılar .
vaxquis

9
@Utku, kod oluşturma yapmak için daha iyi nedenler genellikle mevcut dilinizin ifade edebileceğinden daha yüksek bir tanım sağlamak istemekle ilgilidir . Derleyicinin verimli kod oluşturabilmesi veya oluşturamaması, onunla gerçekten ilgisi yoktur. Ayrıştırıcı jeneratör düşünün - bir lexer tarafından üretilen flexveya ürettiği bir ayrıştırıcı bisonneredeyse kesin C elle yazılmış muadillerine göre yürütmek için sık sık daha hızlı, daha öngörülebilir daha doğru ve olacak; ve çok daha az koddan üretilmiştir (bu nedenle daha az bakım çalışması da vardır).
Charles Duffy

1
Belki çok fazla işlevsel unsuru olmayan bir dilden geliyorsunuz, ancak birçok dilde işlevler birinci sınıf - onları geçebiliyorsunuz, yani bu tür dillerde kod veri, ve ona böyle davranabilirsiniz.
Restioson

1
@ İşlevsel bir dil kodundaki röportaj veri değildir. Birinci sınıf fonksiyonlar tam olarak şu anlama gelir: Fonksiyonlar veridir. Ve illa ki özellikle iyi veri değil: onları mutlaka bir miktar değiştiremezsiniz (örneğin, işlevler içindeki tüm eklemeleri çıkarmalara çevirmek gibi). Kod, Homoconic dillerinde veridir. (Homoikonik dillerin çoğu birinci sınıf fonksiyonlara sahiptir. Fakat bunun tersi doğru değildir.).
Lyndon White

Yanıtlar:


150

Kaynak kod üretimi bir model midir?

Teknik olarak, eğer kod üretirsek, insanlar tarafından okunabilen bir metin olsa bile kaynak değildir . Kaynak Kod , bir insan veya diğer gerçek zeka tarafından üretilen, mekanik olarak çevrilmeyen ve (gerçek) kaynaktan (doğrudan veya dolaylı olarak) hemen çoğaltılamayan orijinal koddur.

Bir şey üretilebiliyorsa, o şey veridir, kod değil.

Zaten her şeyin bir veri olduğunu söyleyebilirim . Hatta kaynak kodu. Özellikle kaynak kodu! Kaynak kod sadece programlama görevlerini gerçekleştirmek için tasarlanmış bir dilde bulunan veridir. Bu veriler çevrilebilir, yorumlanabilir, derlenecek, gerektiğinde diğerlerinin veri biçimlerine dönüştürülebilir, bazıları çalıştırılabilir hale gelir.

İşlemci bellekten yönergeleri yürütür. Veriler için kullanılanla aynı hafıza. İşlemci talimatları yürütmeden önce, program veri olarak belleğe yüklenir .

Yani, her şey veridir , hatta koddur .

[Oluşturulan kod veridir] göz önüne alındığında, kod oluşturma fikri bu bir yanlış anlama değil midir?

Derleme işleminde, biri metin olarak ara kod üretme olabilen birden fazla adımın olması mükemmeldir.

Diğer bir deyişle, eğer bir şey için bir kod üreticisi varsa, neden gerekli parametreleri alabilen ve "oluşturulacak" kodun yapacağı doğru işlemi yapan uygun bir fonksiyon yapmıyorsunuz?

Bu bir yol, ama başkaları da var.


Kod üretme çıktısı, bir insan tarafından kullanılmak üzere tasarlanmış bir şey olan metindir.

Tüm metin formları insan tüketimine yönelik değildir. Özellikle, oluşturulan kod (metin olarak) tipik olarak insan tüketimini değil derleyici tüketimini amaçlar .


Kaynak kodu orijinal olarak kabul edilir: usta - düzenlediğimiz ve geliştirdiğimiz; kaynak kod kontrolü kullanarak arşivlediklerimiz. Üretilen kod, insan tarafından okunabilir metin olsa bile, genellikle orijinal kaynak kodundan yeniden üretilir . Genel olarak konuşursak, üretilen kodun derleme sırasında yenilendiğinden kaynak kontrolü altında olması gerekmez.


1
Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
maple_shaft

65

Pratik muhakeme

Tamam, bu kodun veri olduğunu da biliyorum. Anlamadığım şey neden kaynak kodu ürettiğim?

Bu düzenlemeden, teorik Bilgisayar Bilimi yerine oldukça pratik bir düzeyde sorduğunuzu varsayıyorum.

Java gibi statik dillerde kaynak kodu oluşturmanın klasik nedeni, bunun gibi dillerin çok dinamik şeyler yapmak için dil içi araçların kullanımı kolay bir şekilde gelmemesiydi. Örneğin, Java'nın biçimlendirici günlerinde, dinamik veri türleriyle (eşleştirme özellikleriyle) dinamik bir adla (DB'nin tablo adını eşleştirerek) ve dinamik yöntemlerin (o tablodan eşleşen özniteliklerle) kolayca bir sınıf oluşturmak mümkün değildi. bahsedilen niteliklerin tipleri). Özellikle Java, derleme zamanında yazım hatalarını yakalayabilmenin çok önemli olduğunu belirtti.

Bu nedenle, böyle bir ayarda, bir programcı yalnızca Java kodu oluşturabilir ve çok sayıda kod satırını manuel olarak yazabilir. Genellikle, programcı bir masa değiştiğinde, geri dönüp eşleşecek kodu değiştirmesi gerektiğini; ve eğer bunu unutursa, kötü şeyler olur. Bu nedenle, programcı kendisi için bazı araçlar yazdığı noktaya gelecektir. Ve böylece yol daha akıllı kod üretmeye başlar.

(Evet, anında bayt kodunu oluşturabilirsiniz, ancak Java'da böyle bir şeyi programlamak, rastgele bir programcının birkaç satırlık etki alanı kodu yazmak arasında yapabileceği bir şey olmaz.)

Bunu çok dinamik olan dillerle karşılaştırın; örneğin Ruby, çoğu zaman Java'ya karşı olan antitezi düşünürdüm (her iki yaklaşıma da değer vermeden bunu söylediğimi unutmayın; bunlar sadece farklıdır). Burada, çalışma zamanında dinamik olarak sınıflar, yöntemler vb. Üretmek için% 100 normal ve standart bir programdır ve en önemlisi, programcı, "meta" seviyesine girmeden, tam anlamıyla kodda yapabilir. Evet, Ruby on Rails gibi şeyler kod üretme ile geliyor, ancak çalışmalarımızda bunu temelde yeni programcılar için bir tür gelişmiş "eğitim modu" olarak kullandığımızı gördük, ancak bir süre sonra gereksiz hale geliyor (çok az kod olduğu için Bu ekosisteme yazmak için, ne yaptığınızı bildiğinizde, el ile yazmak, oluşturulan kodu temizlemekten daha hızlı olur).

Bunlar "gerçek dünyadan" sadece iki pratik örnektir. Kod nereye Sonra LISP gibi dilleri var olduğunu anlamıyla verileri. Öte yandan, derlenmiş dillerde (Java veya Ruby gibi bir çalışma motoru olmadan), çalışma zamanında sınıf veya yöntem adlarını tanımlayan hiçbir kavram yoktur (ya da modern C ++ özelliklerine uymadım ...), bu yüzden kod oluşturma, derleme işlemi çoğu şey için tercih edilen bir araçtır (diğer C / C ++ 'a özgü örnekler esnek, yacc vb. gibi şeyler olabilir).


1
Bence bu daha çok oy alan cevaplardan daha iyi. Özellikle, Java ve veritabanı programlama ile belirtilen örnek, kod üretiminin neden kullanıldığını ve geçerli bir araç olduğunu ele almakta çok daha iyi bir iş çıkarır.
Panzercrisis

Bugünlerde Java'da bir DB'den dinamik tablolar oluşturmak mümkün müdür? Veya sadece bir ORM kullanarak mı?
Noumenon

“(ya da modern C ++ özelliklerine yetişmedim…)” kesinlikle C ++ 'da fonksiyon işaretçileri sayesinde yirmi yıldan uzun bir süredir mümkün mü? Test etmedim ancak bir karakter dizisi ayırmak, makine kodunu doldurmak ve ilk göstergeyi bir işlev göstergesine bir göstergeye çevirmek ve sonra çalıştırmak için ne olması gerektiğinden eminim. (Hedef platformun bunu yapmanıza engel olacak bazı güvenlik önlemleri olmadığını
varsayalım

1
"bir karakter dizisi tahsis et, onu makine koduyla doldur ve sonra ilk elemana bir göstergeyi işlev göstergesine atlat ve çalıştır?" Tanımlanmamış davranış olmasının yanı sıra, "anında bayt kodunu üret" in C ++ eşdeğeridir. Aynı "sıradan programcılar tarafından dikkate alınmadı" kategorisine giriyor
Caleth

1
@Pharap, "elbette bu C ++ 'da yirmi yılı aşkın bir süredir mümkündü" ... biraz kıkırdamak zorunda kaldım; C ++ 'ı en son kodladığımdan bu yana yaklaşık 2 yıl. :) Ama C ++ hakkındaki cümle zaten kötü bir şekilde formüle edildi. Bunu biraz değiştirdim, şimdi ne demek istediğimi daha net görmeliyim.
2E18'de

44

neden kod oluşturmalı?

Çünkü delikli kartlarla programlama (veya not defterinde alt kodlar ) bir acıdır.

Performans nedeniyle yapılıyorsa, derleyiciden bir eksiklik gibi geliyor.

Doğru. Zorunlu olmadığım sürece performans umurumda değil.

İki dilin köprülenmesi için yapılıyorsa, arayüz kütüphanesi eksikliği gibi geliyor.

Ne demek istediğin hakkında hiçbir fikrin yok.

Şunun gibi bakın: Oluşturulan ve tutulan kaynak kodu her zaman ve sonsuza dek popoda bir acıdır. Sadece bir nedenden dolayı var. Birisi bir dilde çalışmak isterken, bir başkası başka biri üzerinde çalışmakta ısrar eder ve ikisi de aralarında nasıl birlikte çalışacağını bulmak için canını sıkmaz, onlardan biri en sevdikleri dili nasıl uyguladıkları dile nasıl dönüştürebileceklerini belirleyebilir. isterler.

Bunu sürdürmek zorunda kalana kadar bu iyi. Bu noktada hepiniz ölebilirsiniz.

Anti bir kalıp mıdır? Sigh, hayır. Daha önceki dillerin eksikliklerine elveda demeye istekli olmasaydık ve daha eski dillerin kodunu çıkarmaya bile başlamazsak, birçok dil mevcut olamazdı.

Buna dayanamayacağım yarı dönüştürülmüş Frankenstein canavarı patchwork'ünde bırakılan bir kod üssü. Oluşturulan kod dokunulmaz koddur. Dokunulmaz kodlara bakmaktan nefret ediyorum. Yine de insanlar kontrol etmeye devam ediyor. NEDEN? Yürütülebilir dosyayı kontrol ediyor olabilirsiniz.

Peki şimdi rant ediyorum. Demek istediğim hepimiz "kod üretiyoruz". Kaynak kod gibi oluşturulan kodları tedavi ederken, beni çıldırtıyorsunuz. Sadece kaynak kodun kaynak kodunu vermemesine benziyor.


41
Üretirseniz, SOURCE kodu değildir. Ara kod. Şimdi ağlayacağım.
candied_orange

65
ARG !!! Nasıl göründüğü önemli değil !!! Metin, ikili, DNA, KAYNAK değilse, değişiklik yaparken dokunmanız gereken şey bu değildir. Derleme işlemimin içinde geçtiği 42 ara dili varsa, bu iş değil. Onlara dokunmayı kes. Bunları kontrol etmeyi bırakın. Değişikliklerinizi kaynakta yapın.
candied_orange

24
XML metindir ve açıkça insan tüketimi için değildir. :-)
Nick Keighley

38
@utku: "Bir şey bir insan tarafından tüketilmek istemiyorsa, metin olmamalıdır": Tamamen aynı fikirde değilim. Başımın üstündeki bazı karşıt örnekler: HTTP protokolü, MIME kodlamaları, PEM dosyaları - her yerde base64 kullanan hemen hemen her şey. Hiç kimsenin görmemesi durumunda bile, verileri 7 bitlik güvenli bir akıma kodlamanın birçok nedeni vardır. Normalde bir insanın asla etkileşime /etc/
girmemesi

12
"Delikli kartlarla programlama" nın ne anlama geldiğini anlamadığını düşünüyorum. Ben yaptık, orada oldum ve evet, oldu bir ağrı; ancak "oluşturulan kod" ile hiçbir bağlantısı yoktur. Delikli Bir deste sadece bir başka türüdür dosyanın diskteki bir dosyaya --like veya kasete bir dosya veya bir SD kart üzerinde dosya. O zamanlar kartların güvertelerine veri yazar ve onlardan veri okurduk. Bu nedenle, kod üretmemizin nedeni, delikli kartlarla programlamanın bir sorun oluşturmasıydı, bu, herhangi bir veri deposuyla programlamanın bir sorun olduğunu gösteriyor.
Solomon Yavaş

41

neden kaynak kodu oluştur

Kariyerimde birlikte çalışmak zorunda kaldığım kod jeneratörleri için en sık kullanılan durum;

  • girdi olarak bir tür veri modeli veya veritabanı şeması için üst düzey bir meta-açıklama aldı (belki ilişkisel bir şema veya bir tür XML şeması)

  • ve çıktı olarak veri erişim sınıfları için kazan plakası CRUD kodu ve buna karşılık gelen SQL'ler veya belgeler gibi ilave şeyler üretti.

Buradaki fayda, kısa bir giriş spesifikasyonunun bir satırından 5 ila 10 satır hata ayıklanabilir, güvenli yazılabilir, hatasız (kod üretecinin çıktısının olgun olduğu varsayılır) edinilmesidir, aksi takdirde elle uygulamak ve korumak zorunda kalırsınız. Bunun bakım ve gelişim çabalarını ne kadar azalttığını hayal edebilirsiniz.

Ayrıca ilk sorunuza cevap vereyim

Kaynak kod üretimi bir anti patern mi

Hayır, kaynak kod üretme başlı başına değil, ama aslında bazı tuzaklar var. Pragmatik Programcı'da belirtildiği gibi, anlaşılması zor bir kod ürettiğinde kod oluşturucu kullanmaktan kaçınılmalıdır . Aksi takdirde, bu kodu kullanma veya hata ayıklama çabalarının artması, kodu manuel olarak yazmamak suretiyle kaydedilen çabadan kolayca ağır basabilir.

Ayrıca, üretilen kod bölümlerini fiziksel olarak elle yazılmış koddan fiziksel olarak ayırmanın iyi bir fikir olduğunu da eklemek isterim, yeniden oluşturma işlemi herhangi bir elle yapılan değişikliklerin üzerine yazmaz. Bununla birlikte, görevin eski dilde X ile yazılmış bazı kodları diğer dilde, daha modern bir dil Y'ye geçirmesi ve bu durumu daha sonra Y dilinde de sürdürmek niyetiyle bir kez daha ele aldım. bir kerelik kod üretimi için durum.


Bu cevaba katılıyorum. Java için Torque gibi bir şey kullanarak, java kaynak dosyalarının otomatik olarak oluşturulmasını, sql veritabanına uyan alanlarla yapabilirim. Bu, crud operasyonlarını çok daha kolaylaştırır. En büyük yarar, yalnızca veritabanında bulunan alanlara başvuru yapabilmek de dahil olmak üzere tür güvenliğidir (Otomatik tamamlama teşekkür ederiz).
MTilsted

Evet, statik olarak yazılmış diller için bu önemli bir bölümdür: elle yazılmış kodunuzun gerçekte oluşturulan koda uyduğundan emin olabilirsiniz .
Paŭlo Ebermann

"eski dilde yazılmış bazı kodları geçir" - o zaman bile, bir defalık kod oluşturma büyük bir acı olabilir. Örneğin, bazı manuel değişikliklerden sonra jeneratörde bir hata tespit edersiniz ve düzeltmeden sonra üretimi yeniden yapmanız gerekir. Neyse ki, git veya benzeri genellikle ağrıyı hafifletebilir.
maaartinus

13

neden kaynak kodu üretelim?

Oluşturulan (derleme zamanında ve hiçbir zaman teslim edilmemiş) kod için iki kullanım durumuyla karşılaştım:

  1. Alıcıları / ayarlayıcıları, toString, eşittir ve hashCode gibi kazan plakası kodunu, bunları belirtmek için oluşturulmuş bir dilden otomatik olarak oluşturun (örn. Java için lombok projesi)
  2. Ana kodda kullanılacak bazı arayüz özelliklerinden (REST, SOAP, her neyse) otomatik olarak DTO tipi sınıflar oluşturun. Bu, dil köprüsü sorununuza benzer, ancak aynı şeyi oluşturulmuş sınıflar olmadan uygulamaya çalışmaktan daha iyi tip kullanımıyla daha temiz ve basit hale gelir.

15
Anlatım dillerinde çok tekrarlayan kod. Mesela, esastır aynı fakat benzer olmayan veri yapıları için aynı şeyi yapan kod yazmak zorunda kaldım. Muhtemelen C ++ şablonu gibi bir şey yapmış olabilir (hey bu kod üretimi değil mi?). Ama ben C kullanıyordum. Kod oluşturma beni aynı kodlardan çok yazdı.
Nick Keighley

1
@NickKeighley Belki de alet zinciriniz başka bir uygun dil kullanmanıza izin vermedi?
Wilson

7
Genelde uygulama dilinizi seçip seçemezsiniz. Proje C'deydi, bu seçenek değildi.
Nick Keighley

1
@Werder ifade dilleri sıklıkla kod oluşturma (örneğin lisp makrolar, raylar üzerinde ruby) kullanır, bu arada metin olarak kaydedilmeleri gerekmez.
Pete Kirkham

4
Evet, kod oluşturma temelde meta-programlamadır. Ruby gibi diller, dilin kendisinde meta-programlama yapmanıza izin verir, ancak C bunun yerine kod oluşturma kullanmak zorunda değildir.
Sean Burton,

13

Sussmann, klasik “Bilgisayar Programlarının Yapısı ve Yorumlanması” ndaki, özellikle de kod-veri ikiliği hakkında söylenecek çok şey hakkında ilginçti.

Benim için adhoc kod üretmenin asıl kullanımı, bazı küçük etki alanı dillerini programlarımda birleştirebileceğim bir şeye dönüştürmek için kullanılabilir bir derleyiciden yararlanmaktır. BNF'yi düşünün, ASN1'i düşünün (Aslında, yapma, çirkin), veri sözlüğünün elektronik tablolarını düşünün.

Önemsiz etki alanına özgü diller çok büyük bir zaman tasarrufu sağlayabilir ve standart dil araçlarıyla derlenebilecek bir şey çıkarmak, ne tür bir dilde olursanız olun, önemsiz olmayan bir el kesicisi gibi bu tür şeyleri oluştururken gitmenin yoludur. Yazılı mı, yoksa otomatik olarak oluşturulan biri için BNF.

Daha sonra bazı sistem derleyicilerine beslenen metni çıktırarak, bu derleyiciler optimizasyonunu ve sisteme özel konfigürasyonu düşünmek zorunda kalmadan elde ederim.

Derleyici giriş dilini başka bir aracı temsil olarak etkin kullanıyorum, sorun nedir? Metin dosyaları doğal olarak kaynak kod değildir, derleyici için bir IR olabilirler ve C veya C ++ veya Java ya da her neyse kimin umurunda olursa olsunlar.

Şimdi, eğer birilerinin giriş dili dosyalarını düzenlediğinde ve yeniden oluştururken net bir şekilde hayal kırıklığına uğratacak olan oyuncak dili ayrıştırıcısının ÇIKIŞI'nı düzenleyebileceğinizi düşünmekte zorlanıyorsanız , cevap otomatik olarak oluşturulan IR'yi depoya koymamaktır. Alet zinciriniz tarafından yaratılmıştır (ve bu tür insanların geliştirilmesinden kaçının, genellikle pazarlamada çalışmaktan daha mutlu olurlar).

Bu, bizim dilimizdeki bir ifadenin yetersizliği değildir; şartnamenin bazı kısımlarını otomatik olarak koda dönüştürülebilen bir forma sokmanın (veya masaj yapmanın) gerçeğinin bir ifadesidir ve bu genellikle çok daha az olacaktır. böcek ve bakımı çok daha kolay. Test ve konfigürasyon elemanlarımıza bir elektronik tablo verebilirsem, ince ayar yapabilirler ve daha sonra bu verileri çalıştıran ve ECU'mdaki flaş için tam bir hex dosyasını yayan bir aracı elden çevirmek için çok büyük bir zaman tasarrufu sağlarlar. Günün dilinde bir dizi sabit halinde en son kurulum (yazım hataları ile tamamlayın).

Simulink'te model oluşturma ve RTW ile C oluşturma, sonra ne araçla anlamlı olursa olsun, C hedefini derleme, orta C okunamaz durumda, ne olmuş? Yüksek seviyeli Matlab RTW malzemelerinin sadece bir C altkümesini bilmesi yeterlidir ve C derleyicisi platformun detaylarıyla ilgilenir. Bir insanın yaratılan C ile derine girmesi gereken tek zaman, RTW komut dosyalarının bir böceğine sahip olması ve bu tür bir şeyin nominal olarak insan tarafından okunabilen bir IR ile ve daha sonra sadece ikili bir ayrıştırma ağacıyla hata ayıklamak için çok daha kolaydır.

Elbette bytecode veya hatta çalıştırılabilir kod çıktısı almak için böyle şeyler yazabilirsiniz, ancak bunu neden yaptınız? Bir IR'yi bu şeylere dönüştürmek için araçlarımız var.


Bu iyidir, ancak hangi IR'nin kullanılacağını belirlerken bir tradeoff olduğunu eklerim: C'yi IR olarak kullanmak bazı şeyleri kolaylaştırır ve diğer şeyleri x86 derleme diline kıyasla daha zorlaştırır. Seçim, örneğin Java dili kodu ile Java bayt kodu arasında seçim yaparken daha da önemlidir, çünkü yalnızca bir veya diğer dilde var olan birçok işlem vardır.
Daniel Pryden

2
Ancak X86 derleme dili bir ARM veya PPC çekirdeğini hedeflerken zayıf bir IR yapar! Her şey mühendislikte bir başarısızlık, bu yüzden buna Mühendislik diyorlar. Birincisi, Java bayt kodunun olanaklarının Java dilinin olanaklarının katı bir üstünlüğü olduğunu ve alet zincirinden bağımsız olarak metallere yaklaştıkça ve IR'yi nereye enjekte ettiğinizde bunun genel olarak geçerli olacağını ummaktır.
Dan Mills,

Oh, kesinlikle katılıyorum: yorumum, neden hiç bytecode veya bazı alt seviye çıktılar aldığınızı sorgulayan son paragrafınıza yanıt oldu - bazen daha düşük seviyeye ihtiyacınız var. (Özellikle Java’da, Java dilinde yapamayacağınız bytecode ile yapabileceğiniz birçok yararlı şey vardır.)
Daniel Pryden

2
Buna katılmıyorum, ancak yalnızca azaltılmış genellikte değil, aynı zamanda gerçekten sinir bozucu düşük seviye optimizasyonundan daha çok sorumlu olmanız gerçeği gibi, metale daha yakın bir IR kullanmanın bir maliyeti var. Genelde bu günlerde uygulamadan ziyade algoritma seçimini en iyi duruma getirme anlamında düşündüğümüz gerçeği, derleyicilerin ne kadar uzağa geldiğinin bir yansımasıdır, bazen bu şeylerde metale gerçekten yaklaşmanız gerekir, fakat derleyicileri atmadan önce iki kez düşünmeniz gerekir. Çok düşük seviye bir IR kullanarak optimize etmek için yeteneği.
Dan Mills

1
"Onlar genellikle pazarlamada daha mutlular " Catty, ama komik.
dmckee

13

Pragmatik cevap: Kod üretimi gerekli ve faydalı mı? Özel kod temeli için gerçekten çok kullanışlı ve ihtiyaç duyulan bir şey sağlıyor mu, yoksa sadece alt-optimal sonuçlar için daha entelektüel ek yüke katkıda bulunacak şekilde bir şeyler yapmanın başka bir yolunu yaratıyor mu?

Tamam, bu kodun veri olduğunu da biliyorum. Anlamadığım şey neden kod ürettiğim. Neden onu parametreleri kabul edip bunlara etki edebilecek bir fonksiyon haline getirmiyorsunuz?

Bu soruyu sormanız gerekiyorsa ve net bir cevap yoksa, o zaman muhtemelen kod oluşturma gereksizdir ve yalnızca egzotizme ve kod tabanınıza büyük ölçüde bir entelektüel katkı sağlar.

Bu arada OpenShadingLanguage gibi bir şey alırsanız: https://github.com/imageworks/OpenShadingLanguage

... o zaman etkileyici sonuçların derhal cevaplandırılmasından dolayı böyle soruların cevaplanması gerekmez.

OSL, gölgelendirici ağlarını anında makine koduna (tam zamanında veya "JIT") dönüştürmek için LLVM derleyici çerçevesini kullanır ve bu işlemde, gölgelendirici parametrelerini ve yapamayan diğer çalışma zamanı değerlerini tam olarak bilen gölgelendiricileri ve ağları yoğun şekilde en iyi duruma getirir gölgelendiriciler kaynak koddan derlendiğinde bilinmektedir. Sonuç olarak, OSL gölgelendirme ağlarımızın, C'de elde edilen eşdeğer gölgelendiricilere göre% 25 daha hızlı çalıştığını görüyoruz! (Eski gölgelendiricilerimiz işleyicimizde böyle çalıştı.)

Böyle bir durumda, kod oluşturucunun varlığını sorgulamanıza gerek yoktur. Bu tür VFX alan adında çalışıyorsanız, hemen yanıtınız genellikle "sus ve paramı alın!" ya da "vay, ayrıca böyle bir şey yapmamız gerekiyor."


gölgelendirici ağlarını makine koduna çevirmek . Bu kod oluşturucu yerine derleyici gibi geliyor, değil mi?
Utku

2
Temel olarak, kullanıcının bağladığı ve JIT tarafından LLVM tarafından derlenen ara kodu üreten bir düğüm ağı alır. Derleyici ve kod üreteci arasındaki fark biraz bulanık. C ++ veya C önişlemcili şablonlar gibi dillerde kod oluşturma özellikleri satırları hakkında daha fazla mı düşünüyorsunuz?

Kaynak kodunu çıkaran herhangi bir jeneratörü düşünüyordum.
Utku

Çıktının hala insan tüketimi için nerede olduğunu kabul ediyorum. OpenSL ayrıca aracı kaynak kodu da üretir ancak LLVM tüketimi için montaja yakın olan düşük seviyeli koddur. Tipik olarak tutulması gereken kod değildir (bunun yerine programcılar kodu oluşturmak için kullanılan düğümleri korur). Çoğu zaman bu tür kod oluşturucuların değerlerini haklı çıkaracak kadar kötüye kullanılma ihtimalinin daha fazla olacağını düşünüyorum, özellikle de kodu derleme işleminizin bir parçası olarak yeniden oluşturmak zorundaysanız. Bazen hala eksiklikleri gidermekle birlikte gerçek bir yerleri var ...

... belirli bir alan için kullanıldığında mevcut dil (ler) in QT, meta-nesne derleyici (MOC) ile tartışmalı olanlardan birine sahip. MOC normalde C ++ 'da özellikler ve yansıma ve sinyaller ve slotlar ve benzeri özellikler sağlamanız gereken kazanı azaltır, ancak varlığını net bir şekilde haklı çıkaracak kadar değildir. Sık sık, QT'nin MOC'nin kod oluşturma sıkıntısı çekmeden daha iyi olabileceğini düşünüyorum.

8

Hayır, ara kod üretmek bir anti-patern değildir. Sorunuzun diğer kısmına cevap, "Neden yapmalı?", Yine de bazı nedenler vermeme rağmen, çok geniş (ve ayrı) bir soru.

Hiçbir zaman insan tarafından okunabilir bir koda sahip olmamanın tarihsel sonuçları

En ünlü dillerden oldukları için C ve C ++ 'ı örnek olarak alalım.

C kodunu derlemenin mantıksal alayının makine kodundan ziyade insan tarafından okunabilen montaj kodunu çıkardığına dikkat etmelisiniz. Benzer şekilde, eski C ++ derleyicileri fiziksel olarak C ++ kodunu C koduna derlemek için kullanılır. Bu olaylar zincirinde, insan tarafından okunabilir kod 1'den insan tarafından okunabilir kod 2'den insan tarafından okunabilir kod 3'ten makine koduna derleyebilirsiniz. "Neden?" Neden olmasın?

Orta, insan tarafından okunabilir kod oluşturulur hiçbir zaman, biz bile olmayabilir sahip C veya hiç C ++. Bu kesinlikle bir olasılıktır; İnsanlar hedeflerine en az direnç gösterme yolunu izlerler ve eğer C gelişme durgunluğu nedeniyle ilk önce başka bir dil buhar kazanırsa, C hala gençken ölebilirdi. Tabii ki, “Belki o zaman belki başka bir dil kullanıyor olurduk, belki daha iyi olurdu” diyebilirsiniz. Belki, ya da belki daha kötü olurdu. Ya da belki hepimiz hala mecliste yazıyor oluruz.

Neden insan tarafından okunabilen ara kod kullanılmalı?

  1. Bazen ara kod istenir, böylelikle bir sonraki adımdan önce onu değiştirebilirsiniz. Bu noktanın en zayıf olduğunu kabul edeceğim.
  2. Bazen bu, orijinal çalışmanın insan tarafından okunabilen herhangi bir dilde değil, GUI modelleme aracıyla yapılmasından kaynaklanmaktadır.
  3. Bazen çok tekrarlayan bir şey yapmanız gerekir ve dil ne yaptığınıza hitap etmemelidir , çünkü bu sadece çok iyi bir şekilde programlama dilinin karmaşıklığını veya dilbilgisini artıran bir işi olmayan öyle bir niş veya karmaşık bir şeydir. sen.
  4. Bazen çok tekrarlanan bir şey yapmak gerekir ve orada hiçbir olası bir yoldur Eğer genel bir şekilde dile istediklerini elde etmek; ya dilin dilbilgisi ile temsil edilemez ya da çakışamaz.
  5. Bilgisayarların amaçlarından biri, insan çabalarını azaltmaktır ve bazen tekrar dokunulmaması muhtemel olmayan kodlar (düşük bakım olasılığı), onda bir zamanda daha uzun kodunuzu oluşturmak için yazılmış meta kodlara sahip olabilir; eğer 2 hafta yerine 1 gün içinde yapabilirsem ve hiç korunma ihtimalim yüksek değilse, onu daha iyi üretebilirim - ve kapalı ihtimalde bundan 5 yıl sonra birisinin canımı sıkılır çünkü gerçekten de bunu sürdürmeleri gerekir, o zaman isteseler veya garip kodu sürdürmenin 1 hafta tarafından rahatsız (ama biz bu noktada 1 hafta öncesinde hala) ise tam dışarı yazma 2 hafta geçirebilirsiniz ve işte eğer o bakım hiç yapılması gereken .
  6. Bakmamın daha fazla nedeni olduğundan eminim.

Örnek

Daha önce başka bir belgedeki verilere veya bilgilere dayanarak kodun üretilmesi gereken projeler üzerinde çalıştım. Örneğin, bir projenin tüm ağ mesajları ve bir elektronik çizelgede tanımlanan sabit verileri ve elektronik çizelgeden geçen ve bu iletilerle çalışmamıza izin veren birçok C ++ ve Java kodu üreten bir aracı vardı .

Bu projeyi kurmanın en iyi yolu olduğunu söylemiyorum (başlangıcının bir parçası değildim), fakat sahip olduğumuz buydu ve yüzlerce (belki de binlerce, emin değilim) yapılar, nesneler ve sabitlerdi. bu üretiliyordu; Bu noktada, muhtemelen Rhapsody gibi bir şeyle tekrar yapmak için çok geç. Fakat Rhapsody gibi bir şeyde yeniden yapıldıysa bile, yine de Rhapsody'den üretilen bir kodumuz var .

Ayrıca, tüm bu elektronik tablodaki verilerin tek bir şekilde olması iyi oldu: verileri yalnızca kaynak kod dosyalarında olsaydı sahip olamayacağımız şekilde göstermemize izin verdi.

Örnek 2

Derleyici yapımında bazı çalışmalar yaparken, lexing ve ayrıştırma işlemimi yapmak için Antlr aracını kullandım. Dil dilbilgisi belirledim, sonra aracı C ++ veya Java'da bir ton kodunu tükürmek için kullandım, daha sonra bu kodu kendi tarafında kodumda kullandım ve derlemeye dahil ettim.

Başka nasıl yapılmalıydı? Belki başka bir yolla gelebilirsin; Muhtemelen başka yolları var. Ancak bu iş için, diğer yollar sahip olduğum oluşturulan lex / ayrıştırma kodundan daha iyi olamazdı.


İki kodun uyumsuz olduğu ancak çok ezoterik bir kodlama dilinde bir tür kararlı bir api bulunduğunda, ara kodu bir dosya formatı türü ve hata ayıklama izi olarak kullandım. El ile okunması gerekiyordu, ancak aynı şekilde xml de olabilirdi. Ancak, bu, tüm web sayfaları bu şekilde çalıştıktan sonra, birinin dediği gibi, düşündüğünüzden daha yaygındır.
joojaa

7

Kaçırdığın şey yeniden kullanım .

Kaynak kod metnini derleyiciye dönüştürmek için derleyici olarak adlandırılan harika bir aracımız var. Girdileri iyi tanımlanmıştır (genellikle!) Ve optimizasyonun nasıl yapıldığını geliştirmek için birçok çalışmadan geçti. Aslında istiyorsanız kullanmak bazı işlemleri yürütmek için derleyici, varolan derleyici kullanmak ve kendi yazmayın istiyorum.

Birçok kişi yeni programlama dilleri icat eder ve kendi derleyicilerini yazar. İstisnasız olarak, hepsi bunu yapıyor çünkü o dilin sağladığı özelliklere ihtiyaç duydukları için zorluktan zevk alıyorlar . Yaptıkları her şey başka bir dilde yapılabilirdi; onlar sadece yeni bir dil yaratıyorlar çünkü bu özellikleri seviyorlar. Onları almazsa iyi ayarlanmış, hızlı, verimli, optimize edici bir derleyici var. Onlara, metni ikilik hale getirebilecek bir şey verecek , elbette, ancak mevcut tüm derleyiciler kadar iyi olmayacak .

Metin sadece insanların okuyup yazdığı bir şey değildir. Bilgisayarlar mükemmel de evde metin ile. Aslında, XML (ve diğer ilgili formatlar) gibi formatlar başarılıdır çünkü düz metin kullanırlar. İkili dosya formatları genellikle belirsiz ve kötü bir şekilde belgelenir ve bir okuyucu nasıl çalıştıklarını kolayca bulamaz. XML nispeten kendi kendine belgelendirilerek, insanların XML biçimli dosyaları kullanan kodlar yazmasını kolaylaştırır. Ve tüm programlama dilleri metin dosyalarını okumak ve yazmak için ayarlanmıştır.

Öyleyse, hayatınızı kolaylaştırmak için yeni bir tesis eklemek istediğinizi varsayalım. Belki bir GUI düzen aracıdır. Muhtemelen Qt'un sağladığı sinyal ve slot arayüzleri . Belki de, TI'nin Kod Oluşturucu Stüdyosu , üzerinde çalıştığınız cihazı yapılandırmanıza ve doğru kitaplıkları derlemenin içine çekmenize olanak tanır. Belki de bir veri sözlüğü alıp otomatik tanımlayan typedef'leri ve global değişken tanımlarını alıyor (evet, bu hala gömülü yazılımda çok şey var). Her ne olursa olsun, mevcut derleyicinizden yararlanmanın en etkili yolu, kendi yapılandırmanıza uygun olanı seçip kendi dilinizde otomatik olarak kod üreten bir araç oluşturmaktır.

Geliştirilmesi ve test edilmesi kolaydır, çünkü neler olduğunu biliyorsunuz ve tükettiği kaynak kodunu okuyabilirsiniz. İnsan yıllarını GCC'ye rakip bir derleyici oluşturmak için harcamanıza gerek yok. Tamamen yeni bir dil öğrenmenize veya başkalarının bilmesini gerektirmenize gerek yok. Tek yapmanız gereken bu küçük alanı otomatikleştirmek ve diğer her şey aynı kalıyor. İş bitmiş.


Yine de, XML’in metin temelli olmasının avantajı, sadece gerekirse , insanlar tarafından okunup yazılabilmesidir (normal olarak çalıştıklarında rahatsız olmazlar, ancak geliştirme sırasında kesinlikle yaparlar). Performans ve alan verimliliği açısından, ikili formatlar genellikle çok daha iyidir (darboğaz başka bir yerde olduğu için çoğu zaman önemli değildir).
leftaroundabout

@leftaroundabout Bu performansa ve alan verimliliğine ihtiyacınız varsa, elbette. Bugünlerde birçok uygulamanın XML tabanlı biçimlere gitmesinin nedeni, performans ve alan verimliliğinin bir zamanlar en üst düzey kriterler olmaması ve tarihin ikili dosya biçimlerinin ne kadar zayıf tutulduğunu göstermesidir. (Eski MS Word, klasik bir örnek için belgeler!) Konu yine de kalır - metin, bilgisayarların insanlar kadar okuması için de uygundur.
Graham

Tabii ki, kötü bir şekilde tasarlanmış bir ikili format, aslında, metin formatı aracılığıyla doğru bir şekilde düşünülenden daha kötü performans gösterebilir ve iyi bir ikili format, genellikle, bazı genel amaçlı sıkıştırma algoritmaları ile paketlenmiş XML'den çok daha küçük değildir. Her iki dünyanın en iyisi IMO, cebirsel veri türleri aracılığıyla insan tarafından okunabilen bir spesifikasyon kullanmak ve bu tür AST'den otomatik olarak etkin bir ikili gösterim oluşturmaktır. Örneğin düz kütüphaneye bakınız .
leftaroundabout

7

Kaynak kodun ne olduğuna ve ne olmadığına odaklanan daha pratik bir cevap. Kaynak kodu oluşturmanın tüm bu durumlarda oluşturma işleminin bir parçası olduğunu unutmayın; bu nedenle oluşturulan dosyalar kaynak denetimine girmemelidir.

Interoprability / basitlik

Google'ın Protokol Tamponları'nı ele alalım, örnek olarak: Uygulamayı birden çok dilde oluşturmak için kullanılabilecek tek bir üst düzey protokol açıklaması yazarsınız - sistemin farklı bölümleri genellikle farklı dillerde yazılır.

Uygulama / teknik sebepler

TypeScript al - tarayıcılar yorumlayamaz, bu yüzden derleme işlemi JavaScript oluşturmak için bir transpiler (kod çeviriciyi kodlayan kod) kullanır. Aslında birçok yeni veya ezoterik derlenmiş dil, uygun bir derleyici almadan önce C'ye aktarmaya başlar.

Kullanım kolaylığı

C'ye yazılan ve sadece tek bir ikili (RTOS veya OS yok) kullanan gömülü projeler için (IoT'yi düşünün), bunları doğrudan kaynaklanmasına bağlı olarak, normal kaynak kodu gibi derlenecek verilerle bir C dizisi oluşturmak oldukça kolaydır. kaynaklar olarak.

Düzenle

Protobuf'u genişletmek: kod oluşturma, üretilen nesnelerin herhangi bir dilde birinci sınıf sınıflar olmasını sağlar. Derlenmiş bir dilde, genel bir ayrıştırıcı zorunlu olarak bir anahtar-değer yapısı döndürürdü - bu da çok sayıda kazan plakası kodu yerine getirmediğiniz anlamına gelir; bazı derleme zamanı kontrollerini kaçırırsınız (özellikle anahtarların ve değer türlerinin), daha kötü performans alırsınız ve kod tamamlanmadı. Bunların hepsini void*C veya std::variantC ++ ' da bu kadar büyük olduğunu hayal edin (C ++ 17 varsa), bazı dillerin böyle bir özelliği olmayabilir.


İlk nedenden ötürü, OP'nin fikrinin her dilde genel bir uygulamaya sahip olacağını düşünüyorum (bu protokol protokollerinin tanımını alır ve daha sonra çevrimiçi formatı ayrıştırır / tüketir). Bu neden kod üretmekten daha kötü olsun?
Paŭlo Ebermann

@ PaŭloEbermann, her zamanki mükemmel performans argümanının dışında, böyle bir genel yorumlama, bu mesajlaşmayı derlenmiş (ve muhtemelen yorumlanır) dillerde birinci sınıf nesneler olarak kullanmayı imkansız kılacaktır - örneğin C ++ 'da, böyle bir tercüman, bir anahtar-değer yapısını getirmesi gerekecekti. . Elbette o kv'yi sınıfınıza sokabilirsiniz, ancak birçok kod koduna dönüştürebilirsiniz. Ayrıca kod tamamlama işlemi de var. Ve zaman kontrolünü derleyin - derleyiciniz değişmezlerin yazım hatası olup olmadığını kontrol etmez.
Jan Dorniak

Kabul ediyorum ... bunu cevaba ekler misin?
Paŭlo Ebermann

@ PaŭloEbermann bitti
Jan Dorniak

6

Kaynak kod üretimi bir model midir?

Yeterince dışavurumcu bir programlama dili için iyi bir çözüm. Yeterli yerleşik meta-programlama içeren bir dilde kod oluşturmaya gerek yoktur.


3
Aynı zamanda daha etkileyici bir dil için tam, aşağıdan yerel nesneye kod derleyici yazmak zorunda kalmak için de bir geçici çözümdür. C üretin, iyi bir optimize ediciye sahip bir derleyicinin gerisini halletmesine izin verin.
Blrfl

Her zaman değil. Bazen bir veri yolu üzerindeki sinyaller için bazı tanımları içeren bir veya daha fazla veritabanınız olabilir. Sonra bu bilgiyi bir araya getirmek istersiniz, belki bazı tutarlılık kontrolleri yapın ve ardından veriyolundan gelen sinyaller ile kodunuzda olmasını beklediğiniz değişkenler arasında arayüz oluşturan bir kod yazın. Bana bazı müşterilere sağlanan Excel sayfalarını, bir veri tabanını ve diğer veri kaynaklarını kullanmayı kolaylaştıran meta programlamaya sahip bir dil gösterebilir ve ihtiyaç duyduğum kodu oluşturur, veri geçerliliği ve tutarlılığı için gerekli bazı kontroller yapılır. her şey bana göster demek.
CodeMonkey

@CodeMonkey: Ruby on Rails'in ActiveRecord uygulaması gibi bir şey akla geliyor. Koddaki veritabanı tablosu şemasını çoğaltmanıza gerek yoktur. Sadece bir tabloyu bir sınıfla eşleştirin ve sütun adlarını özellik olarak kullanarak iş mantığını yazın. Ruby meta-programlama tarafından da yönetilemeyen bir kod oluşturucu tarafından üretilebilecek herhangi bir desen hayal edemiyorum. C ++ şablonları da biraz eğlenceli olsa da son derece güçlü. Lisp makroları, başka bir güçlü dil meta programlama sistemidir.
kevin cline

@kevincline demek istediğim, veritabanındaki bazı verilere dayanan koddu (bundan oluşturulabilir), ancak veritabanının kendisi değildi. Yani, Excel Tablo A'da hangi sinyalleri aldığım konusunda bilgim var. Bu sinyaller hakkında bilgi içeren bir Veritabanı B'm var. Şimdi bu sinyallere erişen bir sınıfa sahip olmak istiyorum. Kodu çalıştıran makinedeki veritabanına veya Excel sayfasına bağlantı yoktur. Basit bir kod üreteci yerine derleme zamanında bu kodu üretmek için gerçekten karmaşık C ++ Temprating kullanmak. Ben kodgen seçeceğim.
CodeMonkey

6

Kaynak kod üretimi her zaman bir anti-kalıp değildir. Örneğin, şu anda belirtilen spesifikasyonla iki farklı dilde kod üreten bir çerçeve yazıyorum (Javascript ve Java). Çerçeve, kullanıcının tarayıcı eylemlerini kaydetmek için oluşturulan Javascript'i kullanır ve çerçeve yeniden yürütme modundayken eylemi gerçekten yürütmek için Selenyum'daki Java kodunu kullanır. Kod oluşturma özelliğini kullanmasaydım, el ile ikisinin de her zaman senkronize olduğundan, hantal ve aynı zamanda bir şekilde mantıklı bir çoğaltma olduğundan emin olmam gerekirdi.

Bununla birlikte, biri jenerikler gibi özellikleri değiştirmek için kaynak kodu üretiyorsa, anti-paterndir.


Elbette, kodunuzu bir kez ECMAScript'te yazıp JVM'deki Nashorn veya Rhino'da çalıştırabilirsiniz. Veya ECMAScript'te bir JVM yazabilir (veya Avian to WebAssembly'ı Emscripten kullanarak derlemeyi deneyebilir) ve Java kodunuzu tarayıcıda çalıştırabilirsiniz. Bunların harika fikirler olduğunu söylemiyorum (iyi, muhtemelen korkunç fikirler :-D), ama en azından eğer mümkün değillerse mümkün.
Jörg W Mittag

Teoride bu mümkün, ancak genel bir çözüm değil. Dillerden birini diğeri içinde çalıştıramazsam ne olur? Örneğin, ilave bir şey: Kod üretmeyi kullanarak basit bir Netlogo modeli yarattım ve sistemin her zaman kaydedici ve tekrarlayıcı ile senkronize olan etkileşimli bir dokümantasyonuna sahip oldum. Ve genel olarak, bir gereksinim yaratmak ve ardından kod üretmek, anlamsal olarak birlikte çalışan şeyleri senkronize olarak tutar.
Hristo Vrigazov

6

Burada bir şey mi eksik?

Belki de ara kodun başarının nedeni olduğu ortaya çıkmış iyi bir örnek? Size HTML sunabilirim.

HTML'nin basit ve statik olmasının önemli olduğuna inanıyorum - tarayıcıları kolaylaştırdı, mobil tarayıcıları daha erken başlatmasına izin verdi. . Kullanıcıların Java uygulamaları tarafından gerçekten tehlike altında oldukları ve bu tür web sitelerini ziyaret etmenin DC ++ ile indirilen oyun çatlaklarını denemek kadar güvenli olduğu ortaya çıktı. Öte yandan, düz HTML, herhangi bir siteyi cihazımızın güvenliği konusunda makul bir inançla kontrol etmemize izin verecek kadar zararsızdır.

Ancak, HTML, bilgisayar tarafından oluşturulmuş olmasaydı, şimdi olduğu yere yakın bir yerde olmazdı. Cevabım, birileri onu veritabanından HTML dosyasına manuel olarak yeniden yazana kadar bu sayfada görünmezdi. Neyse ki hemen hemen her programlama dilinde kullanılabilir HTML yapabilirsiniz :)

Diğer bir deyişle, eğer bir şey için bir kod üreticisi varsa, neden gerekli parametreleri alabilen ve "oluşturulacak" kodun yapacağı doğru işlemi yapan uygun bir fonksiyon yapmıyorsunuz?

Soruyu ve tüm cevapları ve yorumları kullanıcıya göstermek için HTML arasında oluşturulan kod olarak kullanmaktan daha iyi bir yol hayal edebiliyor musunuz?


Evet, daha iyi bir yol düşünebilirim. HTML, Tim Berners-Lee tarafından salt metin bir web tarayıcısının hızlı bir şekilde oluşturulmasına izin verme kararının bir mirasıdır. O zamanlar gayet iyiydi, ama aynı şeyi yapmayız. CSS, çeşitli sunum elemanı türlerini (DIV, SPAN, TABLE, UL, vb.) Gereksiz kılmıştır.
kevin cline

@kevincline Bu şekilde HTML'nin kusursuz olmadığını söylemiyorum, işaretleme dilinin (bir program tarafından oluşturulabilecek) tanıtılmasının bu durumda çok iyi sonuçlandığını belirtiyordum.
Džuris

Yani HTML + CSS sadece HTML'den daha iyidir. Çalıştığım bazı projeler için doğrudan HTML + CSS + MathJax'ta dahili belgeler yazdım. Ancak ziyaret ettiğim web sayfalarının çoğu, kod üreticileri tarafından oluşturulmuş görünüyor.
David K

3

neden kaynak kodu üretelim?

Çünkü, özellikle sıkıcı, tekrarlayan işler için kodu manuel olarak yazmaktan daha hızlı ve daha kolay (ve daha az hata eğilimli). Tek bir kod satırı yazmadan önce tasarımınızı doğrulamak ve doğrulamak için üst düzey aracı da kullanabilirsiniz.

Yaygın kullanım durumları:

  • Rose veya Visual Paradigma gibi modelleme araçları;
  • High- er Gömülü SQL veya Derlenebilir şey haline Önişlenmiş gereken bir arayüz tanım dili gibi seviye diller;
  • Flex / bison gibi Lexer ve ayrıştırıcı jeneratörler;

“Neden sadece bir işlev yapmıyor ve doğrudan ona parametreler iletmiyorsunuz?” Konusuna gelince, yukarıdakilerin hiçbirinin kendi içinde yürütme ortamları olmadığını unutmayın. Kodunuzu bunlara karşı bağlamanın yolu yok.


2

Bazen, programlama diliniz sadece istediğiniz özelliklere sahip olmayabilir, bu da istediğiniz şeyi yapmak için işlevler veya makrolar yazmayı imkansız hale getirir. Ya da belki olabilir ne istersen yap, ama kod çirkin olurdu yazmak için. Basit bir Python betiği (veya benzeri), daha sonra #includegerçek kaynak dosyaya girdiğiniz, derleme işleminizin bir parçası olarak gerekli kodu oluşturabilir .

Bunu nasıl bilebilirim? Çünkü bu, en son SourcePawn olan çeşitli farklı sistemlerle çalışırken defalarca ulaştığım bir çözüm. Basit bir kaynak kodu satırını ayrıştırıp iki veya üç satır kod ürettiğinden oluşan basit bir Python betiği, iki düzine satır yazdığınızda (tüm cvarlarımı oluştururken) oluşturulan kodu el ile oluşturmaktan çok daha iyidir.

İnsanlar isterse gösterme / örnek kaynak kodu kullanılabilir.


1

Metin formu insanlar tarafından kolay tüketilmesi için gereklidir. Bilgisayarlar ayrıca kodları oldukça kolay bir şekilde metin biçiminde işler. Bu nedenle, üretilen kodun üretmesi en kolay ve bilgisayarları tarafından tüketilmesi en kolay olan ve çoğunlukla okunabilen metin biçiminde üretilmesi gerekir.

Kod oluşturduğunuzda, kod oluşturma işleminin kendisinin sıklıkla hata ayıklanması gerekir - insanlar tarafından. Eğer üretilen kod insan tarafından okunabilir ise, insanlar kod oluşturma sürecindeki sorunları tespit edebiliyorsa, çok, çok faydalıdır. Sonuçta, birinin kodu oluşturmak için kodu yazması gerekiyor. İnce havadan olmaz.


1

Kod Oluşturma, yalnızca bir kez

Tüm kaynak kod üretme, bazı kod üretme durumu değildir ve ardından hiçbir zaman ona dokunmaz; daha sonra, güncellemesi gerektiğinde, orijinal kaynaktan yeniden üretir.

Bazen yalnızca bir kez kod üretirsiniz, sonra orijinal kaynağı atarsınız ve ileriye doğru ilerlemek yeni kaynağı korur.

Bu bazen kodu bir dilden diğerine taşırken olur. Özellikle, bir kişi orijinal belgede yeni değişiklikler yapmak için daha sonra bağlantı kurmak istemezse (örneğin, eski dil kodu korunmayacak veya aslında tamamlandı (örneğin, bazı matematik işlevleri söz konusu olduğunda)).

Yaygın bir durum, bunun için bir kod üreticisi yazmanın, kodun yalnızca% 90'ını doğru bir şekilde çevirebilmesidir. ve sonra son% 10'un elle düzeltilmesi gerekiyor. Bu,% 100'ü elle çevirmekten çok daha hızlıdır.

Bu tür kod üreteçleri, genellikle tam dil çevirmenlerinin (Cython veya benzeri f2c) ürettiği kod üreteçlerinden çok farklıdır . Amaç bir kez kodunu korumaktır çünkü. Tam olarak yapmaları gerekeni yapmak için genellikle 1 kapalı olarak yapılırlar. Birçok yönden, port koduna bir regex / find-replace kullanmanın bir sonraki seviye sürümüdür. "Takım destekli taşıma" diyebilirsiniz.

Örneğin bir web sitesi sıyırıcısından yalnızca bir kez Kod Oluşturma.

Yakından ilgili olan, kodu bir kaynaktan oluşturursanız tekrar erişmek istemezsiniz. Örn: kodu oluşturmak için gereken eylemler tekrarlanabilir, tutarlı değilse veya bunları gerçekleştirmek pahalı ise. Şu anda bir çift proje üzerinde çalışıyorum: DataDeps.jl ve DataDepsGenerators.jl .

DataDeps.jl, kullanıcıların veri indirmesine yardımcı olur (standart ML veri kümeleri gibi). Bunu yapmak için, RegistrationBlock dediğimiz şeye ihtiyacı var. Bu, dosyaların nereden yükleneceği ve bir sağlama toplamı gibi bazı meta verileri belirten bir kod ve kullanıcıya herhangi bir terim / birleşim / verilerdeki lisanslama durumunun ne olduğunu açıklayan bir mesajdır.

Bu blokları yazmak can sıkıcı olabilir. Ve bu bilgiler genellikle verilerin yapılandırıldığı web sitelerinde (yapılandırılmış veya yapılandırılmamış) bulunur. Bu nedenle DataDepsGenerators.jl, çok sayıda veri barındıran bazı siteler için RegistrationBlockCode oluşturmak için bir web kodlayıcı kullanır.

Onları doğru şekilde üretmeyebilir. Böylece oluşturulan kodu kullanan dev, onu kontrol edebilir ve düzeltmelidir. Örneğin, örneğin lisanslama bilgilerini kaçırmamış olduğundan emin olmak istiyorlar.

Önemli olarak, DataDeps.jl ile çalışan kullanıcılar / dev'lerin, oluşturulan RegistrationBlock kodunu kullanmak için web sayfasını kurmaları veya kullanmaları gerekmez. (Ve bir web sıyırıcısını indirip kurmaya gerek duymamak, özellikle CI çalışmaları için oldukça zaman kazandırır)

Kaynak kodunu bir kez üretmek bir antipattern değildir. ve normalde metaprogramming ile değiştirilemez.


"rapor", "tekrar bağlantı noktası" dışında bir şey ifade eden İngilizce bir kelimedir. Bu cümleyi daha açık hale getirmek için "tekrar bağlantı" seçeneğini deneyin. (Tavsiye edilen bir düzenleme için çok küçük olduğu için yorum yapma.)
Peter Cordes

İyi yakalamak @PeterCordes Rephrased.
Lyndon White

Oluşturulan kodun ne kadar korkunç olduğuna bağlı olarak daha hızlı ancak potansiyel olarak daha az bakım yapılabilir. Fortran to C bir zamanlar geri döndü (C derleyicileri daha yaygındı, bu yüzden insanlar f2c+ kullanacaktı cc), fakat sonuçta ortaya çıkan kod, AFAIK programının C sürümü için gerçekten iyi bir başlangıç ​​noktası değildi.
Peter Cordes

1
Potansiyel olarak, potansiyel olarak değil. Bazı kod üreteçlerinin bakım yapılamayan kod yapması kod üreteci kavramında hata değildir. Özellikle, her vakayı yakalamak zorunda olmayan bir el yapımı araç, genellikle mükemmel kodlar oluşturabilir. Örneğin, kodun% 90'ı sadece dizi sabitlerinin listesi ise, o zaman bu dizileri yapıcıları bir kerelik olarak üretmek önemsiz bir şekilde çok güzel bir şekilde yapılabilir ve az çaba sarf edilebilir. (Öte yandan, Cython'un C kodu çıktısı insanlar tarafından korunamaz. Çünkü olması amaçlanmadı. Tıpkı f2cgün içinde söylediğiniz gibi )
Lyndon White

1
Büyük masa sadece en basit ve en aza indirilen tartışma oldu. Benzer şekilde döngüleri veya koşulları dönüştürmek için de söylenebilir. Aslında sedçok uzun bir yol gidiyor, ancak bazen biraz daha etkileyici bir güce ihtiyaç var. Program mantığı ve veri arasındaki çizgi genellikle iyi bir tanesidir. Bazen ayrım yararlı değildir. JSON (/ was) sadece javascript nesne yapıcı kodudur. Örneğimde, aynı zamanda nesne yapıcı kodu da oluşturuyorum (veri mi? Belki (belki de bazen işlev çağrıları olduğundan beri değil). Kod olarak kabul edilir mi? Evet.)
Lyndon White

1

"Kaynak" kodunun üretilmesi, oluşturulan dilin bir eksikliğinin bir göstergesidir. Bunun bir modelini aşmak için araçlar kullanmak mı? Kesinlikle hayır - açıklamama izin verin.

Tipik olarak, kod oluşturma kullanılır, çünkü elde edilen kodu, düşük seviye dilden çok daha az ayrıntılı olarak tanımlayabilen daha yüksek düzeyde bir tanım vardır. Böylece kod oluşturma, verimliliği ve netliği kolaylaştırır.

C ++ yazdığımda, kod yazımını veya makine kodunu kullanmaktan daha verimli kod yazmamı sağladığı için yapıyorum. Makine kodu hala derleyici tarafından üretilir. Başlangıçta, c ++ C kodunu üreten ön işlemciydi. Genel amaçlı diller, genel amaçlı davranış oluşturmak için mükemmeldir.

Aynı şekilde, bir DSL (etki alanına özgü dil) kullanarak kısa bir yazı yazmak mümkündür, ancak belirli bir göreve sınırlı kod yazabilirsiniz. Bu, kodun doğru davranışını oluşturmayı daha az karmaşık hale getirecektir. Unutmayın ki bu kod demek ve bitirmek demektir . Bir geliştiricinin aradığı şey davranış oluşturmanın etkili bir yoludur.

İdeal olarak jeneratör, kullanımı ve anlaşılması daha kolay olan bir girdiden hızlı kod oluşturabilir. Bu yerine getirilirse , bir jeneratör kullanılmaması bir anti-paterndir . Bu anti-desen genellikle "saf" kod ahşap işçisi veya diğer esnaf iş parçalarını "üretmek" için elektrikli aletler veya CNC kullanımının kullanıldığına bakıp olabilir aynı şekilde çok "temiz", (düşünmek olduğu anlayışına gelen altın çekiç ).

Öte yandan, oluşturulan kodun kaynağının yeteri kadar verimli olmayan kodun korunması veya üretilmesi daha zor ise, kullanıcı yanlış araçları kullanma tuzağına düşüyor (bazen aynı altın çekiç nedeniyle ).


0

Kaynak kod üretimi kesinlikle oluşturulan kodun veri olduğu anlamına gelir. Ancak, birinci sınıf veri, programın geri kalanının manipüle edebileceği veridir.

Farkında olduğum en yaygın iki veri kaynağı, kaynak koduna entegre edilmiştir, pencereler (çeşitli kontrollerin sayısı ve yerleşimi) ve ORM'ler hakkında grafiksel bilgidir. Her iki durumda da, kod oluşturma yoluyla entegrasyon, verilerin kullanımını kolaylaştırır, çünkü bunları kullanmak için ekstra "özel" adımlar atmanız gerekmez.

Orijinal (1984) Mac'lerle çalışırken, verileri ikili biçimde tutan bir resouce editörü kullanılarak diyalog ve pencere tanımları oluşturuldu. Bu kaynakları uygulamanızda kullanmak, "ikili format" Pascal olsaydı, olması gerekenden daha zordu.

Böylece, hayır, kaynak kodu üretimi bir anti-kalıp değildir, verinin uygulamanın bir parçası olmasını sağlar ve bu da kullanımını kolaylaştırır.


0

Kod oluşturma, başardığından daha pahalı olduğu zaman bir kalıptır. Bu durum, A'dan B'ye, A'nın neredeyse B ile aynı dil olduğu A'dan B'ye gerçekleştiğinde, ancak A'ya B'nin tüm özel kalıplama ve A'dan B'ye evreleme için daha az çabayla kodlanmasıyla yapılabilecek bazı küçük uzantılarda meydana gelir. .

Dış metin işleme aşamalarında metaprogramlamayı gerçekleştirmenin komplikasyonları ve yetersizlikleri nedeniyle meta-programlama olanakları olmayan (yapısal makrolar) olmayan dillerde kod üretimine karşı daha yasaklıdır.

Zayıf ticaret, kullanım miktarıyla da ilgili olabilir. Dil A, B'den önemli ölçüde farklı olabilir, ancak özel kod oluşturucusuyla tüm proje yalnızca bir veya iki küçük yerde A kullanır, böylece toplam karmaşıklık miktarı (küçük A bitleri, artı A -> B kod üreteci, artı çevreleyen yapı evrelemesi) B'de yapılan bir çözümün karmaşıklığını aşıyor.

Temel olarak, eğer kod üretmeyi taahhüt edersek, büyük olasılıkla “büyük veya eve gitmeliyiz”: önemli bir anlambilimine sahip olmasını sağlamalı ve çok kullanmalı ya da rahatsız etmemeliyiz.


Neden "Bjarne Stroustrup ilk kez C ++ ..." paragrafını uyguladıysa? Bence ilginçti.
Utku

@Utku Diğer cevaplar, projenin geri kalanının tamamen yazıldığı, bütünüyle karmaşık bir dilin oluşturulması açısından bunu kapsar. Bunun “kod üretimi” olarak adlandırılan şeyin çoğunluğunu temsil ettiğini sanmıyorum.
Kaz

0

Bunu açıkça görmedim (bir ya da iki cevabın dokunduğunu gördüm, ama çok net görünmüyordu)

Kod üretmek (dediğiniz gibi, veriymiş gibi) bir sorun değil - derleyiciyi ikincil bir amaç için yeniden kullanmak için bir yol.

Oluşturulan kodu düzenlemek, şimdiye kadar karşılaşacağınız en sinsi, kötü, korkunç anti-paternlerden biridir. Bunu yapma.

En iyi ihtimalle, oluşturulan kodun düzenlenmesi projenize bir sürü zayıf kodu çeker (ENTIRE kod kümesi şimdi gerçekten KAYNAK KODU - artık veri değil). En kötüsü, programınıza çektiğiniz kodun fazlasıyla gereksiz olduğu, neredeyse tamamen anlaşılamayan, kötü adlandırılmış bir çöp.

Sanırım üçüncü bir kategori bir kez kullandığınız koddur (gui generator?) Ve başlamanıza / öğrenmenize yardımcı olacak şekilde düzenleyin. Bu, her ikisinden de biraz - başlamak için iyi bir yol olabilir, ancak GUI jeneratörünüz, bir programcı olarak sizin için iyi bir başlangıç ​​olmayacak "Generatable" kodunu kullanarak hedeflenecektir - Ayrıca, ikinci bir GUI için tekrar kullanmaya istekli, bu da sisteminize yedek SOURCE kodunu çekmek anlamına gelir.

Takımınız, oluşturulan kodun herhangi bir düzenlemesine izin vermeyecek kadar akıllıysa, bunun için gidin. Olmazsa, oradaki en kötü anti-paternlerden biri diyebilirim.


0

Hem kod hem de veri: Bilgi.

Veri, tam olarak ihtiyaç duyduğunuz (ve değer) formdaki bilgidir. Kod aynı zamanda bilgidir, ancak dolaylı veya ara formda. Temelde, kod aynı zamanda bir veri biçimidir.

Daha spesifik olarak, kod, makinelerin insanları işlem bilgisinden tamamen kendiliğinden çıkarmaları için olan bilgidir.

İnsanları bilgi işlemden boşaltmak en önemli sebep. Orta adımlar, hayatı kolaylaştırdığı sürece kabul edilebilir. Bu nedenle ara bilgi haritalama araçları mevcuttur. Kod üreteçleri, derleyiciler, aktarıcılar vb.

neden kaynak kodu üretelim? Neden onu parametreleri kabul edip bunlara etki edebilecek bir fonksiyon haline getirmiyorsunuz?

Diyelim ki birileri size uygulaması sizin için karanlık olan bir haritalama işlevi sunuyor. İşlev vaat edildiği gibi çalıştığı sürece, dahili olarak kaynak kodu üretip üretmemesine dikkat eder misiniz?


0

Bir şey üretilebiliyorsa, o şey kod değil, veridir.

Daha sonra koyduğunuzda bu kod veridir, teklifiniz “Bir şey üretilebiliyorsa, o şey kod değildir” dür. Öyleyse, bir C derleyicisi tarafından oluşturulan montaj kodunun kod olmadığını söyler misiniz? El ile yazdığım montaj koduyla tam olarak çakışırsa ne olur? İstersen oraya gidebilirsin, ama seninle gelmeyeceğim.

Bunun yerine "kod" tanımıyla başlayalım. Çok teknik olmadan, bu tartışmanın amaçları için oldukça iyi bir tanım "bir hesaplama yapmak için makinede işlem yapılabilir talimatlar" olacaktır.

Buna bakıldığında, kaynak kod üretmenin bütün bu fikri bir yanlış anlama değil midir?

Evet, başlangıç ​​teklifiniz bu kodun üretilememesidir, ancak ben bu teklifi reddediyorum. Eğer "kod" tanımımı kabul ediyorsanız, genel olarak kod oluşturmada kavramsal bir problem olmamalıdır.

Diğer bir deyişle, eğer bir şey için bir kod üreticisi varsa, neden gerekli parametreleri alabilen ve "oluşturulacak" kodun yapacağı doğru işlemi yapan uygun bir fonksiyon yapmıyorsunuz?

Eh, bu tamamen farklı bir soru, doğası hakkında değil, kod üretme nedenleriyle ilgili. Alternatif bir kod üreteci yazmak veya kullanmak yerine, sonucu doğrudan hesaplayan bir işlev yazıyorsunuz. Ama hangi dilde? Birisinin doğrudan makine kodunda yazdığı günler geride kaldı ve kodunuzu başka bir dilde yazdığınızda, gerçekten çalışan bir program üretmek için bir derleyici ve / veya assembler biçimindeki bir kod oluşturucusuna güveniyorsunuz.

Neden öyleyse, Java ya da C ya da Lisp ya da her neyse yazmayı tercih edersiniz? Montajcı bile mi? En azından kısmen bu dillerin, yapmak istediğiniz hesaplamanın ayrıntılarını açıklamayı kolaylaştıran veri ve işlemler için soyutlamalar sağladığını iddia ediyorum.

Aynısı, çoğu üst seviye kod üreticisi için de geçerlidir. Prototipi vakalar gibi tarayıcı ve ayrıştırıcı jeneratör muhtemelen lexve yacc. Evet, bir tarayıcı ve ayrıştırıcıyı doğrudan C'ye veya istediğiniz başka bir programlama dilinde (hatta ham makine kodu) yazabilirsiniz ve bazen bir tane yazabilir. Ancak, herhangi bir önemli karmaşıklık sorunu için, lex veya yacc'ler gibi daha üst düzey, özel amaçlı bir dil kullanmak, elle yazılmış kodun yazılmasını, okunmasını ve korunmasını kolaylaştırır. Genellikle çok daha küçük.

"Kod üreteci" ile tam olarak ne demek istediğinizi de düşünmelisiniz. C ön işleme ve C ++ şablonlarının başlatılmasının kod oluşturma alıştırması olduğunu düşünürdüm; bunlara itiraz ediyor musunuz? Değilse, o zaman bence bunları kabul etmeyi rasyonelleştirmek, ancak diğer kod üretme lezzetlerini reddetmek için bazı zihinsel jimnastik yapmanız gerekecek.

Performans nedeniyle yapılıyorsa, derleyiciden bir eksiklik gibi geliyor.

Neden? Temel olarak, kullanıcının verileri beslediği, bazıları "talimatlar" ve diğerleri "girdi" olarak sınıflandırılan ve hesaplamayı gerçekleştirip "çıktı" olarak adlandırdığımız daha fazla veri yayan bir evrensel programa sahip olmalısınız. (Belli bir bakış açısına göre, böyle bir evrensel programa "işletim sistemi" denebilir.) Fakat neden bir derleyicinin daha genel bir programı optimize etmek gibi genel amaçlı bir programı optimize etmede daha etkili olması gerektiğini düşünüyorsunuz? Program? İki program farklı özelliklere ve farklı yeteneklere sahiptir.

İki dilin köprülenmesi için yapılıyorsa, arayüz kütüphanesi eksikliği gibi geliyor.

Bir dereceye kadar evrensel bir arayüz kütüphanesine sahip olmanın mutlaka iyi bir şey olacağını söylüyorsunuz. Belki öyle olurdu, ama çoğu durumda böyle bir kütüphane yazmak büyük ve zor, hatta belki de yavaş olabilir. Ve eğer böyle bir canavar eldeki belirli soruna hizmet etmek için mevcut değilse, o zaman bir kod oluşturma yaklaşımı sorunu daha kolay ve daha çabuk çözdüğünde, bunun yaratılmasında kim ısrar edersiniz?

Burada bir şey mi eksik?

Sanırım birkaç şey var.

Bu kodun veri olduğunu da biliyorum. Anlamadığım şey neden kaynak kodu ürettiğim? Neden onu parametreleri kabul edip bunlara etki edebilecek bir fonksiyon haline getirmiyorsunuz?

Kod üreteçleri, bir dilde yazılmış kodu farklı, genellikle daha düşük bir dilde kodlamaya dönüştürür. O zaman, neden insanların çoklu dil kullanarak programlar yazmak istediklerini ve özellikle neden farklı seviyelerde dilleri karıştırmak isteyebileceklerini soruyorsunuz.

Ama ben buna çoktan dokundum. Biri, kısmen o görevin netliği ve açıklığına dayanan belirli bir görev için bir dil seçer. Daha küçük kodlar ortalama olarak daha az hataya sahip olduklarından ve bakımı daha kolay olduğu için, en azından büyük ölçekli işler için daha yüksek seviyeli dillere yönelik bir önyargı da vardır. Ancak, karmaşık bir program birçok görevi içerir ve çoğu zaman bir dilde daha etkili bir şekilde ele alınabilirken, diğerleri başka bir dilde daha etkili veya daha kapsamlı olarak ele alınabilir. İş için doğru aracı kullanmak, bazen kod oluşturma anlamına gelir.


0

Sorunuzu yorumunuz bağlamında yanıtlama:

Derleyicinin görevi, insan tarafından okunabilir biçimde yazılmış bir kod almak ve onu makinede okunabilen forma dönüştürmektir. Dolayısıyla, derleyici verimli bir kod oluşturamazsa, derleyici işini düzgün yapmıyor demektir. Yanlış mı?

Bir derleyici göreviniz için asla optimize edilmeyecek. Bunun nedeni basittir: birçok görevi yapmak için optimize edilmiştir . Birçok insan tarafından birçok farklı görev için kullanılan genel amaçlı bir araçtır. Görevinizin ne olduğunu öğrendikten sonra, derleyiciye özel bir şekilde koda yaklaşabilir, derleyicilerin yapamayacağı travmalar yapabilirsiniz.

Örnek olarak, bir analistin kod yazması gereken yazılım üzerinde çalıştım. Algoritmalarını C ++ 'da yazabilirler ve bağlı oldukları tüm sınır kontrollerini ve notlama numaralarını ekleyebilirlerdi, ancak bu kodun içsel çalışmaları hakkında çok şey bilmeyi gerektirir . Basit bir şey yazmayı tercih ederler ve son C ++ kodunu oluşturmak için ona bir algoritma atayım. Sonra, analistlerimin asla dayanmasını beklemeyeceğim statik analiz gibi performansı en üst düzeye çıkarmak için egzotik hileler yapabilirim. Kod oluşturma, ürünü kapıdan çıkarmasını sağlayan herhangi bir genel amaçlı araçtan daha kolay hale getiren, alana özgü bir şekilde yazmalarını sağlar.

Ben de tam tersini yaptım. Yapmış olduğum ve "kod üretmeyen" bir görevi olan başka bir işim var. Yazılımı kullananlar için hayatı kolaylaştırmak istedik, bu yüzden derleyicinin anında kodu oluşturması için büyük miktarlarda şablon metaprogramlama kullandık. Bu yüzden, işimi yapabilmek için sadece genel C ++ diline ihtiyacım vardı.

Ancak, bir yakalama var. O was müthiş hatalar okunabilir olduğunu garanti etmek zor. Daha önce şablon meta programlanmış kodunu kullandıysanız, tek bir masum hatanın, neyin yanlış gittiğini anlamak için 100 satır anlaşılmaz sınıf adı ve şablon argümanı alan bir hata üretebileceğini biliyorsunuzdur. Bu etki, sözdizimi hataları için önerilen hata ayıklama işleminin "Kendi dosyalarınızdan birinin ilk kez hata verdiğini görene kadar hata günlüğünü kaydırın." Şeklinde olduğunu belirtti. yanlış yaptın."

Kod oluşturmayı kullanmış olsaydık, insan tarafından okunabilen hatalarla çok daha güçlü hata işleme yeteneklerimiz olabilirdi. C'est la vie.


0

Kod oluşturmanın birkaç farklı yolu vardır. Üç ana gruba ayrılabilirler:

  • Derleme işlemindeki bir adımdan çıktı olarak farklı bir dilde kod üretmek. Tipik derleyici için bu daha düşük seviyeli bir dil olabilir, ancak JavaScript'i derleyen dillerde olduğu gibi başka bir üst seviye diline olabilir.
  • Derleme işleminde bir adım olarak kaynak kod dilinde kod üretmek veya dönüştürmek . Bu ne makrolar yapar.
  • Düzenli derleme işleminden ayrı bir araçla kod üretmek. Bunun çıktısı, normal kaynak kodla birlikte dosya halinde yaşayan ve beraberce derlenen koddur. Örneğin, bir ORM için varlık sınıfları bir veritabanı şemasından otomatik olarak oluşturulabilir veya veri aktarım nesneleri ve servis arayüzleri SOAP için bir WSDL dosyası gibi bir arayüz belirtiminden oluşturulabilir.

Sanırım üçüncü tür oluşturulan koddan bahsediyorsunuzdur, çünkü bu en tartışmalı biçimdir. İlk iki formda üretilen kod, kaynak koddan çok net bir şekilde ayrılmış olan bir ara adımdır. Ancak üçüncü formda, kaynak kod ile üretilen kod arasında resmi bir ayrım yoktur, ancak üretilen kodun muhtemelen "bu kodu düzenleme" diyen bir yorumu vardır. Yine de, geliştiricilerin, gerçekten çirkin olacak üretilen kodu düzenleme riskini açar. Derleyicinin bakış açısından, oluşturulan kod kaynak koddur.

Bununla birlikte, bu tür oluşturulan kod biçimleri statik olarak yazılmış bir dilde gerçekten yararlı olabilir. Örneğin, ORM varlıklarıyla entegrasyon olduğunda, veritabanı tabloları için güçlü şekilde yazılmış sarmalayıcılara sahip olmak gerçekten yararlıdır. Entegrasyonu çalışma zamanında dinamik olarak idare edebileceğinizden emin olabilirsiniz , ancak tip güvenliği ve araç desteğini (kod tamamlama) kaybedeceksiniz. Statik olarak yazılan dilin en büyük yararı, yazı tipinin çalışma zamanında değil yazı tipinde desteklenmesidir. (Buna karşılık, bu tür kod oluşturma, dinamik olarak yazılmış dillerde çok yaygın değildir, çünkü böyle bir dilde çalışma zamanı dönüşümlerine kıyasla hiçbir fayda sağlamaz.)

Diğer bir deyişle, eğer bir şey için bir kod üreticisi varsa, neden gerekli parametreleri alabilen ve "oluşturulacak" kodun yapacağı doğru işlemi yapan uygun bir fonksiyon yapmıyorsunuz?

Güvenlik ve kod tamamlama türü, derleme zamanında (ve bir IDE kodu yazarken) istediğiniz özellikler olduğundan, normal işlevler yalnızca çalışma zamanında yürütülür.

Yine de bir orta yol olabilir: F #, derleme zamanında programlı olarak oluşturulan temelde güçlü şekilde yazılan arayüzler olan tip sağlayıcıları kavramını destekler. Bu kavram muhtemelen birçok kod üretme kullanımının yerini alabilir ve endişelerin daha net ayrılmasını sağlayabilir.


0

İşlemci komut setleri temel olarak zorunludur , ancak programlama dilleri bildirimsel olabilir . Bilgilendirici bir dilde yazılmış bir programı çalıştırmak kaçınılmaz olarak bir tür kod oluşturma gerektirir. Bu cevapta ve diğerlerinde de belirtildiği gibi , insan tarafından okunabilir bir dilde kaynak kodu oluşturmanın ana nedeni, derleyiciler tarafından gerçekleştirilen karmaşık optimizasyonlardan yararlanmaktır.


-3

Bir şey üretilebiliyorsa, o şey kod değil, veridir.

Yanlış yoldan anladın. Okumalı

Bir şey yorumlanabilirler için bir jeneratöre beslenebilirse , o şey veri değil, koddur.

Bu derleme aşaması için kaynak formatıdır ve evye formatı hala koddur.


1
Kaynak kodun tanımı yanlış . Kaynak kodu çoğunlukla üzerinde çalışan insanlar içindir (ve bu gerçek onu tanımlar, ayrıca FSF'nin özgür yazılımını da görün ). Birlikte oluşturulan Assembler kodu gcc -fverbose-asm -O -S, her zaman GNU'ya beslenen asve bazen insanlar tarafından okunan bir metin biçiminde olsa bile, kaynak kod değildir (ve yalnızca veya çoğunlukla veri değildir) .
Basile Starynkevitch

Ayrıca, birçok dilde uygulama C kodunu derler , fakat oluşturulan C orijinal kaynak kodu değildir (örneğin, insanlar tarafından kolayca kullanılamaz).
Basile Starynkevitch

Sonunda donanımınız (örneğin, AMD veya Intel yonganız veya bilgisayar anakartınız), makine kodunu yorumluyor (açıkçası kaynak kod değil). BTW IBM1620, klavyede yazılabilir (BCD) makine koduna sahipti , ancak bu gerçek onu "kaynak kod" yapmadı. Tüm kod kaynak değil .
Basile Starynkevitch

@BasileStarynkevitch Ah, beni oraya götürdün. Esprili ifademi çok fazla sıkıştırmaya çalışmamalıyım veya anlamlarını değiştiriyorlar. Doğru, kaynak kod ilk derleme aşamasına beslenen en orijinal kod olmalıdır.
Bergi

Hiçbir kaynak kod insanlar için kod değildir. Müzik (ses vs) olarak tanımlamak zor ve özneldir. Bu, onu tüketen yazılımı bulmaya çalışmak değildir.
Basile Starynkevitch
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.