Dil tasarımcılarının nelere dikkat etmesini istiyorsunuz? [kapalı]


38

Bu sorunun amacı, anadilde olmayan bir dilde olmadan, yaşayamayacağınız ya da dileğinizde kullanamayacağınız bir programlama dili özellikleri listesi oluşturmak değildir. Bu sorunun amacı, çoğu dil tasarımcının düşünmeyebileceği bir dilbilgisi tasarımının köşelerini aydınlatmaktır. Bu yüzden, X dilini düşünmek yerine biraz daha felsefi düşünün.

Önyargılarımdan biri ve belki de tartışmalı olabilir, mühendisliğin daha yumuşak olan tarafının (neden ve ne için olduğu), daha somut olan taraftan birçok kez daha önemli olduğudur. Örneğin, Ruby, geliştirici mutluluğunu geliştirme hedefi ile tasarlanmıştır. Düşüncelerinizin teslim edilip edilmediği konusunda karışık olsa da, bunun bir amaç olduğu gerçeği, dil tasarımındaki bazı seçeneklerin bu felsefeden etkilendiği anlamına gelir.

Lütfen göndermeyin:

  • Sözdizimi alev savaşları. Kabul edelim, tercihlerimiz var ve sözdizimi dil tasarımı ile ilgili olarak önemlidir. Sadece emacs ve VI (bu günlerde çok sayıda insan hakkında hiçbir şey bilmeyen çok sayıda insan hakkında) olan doğanın destansı savaşlarından kaçınmak istiyorum.
  • “X özelliğine sahip olmayan herhangi bir dil var olmayı haketmiyor” yorumlarını yazın. Tüm programlama dillerinin varlığının en az bir nedeni var - iyi ya da kötü.

Lütfen do yazı:

  • Dil tasarımcılarının özlediği görünen felsefi fikirler.
  • Zayıf uygulanmayan teknik konseptlerden çok daha sık uygulanmamaktadır. Lütfen neden olduğu ağrıya bir örnek verin ve nasıl çalışmasını tercih edeceğiniz konusunda bir fikriniz varsa.
  • Dilediğiniz şeyler platformun ortak kütüphanesinde bulunuyordu ancak nadiren bunlar. Aynı belirteci, genellikle istediğiniz ortak bir kütüphanede olan şeyler değildi.
  • Tüm programlama dillerinin uygun şekilde uygulanmasını ve doğru şekilde tanımlanmasını istediğiniz yerleşik test / iddia / sözleşme / hata yönetimi desteği gibi kavramsal özellikler.

Umarım bu eğlenceli ve teşvik edici bir konu olacaktır.

Düzenleme: Sözdizimi Alev Savaşları ile ne demek istediğimi açıklığa kavuşturdu. Tüm sözdizimi tartışmalarından kaçınmaya çalışmıyorum, çünkü sözdizimi program dili tasarımının temel bir parçası.


Bu sözdiziminin sadece bir uygulama detayı olduğunu söylemek sadece yanlış. Sözdizimi tasarımı, bir dil tasarlamanın temelde önemli bir parçasıdır. Ve birçok noktayı bunu yapmak aslında sözdizimi içerebilir yayınlanan görmek istiyorum. Yazık. İlginç bir soru gibi geldi.
Konrad Rudolph

Kaçınmak istediğim alev savaşı. Bir alev savaşı başlamadan sözdizimini tartışabiliyorsanız, bunun için gidin.
Berin Loritsch

Yanıtlar:


49

Varsayılan olarak Unicode Desteği

Bu gün ve yaşta, programlar uluslararası olarak kullanılmak üzere veya uluslararası olarak kullanılabileceği varsayımı altında geliştirilmektedir. Onlar gerekir onların karakter kümeleri için destek sağlamak veya yararsız o dilde yazılmış programları işlemek.


2
+1 Aslında, dilin kendisi tanımlayıcılarınız için herhangi bir karakteri kullanmanıza izin vermelidir. Hepimiz İngiliz değiliz.
Berin Loritsch

13
@Berin: Aslında, Fransız olsam da, İngilizce programlarını çok tercih ediyorum. Sorun iletişim sorunlarından biri, Macarca, İspanyolca veya Portekizce tanımlayıcıları olan programlar yazarsanız, uluslararasılaşma bağlamında benden asla içeri girmemi beklemeyin, geliştiricilerin kendi aralarında iletişim kurabilmeleri son derece önemlidir. ve bu, tanımlayıcılar, yorumlar ve belgeler için ortak bir dil kullanılması anlamına gelir. İngilizce, geliştiricilerin lingua franca'sıdır.
Matthieu M.

11
Dili kullanırken unicode desteğinin doğal olması gerektiğini eklerdim. Mümkünse, "eklemek" için fazladan çaba sarf etmemeli, “sadece çalışmalı” (makul yerlerde).
RHSeeger

4
Benzer şekilde, dil metin (karakter dizisi) ve ikili (bayt dizisi) veriler arasında temel bir ayrım yapmalıdır. C # stringve ile bu doğru alır byte[]. Python 3.x strve ile olduğu gibi bytes. C (++) charbunu çok yanlış yapar.
dan04,

1
@RHSeeger - gerçekten !!! Python'da bile yazmanız gerekir u'My Unicode Štring'. Ne tür bir ip ile uğraştığını ve kod yazmayı unutabilmeni isterdim.
orokusaki

25

Bir çiftim var:

  • Jenerik / şablonlar. Örneğin, Java jenerikleri güçlüdür ancak zorunlu olarak esnek değildir. Ayrıca, tip silme kullandıkları için, özellikle arayüzlerde, soyut olarak uygularken problemler gördüm. Ve derleyici, spesifik olmayan bir jenerik kullanıldığında uyarmamalı ( HashmapBunun yerine Hashmap<String, int>). Bence önemli ölçüde geliştirilebilirler. İyi şablonlama çok faydalıdır, ancak genellikle ihmal edilir.

  • Standart kütüphanede İyi Tarih desteği. Yani, tarih, saat ve dakika ekleyebiliyor ve çıkarabiliyorum ve 1 Ocak 1970'ten bu yana milisaniyelik sayılarla uğraşmak zorunda kalmayacağım.


2
"iyi tarih desteği" olsa oldukça dik bir gerekliliktir! Bu ne anlama geliyor? Bence tarihler ve zamanlar, her şeyi iyi yapamayacağınız şeylerden biri. Ya basit ve yanlıştırsın ya da doğru ve haksız yere karmaşıklaştırırsın. iyi bir orta noktaya ulaşmak gerçekten zor.
sara,

@kai Mesele şu ki, tarih desteği genellikle oldukça korkunç. Eski java.util.Dateneredeyse tüm olası FRİKİKLERİNDEN ve sorunları var. Yeni java.time.*paketin yalnızca bir bölümünü biliyorum , ancak temiz, kullanımı kolay ve AFAICT hatasız. Daha ileri düzey kullanıcılar sorun bulabilir, ancak bu büyük bir gelişme. +++ Sorun, karmaşık bir sorun olduğu ve ilk versiyonunun acele ve bozuk olduğu görünüyor.
maaartinus

24

Lütfen bilgisayar güvenlik görevlileri için dilinizi analiz edilebilir / denetlenebilir hale getirin.

Güvenlik görevlileri, bir program gönderilmeden önce güvenlik açıklarını bulabilmeli. İdeal olarak, biz erken aranırız ve kod temeli üzerinde geliştikçe yorum yapabilir, ancak sıklıkla değil.

Dilin veya çekirdek kitaplıkların yeni bir sürümü çıktığında, daha önce güvenli olan şeyler artık olmayabilir:

  1. kitaplıklar daha güçlü olabilir: örneğin, URL kitaplığı artık desteklemektedir javascript:
  2. dizeleri veya baytları koda dönüştürmenin yeni yolları olabilir: örneğin evalseri kaldırma kütüphaneleri
  3. dil yansıtma teknikleri daha güçlü olabilir: örneğin, yerel değişkenleri açığa çıkarma

Bu değişikliklerden herhangi biri bir programın kötüye kullandığı otorite miktarını artırabilir, ancak programın kullandığı otorite miktarı (kötü amaçlı olmayan müşterilerle çalışırken) değişmediğinden, güvenlik halkının yoğun bir şekilde ortaya çıkmadan anlaşılması zor yeniden denetim.

Bu yüzden, lütfen dili tasarlarken ve versiyonlarken bizi düşünün. Aşağıda birkaç ipucu:

Bir programın içinde parçalanabileceği birkaç ilkel tanımlayın.

HTML5 bu şekilde özellikle kötü. Onlar belli güvenlik içine düşünce bir sürü koyun ve bazı çok akıllı insanlar var, ancak bunun yerine gibi yeni bir program elemanlarını belirtmek gelmiş <video>eskilerin açısından veya yeni bir ortak soyutlama yaratarak <video>ve eski <img>açısından daha belirtilebilir, <video>henüz kendi güvenlik sonuçlarıyla bir başka bir kereye mahsus program öğesi.

Dilinizi statik analize uygun hale getirin (statik olarak yazılmamış olsa bile).

Güvenlik halkı, kalıpları bulmak ve gerçekten zorlu parçalara odaklanabilmeleri için bir programın parçalarını denemek ve dışlamak için genellikle statik analizi kullanır.

Hangi tanımlayıcıların yerel değişken olduğu ve hangilerinin olmadığı açık olmalıdır.

Örneğin, xaşağıdaki yerel bir değişken olup olmadığını söylemeyi imkansız hale getiren eski JavaScript sürümleriyle aynı hatayı yapmayın (spec'in eski sürümünün hazır bilgi okumasına göre):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Ayrıştırılabilir güvenlik için izin ver

Güvenlik özelliklerini koruyan güvenli bir çekirdek etrafında birçok güvenli sistem tasarlanır, böylece güvenlik halkı, az miktarda bir kodu analiz etmeye ve programcıların çoğunu {sinir bozucu, sersemletici, paranoyak} güvenlik halkı ile uğraşmaktan kurtarmaya yönelik çabalarına odaklanabilir .

Böyle bir çekirdeği kendi dilinizde yazmak mümkün olmalıdır. Dilinizin güvenlik özelliklerinden biri, yalnızca belirli bir URL alt kümesinin getirileceği durumdaysa, çekirdek yazarlar tüm URL’lerin kodlarını getirerek kanalize etmek için bir şeyler yapabilir mi? Veya statik derleme kontrolleri (ithalatlara bakmak gibi) aynı işlevi görür.

Newspeak gibi bazı diller bir nesne yetenekleri modeli kullanır. Bu harika ve ayrıştırılabilir güvenlik elde etmek için harika bir yol.

Ancak, bunu yapamazsanız, modül grafiğini statik olarak analiz edilebilir bir eser haline getirmek size biraz yarar sağlar. Bir modülün dosya G / Ç modülüne ulaşamadığını ispatlayabilirsem (TCB'deki bir modülde kod çağırmak hariç), o zaman bu modülden tüm sorun sınıflarını ekarte edebilirim.

Katıştırılmış komut dosyası dillerinin yetkisini sınırlandırın

Çok sayıda yararlı sistem, dinamik (hatta işlevsel) dillerde yazılmış çok sayıda kodu başlatan statik bir çekirdek olarak düzenlenir.

Ve komut dosyası dillerinin gömülmesi bir sistemi çok daha genişletilebilir hale getirebilir.

Ancak bir betik dili, VM'nin tam yetkisine sahip olmamalıdır.

Katıştırılmış komut dosyası dillerine izin vermeyi tercih ederseniz, istilacının yapabileceklerini sınırlandırmasını kolaylaştırın. Bir nesne yetenekleri modeli (yukarıdaki Newspeak hakkındaki yoruma bakınız) burada çok uygundur; bu nedenle, kodlama dilinde bir kod değerlendirilirken, arayan kişinin yürütmek üzere koddan ve bu kodun tüm genel değişkenlerinden geçmesi gerekir .

evalKendisini bir betik dili olarak yerleştiren bir dil gibi davran

Diliniz bir dizgiyi koda dönüştürmek için kendi derleyicisini çağırabilirse, gömülü bir betik diliyle aynı şekilde işaretlenmesini sağlayın.

Basit bir eşzamanlılık modeli kullanın

Biz güvenlik görevlileri, bir güvenlik mülkünün korunup korunmadığını anlamaya çalışırken yarış koşulları hakkında endişelenmek zorunda değiliz.

Lütfen dişlere takmadan önce diş açmaya alternatifleri neredeyse güvenli bir varsayılan seçenek olarak düşünün.

Basit bir tanesi, E, Verilog ve JavaScript'te olduğu gibi olay döngüsü eşzamanlılığıdır.

Karışıklık alıntı alıntı yapmayın

Bazı diller tutkal dilleridir ve çok sayıda farklı dilde karakter dizileriyle uğraşırlar.

Örneğin, JavaScript genellikle HTML, CSS, XML, JSON ve hatta JavaScript dizelerini oluşturur. Programcıların, diğer dillerde dizeleri yapmak için bunları birleştirirken düz metin dizelerini düzgün bir şekilde kodlamayı hatırlamaları çok zordur, bu nedenle JS programları, şaşırtıcı olmayan bir şekilde, her türlü alıntı karışıklığı sorununu yaşar: XSS en kötüsüdür.

Dize bileşimi özelliklerini eklemek istiyorsanız , programcının güvenlik yükünü azaltmaya çalışın. DSL'ler, hijyenik makrolar ve gömülü şablonlama dilleri, kütüphane veya dil geliştiricilere düzgün bir şekilde kaçmak için yükü taşıyarak ve son geliştiriciden uzağa taşıyarak bunu yapmanın harika bir yolu olabilir.


Güzel arıza.
Qix

23

En iyi dillerden bazıları, kendileri için dil yapmak isteyen insanlar tarafından tasarlanmıştır.

Bu nedenle, dil tasarımcılarının kullanıcılarına daha az dikkat etmesi gerektiğini düşünüyorum. Herkesi memnun edemezsin, ne denememelisin.


4
Bu bir dereceye kadar doğru olabilir. Ancak, kullanıcılarınızı asla dinlemezseniz, beyin çocuğunuzu kullanmaya çalıştıklarında üzerinize verdiğiniz acıyı asla bilemezsiniz. Bu acıyı duymadan / hissetmeden, bu sorunu ve başkalarını çözecek bir sonraki harika fikirle asla karşılaşamayacaksınız. Hiç kimse bir ada değildir. Acı, inovasyon için harika bir itici güç olabilir.
Berin Loritsch

5
@Berin: Asla demek istediğim, kullanıcılarınızı asla dinlememeniz gerektiği , ancak dili yapmak için tasarlanmadığı bir şey için dili kullanmak isteyen kullanıcıları dinleme. Belirli bir seti veya problemi çözmek için bir dil tasarladıysanız, o zaman bu problemleri çözmesi gereken kullanıcılara da hitap etmelisiniz. Ancak, aşırılığı giderirsiniz ve bazen bir dil yeni bir alanda bir niş bulabilir, yani +1.
Jeremy Heiler

2
@ Jeremy, evet, tam olarak söylediğim şey bu ama bir dilin tasarlanmadığı bir alanda iyi çalışması bence nadir.
dan_waterworth

@ dan_waterworth: Başarılı diller genellikle tasarlanmadıkları alanlarda genellikle iyi çalışırlar.
David Thornley,

8
"Kullanıcıları dinlemeyin" yerine, tavsiye "sahip olmadığınız kullanıcıları dinlemeyin" şeklinde daha iyi ifade edilir.
chrisaycock

16

Zamanın sadece% 5-10'u kod yazarak harcanıyor. Dil tasarımcıları, yazılım çalışması yapmanın zorluğuna dikkat etmelidir; bu, hataları ve hataları düzeltmek anlamına gelir.

Bunun anlamı iyi bir hata ayıklayıcısından gitmen gerektiğidir. Arcan sözdizimi ve ton komutları sadece biraz daha iyi olan anahtar komutları ile bazı araç değil.


2
+1. Hata ayıklama, bazı dillerin diğerlerinden daha iyi olduğu yerlerden biridir - ve bazı IDE'ler kullanılabilir bir dil ile yolunuza çıkanlar arasındaki tüm farkı yaratır.
Berin Loritsch

2
Buna biraz ekleyeceğim ve mümkün olduğunda yararlı yığın izleri diyeceğim. Eğer bir hata varsa (ya da yakalanmamış bir istisna ya da ne olursa olsun, dilinize bağlı olarak), kullanılan tüm argümanların yanı sıra kullanılan argümanların değerlerini de görmek istiyorum. Tcl bunu son derece iyi yapıyor ... ama dürüst olmak gerekirse, her şey Tcl'de bir dizedir, böylece her şeyin değerini göreceli olarak kolayca yazdırabilirsiniz.
RHSeeger

1
Sadece hata ayıklama değil, böcek yazmayı zorlaştırır. Java, dizilerde otomatik sınır denetimi sağladığında çok mutlu oldum ... ama işte 15 yıl sonra, hala bu hataları diğer dillerde yapıyoruz.
Alex Feinman

3
Derleme zamanında Bugs'u bulan bir dilin olması daha iyi olmaz mıydı? Örneğin, Ada'yı kullanırken hata ayıklayıcısında daha az zaman harcıyorum, sonra C veya C ++ kullanıyorum.
Martin

12

Karşılaştığım diğer dillerden daha fazla şey yapan Python'a dikkat etmeleri gerektiğini düşünüyorum (ve bazı özellikleri beğenmeseniz bile). Bu, Python'u taklit etmeleri gerektiği anlamına gelmez, ancak Python gibi bir dil yapmak istemeseniz bile, Python'un doğru yaptıklarını bilmek önemlidir.

Buradaki ilgili felsefi fikirlere gelince, bunlar Python Zen'in en önemli fikirleri:

  • Açık, örtük olmaktan iyidir.
  • Okunabilirlik sayar.
  • Özel durumlar kuralları ihlal edecek kadar özel değil.
  • Her ne kadar pratiklik saflığı yenerse de.
  • Bunu yapmanın bir yolu ve tercihen sadece bir tane olmalı.
  • Uygulamanın açıklanması zorsa, bu kötü bir fikirdir.
  • İsim boşlukları harika bir fikirdir - hadi daha fazlasını yapalım!

Bence bu kuralları izleyen bir dil mutlaka iyi olmalı, ama bunu yapan sadece birisini biliyorum ve bu Python. Uygulamada örneğin Ruby ile olan tüm benzerlikler için, Ruby okunabilirlik gibi şeyleri özlüyor ve sizi eğlenceli, ancak profesyonel bir ortamda kullanışlı olmayan kod golf yapmaya davet ediyor.

Python'da özlediğim tek teknik özellik "until" ifadesidir (olduğu gibi, ancak ifadeyi ilk kez test etmiyor). Öyleyse hem Python'da hem de diğer dillerde standart kütüphanelerde geliştirilebilecek birçok şey var, ancak bu kesin bir dil değil , bu yüzden farklı bir soru. :-)


4
Özellikle bir dil tasarım düzeyinde diğer iki şeyi daha önemli buluyorum: "Özel durumlar kuralları ihlal edecek kadar özel değil." çünkü binlerce özel durumdan veya gizli kurallardan oluşan bir dilin kullanımı zor, ancak "Pratiklik saflığı geçiyor olsa da" ile birlikte. çünkü aksi takdirde, turp tarplarının alemine sürüklenirsiniz.

15
Açıkça örtük olmaktan daha iyiyse, neden değişkenleri açıklamanız gerekmiyor? Basit bir yazım hatası, hata ayıklaması zor hatalara neden olabilir (derleme zamanında yakalanan hataların veya hata ayıklamada açık ve kolay çalışma zamanı hatalarının aksine), bu IMO diline karşı önemli bir grevdir.
Mason Wheeler

4
@Mason Wheeler: Değişkenleri diğer dillerde bildirmenizin tek nedeni, onların ne tür olduğunu bildirmenizdir. Python dinamiktir, bu nedenle tür bildirimi gerekli değildir ve bu nedenle bildirime gerek yoktur. Bunun örtük / açık ile nasıl bir ilgisi olduğunu anlamıyorum. Python'daki türler açıktır. Değişkenler de öyle. On yıl sonra, bir yazım hatası hiçbir zaman hata ayıklama zor bir hataya neden olmadı. Aslında, onlar hata ayıklamak için önemsiz.
Lennart Regebro

8
Liste için +1, fanlılık için -1. Önemli başarı kazanan tüm dillere dikkat etmek ve bu öğelerin uygulanabilirliğini dahil etmek veya en azından analiz etmeye çalışmak daha pragmatik bir yaklaşım gibi görünüyor.
Steven Evers

3
@ Lennart: Fonksiyonun türlerini açıkça ifade edebilmek için (ancak zorunlu değil, kural 4'e bakınız) iyi bir şey olduğunu söyleyebilirim. Sözleşmeye göre tasarıma benzer. Yapmak istediğim nokta bu.
Theo Belaire

11

Dili gereksinimlerinize uyacak şekilde değiştirme yeteneği benim için çok büyük. Makrolarla yapılan Lisp için, üst seviye ile Tcl için. Daha az ölçüde, Ruby lambda ve benzerlerini kullanır. Sorunlarımı mevcut kontrol yapılarının etrafında kalıplamak yerine, soruna uygun yeni kontrol yapıları ekleyebilmeyi istiyorum. Basit bir örnek olarak, bazı dillerde var olan ancak diğerlerinde bulunmayan "do .. till" yapısı, bazı vakaları ele almak için "süre" den daha temiz bir yoldur, diğer vakaları karşılamak için yeni yapılar ekleyebilmek son derece yararlıdır.

Daha genel anlamda, bu metaprogramlamadır ... ama çoğunlukla yeni kontrol yapıları oluşturmak için kullanırım.


İlginç. İyi meta programlama desteğinin doğru olması zor olabilir, ancak gerektiğinde çok güçlü olabilir. Lisp'i sevenler arasında Lisp'in uygulanmasının en iyiler arasında olduğunu duydum - ama Lisp'teki her şey hakkında bunu söylüyorlar. Meta programlamanın doğru yapıldığını düşündüğünüz herhangi bir örnek?
Berin Loritsch

"Metaprogramming doğru yapıldı", doğru yapmanın basit olduğu (mantıklı basit etkinlik için) ve sonucun dilin doğal bir parçası gibi hissettirdiği bir yer olmalı.
Donal Fellows,

1
Sadece değiştirilebilir değil, deşifre edilebilir bir modifikasyon. Eğer bir dilde bir şeyleri yeniden kaydettiyseniz, ben bir okuyucu olarak hızlı bir şekilde çözebilmeliyim. Ek açıklamalar veya diğer dışsal belirteçler bu konuda yardımcı olabilir.
Alex Feinman

Mata-Lua veya Template Haskell'in bunu sağlamak için iyi bir iş çıkardığını düşünüyorum. (Scheme Makro'nunki kadar hoş değil, ama bir dilde parens'ten sonra kullanmak için ödediğiniz para budur)
Theo Belaire

10

En önemlisi, dilinizin bir "stile" sahip olması gerektiğidir. Örneğin, C işaretçi tabanlı bir sistem programlama dili diyebilirim. Erlang'ı aynı anda işlevsel bir programlama dili olarak adlandırırdım. Diğer bazı diller (C ++ ve tartışmalı Java gibi), Allan Kay'ın "aglutinleştirici" diller olarak adlandırdığı dillerdir: Frankenstein dilleri, birlikte ele alınan birçok özellikten oluşmuştur.

Bir sonraki en önemli şey, dilin kendisinde yapılan değişikliklerin son çare olması gerektiğidir. En iyi huylu sesler bile dilin diğer özellikleri ile birleştirildiğinde karmaşık hale gelebilir. Bir dile yeni bir özellik koymak için şunu yapmanız gerektiğini söyleyebilirim:

  1. Gerçekten gerekli olduğunu kanıtlayın.
  2. Bir kütüphanede yapılamayacağını ispatla.
  3. Dilde olduğunu kanıtla.

2
Başka bir deyişle, dilin bir genel tasarım ilkesine sahip olması ve dilin bu ilkeyle tutarlı olması gerekir. Dil gelişimi ile ilgili yorumlar garanti altına alındı ​​(bunun birkaç kez yankılandığını gördüm).
Berin Loritsch

1
Bana en sevdiğim C ++ teklifimi hatırlatıyor ... Bir köpeğe fazladan bacak çivilemekle yapılmış bir ahtapot.
ocodo

4
Bir kütüphanede yapılamayacağını ispatla . +1
Qix

2
Ben kütüphane mesajını seviyorum. Haskell gibi dillerin döngüler, istisnalar veya süreklilikler gibi yerleşik kontrol akışı öğelerine sahip olmaması çok iyidir. dil içinde tanımlamaları gerçekten çok basittir, sözdizimini gerçekten temiz tutar ve bir sürü zeki dil özelliği oluştururken genişletilebilirliği ve birleştirilebilirliği arttırır.
sara,

10

Harika bir soru için teşekkürler. Bazı güzel cevaplar alıyorsun.

Gözlerinin üzerinden sır değil, ama bir programcıya bilgi kanalı olarak bakıyorum. Fikirler / kavramlar / gereksinimler bir ucunda gider ve kod diğerinden çıkar.

Bir takım şartlar (ne şekilde belirtilirse gösterilsin) ve büyük bir beyaz tahtadaki kod setini alır ve her gereksinimi onu uygulayan koda eşleyen çizgiler çizerseniz, o grafiğin karmaşıklığı kodun ne kadar iyi olduğuna bağlı olacaktır. Gereksinimleri ifade eder. İdeal olarak, oldukça doğrudan ve birebir olmalı, ancak pratikte elde edilmesi zor.

Bir dilin etki alanına özgülüğünü, bu grafiği basitleştirdiği ölçüde ölçtüm. Bu son derece arzu edilen bir özelliktir ve doğru sınıfları / rutinleri (isimler / fiiller) tanımlamaktan, kendi ayrıştırıcınızı ve tercümanınızı / derleyicinizi yazmanıza kadar, herhangi bir şekilde, herhangi bir şekilde, doğru sınıfları / rutinleri (isimler / fiiller) tanımlamaktan herhangi bir şekilde ele alınabilir.

Sadece ne demek istediğime bir örnek vereyim. Esnek diyalog kullanıcı arayüzleri oluşturma problemi için, bu teknik , tipik olarak UI'lerde yapılan işlerin çoğunu, verileri hareket ettiren, olay işleyicileri yazmak zorunda kalmaz. Aynı zamanda, yaklaşık bir büyüklük sırasının kaynak kodunun azalması ile sonuçlanır. Meta-dil gerçekten C / C ++ / Lisp içerisindeki rutin ve makrolardan sadece birkaçı ve bunu makro olmayan dillerde de yaptım.

Bir şartın uygulanması, kodda 5 nokta düzenlemesiyle veya 10'da yapılabilirse, bunu 5 ile yapmak sadece daha az kod değil, bir adımı atlamak ve hata yapmak için daha az şans demektir. Bu nedenle, bir alana ne kadar özel bir dil olursa, kod o kadar küçük, daha sürdürülebilir ve daha hatasız olur. Bence buna nasıl devam edeceğimizi bilmemiz gerekiyor. O mu değil kodu daha okunabilir olduğu anlamına sürece okuyucu tekniğini anlamak için öğrenme eğrisi yatırım yapmıştır.


9

Pascal ve Ada'da olduğu gibi sınırlı ve farklı tamsayı türleri. Dürüst olmak gerekirse: Herhangi bir tamsayı aralığına ne sıklıkta ihtiyacınız var? Gerçek dünyayı daha iyi temsil etmek için ilkel türlerde geliştirilecek çok şey olduğunu düşünüyorum.


2
C, C ++, D, Java, C # vb. Gibi sınırlı tamsayı türleri kesin olarak kendi yerlerine sahiptir. Bazı programlama türleri umursamaz ve sadece tamsayı ile kayan nokta arasındaki farka ihtiyaç duyarlar. O zaman bile, belki sadece bir sayı türüne ihtiyacımız var ve sayının ayrılmaz bir parçası için endişelenelim. Kısacası, iş programlaması, bir tamsayı olduğundan, tamsayı tipine karşı daha az hassastır. Bir protokolü düşük seviyede uyguladığınızda, kurallar büyük ölçüde değişir.
Berin Loritsch

2
Ada'daki gibi türlerin nerede söyleyebileceğini type Date_Of_Month is 1 .. 31;ve 16 veya 32 bit gibi kararları optimize ediciye bırakabileceğinizi düşündüm . Fakat daha önemlisi, 32 veya 0 veya -5 türünü bir değişkene atamak size bir tane verir RANGE_ERROR.
Martin

Aralıklar , kullanım alanlarının açık olduğu Date_Of_Month(veya Month_Of_Year) gibi şeyler için iyi çalışır , ancak çoğu - muhtemelen çoğu durumda bulanık. type Persons_Age is 0..120? Ya biri uzun ömürlü rekoru kırarsa? type Year is 0..9999? Ya bir Mısırbilimci iseniz?
dan04

Eğer bir Mısırbilimciyseniz, haksız yere ihtiyacınız vardır type Egyptian_Year is -9999 .. 300;. Deneyimlerime göre, çoğu zaman tamsayılar için faydalı sınırlar bulabilirsiniz. Bu bakımdan type Scrolls_Found is array Egyptian_Year of Natural;, dizi dizini olarak sınırlandırılmamış bir türünüz olamaz / olmamalısınız. Bu sadece hacker için bir saldırı vektörü. BTW: Ada menzil sınırlarının çalışma zamanında hesaplanmasına izin veriyor.
Martin,

1
@kai hiç kimse bu tip tip bir özelliğin istisnasız her yerde kullanılması gerektiğini söylemedi . Ada'nın ayrıca "normal" sayısal türler kullanmasına izin verdiğinden eminim. Sınırlı sayısal türler bazı (oldukça yaygın) problemler için kesinlikle kullanışlıdır .
Sarge Borsch

8

Programlama dillerini öğrendikten sonra kullanımı kolaylaştıran özellikler ve kullanmayı öğrenmelerini kolaylaştıran özellikler vardır. Bir dilin kullanıcıları ideal olarak onunla uzun süreli bir ilişki içinde olduklarından, kullanım kolaylığı için optimizasyon yapmak, öğrenme kolaylığı için optimizasyon yapmaktan daha iyidir. Gerektiğinden daha zor şeyler yapmayın, ancak dile aşina olmayan kişilere okunabilirlik için anlamlılıktan (çok küçük kodlar yazabilmek) feda etmeyin. Öte yandan, dil yıllardır üzerinde çalışmakta olan insanlara hat gürültüsü gibi okunmamalı; kullanımı veya öğrenmesi kolay olmazdı.


8

Adlandırma Kuralları (Sana PHP bakıyorum)


Bir dil tasarım sorunu az olsa da. Tabii ki, her zaman standart kütüphaneye neyin girdiğine bir göz atmak zorunda kalırsınız, ancak dil tasarımcıları adlandırma kurallarını uygulayamazlar;)

3
Standart kütüphane için yapabilirsiniz.
Malfist

3
PHP'den bile bahsetme. Etrafında en yaygın kullanılan dil. Bir bilgisayar bilimcisi tarafından tasarlanmamış, sadece şablon isteyen bir adam ve steroidler eklendi.
Keyo

@delnan: Merkür veya Eyfel gibi bazı diller adlandırma kuralları uygular (tüm sermaye sınıfı adları, bir sermaye ile başlayan değişkenler, vb.) ve derleyici tarafından uygulanır. Fortran, i, j, k ile başlayan değişkenlerin tamsayı olduğunu söyledi (bu yüzden çoğu dilde döngü değişkenleri olarak geleneksel kullanım ...). Ve bunun gibi. Eğer bir sözleşmeyi sevmiyorsanız, bir şekilde can sıkıcı, fakat en azından kaynak kodlarının tutarlılığı için iyi.
PhiLho

@ PhiLho: Yine de çok sınırlı. Tutarlı değil - sadece bir örnek - tutarlı, anlamlı (insan okuyucular için) büyük harf kullanımı veya alt çizgi kullanımı (deneyebilir ancak süreçteki programcıların aklını tehlikeye atar).

7

Geliştirme ortamları ile birinci sınıf entegrasyon.

Günümüzde kodlama zengin bir ortamda yapılır. HTML / CSS / JS için Firebug ve diğer etkileşimli araçlara sahibiz. Java, Eclipse ve IDEA ve diğer gerçek IDE'ler için. Ve bunun gibi. Editör ile başlayan, ancak orada bitmeyen bir araç ekolojisi vardır:

  • Dosyaların içinde ve arasında kod düzenlenmesi
  • Akıllı vurgulama
  • Akıllı tamamlama / tahmini yazma
  • Statik hata ayıklama (sözdizimi, anlamsal ve stilistik hataların işaretlenmesi)
  • Şablonların ve makroların oluşturulması ve kullanılması
  • Sürüm kontrolü (sürüm oluşturma, birleştirme, dallanma, ...)
  • Birden fazla yazarla birlikte dağıtılmış geliştirme (yorumlar, satır içi belge, ek açıklamalar, ...)
  • Çalışma zamanı hata ayıklama (yığın izleri, adımlama, saatler, ...)
  • Etkileşimli "canlı" hata ayıklama (Firebug gibi - canlı sistemin düzenleme davranışı)
  • ... sırada ne olduğunu bile bilmiyorum.

Bu etkinliklere destek verecek diller oluşturulmalıdır. Bazı ilerlemeler kaydedilmiştir - örneğin Java'da, diğer geliştiricilerin kodun amacını anlamalarına yardımcı olacak açıklamalar.

Ancak CVS kontrollü kaynağın sürüm numarası içerebilmesi için çoğunlukla yorumlarda $ Id $ kullanmak gibi, hacklenmiş şeyler var. Neden böyle bir şeyi dilin kendisinden yapamıyorum?


ASIS (ISO / IEC 15291: 1999 “Ada Semantik Arabirim Spesifikasyonu”) gibi bir şey mi kastediyorsunuz? ASIS istediğin her şeyi kapsamıyor ama epeyce. Genellikle diğer programlama dilleri için ASIS gibi bir şey diledim. Bkz sigada.org/wg/asiswg detayları için.
Martin

Bunlardan bazıları IDE'nizden oldukça ucuza gelir veya ücretsiz gelir: kod organizasyonu, sözdizimi vurgulama, kod katlama, sürüm kontrolü, şablonlar / makrolar. Diğerleri çok daha fazla çaba gerektirir: çalışma zamanı hata ayıklama, statik hata ayıklama, Akıllı tamamlama / tahminde bulunma, yeniden yapılanma vb.
Berin Loritsch

6

Dağıtılmış Hesaplama

Bedava öğle yemeği bitti. Bugün bir tane çoklu çekirdek / çoklu işlemci (ve özel durumlarda çoklu bilgisayar) üzerinde çalışan programlara ihtiyaç duyuyor.

Ne yazık ki, çok parçacıklı kod yazmak kavramsal olarak zordur, bu nedenle dili engel olarak eklemenize gerek yoktur.

C ++ 0x kullanımı gelecekte bu kitaplık olarak getirmiş ve gerçek senkronizasyon sorunları sizi özgür olmayan bütün bunlara (Sadece bilgin olsun o kadar kolay çözmek olanlar ...) kesinlikle ilginç

Go'nun soruna yaklaşımını gerçekten çok seviyorum : çok iş parçacığı yerleşiktir ve alınan yaklaşım (kanallar ve goroutinler) geleneksel semafor / muteks / kilit yaklaşımlarından çok daha kolay bir zihniyet oluşturur. Yine de (Go işaretçilere sahiptir) veya kilitlenmeye (kanallarda bekleme döngüsü ...) eşzamanlı olarak senkronize olmayan bir yapıya erişmek kolaydır.

Verilerin değişkenliği destekleyen dillerin, işlevsel diller gibi, bunun da hakkına sahip olabileceğini düşünüyorum (orada deneyimim olsa da).

Ayrıca, Aktör modeli bir sonraki hedefimiz olabilir. Bu da dağıtılmış bilgisayar kullanımı içindi.


Başka bir örnek Erlang olacaktır. Bu tür diller arasındaki ortak tema , durumun esasen mesaj ile birlikte geçirildiği ortak bir yaklaşım değildir . Yaklaşım iyi ölçeklenir.
Berin Loritsch

@Berin: Haklısın, mesajda Erlang'ı alıntılamadığım halde, çok az şey bildiğim için, Aktör modelini doğru şekilde uyguladığını hatırlıyorum.
Matthieu M.

6

Bana deli de ama benim için en önemli dil özelliklerinden biri örneklerle birlikte iyi bir çevrimiçi referansın mevcudiyeti. Herhangi bir dil için iyi arama sonuçları bulabileceğimi biliyorum, ancak MSDN ve Java API'leri sitesini gerçekten seviyorum. Belirli bir dilde fazla tecrübesi olmayan bir kişi için programlamayı çok daha kolaylaştırır.


JavaDoc, CppDoc, RubyDoc, vb., Standart kütüphaneleri ve yarattığınız kütüphaneleri anlamada büyük bir varlık olmuştur. Hepsi eşit yaratılmamış ve bazıları gezinmek diğerlerinden daha kolay.
Berin Loritsch

Kabul edildi, Java API sitesi mükemmel bir varlıktır. API dokümantasyonu oluşturmak için standart bir formata sahip olması harika. JavaDoc'u (netbeans) analiz etmek için yerleşik destekli bir IDE kullanmanın üretkenliği inanılmazdır. Her ne kadar korkunç bir hafızam olsa da, bu muhtemelen bana diğerlerinden daha fazla yarar sağlıyor.
toc777

6

Derleyicinin kodunuzu kontrol etmesine yardımcı olmak için daha fazla yetenek.

Gömülü bir sistem programcısı olarak, her zaman C kullanırım. Fakat her zaman derleyiciye kodumdan ne beklediğimi söylemesini ve doğrulayabilmesini sağlamak için daha iyi / daha iyi yöntemlerim olmasını diliyorum.

EG bir fonksiyona sahip olabilirim

f(int x)

ama tercih ederim

f(int range[-5..25] x)

EG Lisp veya Haskell gibi bir tür üst düzey fonksiyonel dil kullanarak işlevler hakkında iddialar yazabilmek istiyorum. Bunlar kodda derlenmez, ancak statik veya dinamik analiz için kullanılabilir.


Temelde sınır kontrolü yapmak için etkili bir yol mu? Bu çok iyi olurdu. Bununla birlikte, en azından çalışma zamanı kontrolü ve derleme zamanı kontrolü için dahil edilmesini isterdim. Bir veritabanından veya kullanıcı arayüzünden bilgi alırken, değerin her zaman geçerli olacağını garanti edersiniz. Bu bir dil özelliği olsaydı, bu amaçlar için de kullanmak isterdim.
Berin Loritsch

3
Pascal'ı kullanmalısın. Derleyicinin derleme zamanında doğrulayabileceği -5.25 gibi isteğe bağlı bir sayı aralığını kapsayan bir tür tanımlayabilirsiniz. (Tabii ki sadece sabitleri atadığınız sürece.)
Mason Wheeler

1
@Kugel: Derleyici özelliğinden başka ne var? Ve Birim testi, üretimdeki kodu kontrol etmez. Ve üretimde kontrol yapmamak, ilk yolculuktan sonra canlı gemileri çıkarmak gibidir. Yakıttan tasarruf etmek ve gemiyi daha hızlı yapmak.
Martin

1
Çalıştığım platformun Ada derleyicisine sahip olmaması dışında Ada'yı kullanırdım. Sadece bir C derleyicisi var, yani bu zaten akademik.
Rocketmagnet

1
Zaten pek çok varsayım kullanıyorum, fakat bunun ve başka şeylerin dil özellikleri olarak ele alınması daha iyi olurdu.
Rocketmagnet

5

Ayrıntılı sözdiziminin öğrenilmesi zor ve okunabilirliğe yardımcı olmadığından, mümkün olduğunca az anahtar kelime içeren küçük sözdizimi.

En kötü örnek Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Doldurucu kelimeler gibi, gibi .. programlama dilleri için anlam ifade etmiyor.


4
Bence en kötü örnek söylediğin diller public static void.
Joey Adams

1
Fikir yeni değildir ve zaten hiç anahtar kelimesi olmayan SmallTalk biçiminde uygulanır. Yani SmallTalk'u talebiniz için olumlu bir örnek olarak kullanmalıydınız. BTW: Bunun ne anlama geldiğini bilmiyorsanız IS, Ada'yı anlamadınız mı (hiç programladınız mı?): ISProsedür bildirimini yerel değişkenlerin bildirgesinden ayırır ve ayrıca bir belirtimi uygulamadan ayırır. Tabii ki, sadece bir fonksiyonun özelliklerini ve uygulanmasını karşılaştırırken, bunun ISmantıklı olduğunu ve bir dolgu maddesi olmadığını göreceksiniz .
Martin

1
Bahsetmeyi unuttum: SmallTalk sözdizimi ayrıca bir kartpostalın arkasına da uyar. Bu yüzden aynı zamanda “küçük” olan isteğinizi yerine getirecektir. Elbette buradaki fikirlerin çoğu zaten bir yerde bir dilde uygulanmakta ve çoğu poster bu dilleri hatalı bir olumsuz örnek yapmak yerine pozitif örnek olarak kullanmaktadır . Yeterince üne sahip olursam, sana oy veririm. Fikriniz kötü olduğu için değil - olumsuz örnek kullanmak için.
Martin

7
Doldurucu kelimeler, sözdizimi belirsizleştirmeye yardımcı olurlarsa aslında bir amaca hizmet edebilirler. Mesela ben çok tercih if x then …için if (x) …. İçeriksel bir anahtar kelime için bir çift parantez takas ettik. Bu mantıklı çünkü durum xkendi parantezleri ile karmaşık bir ifade olabilir. En dıştaki çifti ortadan kaldırmak, okunabilirliği büyük ölçüde artırabilir. Elbette ki alternatif, burada Python'daki gibi bir kolon kullanmaktır. Aslında, bu tür netleştirici dolgu maddelerinin çoğunun kolonlarla değiştirilebileceğine inanıyorum. Hangi yöntemi tercih ettiğime emin değilim.
Konrad Rudolph

3
@Konrad: Eğer sözdizimini yanlış tutarsa, bu bir dolgu değil . is Olan Ada çünkü dolgu olabilir sağladı procedure Hello begin ... endhiçbir belirsizlik ile.
dan04

4

Daha fazla öğrenme dili görmek istiyorum . Her belirteç arasında boşluk bırakmayı gerektiren, sadece ondan daha kısıtlı olan mutlak yeni başlayanlar için diller değil , aynı zamanda zaten programlamayı bilen ve yeni kavramları öğrenmek veya genel olarak programlamada daha iyi olmak isteyen insanlar için diller.

Bana göre Haskell, "öğrenme dili" ile neyi kastettiğimin harika bir örneğidir (yine de popülerliği ve yıllar boyunca genel olarak kullanılmasına rağmen). Bilinen C sözdizimini bırakarak ve geriye doğru fonksiyon bileşimi operatörlerine sahip olarak (örneğin (+2) . (*3), 3 ile çarpıp sonra 2 ekleyen bir işlevdir ), Haskell bana daha kısa işlevler yazmamı öğretti. Acımasız türü denetleyicisi, dili daha hızlı öğrenmeme yardımcı oldu ve mantıksal olarak kod hakkında düşünme yeteneğimi geliştirdi. Bu avantajların her ikisi de meclis bile olsa diğer dillere yayılmıştır.

Dil öğrenmenin ve genel amaçlı dillerin hedefleri genellikle çatışma içindedir. Bir öğrenim dili, öğrenmesi için zorlayıcı ve ödüllendirici olmalı ve bu tarz birçok uygulama için en iyisi olmasa bile belirli bir stili zorlamalıdır. Genel amaçlı bir dil, işleri yapmak için iyi olmalı ve soyutlamaların kullanımı dikkatlice ölçülmeli ve "mantıklı" olmalıdır. Örneğin, bir web sitesini tamir ederken, monadlar hakkında bilgi edinmek bir programcının aklında son şey olacaktır. Madalyonun diğer tarafında, birileri programlamayı öğrenirken, henüz fonksiyonlar hakkında bir şey öğrenmemiş olsalar bile, "kamu statik geçersizliği" saçmalığını atlatmaları gerekmemeliydi.

Bir dil tasarımcısıysanız, lütfen dilinizin bir öğrenme dili veya uygulamalı bir dil olup olmadığını göz önünde bulundurun. Bu, tasarımınızda ne kadar saflık kullanmak isteyeceğinizi belirleyecektir.


2
Haskell'in fonksiyon kompozisyonu nasıl bir şekilde geriye doğru? Doğrudan bir çevirisi (f ∘ g)(x) = f(g(x)).
Jon Purdy

@Jon Purdy: İşlevleri uygulamalarının tersi sırayla yazmak zorunda olduğunuz anlamına gelir. Her iki formda gda önce argümana uygulanır, ardından bunu takip edin f. Eğer bu listelerin ilk öğeyi bir liste, grup sıralamak ve almak istiyorsanız şu yazılır (map head . group . sort) listya map head $ group $ sort listya map head (group (sort list)). Her durumda, işlemleri geriye doğru yazmaktan vazgeçersiniz. Bu arada, içe aktarma Control.Arrowsöyleyebilmenizi sağlar (sort >>> group >>> map head) list, ancak >>>operatör bana oldukça garip ve ayrıntılı görünüyor.
Joey Adams

2
Bilmiyorum, hala sağdan sola birinin mantıklı olduğunu düşünüyorum. (map head . group . sort) list"her grubun bir tür ilk listörneği" olarak okur , bu oldukça doğaldır - ve kulağım için daha işlevsel (sort >>> group >>> map head) listve geriye doğru okur ve "sırala" grubundan sonra her grubun ilk öğesini alır. .. list".
Jon Purdy

@JoeyAdams - oldukça garip ve operatör görünüyor ayrıntılı - Birkaç daha yeni işlevsel diller kullanmaya başladılar ... belki gözleri biraz daha kolay olan bir sol-sağ zincirleme operatörü olarak>>>|>
Jules

4

2011'den beri

  • kesinlikle eksiksiz bir şartname. C'deki gibi hiçbir arkaya bağımlı olmayan delik yok
  • okuyuculu destek; sadece senkronizasyon özellikleri (kilitler) değil, çoklu okuyucuyu bir döngü yazmak kadar kolay hale getiren dil özellikleri:

    tümü (o, myCollection içinde) {o.someMethod ()}

  • çok paradigma; Programcı, bir durum bazında derleme zamanı güvenliğini mi yoksa dinamik bir dilin tam tersini mi istediğime karar vereyim; bana nesne yönelimli özellikler, işlevsel özellikler vs. ver

  • tutarlılık (hem tutarlılık hem de çoklu paradigma için biraz sorduğunu biliyorum ...)


Tam bir şartname için% 100 seninleyim. Çok paradigma ve tutarlılık kesinlikle dengeleyici bir hareket olacaktır. Dinamik bir paradigma için statik denetim davranışlarının bir alt kümesi olarak bir davranış seti belirleyebilirsiniz - ancak bu iki yaklaşımın kendilerini çok farklı programlama stillerine borç verebileceğini düşünüyorum. Bu noktada gerçekten ayrı diller seçtiler. Belki de% 100 uyumluluğa sahip bir çift tutarlı dil aradığınız şey olabilir mi?
Berin Loritsch

Scala gibi diller (ve belki de Haskell? Yeteri kadar bilmiyorum), tür çıkarımı ve imaları sayesinde güçlü statik tip sistemi ve netliği vardır.
PhiLho

2
Bir dil bir programcının neyin önemli olduğunu veya neyin önemli olmadığını belirtmesine izin verdiğinde mimariye bağlı özellikler iyidir. C'yi korkunç kılan şey, "modulo 65536'yı saran sayısal tip"; Bir platform uint16_t uygulasa bile, standart bazı uygulamaların uint16_timzalı olarak iki değer arasındaki farkı , bazılarının imzasız olarak değerlendirmesini gerektirir; programcının hangi davranışı istediğini belirlemesine imkan vermez .
supercat

Ben çok paradigma için katılmıyorum; Bu stil savaşları kodlamak için çok fazla kıpırdatmak oda bırakıyor. Kütüphane A, bir sürü dinamik paradigma ile yazılmıştır . B Kütüphanesi bir sürü statik paradigma ile yazılmıştır . Peki, şimdi Kütüphane A'nın Kütüphane B ile konuşması gerekiyor; orta yer neresi? Aynı dilde iki kod parçası arasına yapıştırıcı yazmanız gerekiyorsa, dil kendiliğinden IMO’ya kusurludur.
Qix

3

Hafif İşlemler

Erlang'daki gibi Hafif İşlemler yapmak istiyorum. Esas olarak çalışma zamanı için bir sorun. Bu JVM ve .NET CLR'de eksik. LWP, büyük ölçüde eş zamanlı yazılım oluşturmak için yardımcı olur. İdeal olarak, bir dilde bir nesne oluşturmak olduğu gibi bir süreç oluşturmak daha pahalı olmamalıdır. Uygulamalarımda milyonlarca işlem yaratmak istiyorum.

Preemtive zamanlamaya sahip bir iş parçacığı havuzu olarak uygulanır, böylece tek bir görev diğer görevi engellemez ve görevler mevcut olan herhangi bir işlemci çekirdeğinde zamanlanabilir.

Kuyruk özyineleme desteği

Kuyruk özyineleme için destek almak istiyorum. Bu, çalışma ortamı için de bir sorun olabilir. JVM'nin kuyruk özyineleme desteği yoktur.

Kolay dağıtılmış programlama

Ben send (destek istiyorum ! ) Ve almak Erlang aynı Netword üzerindeki diğer makinelerde çalışan uygulamanın bölümlerine ilkeller. Bu, dağıtılabilir veri depoları gibi ölçeklenebilir uygulamalar oluşturmayı kolaylaştırır. Dilde yerleşik olan bu serileştirme eklenmesi de erlang'daki gibi çok faydalıdır. Java’da olduğu gibi, el ile de yapmam gerekiyor.



Scala kuyruk özyinelemeye sahip ve JVM'ye derlenmiştir. IBM Java derleyicisi de bazen kuyruk özyinelemesi yapabilir.
Martin

3

Meta programlamayı kolaylaştırın.

özel formları sınırla

Python'da bunu yerleşik bir işlev değil yazdırmanın iyi bir nedeni yoktur. Parens ile bir şey yapmak istememek dışında, bir işlev gibi görünür ve hareket eder.

Do asıl ihtiyacımız for, foreach, whileve kendi özel form olarak her gibi. Değişken döngü formlarının sözdizimsel şekerini sağlamak için bir döngü yapısına ve bazı varsayılan makrolara ne dersiniz.

özel formlar için meta-programlama

form['if'](test-fn, body-fn)


Ruby türünün döngü için "özel formları" vardır, en azından yinelenebilir nesnelerin genellikle eachbir argüman olarak bir kod bloğunu alan bir yönteme sahip olması anlamında . (Ruby'de ayrıca vardır forve whiledöngüler vardır, ancak saygılı Ruby programcısı aslında bunları kullanmaz.)
mipadi

@mipadi: Ben Ruby bloklarının ve ilgili deyimlerin büyük bir hayranıyım.
dietbuddha

Belki de düşünüyorlar ki - Gözünü dışarı atarsın :) Sanırım hepinizin güçlü "Python" ile "neden olmasın iyi bir sebebi" nin birlikteliğiydi. Bununla birlikte, metaprogramming, genellikle ihmal edilen geçerli bir dil tasarım konusudur. Bu nedenle, bunu daha fazla oylayacağım.
Berin Loritsch

@Berin: Aslında kullanıyorum ve Python'un hayranıyım.
dietbuddha

Bir döngü tipi, kod akışını belirsiz hale getirir. Örneğin do..while, bir değerlendirme en üstte olan bir döngü tipi olsaydı, bir döngü nasıl görünür? Öyle görünmüyordu ... hiç bir döngü yok.
Qix

2

Ağ yetenekleri

Ağ desteği olmadan gelen bir dil, bugünün dünyasında oldukça yetersiz.

Gerçek dünyadaki çoğu uygulamanın bir tür ağ üzerinden iletişim kurması gerekir:

  • otomatik güncelleme
  • veritabanı erişimi
  • Ağ hizmetleri

Aynı zamanda elbette dağıtılmış / bulut bilişim desteğinin temel taşıdır.


8
Ancak standart bir kütüphane özelliği olabilir .
Donal Fellows,

@ Donal: Asla söylemedim (ya da en azından öyle düşünmedim), soru hem dilde hem de kütüphane özelliklerinde açık. Demek istediğim şu ki, eğer bir dil paketi alıyorsanız ve orada ağ özelliği yoksa, bu ağrıyı daha sonra değil de dolduracaksınız :)
Matthieu M.

3
Standart kütüphane dil deneyiminin bir parçasıdır ve aynı özen ve saygı ile ele alınmalıdır. Ayrıca standart bir kütüphane için bu şartı kabul ediyorum.
Berin Loritsch

1

Yeni şeyler yaratmak için öğrenmesi kolay ve birleştirmesi kolay bir programlama dilini seviyorum.

Örneğin, bir şeyi yazmak için birçok yolun olması çekici olsa da, onu yazmak için yalnızca bir ya da iki yolun olması daha iyi olduğunu düşünüyorum. Bu şekilde programın bakımı daha kolaydır.

Kavramları tüm unsurlara uygulayabilen bir dil çok yararlıdır (bence buna ortogonallik denir) Böylece, yeni bir dil özelliği ile bir sonraki karşılaşışınızda, nasıl kullanılacağını öğrenebilirsiniz.

Bazen dil sözdiziminin derleme / yorumlama aşamasında daha iyi performans gösterme yolunda olması gerektiğini biliyorum, ancak bazen dil tasarımcısının bu işi geliştiriciye ertelediğini hissediyorum. Örneğin, Java veya Javascript'te çok satırlı dizeler.

Son olarak, dil sözdizimi kullanıcı arayüzüdür ve bu nedenle açık, özlü, sezgisel, kullanımı kolay olmalı ve alışkanlıklarına saygı göstermelidir.


Ortogonal, her özelliğin farklı bir şey yaptığı anlamına gelir. Grep veya awk gibi araçlara bakın. Bir şey yaparlar, peki. İhtiyacınız olan her şeyi yapmak için onları farklı sırayla bağlarsınız.
Theo Belaire

1
  • Okunabilirlik : Dilbilgisinde kullanılan semboller ne kadar küçük / en küçükse, o kadar temiz ve daha iyi.
  • Nesneye Dayalı Türler : Yöntemler, işlevler değil.
  • Anlaşılabilirlik : Dahili akıcı arayüzler, kütüphane sınıfları / arayüzleri ve çeşitleri için kapsamlı ve kısa adlar.

1
Üzgünüm, bu konuda tamamen yanlış olduğun için sana -1 vermeliyim. Kısalığı yardımcı yazma hızlı kod, ama kesinlikle belli bir asgari ötesinde, kod daha okunabilir yapmaz. Belli bir ayrıntı seviyesi kodu okumayı çok daha kolaylaştırır, çünkü bu fazladan kelimeler ve semboller bir şey ifade eder ve programcıya anlamlı bir bilgi verir, özellikle de başka bir kişi tarafından yazılmışsa ve zaten zihinsel olarak sahip olma avantajına sahip değilseniz Kafandaki modeli.
Mason Wheeler

Benim için temiz kod okunabilir koddur. Ayrıca en küçüklerini söyledim: PHP dizilerinde "=>" yerine ":" veya "." "->" yerine kesinlikle bir gelişme olur (ve zaten PHP'yi severim).
dukeofgaming

4
@Mason: Ben ve birçok iyi teknik yazar (örn. William Zinsser) katılmıyorum. Ayrıntı, okunaklılık düşmanıdır, terslik değil.
Konrad Rudolph

2
Sembollerle tanımlanmış bir çeşitlilik arz ediyorum . Ancak, çok karakterli sembollerle mutluyum, ancak okuyucunun doğal olarak tek bir sembol gibi davrandığı şeyler olduğu sürece (örneğin, bir kelime bir semboldür).
Donal Fellows,

1
İlk noktanız ikinci ikinizle doğrudan çakışıyor.
Qix

1

Mevcut bir programlama diline bir özellik ekleme. Yani, yeni B dili eski A dili artı X özelliğidir.

Mevcut örnekler:

  1. C sınıfları ekleme => C ++
  2. Java bazı şeyler ekleyerek => C #

2
Bu çok büyük bir basitleştirmedir. Çok daha iyi bir örnek C ve Objective-C arasındaki fark olabilir.
Jon Purdy

0

Teknoloji / platform / dil / veritabanı vs. söz konusu olduğunda çoğu zaman performans düşmektedir. Gelecekte, günümüzün pek çok yazılımı, daha güçlü bir hesaplama gücümüz olduğundan, grafik bir dil kullanılarak tasarlanabilir.

Hesaplama gücümüz ve başvurunuzu tasarladığınız bir dilin olduğu ve dil ayrıntılarıyla ilgili endişelenmenize gerek olmadığı gün için umarım .

Güncelleme: LabView diline bir link gönderirim

Güncelleme: “hesaplama gücü” ile ne demek istediğimi daha fazla açıklamalıyım. Derlenmiş yazılımın performansı, sözdizimi diline dayalı derlenmiş yazılımlar kadar güçlü olmayabilir. Grafiksel programlamayı daha yüksek bir programlama seviyesi olarak düşünüyorum ve daha fazla ek yük olabilir. Günümüzün bilgisayarları grafik programlama dillerini kolayca çalıştırabilir ve yapabilir.


3
Bilgisayarlar bunu yapacak kadar güçlü. Sadece pratik değil, bir nedenden ötürü koda girmeniz gerekeceği için .
Jeremy Heiler

2
Hala bir çeşit dil. Bunu gerçeğe dönüştürmek için birden fazla girişimde bulunuldu. UML araçları belirli miktarda kod üretecektir, ancak model çalışan bir ürün üretmek için yeterince ayrıntılı olduğunda, artık kodlamayı anlamak için kullanılamaz. Unix ortamında, uygulamaların grafiksel kablolanması için bir şey olduğuna inanıyorum, ancak düzeltilmesi için çok fazla yapılandırma yapılması gerekiyordu. İş akışı motorları, programlayıcı olmayanların iş akışını tasarlamasına izin vermek için bu metaforu kullanır.
Berin Loritsch

1
Kısacası, genel olarak bu yaklaşımın kullanışlılığından ciddi olarak şüphelenmeme rağmen, şu anda kullanıldığı ve bu uygulama için iyi çalıştığı özel uygulamalar var. Re: puanları ... 1. Bilgisayarlar hesaplama gücüne sahip, teknik tarafı sorun değil. 2. Sorun, ayrıntıları genel anlamda kaybolmadan çalışmayı genel anlamda yapmak için yeterince anlamlı bir görsel dil sağlamaktır. Niş uygulamaların dışında, metin bir programın çok daha küçük bir gösterimi gibi görünüyor. Oy verdim, çünkü sorulan soruya uygulanabilir.
Berin Loritsch

1
@Amir: Öyleyse, lütfen "grafik programlama" için yazılım geliştirmeyi sürdürebilmek için bilgisayarların neden daha güçlü olmaları gerektiğini açıklayın?
Jeremy Heiler

7
@Amir: Daha temel olanı ile teknik bir sınırlandırmaya şaşırıyorsunuz. Çok fazla grafik bilgisayar diline sahip olmamanın nedeni, onları nasıl iyi yapacağımızı bilmememiz (ve iyi yapılıp yapılmadıklarını bilmememiz). LabView'ün farkındayım ve içinde karmaşık şeyler yapmak ya da basit şeyleri değiştirmek konusunda yeterince acı duydum. Ne de böyle bir dili tasarlamak için daha güçlü bilgisayarlara ihtiyacımız yok, bu yüzden devam edin ve bazı örnek programları böyle bir varsayımsal dilde çizmeye çalışın.
David Thornley,
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.