Bir dili belirli bir görev için “optimize edilmiş” yapan nedir?


15

Genellikle belirli görevler için uzmanlaşmış programlama dilleri vardır. Bazı programlama dilleri dizi aritmetiğinde mükemmeldir (matrisler ve çok boyutlu dizilerin kullanımı gibi), ancak bazıları diğer dillerde yeniden üretilmesi zor olan (ancak yine de aynı olan) daha yüksek seviyeli matematikte çok daha iyidir.

Bir dil, belirli bir görev veya nihai hedef için, en azından yine de derlemeye derlendiğinden, diğer dillerden daha iyi yapar?

Turing tam dillerden, Turing eşdeğeri olanlardan bahsediyorum.


1
Bu ansiklopedik bir soru. Bir şekilde yıkmanızı, daha belirgin hale getirmenizi öneririm.
André Souza Lemos

5
"Pazarlama" demek yanlış olur mu?
corsiKa

2
@corsiKa Evet, bence bu bir pazarlama meselesinden daha fazlası.
Jeremy West

Yanıtlar:


18

Dikkate alınması gereken birkaç nokta var:

  • Soyutlama: dil "özel" olarak neyi ele alır? Matrisler Matlab'daki gibi birinci sınıf değerler midir, yoksa C'deki gibi diziler gibi daha basit türler kullanarak bunları kodlar mısınız? C matrislerin nasıl uygulandığını düşünmenizi sağlar, Matlab yapmaz.

    Benzer şekilde, karmaşık bir asenkron iletişim sisteminiz varsa, geri arama yapabilmeniz için muhtemelen birinci sınıf işlevler istersiniz.

    Ne kadar çok özellik eklenirse, dil o kadar karmaşık hale gelir. Bu nedenle, C ++ ve D gibi bazı "çoklu paradigma" dilleri olsa da, çoğu dil bir niş seçer, bu niş için önemli olan şeyleri seçer ve ana soyutlamalara öncelik verir.

  • Performans: derleme zamanı veya çalışma zamanı olsun, tüm soyutlamanın bir maliyeti vardır. Bazı diller kendilerini daha az soyut, ancak daha fazla performans gösterecek şekilde sınırlarlar.

    Erken Fortran, işaretçiler veya özyinelemeye izin vermedi, bu nedenle çok sayıda döngü yürüttüğünüz C gibi bir dilden daha hızlı, sayı sıkışıklığında harikaydı. Ancak, dolaylı gösterim için işaretçilere ihtiyaç duyduğunuz, ağaçlar gibi büyük veri yapılarını kodlamak korkunçtu. (Modern Fortran hakkında fazla bir şey bilmediğimi unutmayın.)

Esasen, her zaman ödünleşmeler vardır. Daha fazla özet, daha yavaş çalışma zamanı veya derleme zamanında daha fazla karmaşıklık anlamına gelir. Daha fazla özellik, daha karmaşık bir dil anlamına gelir. Bazı özellikler işaretçileri ve özyineleme gibi belirli şeyleri hızlı, diğerleri yavaşlatır. Mükemmel bir dil yoktur, bu nedenle her dil, dil nitelikleri alanında bir tür yerel maksimuma ulaşacaktır.


8

Bazı dillerin kısıtlamaları, kullanıma hazır performans ve olasılıklar arasında bir takas olan daha hızlı kodun uygulanmasını kolaylaştırır (örn. Fortran vs C ve işaretçi takma adı).

Dil, belirli görevler için "optimize edilmez", ancak kodun derleyici tarafından anlaşılmasını kolaylaştıran uygulama, derleyiciler ve kısıtlamalar bunu yapar. Gerçek anlaşma belirli kütüphaneler hakkında, problem uzunluğuna bağlı olarak anahtarları ile süreci hızlandırmak için uygulanan algoritmalar onu en uygun hale getiriyor.

Örneğin çarpma işlemi çeşitli durumlar kullanır (bkz. GMP çarpımı) .

Dil, daha üst düzey matematik işlemlerini belirttiğinde uygulaması en uygunudur (bu durumda etkilidir), ancak bu dil spesifikasyonunun bir parçası değildir.

Bir göz atın lütfen Matlab, Mathematica ve Maple matris sıralaması hesaplama (Şu anda tüm testleri kendim yapamıyorum, ancak bunlar testlerimle tutarlı). Tüm bu diller (ortamlar) aynı üst düzey işlemi uygular, ancak uygulama ayrıntıları farklı zamanlar veren farklılık gösterir.

Etki alanına özgü bazı görevler (burada da etki alanına özgü dil) belirli hesaplamalara yönelik olduğunda, hedef kitle için iyileştirilir ve optimize edilir (yıllar içinde). Ancak optimal olmak her zaman böyle değildir. Örneğin, Perl'in uzun bir kullanım dizesi geçmişi vardır, ancak PCRE (burada sadece Perl'in düzenli ifadeleri) mevcut en hızlı olanlar değildir (ve çok fazla bellek kullanır), ancak son derece etkileyici ve güçlüdür.

Dilin kısıtlamaları derleme sürecinde bir fark yaratır, belirtilen işaretçi takma adı kodun yeniden sıralanması olasılığını önler ve değişkenlerin yeniden yüklenmesini zorlar.


9
Çoğu dil spesifikasyonlarına göre Turing'dir, çünkü hepsi spesifikasyonlarında sabit adres boyutları belirtmez. Ve Turing Complete modulo adres boyutu olan C gibi şeyler ve hiç Turing Complete olmayan Coq, Agda veya System F gibi şeyler arasındaki farkı kaybetmek oldukça sınırlayıcıdır.
16:45, jmite

1
@jmite teşekkür ederim. Umarım bu artık farklılıkları gölgelemez
Evil

@Evil: Bence, görevler için optimize edilmemiş diller hakkındaki ifadeniz yanlış. bilgisayarın bakış açısından optimize kelimesini görüyorsunuz. Ancak bazı diller, yalnızca programcı için daha kolay hale getirmek için tasarlanmıştır ve uygulayıcıların bunu nasıl gerçekleştireceklerini anlamalarına izin verir.
theDoctor

Bu verimlilik açısından, bu yüzden yanlış değil, sadece bu açıyı aldım, diğerini düşünebilirsiniz (optimize edilmiş anlamı, içinde bazı belirli görevleri yazmak daha kolaydır). "Bir dil ne olursa olsun belirli bir görev ya da son hedef için diğer dillerden daha iyi [...]", eminim ki: daha kolay, daha hızlı, daha ucuz vb. "Daha iyi" ye dahil edilebilir. Yazar ne bir cevap kabul etti ne de verilen cevaplardan herhangi birinin sorulanla ilgili olmadığı yönünde açıklamalar veya açıklamalar içermedi. Bunun yanı sıra, bazı insanlar için diğerlerinden daha önemli faktörlerden biridir
Evil

5

Bence bu aslında oldukça hassas bir şekilde formüle edilebilir: Bir araç (örneğin, standart kütüphaneleriyle birlikte bir programlama dili), kullanılabilecek tüm olası araçlara göre, en aza indirildiğinde belirli bir sınıf problemi için en uygun araçtır. sorun sınıfındaki tüm problemler üzerinde belirli bir olasılık dağılımının beklentisinin üstlenildiği, yeterince doğru ve performanslı bir çözüm elde etmenin beklenen maliyeti. Çoğunlukla bu maliyet, programcı zamanı biçimindedir ve beklenen tasarım süresini, beklenen hata ayıklama süresini, araca aşina olmayan birini eğitmek için gereken süreyi vb. İçerir.

Uygulamada, bu miktarların neredeyse hiçbiri ölçülemez. Yine de, bu sorunu düşünmenin doğru yolu olduğunu düşünüyorum.


4

Bu mükemmel bir soru ve kolayca cevaplanamıyor. Erlang dili hakkında, gerçek zamanlı telekomünikasyon uygulamaları için uygun kılan bir şey var mı? Yoksa Erlang derleyicisiyle ilgili bir şey mi? Yoksa Erlang topluluğu ve ekosistemiyle ilgili bir şey mi? Belki de telekom uygulamaları nasıl yazacağını bilen insanlar Erlang'da uzman ve Erlang'ı bilen insanlar telekom uygulamaları konusunda uzmandır? Tüm bu faktörlerin rol oynadığından şüpheleniyorum.

Erlang'da muhtemelen bu tür uygulamalara uygun hale getiren iki özellik vardır (uyarı: dili hiç kullanmadım) - eşzamanlılık için iyi bir desteğe ve dinamik yazılım yükseltme desteğine sahiptir. Bu özellikler diğer birçok alanda da yararlı olacaktır, ancak telekom mühendisleri çalışma süresi konusunda fanatiktir. Belki de web siteleri inşa eden insanlar telefon santralleri inşa eden insanlar kadar yüksek kullanılabilirlikten endişe ediyorlarsa, Erlang da orada popüler olurdu.


3

Diğer cevaplar, belirli bir görev için bir dili optimize etme noktasını kaçırıyor - sadece verilen donanımda kodun daha hızlı çalışmasını sağlayan şey değil; belirli bir dilin bir soruna çözümü ifade etmenize ne kadar açık ve net bir şekilde izin verdiği ile ilgilidir. Bu çok fazla sorun alanına bağlıdır ve (pazarlama hype, mevcut çözümlerin cehaleti ve yeni bir dil yazma ego gezisi ile birlikte) neden birden fazla dile sahibiz - amaç programcının daha az kod yazmasıdır. hem daha az hataya yatkındır hem de bir sonraki programcının okuması / anlaması / düzeltmesi / geliştirmesi daha kolaydır.

Örneğin, hem C hem de C ++ nesne yönelimli programlama için kullanılabilir ve gerçekten de GObject kütüphanesi OO C'nin iyi bir örneğidir. Fonksiyon işaretçileri içeren AC yapısı, bir C ++ sınıfındaki sanal yöntemlerle aynı amaca hizmet edebilir ve gerçekleştirebilir daha iyi; geliştirme cezası hafızayı tahsis etmek, fonksiyon göstergelerini başlatmak ve 'ebeveyn' yöntemleri çağırmak için bir strateji seçmek için tutkal kodudur. O daha açık Çoğu zaman / daha güvenli yazmanız Class klass * = new class()daha struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....


Jmite'nin cevabı, yazdığınız şeylerin eksik olduğu bir mermi noktası sağlar. Bu konu için optimize edilmiş alana özgü görevler hakkında yazdım. C'yi seviyorum, OCC gibi şeyleri biliyorum, ancak C Nesnesi Odaklı yapmıyor (derleyici buna yardımcı olmuyor ve birçok optimizasyon engelleniyor, çöp toplayıcı vb. Yok). C ++ gibi C işlevlerini aşırı yükleyemezsiniz, ancak elbette herhangi bir davranışı taklit edebilirsiniz (jmite bu konuda da yazdı). Bunun belirtilen soruya nasıl cevap verdiğini görmüyorum.
Kötülük

2
@Evil: Nesne yönelimli programlama ve Nesne yönelimli programlama dili iki farklı kavramdır. Nesneye yönelik programlama, nesne yönelimli bir dil gerektirmez. Muhtemelen UML tasarımınızı yapabilmeniz için sadece kağıt veya beyaz tahtaların varlığını gerektirir.
slebetman

@slebetman Bunun geldiğini görmedim. Muhtemelen kağıda ve beyaz tahtaya ihtiyacınız yoktur, sadece nesneleri hayal edebilirsiniz ve bazı insanlara göre böyle düşünüyoruz, ancak bu OOP kavramlarının dil desteğine daha yakın olamaz. Üzgünüm, ama seçmek istemediğim bir anlaşmazlık bu.
Kötülük

Ben olmadan tüm zihinsel onu takip etmek mümkün olmakla ilgili çok emin değilim: @Evil bazı yardımcı olmak için soyutlama. İlk işime, işlev işaretçileri olan tüm dizilere benzeyen büyük bir C kodu parçası veriliyordu (garip sözdiziminin ne anlama geldiğini anlamak için biraz zamanımı aldı - o zamanlar google yok) ve bir desen görene kadar onunla mücadele ediyordum ve bu dizilerin nesne olduğunu ve bu fonksiyon göstergelerinin yöntem olduğunu fark etti. Kendime küçük bir beyaz tahta aldım ve çok fazla A4 kağıt kullandım ama sonunda kodu
anladım

1
@slebetman Nesne yönelimli programlamanın UML'den en az 20 yıl önce geldiği düşünüldüğünde, nesne yönelimi için UML tasarımlarının gerekli olduğu iddianız tamamen yanlış görünmektedir.
David Richerby
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.