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 lex
ve 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.