Programlama dillerinin semantiği. Petrol ve gazın büyük ansiklopedisi

  • 18.06.2019

Buraya kadar üst düzey bir dilde yazılmış bir programın çalıştırılmadan önce derlenmesi, yani iki kararlı duruma karşılık gelen iki karakterden oluşan bir makine diline çevrilmesi gerektiğinden bahsetmiştik. Derleyici - Bu aynı zamanda girişi yüksek seviyeli bir dilde yazılmış bir kaynak dosya olan bir bilgisayar programıdır. Bu dosya birçok işletim sisteminde çağrılır. kaynak modülü(kaynak modül). Derleyici programı makine diline çevirir ve adı verilen başka bir dosyaya yazar. nesne modülü(nesne modülü).

En basit durumlarda nesne modülünün içeriği RAM'e yüklenebilir ve yürütülebilir. Ancak çoğu zaman, yürütmeden önce bir nesne modülünün eklenmesi gerekir. oluşturmak (bağlantı) ek program modülleri, sistem işlevleri, hizmet bilgileri ve programın yürütülmesi için gerekli diğer verileri içeren diğer nesne modülleri ile.

Düzen, sözde özel bir program tarafından gerçekleştirilir. "bağlayıcı" (bağlayıcı) veya bağlantı düzenleyicisi. Nesne modüllü dosyalar girdisine beslenir ve çıktısı yürütülebilir modül (çalıştırılabilir modül)- tamamen çalışmaya hazır bir programa sahip bir dosya. Bu dosya RAM'e yüklenir ve yürütülür.

Çoğu zaman, derleme ve bağlama tek bir işlemde birleştirilir. Bunu yapmak için derleyiciye özel bir talimat verilir ve çalışmasından hemen sonra bağlayıcının kendisini çağırır. Programcıya, tüm bunlar tek bir işlem gibi görünüyor, ekranda yalnızca derlemenin sonu ve bağlantının başlamasıyla ilgili mesajlar görünüyor.

Yukarıdakilerin tümü, derlenmiş programlama dilleri için tipiktir. Derleme ve bağlantı gerektirmeyen yorumlanmış programlama dillerini oluşturan bir başka dil sınıfı. Bunlar aynı zamanda yüksek seviyeli dillerdir, bu nedenle içlerinde yazılan programlara genellikle Kodlar (senaryo) veya senaryolar , makine diline çeviri gerektirir. Bunun için bir ifade yorumlayıcı programı programa kaydedilir. Derleyiciden farklı olarak, yorumlayıcı program metnin tamamını makine diline çevirmez, her bir ifadeyi ayrı ayrı çevirir ve ortaya çıkan makine kodunu hemen çalıştırır.

Programın yorumlanması, her bir ifadenin önce makine kodlarına çevrilmesi gerçeğinden dolayı, yürütülebilir modülün yürütülmesinden daha yavaştır. Ayrıca, hata aramada kaynak metin önceden taranmadığı için yorumlama işlemi sırasında beklenmedik bir şekilde hatalar meydana gelebilir.

Bununla birlikte, yorumlanan diller, onlarla program oluşturma kolaylığı nedeniyle yaygın olarak kullanılmaktadır. Program, ön dönüşümler olmaksızın yazılabilir ve hemen çalıştırılabilir. Programın çalışması yetersiz görünüyorsa, metni değiştirilebilir ve herhangi bir yeniden derleme yapmadan programı hemen yeniden çalıştırabilir.

Modern programlamada derlenmiş ve yorumlanmış diller arasındaki fark bulanıktır. Bu birleşme iki yönde gerçekleşir. Bir yandan, yorumlanan diller için derleyiciler oluşturulur. Klasik yorumlanan dil her zaman dil olmuştur. TEMEL, ancak şimdi bunun için birçok derleyici yazılmıştır. Programcının bir seçeneği vardır. Yazılmış bir program TEMEL, yorumlanabilir ve hemen yürütülebilir veya yürütülebilir bir modülde önceden derlenebilir ve daha uygun başka bir zamanda yürütülebilir.

Öte yandan, yorumlayıcılar önceden yorumlanmış ve yürütülmüş deyimlerin makine kodunu saklamayı öğrenmiştir. Bu ifadeler örneğin döngüler halinde tekrarlandığında, yorumlayıcı, işi önemli ölçüde hızlandıran hazır makine komutlarını kullanır. Bu tür tercümanlara denir JIT tercümanları (Tam zamanında). Klasik tercümanlardan çok daha hızlı çalışırlar ve bu nedenle daha yaygın hale gelirler.

Genel olarak, herhangi bir dil derlenebilir ve yorumlanabilir, bu nedenle bu ayrım, dilin bir özelliği değil, dil pratiği meselesidir. Ancak birçok dil için derlenen ve yorumlanan uygulamalar arasında performans farkı vardır.

BASIC, Lisp, Pascal ve Python dahil olmak üzere çok sayıda dilin her iki uygulaması da vardır. Java, başlangıçta yorumlanmış bir forma çevrilmiş olmasına rağmen, yerel kod oluşturmak için JIT derlemesini kullanır. Microsoft .NET Framework dilleri, çalışma zamanında yerel koda derlenen Ortak Ara Dil (CIL) ile derlenir. Lisp'in çoğu uygulaması, her iki tür kodu da karıştırmanıza izin verir.

Tarih

Programlamanın ilk günlerinde diller, yürütülme şekillerinden büyük ölçüde etkilendi. Örneğin derlenmiş diller, bir değişkenin veri türünün bildirildiği veya ilk kullanıldığı anda belirtilmesini gerektiriyordu. Yorumlanan diller dinamik yapıları nedeniyle daha fazla esneklik sağlayan ve gelişmeyi hızlandıran bu gereksinimin terk edilmesini mümkün kılmıştır.

Başlangıçta, yorumlanan diller satır satır makine koduna dönüştürüldü, yani her mantıksal satır, yürütmeden hemen önce derlendi. Sonuç olarak, döngü gövdesine eklenen ve birkaç kez yürütülen her komut, derleyici tarafından aynı sayıda işlendi. Şu anda, bu tür etkiler nadirdir. Yorumlanan dillerin çoğu, bir ara temsile önceden çevrilmiştir. Bu bir bayt kodu veya iş parçacıklı koddur. Bu, sırasıyla birkaç montajcı talimatına veya sanal makine talimatına eşdeğer, daha düşük seviyeli kodun küçük parçalarını çağırmak için bir talimat setidir. Zaten bu kod bir yorumlayıcı veya bir sanal makine tarafından yürütülür.

Örneğin, aşağıdaki diller bu şemayı kullanır:

  • Ruby (kodun soyut bir sözdizimi ağacı temsilini kullanır)

Ara kod, ya tüm projenin açık bir derlemesi (Java) ya da program başlamadan önce (Perl, Ruby) ve kaynak kodu değiştiğinde (Python) örtük çeviri ile oluşturulabilir.

Avantajlar

Bir yorumlayıcıda uygulanması bir derleyiciden çok daha kolay olan birkaç özellik vardır:

  • dinamik kapsam ve kapanışları kullanma

Ek olarak, programlama ilkeleri ve stili genellikle programı şekillendiren özel yapıların (bildirimler, sınıflar, veri türleri) oluşturulmasını ve tanımlanmasını gerektirmez. Bu, hem küçük programlar yazmak hem de karmaşık sistemler için yalıtılmış modül geliştirme için yararlı olan kodu aşamalı olarak geliştirmenize ve test etmenize olanak tanır. Çok yönlülükleri nedeniyle, betik dilleri olarak kullanımları uygundur.

Dezavantajları

Ana dezavantaj, makine koduna dönüştürülen derlenmiş dillere kıyasla daha az performans göstermesidir. Bayt koduna çeviri ve JIT derlemesi bu sorunu tamamen çözmez. Ek bir yorumlayıcı veya sanal makine katmanı, programın yürütülmesini yavaşlatır ve daha fazla kaynak gerektirebilir.

Tüm projenin derlenmemesi nedeniyle, çoğu hata yalnızca çalışma zamanında yakalanabilir. Sonuç olarak, ortalama olarak yorumlanan kod, derlenmiş koddan daha kapsamlı bir şekilde test edilmeli, kodlama kurallarına daha sıkı bir şekilde uyulmalı ve ek kod kalitesi analizörleri kullanılmalıdır. Derlenmiş dillerdeki ciddi gelişmeler de bu araçların kullanılmasını gerektirdiğinden son dezavantaj çok belirgin değildir.

Kullanım alanları

Derleme adımının ortadan kaldırılması, programların daha hızlı geliştirilmesine izin verir, bu nedenle karmaşık bir kerelik programlar yazarken (örneğin, bir kerelik bir hesaplama yapmak için) yorumlanmış diller kullanılır.

Örnek vermek


Wikimedia Vakfı. 2010 .

Diğer sözlüklerde "Yorumlu Programlama Dili" nin ne olduğunu görün:

    Sun Microsystems Corporation tarafından geliştirilen, bir web tarayıcısında çalışan ve yüksek düzeyde bir ... ... finansal kelime hazinesi

    Ruby Semantics: multi-paradigma Yürütme türü: yorumlayıcı Giriş tarihi: 1995 Yazar(lar): Yukihiro Matsumoto Son sürüm: 1.9.1 ... Wikipedia

    Bir programlama dili, bilgisayar programları yazmak için resmi bir işaret sistemidir. Bir programlama dili, bir programın ve eylemlerin görünümünü tanımlayan bir dizi sözcüksel, sözdizimsel ve anlamsal kural tanımlar, ... ... Wikipedia

    Bu terimin başka anlamları vardır, bkz. B. Bu terimin başka anlamları vardır, bkz. BI (anlamlar). B Dil sınıfı: prosedürel Yürütme türü: yorumlanmış Göründüğü tarih: 1969 A ... Wikipedia

    Bu terimin başka anlamları vardır, bkz. Lehçe (anlamlar). Lehçe Yürütme türü: yorumlanmış Yazar(lar): George Hart Lehçesi, George Hart tarafından bir enstitü projesinin parçası olarak oluşturulan yorumlanmış bir programlama dilidir… Vikipedi Vikipedi

    ABC Dil sınıfı: zorunlu, prosedürel, yapısal Yürütme türü: yorumlanmış, derlenmiş Çıkış tarihi: 1987 Yazar(lar): Leo Geurts, Lambert Meertens (… Wikipedia

ders 1- Programlama dilleri. Visual Basic

(Wikipedia'dan materyal - özgür ansiklopedi) Programlama dili- resmi ikonik tanımlamak için tasarlanmış sistem algoritmalar icracı için uygun bir biçimde (örneğin, bilgisayar). Programlama dili bir küme tanımlar. sözlüksel,sözdizimsel Ve anlamsal hazırlanmasında kullanılan kurallar bilgisayar programı. İzin veriyor programcı bilgisayarın tam olarak hangi olaylara yanıt vereceğini, bunların nasıl saklanacağını ve iletileceğini belirleme veri, ayrıca çeşitli koşullar altında bu veriler üzerinde tam olarak hangi eylemlerin gerçekleştirilmesi gerektiği. İlk programlanabilir makinelerin yaratılmasından bu yana, insanlık iki buçuk binden fazla programlama dili geliştirdi. programlama dilleri listesi(İngilizce)). Her yıl sayıları yenileriyle doldurulur. Bazı diller yalnızca az sayıda kendi geliştiricileri tarafından kullanılırken, diğerleri milyonlarca insan tarafından bilinir. Profesyonel programcılar bazen çalışmalarında bir düzineden fazla farklı programlama dili kullanırlar.Dil yaratıcıları kavramı farklı şekillerde yorumlarlar. Programlama dili. Çoğu geliştirici tarafından tanınan ortak yerler arasında şunlar yer alır:

    İşlev: bir bilgisayara aktarmak için kullanılan bilgisayar programlarını yazmak için bir programlama dili kullanılır Talimatlar birini veya diğerini yürütmek bilgi işlem süreci ve bireysel yönetim organizasyonu cihazlar.

    Bir görev: programlama dili farklıdır doğal diller bu iletilmek isteniyor komutlar ve insandan bilgisayara veri, doğal diller ise iletişim kurmak için kullanılır. insanların onların arasında. Prensip olarak, "programlama dilleri" tanımını genelleştirebiliriz - bu, komutları, emirleri iletmenin bir yoludur, eylem için net bir kılavuzdur; insan dilleri de bilgi alışverişine hizmet ederken.

    Uygulamak: programlama dili, tanımlamak ve işlemek için özel yapılar kullanabilir veri yapıları ve bilgi işlem sürecinin yönetimi.

Programlama dillerinin özellikleri

Her programlama dili, onu tanımlayan bir dizi resmi belirtim olarak temsil edilebilir. sözdizimi Ve anlambilim Bu özellikler genellikle aşağıdakilerin bir açıklamasını içerir:

    türleri ve veri yapıları

    İşlemsel anlambilim (dil yapılarını hesaplamak için bir algoritma)

    Dilin anlamsal yapıları

    İlkel Kitaplıklar (ör. G/Ç talimatları)

    Dilin amacı ve olanakları felsefesi

Yaygın olarak kullanılan birçok programlama dili için, ilgili dilin özelliklerini ve resmi tanımlarını düzenli olarak güncelleyen ve yayınlayan uluslararası standartlar komiteleri kurulmuştur. Bu tür komiteler çerçevesinde programlama dillerinin geliştirilmesi ve modernizasyonu devam etmekte ve mevcut ve yeni dil yapılarının genişletilmesi veya desteklenmesi ile ilgili sorunlar çözülmektedir.

Veri tipleri

Dahili gösterimde, modern dijital bilgisayarlardaki tüm veriler basitçe sıfırlar ve birler olarak saklanır ( ikili biçimde). Gerçek dünyadan gelen bilgileri (isimler, banka hesapları, ölçümler vb.) temsil eden veriler, programlama dilleri tarafından bu üst düzey kavramlara dönüştürülen düşük seviyeli ikili verilerdir.

Bir programda verilerin düzenlendiği özel bir sistemdir. tip sistemi Programlama dili; tip sistemlerin geliştirilmesi ve incelenmesi olarak bilinir tip teorisi. Diller sistem olarak sınıflandırılabilir statik yazarak ve diller dinamik yazma . Statik yazılan diller, daha sonra dillere bölünebilir: zorunlu beyan, her değişken ve işlev bildiriminin zorunlu bir tür bildirimine sahip olduğu ve çıkarsanan türler. Bazen dinamik olarak yazılan diller denir geç yazılmış .

Veri Yapıları

Üst düzey dillerdeki tip sistemleri, karmaşık, bileşik türleri tanımlamanıza izin verir. veri yapıları. Tipik olarak, yapı veri türleri şu şekilde oluşturulur: Kartezyen ürün baz (atomik) türleri ve önceden tanımlanmış bileşik türleri. Temel veri yapıları (listeler, kuyruklar, karma tablolar, ikili ağaçlar ve çiftler) genellikle yüksek seviyeli dillerde özel sözdizimi yapıları ile temsil edilir. Bu tür veriler otomatik olarak yapılandırılır.

Derlenmiş ve yorumlanmış diller

Programlama dilleri iki sınıfa ayrılır - derlenmiş Ve yorumlanmış. Özel bir program kullanarak derlenmiş dil programı derleyici Dönüştürülür ( derler) belirli bir işlemci tipi (makine kodu) için talimat setine ve ardından çalıştırılabilir dosya, bağımsız bir program olarak çalıştırılabilir. Başka bir deyişle, derleyici programı yüksek seviyeli bir dilden işlemcinin anlayacağı düşük seviyeli bir dile çevirir. Program yorumlanmış bir dilde yazılmışsa, o zaman Tercüman doğrudan yürütür ( yorumlar) önceden tercümesi olmayan metni. Program orijinal dilinde kalır ve tercüman olmadan çalıştırılamaz. Bilgisayar işlemcisinin makine kodunun yorumlayıcısı olduğunu söyleyebiliriz. Kısacası derleyici, ayrı bir program oluştururken programı hemen ve tamamen makine diline çevirir ve yorumlayıcı, programın yürütülmesi sırasında makine diline çevirir. Derlenmiş ve yorumlanmış dillere bölünme biraz keyfidir. Bu nedenle, geleneksel olarak derlenmiş herhangi bir dil için, örneğin paskal, bir tercüman yazabilirsiniz. Ek olarak, çoğu modern "saf" yorumlayıcı, dil yapılarını doğrudan yürütmez, ancak bunları bazı üst düzey ara temsillerde derler (örneğin, değişken referanssız ve makro genişletme ile). Yorumlanan herhangi bir dil için bir derleyici oluşturabilirsiniz - örneğin, orijinal olarak yorumlanan Lisp dili herhangi bir kısıtlama olmaksızın derlenebilir. Çalışma zamanında oluşturulan kod, çalışma zamanında dinamik olarak da derlenebilir. Kural olarak, derlenmiş programlar daha hızlı çalışır ve halihazırda makine diline çevrilmiş olduklarından, yürütülmesi için ek programlara ihtiyaç duymazlar. Aynı zamanda, program metnindeki her değişiklik, geliştirmede zorluklar yaratan yeniden derlenmesini gerektirir. Ayrıca, derlenmiş bir program yalnızca aynı tür bilgisayar üzerinde ve genellikle derleyicinin tasarlandığı aynı işletim sistemi altında çalışabilir. Farklı bir makine türü için yürütülebilir dosya oluşturmak için yeni bir derleme gerekir. Yorumlanan dillerin bazı özel ek özellikleri vardır (yukarıya bakın), ayrıca içlerindeki programlar değişiklikten hemen sonra çalıştırılabilir, bu da geliştirmeyi kolaylaştırır. Yorumlanmış bir dil programı, çoğu zaman, pek çok farklı türde makinede ve işletim sisteminde ek çaba harcamadan çalıştırılabilir. Ancak, yorumlanmış programlar, derlenmiş programlardan belirgin şekilde daha yavaş çalışır ve ek bir yorumlayıcı program olmadan çalışamazlar. Bazı diller, örneğin, Java Ve C#, derlenmiş ve yorumlanmış arasındadır. Yani program makine diline değil, düşük seviyeli makineden bağımsız koda derlenir, bayt kodu. Ardından, bayt kodu yürütülür sanal makine. Bayt kodunu yürütmek için genellikle yorumlama kullanılır, ancak bazı bölümleri programı hızlandırmak için Tam zamanında derleme teknolojisi kullanılarak program yürütme sırasında doğrudan makine koduna çevrilebilir. JIT). Java için bayt kodu, Java Sanal Makinesi (Java Sanal Makinesi, JVM), C# için - Ortak dil çalışması. Bu yaklaşım bir anlamda hem yorumlayıcıların hem de derleyicilerin avantajlarını kullanmanıza olanak tanır. Orijinal dilden de bahsedilmelidir. ileri, olduğu gibi, hem yorumlanır hem de derlenir.

Programlama dili gerçek işlemcilerden farklı olarak bazı soyut bilgisayarların makine kodu olarak da görülebilir. Bu tür durumlarda soyut veya sanal makinelerden bahsedeceğiz.

Derlemenin amacı, gerçek bir bilgisayarın soyut bir makine için yazılmış kodu yürütmesini mümkün kılmaktır. Ancak derleme, hedefimize ulaşmak için kullanılan iki temel teknolojiden yalnızca biridir.

Temel şemalar

Bir programı derlemek yerine, onu yorumlayabilirsiniz. Aşağıdaki şekil, girdinin rolünü göz ardı ederek yaklaşımlardaki farkı göstermektedir.


Pirinç. 3.6.

Hem derleyici hem de yorumlayıcı, bir programlama dilinde yazılmış girdi programları olarak alan programlardır. Derleyici, kendisine iletilen programı, doğrudan bilgisayarda çalıştırılabilen ve hesaplamaların çıktı sonuçlarını oluşturan hedef forma - makine koduna çevirir. Aynı kaynak programın bir yorumlayıcı tarafından işlenmesi, bir hedef program oluşturmaz, doğrudan onu çalıştırarak çıktı sonuçları üretir.

Yorumlayıcı, her bir programlama dili yapısını yürütmenin etkisini belirleyebilmelidir. Bir yorumlayıcının görevini nasıl yerine getirdiğine bir örnek olarak, x: = x +1 atamasının yorumunu düşünün. Yorumlayıcı, kullanılan tüm değişkenlerin ve bunlarla ilişkili değerlerin bir tablosunu tutmalıdır. Tabloda saklanan eski değere 1 ekleyerek yeni x değerini değerlendirir ve ardından eski x değerini değerlendirilen ifadenin değeriyle değiştirerek atamayı gerçekleştirir.

Derleyici, bilgisayar talimatlarını ve bellek adreslerini (tablo gibi daha yüksek seviyeli bir yapı yerine) kullanarak aynı etkiyi üreten makine kodunu üretecektir.

Küçük bir dil için ek bir alıştırmada, bu fikirleri bir derleyici ve yorumlayıcı yazmak için uygulayacaksınız.

Bir programlama dilini soyut bir makine için makine kodu olarak düşünürsek, yorumlayıcının bu makinede hesaplamayı simüle eden bir program olduğunu söyleyebiliriz. Bu durumda makine belleği de soyuttur ve "değişkenler - değerler" yorumlayıcısının tabloları biçimindeki veri yapılarını temsil eder.

Aşağıdaki şekilde, derleme ve yorumlama işlemleri veri girişi ile tamamlanmıştır:


Pirinç. 3.7.

Şekil, derleyici ve yorumlayıcı arasındaki başka bir farkı göstermektedir. Yorumlayıcının iki girdi kaynağı vardır - kaynak program ve girdi verileri; ve derleyiciye yalnızca program beslenir. Aşağıdaki tartışmada, bu fark matematiksel bir form verilecektir.

Derlemek veya yorumlamak? Bu problem, bilgisayar bilimlerinde kapsamlı bir değerlendirme konusudur. Hangisi daha iyi: kaynak bilgiyi olduğu gibi doğrudan işlemek mi yoksa önceden daha uygun bir forma getirmek mi? Bu soru sadece programların işlenmesinde değil, algoritmaların çalışmasında da karşılaşacağız.

Derleyiciler ve tercümanların kendi değerleri vardır. Çeşitli kriterler mümkündür. Performans açısından - program yürütme süresi - derleyiciler kazanır.

  • Derleyicinin çıktısı, doğrudan bilgisayar tarafından yürütülen makine kodudur. Ek olarak, bu kodu oluştururken, derleyici kod verimliliğini artıran iyileştirmeler uygulamış olabilir.
  • Kodun yorumlanması, her bir ifade yürütülürken önceden işlenmesini gerektirir. Sonuç olarak, programın yorumlanması, derleyici tarafından oluşturulan programın çalışmasına kıyasla çok daha yavaştır.

Kolaylığı ve geliştirme hızını kriter olarak seçerseniz her şey değişir. Derleyici, sizinle en son fikrinizin uygulanması arasında durur: programdaki son değişikliğin sonuçlarını görmeden önce, derlemenin (ve aşağıda tartışılacak olan bağlantının) sonucunu beklemeniz gerekir. Yorumlandığında, yürütme hemen başlar.

Modern geliştirme ortamlarında, bu derleme eksikliği, kullanılan teknoloji nedeniyle çok kritik değildir. "artan derleme" değişiklik yapıldığında programın yalnızca değişiklikten etkilenen bölümleri derlendiğinde. Bu dersin sonunda, bu teknolojinin EiffelStudio'da nasıl çalıştığına bakacağız.

Yine derlemenin tercih edildiği bir diğer kriter ise programın güvenilirliğidir. Derleyiciler bir programı çevirmekten daha fazlasını yapar; derleme sırasında statik olarak tür denetimi gibi çeşitli denetimler gerçekleştirirler. yazılan diller. Böylece, derleme aşamasında birçok hata ortadan kaldırılırken, yorumlama modu için, çalışma oturumlarından birinde yürütme sırasında hatalar tespit edilir.

Prensip olarak, tercüman programı çalıştırmadan önce bazı kontrolleri de yapabilir. Aslında saf tercümanlar kullanılmaz, her zaman derleme ve yorumlamanın bir karışımıdır.

Derleme ve yorumlamayı birleştirme

Saf derleme ve saf yorumlama şemaları aşırıdır: çoğu pratik çözüm bir karışımdır. Bu, bu bölümde daha sonra ele alınacak olan EiffelStudio'daki derleme süreci için de geçerlidir.

%100 yorumlama şemasının çok az anlamlı olduğuna dikkat edin: yorumlayıcı döngü ifadesi gibi bir ifadeyi her çalıştırdığında, birçok kez gerçek karakter dizisine geri dönmesi ve onu ayrıştırması gerekir. Hiçbir gerçekçi çözüm, böylesine mantıksız bir kaynak israfını kabul edemezdi. Dolayısıyla, aslında yorumlayıcı, girdiyi, soyut bir sözdizimi ağacı oluşturmak gibi, yorum için kabul edilebilir bir forma dönüştürmekle de başlar. Bu işlem sırasında, belirtildiği gibi, tip kontrol kontrolü mümkündür. Bu nedenle, bir dil yorumlayıcısının kullanıldığını okuyabilseniz bile, kısmi derleme ima edilir.

Yorumlama ve derleme kombinasyonu, tartışılan temel fikirden çok daha ileri gider. Derleyicinin çıktısı doğrudan makine kodu olmak zorunda değildir, daha fazla işleme tabi olabilir.


Pirinç. 3.8.

Karma Strateji derleyicinin kod ürettiğini varsayar. ara dil, bazı sanal makineler tarafından anlaşıldı - şekildeki VM. Bu yaklaşım, derleme ve yorumlamanın avantajlarını birleştirir. Özenle tasarlanmış bir sanal makine sayesinde şunları elde etmek mümkündür:

  • VM kodu fiziksel işlemcilerin özelliklerine bağlı olmadığından taşınabilirlik;
  • yaratıldığından beri verimlilik artışı ara kod kolayca yorumlanır.

Sanal makineler, bayt kodu ve JIT (Tam Zamanında) derleyicileri

Modern dillerin uygulanması - Java, C#, diğer .Net dilleri - karma bir çözüme dayanmaktadır. ara kod Java için bayt kodu denir. Terim, sanal makinenin, gerçek bir işlemcininkilere benzer kompakt yönergeler kullandığı gerçeğini yansıtır; burada her yönerge bir yönerge kodu (genellikle tek bir bayt) ve ardından 0, 1 veya 2 yönerge bağımsız değişkeni içerir.

Bayt koduna bir alternatif, örneğin program yapısını temsil etmek için soyut bir sözdizimi ağacı ve değişkenlerin özelliklerini depolamak için karma tabloları gibi doğrudan veri yapılarıyla çalışan bir sanal makine olabilir. Ancak bayt kodu, hem zaman hem de bellek açısından daha iyi çalışma zamanı verimliliği sağlar.

İki aşamalı derleme tekniği yetmişli yıllarda Pascal dilinden bir derleyici uygularken kullanıldı. Web istemcileri tarafından yerel olarak yürütülmesi için çok uygun olduğu için İnternet'in yayılmasıyla yeniden doğdu. Uygulama sağlayıcıları - küçük programlar - bunları bayt kodunda derleyebilir ve bu biçimde gönderebilir. Kompaktlığın ek bir avantajı, kodun taşınabilirliğiydi, çünkü aksi takdirde mümkün olan her şey için makine kodunun oluşturulması gerekirdi. hedef platform.

Applet'i çalıştırmak için kullanıcıların yalnızca bir bayt kodu yorumlayıcısına ihtiyacı vardır. Web tarayıcılarında yerleşikse, böyle bir yorumlayıcının var olduğunu bilmeleri bile gerekmez.Bu yaklaşımla ilgili potansiyel güvenlik riskleri bulunduğundan (haydut veya yanlış uygulamalar bilgisayarınıza zarar verebilir) bu nedenle uygulamalar bir yorumlayıcıya ihtiyaç duyar. bu, uygulamalarda izin verilen işlemleri kesinlikle kontrol edecektir.

Uygulamalar aracılığıyla yazılım teslimi bir miktar başarılı oldu, ancak Java tanıtıldığında beklendiği gibi yazılımı dağıtmanın ana yolu haline gelmedi. Bu kısmen güvenlik sorunlarından kaynaklanmaktadır, ancak ana neden yorumlama nedeniyle verimlilik kaybıdır. Başarılı uygulamaların çoğu, fazla zaman kaybetmeyen bir görsel bileşen içeren bir Web sayfasında çalışmak üzere tasarlanmış küçük programlardır.

Bayt kodu çalışma zamanının verimliliğini artırmak için, istek üzerine derlenen jitter adı verilen JIT (Tam Zamanında) derleyicileri kullanılır. Ana fikir, bazı modüllerin makine kodunun, ilk kez yürütme için çağrıldığı anda anında oluşturulmasıdır (caz aşığı - jitterbug'ı bu tür derleyici hatalarıyla - jitter bug ) karıştırmayın. Şimdi aşağıdaki gibi görünen önceki şekle uygun eklemeleri yapalım:


Pirinç. 3.9.

Genellikle, şekilde gösterildiği gibi, anında derleme (jitting) ile birlikte, bayt kodunu yorumlama olasılığı da vardır. Anında derleme genellikle bir modül (bir yöntem veya tüm sınıf) ilk kez kullanıldığında gerçekleşir, bu nedenle yalnızca o çalıştırma oturumunda gerçekten kullanılan kod için gerekli olacaktır. Tüm programı derleyen geleneksel bir derleyici ile karşılaştırıldığında, bu yaklaşım daha kompakt kod oluşturmanıza olanak tanır, derleme süresini azaltır, ancak daha da önemlisi derlemeyi yürütme sürecinin bir parçası yapar. İkincisi ciddi bir dezavantajdır, çünkü derlemenin ek yükü çalışma zamanına eklenir, böylece çalışma zamanının kendisi daha az tahmin edilebilir hale gelir.

İlk bakışta, bu yaklaşımla, tür kontrolleri ve diğer kontrolleri yapmamalısınız, çünkü çalışma zamanında kim ihlal mesajları almak ister? tür tutarlılığı? Bu bizi dinamik olarak problemlere geri getirecektir. yazılan diller. Elbette, bayt kodunu oluştururken ilk derleme adımında gerekli tüm kontrollerin yapılmasını isteriz, böylece titreşime iletilen herhangi bir kod güvenli olur. Ne yazık ki, bu rahatlatıcı varsayımlar, yine güvenlik endişelerinin ortaya çıktığı dağıtılmış bir ortamda gerçekçi değildir. Bir web sitesinden bayt kodu indiriyorsanız, testi geçip geçmediğini biliyor musunuz? Genel olarak, hayır. Ancak, tür ihlalleri yalnızca güvenilirlik ihlallerine ve program çökmelerine neden olmakla kalmaz, işler çok daha kötü olabilir: bir saldırı sonucunda güvenlik ihlali mümkün hale gelir.

Güvenlik uzmanlarının bakış açısına göre, güvenlik ihlalleri çökmelerden daha kötüdür: bir çökme durumunda her şey durur, güvenlik ihlalleri durumunda program güvenli bir şekilde çalışmasına devam edebilir ve hatta doğru sonuçlar verebilir, ancak buna değer gizli bilgiler. elde edilen sonuçlardan daha fazlası kaybedilebilir.

Sonuç olarak, pratikte, anında derleme, her durumda, bir kontrol içerir. tür tutarlılığı. Bayt kodlu sanal makinenin tür sistemi genellikle kaynak programın tür sisteminden çok daha basit olduğu için performans cezası yine de kabul edilebilir.

EiffelStudio'daki derleme stratejisi ayrıca bayt kodunu da içerir, ancak göreceğimiz gibi, yorumlama ve derlemeyi birleştirmenin farklı yollarını kullanır.

Bu seride, yaptığımız her şeyi etkileyen, ancak nadiren doğrudan karşılaştığımız ve bu nedenle onları tam olarak anlamadığımız programlamanın temel ilkelerine dikkatinizi çekmek istiyorum. Bugünkü makalenin konusu derlenmiş ve yorumlanmış dillerdir.

Geliştiriciler olarak, genellikle derleyici ve yorumlayıcı gibi kavramlarla karşılaşırız, ancak çoğunun ne anlama geldiklerini tam olarak anlamadığına inanıyorum. Bu arada, derleme ve yorumlama, tüm programlama dillerinin nasıl çalıştığının temelleridir. Şimdi bu kavramların gerçekte nasıl çalıştığına bir göz atalım.

Tanıtım

Kodumuzu bir bilgisayarın anlayabileceği bir forma dönüştürmek için derleme ve yorumlama gibi araçlara güveniyoruz. Kod, makine koduna dönüştürüldükten sonra (derleme yoluyla) işletim sisteminde yerel olarak yürütülebilir veya bunu OS (yorumlayıcı) yerine bunu yapan başka bir program tarafından satır satır yürütülebilir.

Derlenmiş bir dil, programın derlendiğinde hedef makinenin talimatlarını içerdiği bir dildir; bu makine kodu insanlar için anlaşılmaz. Yorumlanmış bir dil, talimatların hedef makine tarafından yürütülmediği, ancak başka bir program (genellikle hedef makinenin dilinde yazılan) tarafından okunup yürütüldüğü bir dildir. Derleme ve yorumlamanın her ikisinin de artıları ve eksileri vardır ve biz de bunu tartışacağız.

Devam etmeden önce, birçok programlama dilinin hem derlenmiş hem de yorumlanmış versiyonlarının bulunduğunu belirtmekte fayda var, bu yüzden onları sınıflandırmak zor. Ancak işleri basit tutmak için bundan sonra derlenmiş ve yorumlanmış dilleri ayıracağım.

Derlenmiş diller

Derlenmiş dillerin ana avantajı, yürütme hızıdır. Makine koduna dönüştürüldükleri için, özellikle bazı modern komut dosyası yorumlanmış dillerdeki ifadelerin karmaşıklığı göz önüne alındığında, yorumlananlardan çok daha hızlı ve daha verimlidirler.

Düşük seviyeli diller derlenebilir olma eğilimindedir çünkü verimliliğe genellikle platformlar arası öncelik verilir. Ayrıca derlenmiş diller, geliştiriciye bellek yönetimi ve CPU kullanımı gibi donanım üzerinde çok daha fazla kontrol sağlar. Derlenmiş dillere örnek olarak , Erlang ve .

Derlenmiş dillerin sorunları genel olarak açıktır. Derlenmiş bir dilde yazılmış bir programı çalıştırmak için önce derlenmesi gerekir. Bu sadece fazladan bir adım değil, aynı zamanda hata ayıklamanın önemli bir komplikasyonudur, çünkü herhangi bir değişikliği test etmek için programın yeniden derlenmesi gerekir. Ayrıca derlenmiş diller platforma özeldir çünkü makine kodu, programın derlendiği ve yürütüldüğü makineye bağlıdır.

yorumlanan diller

Derlenmiş dillerin aksine, yorumlanmış dillerin bir programı yürütmek için makine koduna ihtiyacı yoktur; bunun yerine tercümanlar programı satır satır yürütür. Yorumlama süreci eskiden çok zaman alıcıydı, ancak gibi teknolojilerin ortaya çıkmasıyla, derlenen ve yorumlanan diller arasındaki boşluk kapanıyor. Yorumlanan dillerin örnekleri , ve . Yorumlanan dillerin kolaylaştırdığı bazı kavramlar şunlardır:

  • Platform bağımsızlığı;
  • Daha küçük yürütülebilir dosyalar:

Yorumlanan dillerin ana dezavantajı, düşük yürütme hızlarıdır. Ancak, JIT derlemesi, sık kullanılan komut dizilerini makine koduna çevirerek süreci hızlandırır.

Bonus: bayt kodu dilleri

Bytecode dilleri, kodu yürütmek için hem derleme hem de yorumlamayı kullanan dillerdir. Java ve .NET çerçevesi, bayt kodu dillerinin tipik örnekleridir. Aslında, Java Sanal Makinesi (JVM), üzerinde birkaç dil uygulamasının çalıştığı popüler bir bayt kodu yorumlama sanal makinesidir. Bu arada, son zamanlarda statik derleme, Java'nın yeni sürümünde de desteklenecek.

Bir bayt kodu dilinde, program önce insan tarafından okunabilen bir dilden bayt koduna derlenir. Bir bayt kodu, kompakt sayısal kodlar, sabitler ve bellek referanslarından oluşan bir yorumlayıcı tarafından verimli bir şekilde yürütülmek üzere tasarlanmış bir dizi talimattır. Bu noktadan itibaren bayt kodu sanal makineye iletilir ve bu makine de kodu normal bir yorumlayıcı ile aynı şekilde yorumlar.

Kodu bayt koduna derlerken bir gecikme olur, ancak bayt kodu optimizasyonu nedeniyle daha fazla yürütme hızı önemli ölçüde artar. Buna ek olarak, bayt kodu dilleri platformdan bağımsızdır ve hız açısından yorumlanan dillerden daha iyi performans gösterir. JIT derlemesi de onlar için mevcuttur.

Çözüm

Bu günlerde birçok dil, ikisi arasındaki farkı azaltarak hem derlenmiş hem de yorumlanmış uygulamalara sahiptir. Her kod yürütme türünün avantajları ve dezavantajları vardır.

Kısacası derlenmiş diller, makine kodu olarak çalıştıkları ve sistem donanımının kullanılmasına izin verdikleri için en verimli olanlardır. Ancak bu, kod yazma konusunda ek kısıtlamalar getirir ve onu platforma özel hale getirir. Yorumlanan diller ise platformdan bağımsızdır ve metaprogramlama gibi dinamik programlama tekniklerine izin verir. Ancak, yürütme hızında derlenmiş dillerden önemli ölçüde daha düşüktürler.

Bytecode dilleri ise her iki dilin de güçlü yanlarını kullanmaya çalışır ve bunu oldukça iyi yaparlar.