Programlama dillerinin sözdizimi bunların uygulanmasına bağlı mı?


12

Buna rağmen, sorum tamamen alakasız olabilir, ancak çoğu programlama dili ve resmi uygulamaları arasında bir model algıladım.

Python, Lua vb. Gibi yorumlanan (bayt-yorumlanmış?) Diller genellikle son derece yumuşak ve kolay bir sözdizimine sahiptir ve genellikle türsüzdür veya geliştiricinin kaynak kodunda değişken türleri açıkça yazmasını gerektirmez;

C, C ++, Pascal vb. Gibi derlenmiş diller genellikle katı bir sözdizimine sahiptir, genellikle türleri vardır ve çoğunlukla daha fazla kod / geliştirme süresi gerektirir

Resmi uygulamaları Java / C # gibi JIT-Derlenmiş olan diller genellikle yukarıdaki ikisi arasında her ikisinin de en iyi özelliklerinden bazılarıyla benzersiz bir uzlaşmadır.

D ve Vala (ve Java'nın GNU GJC uygulaması) gibi daha modern derlenmiş programlama dillerinden bazıları belki de bu kurala bir istisnadır ve Java ve C # gibi JIT-Derlenmiş dillerin Sözdizimi ve özelliklerine benzemektedir.

İlk sorum şu, bu gerçekten alakalı mi? Ya da bu sadece yorumlanmış dillerin kolay sözdizimine sahip olması, JIT-Derlenmiş olanların ılımlı sözdizimi ve özellikleri vb.

İkincisi, eğer bu bir tesadüf değilse, neden böyle? Örneğin, bazı özellikler yalnızca bir programlama dilinde uygulanabilir, örneğin, JIT-Derleme iseniz?


@YannisRizos üzgünüm, bu bir teklif değil. Sadece vurgulamak istedim. Ben düzenleyeceğim.
ApprenticeHacker

1
Güzel, bir teklif olmasa da, cevaplayıcıların biri olduğunu düşünmesine ve onu reddetmeye çalışmamasına (veya körü körüne katılmasına) neden olabilir ... Benzer desenler fark ettim ama maalesef iyi değil Cevap.
yannis

@ R.MartinhoFernandes üzgünüm, bunun farkında değildim. Düzenleyeceğim (tekrar).
ApprenticeHacker

4
Perl, kullanıcı tanımlı türler için dinamik olarak yazılır, dizileri, karmaları, skalerleri ve alt rutinleri ayırt etmek için statik olarak yazılır ve katı, yorumlanmış ve JIT derlenmiş olarak güçlü bir şekilde yazılır (aynı anda değil) ... dil tasarımını anlamak için, bazı Perllere atmak her zaman eğlencelidir ...
yannis

3
"Katı sözdizimi" ile "katı sözdizimi" ne demek? Hepsi resmi dillerdir ve hiçbiri kaynak kodunu sözdizimi hatalarıyla çalıştırmaz.
nikie

Yanıtlar:


17

Anlambilim ve sözdizimi arasında hiçbir bağlantı yoktur. Homemeconic derlenmiş diller Scheme gibi oldukça minimalist bir sözdizimi ile birlikte gelir. Forth gibi düşük seviyeli derlenmiş meta diller bundan daha da basittir. Bazı çok katı bir şekilde derlenmiş diller önemsiz bir sözdizimi üzerine inşa edilmiştir (düşün ML, Haskell). OTOH, Python sözdizimi, bir dizi sözdizimi kuralı açısından çok ağırdır.

Ve evet, yazımın sözdizimi ile ilgisi yoktur, C ++ kadar sapkın bir şey olmadığı sürece, dilin anlambilimi tarafındadır, burada tüm yazma bilgilerine sahip olmadan ayrıştıramazsınız.

Genel bir eğilim, çok uzun bir süre evrimleşen ve sözdizimi sapmalarına karşı herhangi bir tasarım güvencesi içermeyen dillerin er ya da geç sözdizimsel iğnelere dönüşeceğidir.


Bana "homoiconic" bakmak için +1 ... Ve PHP için ince başını sallamak için ...
yannis

1
+1, çok uzun bir süre evrimleşen ve herhangi bir tasarım güvencesi içermeyen diller , bu aynı zamanda Delphi / Object-Pascal'ı da ifade ediyor mu?
ApprenticeHacker

1
@ThomasEding, yanılıyorsun. Aynı semantik, sözdizimsiz bir dilde (Lisp veya Forth gibi) bile çok geniş bir sözdizimi stilinin üstüne uygulanabilir. Aynı sözdizimi çok çeşitli farklı anlambilimle kullanılabilir - örneğin, C ve Verilog ifadelerinin sözdizimi neredeyse aynıdır, ancak anlambilim önemli ölçüde farklıdır.
SK-logic

1
@ SK-logic - Sadece karmaşık olması ve Turing-complete'un programın sözdiziminin en azından çok büyük bir parçası olmadığı anlamına gelmez. Çeşitli dilleri ayrıştırmak Turing-complete'tur ve sihirli bir şekilde "sözdizimi ile ilgisi olmayan" bir şeyi ayrıştırmaz. Sözdizimi "kapsam" ile ilgili değildir, söz konusu ifadelerin ne anlama geldiği hakkında hiçbir şey söylemeden, bir dildeki ifadelerin yapısı için kurallarla ilgilidir. Tür denetimi ve tür çıkarımı, programların sözdizimi ağaçlarında yürütülmeden çalışır - program hakkında hiçbir şey söylemeden programın yapısı hakkında bir şeyler belirlerler ...
Jack

1
@Jack, sentaksın ne olduğunu yeniden tanımlamaya çalışıyorsun. Turing-tam ayrıştırıcıya ihtiyaç duyan pratik diller yoktur, çoğu bağlamdan başka bir şey değildir. İşte sözdizimi burada kalmalı. Lütfen bu (zaten çok gerilmiş) kavramı başka bir yere uzatmayın. Ve Curry-Howard izomorfizminden daha önce bahsetmiştim - her şey anlambilimle ilgili, sadece doğruluk kurallarının çok ötesinde. Bence " type checking" terimi son derece verimsizdir ve kullanılmamalıdır, çok yanıltıcıdır, tip sistemlerinin doğasını yansıtmaz.
SK-logic

6

Çoğunlukla bu bir tesadüf.

Programlama dilleri zamanla gelişti ve derleyici ve tercüman teknolojisi gelişti. Temel işlemenin verimliliği (yani derleme süresi, yorumlama yükü, yürütme süresi vb.) Ana akım bilgi işlem platformlarının gücü arttıkça daha az önemlidir.

Dil sözdizimi yapar örneğin, Pascal çok dikkatli tek geçişli derleyici kullanmak böylece tasarlanmıştır - - kaynağının üzerinde yani bir geçiş ve excutable makine koduna sahip bir etkisi var. Diğer yandan Ada buna dikkat etmedi ve Ada derleyicilerinin yazması çok zor - çoğu birden fazla geçiş gerektiriyor. (Yıllar önce kullandığım çok iyi bir Ada derleyicisi 8 geçişli bir derleyiciydi. Tahmin edebileceğiniz gibi çok yavaştı.)

Fortran (derlenmiş) ve BASIC (yorumlanmış veya derlenmiş) gibi eski dillere bakarsanız, çok sıkı sözdizimi ve semantik kuralları vardır / vardı. [BASIC durumunda, bu eski BILL TEMEL değil, bundan önce orijinaline geri dönmeniz gerekir.]

Öte yandan, APL (bir sürü eğlence) gibi diğer eski şeylere bakmak, bunun dinamik bir yazımı vardı. Aynı zamanda genel olarak yorumlanmıştır, ancak derlenebilir.

Yumuşak sözdizimi zor bir sorundur - bu, isteğe bağlı veya çıkartılabilecek şeylere sahip olduğunuz anlamına gelirse, dilin alınabileceği kadar zenginliğe sahip olduğu anlamına gelir. Daha sonra BASIC, yıllar önce "LET" ifadesinin isteğe bağlı hale geldiği zaman oldu!

Şu anda gördüğünüz fikirlerin çoğu (örneğin, daktilo veya dinamik yazım) aslında çok eskidir - ilk olarak 1970'lerde veya 1980'lerin başında ortaya çıkıyor. Kullanım şekilleri ve bu fikirlerin kullanıldığı diller değişti ve büyüdü. Ama temelde, yeni olanların çoğu aslında yeni kıyafetler giymiş eski şeyler.

İşte başımın üstünden bazı örnekler:

  • APL: dinamik yazma. Genel olarak yorumlanır. 1960'lardan / 1970'lerden geldi.
  • TEMEL: güçlü veya dinamik yazma. Yorumlanmış veya derlenmiş. 1970'ler ve daha fazlası.
  • Fortran: güçlü yazma. Derleyen. 1960'lar veya öncesi.
  • Algol68: güçlü yazma. Derleyen. 1960'lar.
  • PL / 1: güçlü yazma. Derleyen. 1960'lar.
  • Pascal: Güçlü yazma. Derleyen. 1970'li. (Ama 1980'lerde JIT derleyicilerine çok benzeyen P-Sistem derleyicileri vardı!)
  • Fortran ve diğerlerinin DEC tarafından ilk günlerdeki uygulamaları kısmen derlenmiş ve kısmen yorumlanmıştır.
  • Smalltalk: dinamik yazma. Yorumlanan bayt koduna derlenir. 1980.
  • Prolog: daha tuhaflık. Fonksiyonel. Derlendi (Turbo Prolog, kimse var mı?). 1980.
  • C: güçlü (ha ha) yazarak. Derleyen. 1960's..today.
  • Ada: uber-güçlü yazma. Derleyen. 1980.
  • Perl: dinamik yazma. (Güçlü sözdizimi). Yorumlanır. 1990'lar (?).

Devam edebilirdim.

  • Nitpickers köşesi: Yorumlanan birçok dil, kaynak yüklendiğinde / okunduğunda tokenleştirilir veya "bayt derlenir". Bu, yorumlayıcının sonraki çalışmasını çok daha basit hale getirir. Bazen kodun bayt-derlenmiş sürümünü kaydedebilirsiniz. Bazen yapamazsın. Hala yorumlu.

Güncelleme: Çünkü yeterince açık değildim.

Yazma çok değişebilir.

Derleme zamanı sabit statik yazma yaygındır (örneğin, C, Ada, C ++, Fortan vb.). Burası bir TÜR ŞEYİ ilan ettiğiniz yerdir ve sonsuza dek bu şekilde olur.

Ayrıca, nesnenin kendisine atanan türü seçtiği dinamik yazmaya sahip olmak da mümkündür. Örneğin, bir değişkene bir tamsayı atayacağınız PHP ve bazı erken BASIC ve APL, oradan da bir tamsayı türüdür. Daha sonra dizeye bir dize atadıysanız, dize türüydü. Ve bunun gibi.

Ve sonra gevşek yazım var, örneğin bir değişkene sayısal bir tamsayı atamak (alıntı, bu yüzden bir dize) gibi gerçekten tuhaf şeyler yapabilir ve daha sonra ona bir sayı ekleyebilirsiniz. (örneğin '5' + 5 10 ile sonuçlanır). Bu tuhafın ülkesi, ama aynı zamanda çok yararlı.

ANCAK bunlar bir dile dönüştürülmüş özelliklerdir. Uygulama sadece bunu gerçekleştirir.


13
Güçlü yazma, dinamik yazmanın karşılığı değildir. Zayıf yazmanın karşılığı. Dinamik yazmanın karşılığı statik yazımdır: birinde, bir programdaki ifade türleri statik olarak bilinir (yani programı çalıştırmadan); diğerinde ise türler sadece dinamik olarak bilinir (yani program çalıştırılmalıdır).
R. Martinho Fernandes

Evet ve BASIC ve APL'nin bazı varyantları bunu 1970'lerin sonunda yapıyorlardı. APL türleri bugün onları anladığımız kadar değil (evrensel olarak yazılan tamsayı / kayan nokta gibi şeyler olmakla birlikte vektörler, dizeler ve çok boyutlu matrisler de olabilir).
quickly_now

Bir Fortran tercümanı hala yaygın olarak kullanılmaktadır (bkz. Cernlib ve PAW). Ve onun soyundan, ROOT, bir C ++ yorumlayıcısı üzerine kurulmuştur.
SK-logic

Dürüst olmak gerekirse, güçlü / zayıf ve statik / dinamik yazımın sözdizimi ile ne kadar ilgili olduğu konusunda net değilim. Ama cevap kalitesi oldukça iyiydi, bu yüzden sadece oylardan kaçınıyorum. C sınıfı "statik / zayıf" olarak yazarak (saklı bir değere sanki değeri yanlış alıyorum başka bir tür gibi bakmak önemsiz).
Vatine

@Vatine - Aslında derleme zamanında güçlü, çalışma zamanında var olmayan - bu şekilde isterseniz söyleyebilirim. Bunu birçok dilde işaretçiler ve eşdeğerlerini kullanarak yapabilirsiniz. Varyant kayıtları kullanan klasik paskalda ve UNCHECKED_CONVERSION kullanan Ada'da bile mümkündür (zor olsa da mümkündür).
quickly_now

2

Bence başka bir yol var: uygulama sözdizimine bağlı. Örneğin, sözdiziminiz yansımaya izin veriyorsa, uygulama bunu destekleyen bir çalışma zamanı sağlamalıdır.


@IntermediateHacker: ama java içinde, bu yüzden harika
olmalıyım

2

Gözleminizin esasen tarihin bir sonucu olduğunu genel olarak hemen kabul ediyorum. Bununla birlikte, altta yatan akıl yürütme böyle bir şeye kaynar:

The more modern a language is, the more comfortable it should be to use.

(Gerçekten bir alıntı değil, sadece kendi formülasyonum.) Buraya yazdığımda comfortable, ne dediğine atıfta bulunuyorum best features of both. Daha doğrusu, statik / dinamik yazım veya katı / yumuşak sözdizimi için veya bunlara karşı konuşmak istemiyorum. Bunun yerine, geliştiricilere odaklanıldığını ve dil ile çalışırken konfor seviyelerini artırdığını görmek önemlidir.

Önceki cevaplarda belirtilmeyen, neden bunları gözlemlediğiniz konusunda bazı fikirler sağlayabilecek bazı nedenler (ve hepsi programlama dili geliştirme tarihine dayanmaktadır):

  • Bugünlerde yüzlerce programlama dilimiz var. Yenisi ortaya çıktığında, geniş bir kitleyi nasıl bulabilir? Yeni dillerin her zaman geliştiricilerin konfor seviyesini artırmaya çalışmasının ana nedeni budur. Dil eski bir dil ile aynı şeyi yapabilirse, ancak çok daha kolay / basit / daha zarif / vb. aslında geçişi düşünebilirsiniz.

  • Öğrenme eğrisi bununla el ele gider. Geçmişte, birkaç dilimiz vardı ve birisinin buna değdiğini öğrenmek için zaman harcadık. Bu çok zaman harcamak anlamına gelse bile. Geliştiricilerin çok hızlı öğrenebilecekleri bir dil bulursanız, konfor tekrar artar. Her türlü karmaşıklık (örneğin, karmaşık ilgili sözdizimi) buna zararlıdır ve bu nedenle yeni dillerde giderek daha fazla azalmaktadır.

  • Teknolojik gelişmeler (burada doğrudan tarihsel bir neden) derleyici üreticilerinin geliştirici konforuna daha fazla odaklanabilmesinden sorumludur. İlk günlerde bir derleyici oluşturabildiğimiz için mutluyduk. Bununla birlikte, bu genellikle ağır kısıtlamalar yapılmasını gerektiriyordu. Teknolojik know-how arttıkça, bu kısıtlamaları tekrar kaldırmayı başardık.

Bu nedenle, genel olarak, programlama dilleri ve derleyiciler tipik son kullanıcı uygulamalarına benzer bir gelişme görmüşlerdir:

  1. İlk aşama: Sahip olmak harika bir şey, ancak kanayan kenar teknolojisi, konfor / kullanılabilirlik / ne pahasına olmasa da neredeyse hiç çalışmamasını sağlıyor.
  2. Teknolojik gelişme: Bunları daha sağlam, daha hızlı ve daha kolay yapabiliriz.
  3. Odak kullanıcıya dönüşür: Kullanıcı deneyimine odaklanan Web2.0 hareketine benzer şekilde, yeni programlama dilleri geliştirici perspektifine odaklanır.

(Not a quote really, just my own formulation.)Peki, bir blok alıntı olarak değil kod olarak biçimlendirdiniz, bu yüzden kimsenin bir teklif olduğunu düşündüğünü sanmıyorum :)
yannis

3
Konfor açıkça bir tada bağlıdır (her zaman tamamen özneldir). En rahat olduğum dil 1959'da tasarlandı ve bu yüzyılda ortaya çıkan bazı dillerle uğraşmaya dayanamıyorum.
SK-logic

1
Konfor da amaca bağlıdır. Bir çamaşır makinesi kontrolörü için 8k gömülü bir mikroda PHP veya Prolog çalıştırmak, programlamak için "rahat" olabilir, ancak aynı zamanda kabul edilebilir performansla gerçekten uyum sağlamak ve çalıştırmak için çok zor olabilir.
quickly_now

0

Belirli bir programlama dili, bir derleyicinin çalışma zamanı kararları eklenmeden yürütülebilir koda nasıl indirileceğini belirlemeye yetecek anlamsal bilgiyi açığa çıkarabilir veya sınırlandırabilir ("bu değişken nedir?" Vb.) Bazı diller açıkça yapmak için tasarlanmıştır bu kısıtlama zorunludur veya belirlenmesi kolaydır.

Derleyiciler daha akıllı hale geldikçe, açıkça bu kararları ortaya çıkarmak veya kısıtlamak için tasarlanmamış diller için bile en olası yollar için yürütülebilir kod üretmek üzere yeterli bilgiyi tahmin edebilir veya profil oluşturabilirler.

Bununla birlikte, kodun (evalString ()) çalışma zamanında oluşturulabileceği veya girilebileceği diller (ve derleyicinin çıkartamayacağı veya tahmin edemeyeceği diğer şeyler), çalışma öncesi, onları derleyin.

Geçmişte, bir programlama dili ve uygulaması, yorumlayıcının 4k veya 16k'ye sığabileceği veya derleyicinin bir dakikadan daha kısa bir sürede tamamlanıp tamamlanmayacağı gibi bazı donanım kısıtlamalarına uyacak şekilde gelişmiş olabilirdi. Makineler hızlandıkça, daha önce yorumlanmış bazı programları programcının dönüş tuşuna basabileceği kadar hızlı bir şekilde derlemek (veya) derlemek veya eski derlenmiş program kaynak kodunu biraz daha eski donanımın optimize edilmiş derlenmiş yürütülebilir dosyaları çalıştırabildiğinden daha hızlı yorumlamak mümkün hale gelmiştir.

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.