Kaç çeşit programlama dili vardır? [kapalı]


30

Temel olarak, harika bir programcı olmak için birçok programlama dili öğrenmek istiyorum. Sadece derinlikli bir avuç biliyorum ve birisinin kaç ders verebileceğini umuyordum veya tipleri vardır programlama dilleri . Gruplar halinde öğrenmek zorunda olsaydınız nasıl bir araya toplanırsınız.

Bir Java arka planından gelince, statik yazmaya aşinayım, ancak dinamik yazmaya ek olarak, mümkün olduğunca kategorik bir dağılım görmeyi sevdiğim kadar, mevcut dillerde de çeşitlilik olması gerektiğini biliyorum.


2
Kaç tane yerine "Hangi tip .." demek daha iyi olmaz mı?
Amir Rezaei

Prolog ve C gibi bir şeyin temelde farklı olduğunu öğrendim, bu yüzden her birinin farklı türden bir programlama diline karşılık geldiğini düşünüyordum ve kaç çeşit olduğunu kavramayı umuyordum .
sova

7
2: ne istediğinizi yapan ve ne yapmayan tür
Matt Ellen

1
Farklı programlama dilleri hakkında bilgi edinmek kesinlikle yapıcıdır ! Potansiyel olarak bunun bunun bir kopyası olarak kapatılması gerektiğini savunabilirsiniz ama bence ayrı kalmak için yeterince farklı sorular olduklarını düşünüyorum.
Peter Boughton

1
@Sova, c tabanlı sözdizimi kullanmayan bir şey denemek için ilk tercih ettiğiniz yeni dilleri yapmanızı öneririm. Bu, kafanızın nasıl çalıştığına ve daha iyi bildiğinizden farklı olmasına odaklanacaktır.
Erik,

Yanıtlar:


73

Dilleri nasıl sınıflandırmak istediğinize bağlıdır. : Temelde, diller iki tipe ayrılabilir zorunlu bilgisayarı talimat hangi dilleri nasıl bir görev yapmak ve deklaratif bilgisayarı anlatmak hangi dilleri neyi yapmak. Bilgilendirici diller ayrıca , bir programın bir dizi mantıksal bağlantı aracılığıyla oluşturulduğu işlevsel bir programın oluşturulduğu işlevsel dillere ve mantığa programlama dillerine ayrılabilir . Zorunlu diller, bir tarif gibi, bir problemi çözmek için atılan adımların bir listesini daha çok okur. Zorunlu dilleri C, C ++ ve Java; fonksiyonel diller arasında Haskell; mantık programlama dilleri Prolog içerir.

Zorunlu diller bazen iki alt gruba ayrılır: C gibi prosedürel diller ve nesne yönelimli diller . Nesneye yönelik diller, nesneye yönelik işlevsel diller olduğu gibi gruplara biraz diktir (OCaml ve Scala örneklerdir).

Dilleri ayrıca yazarak da gruplandırabilirsiniz: statik ve dinamik . Statik olarak yazılmış diller, programın çalıştırılmasından önce (tipik olarak bir derleme aşamasında) yazmanın kontrol edildiği (ve genellikle zorlandığı) dillerdir; dinamik olarak yazılmış diller çalışma zamanına göre tip kontrolünü erteler. C, C ++ ve Java, statik olarak yazılmış dillerdir; Python, Ruby, JavaScript ve Objective-C dinamik olarak yazılmış dillerdir. De vardır türsüz Forth programlama dili dahil dilleri,.

Ayrıca, dillerini kendi yazma disipline göre de gruplandırabilirsiniz : örtük türde dönüşümleri destekleyen zayıf yazma, örtük türde dönüşümleri yasaklayan güçlü yazma. İkisi arasındaki çizgiler biraz bulanık: bazı tanımlara göre, C zayıf yazılmış bir dil, diğerleri ise güçlü yazılmış. Yine de disiplini yazmak, dilleri gruplandırmak için gerçekten kullanışlı bir yol değil.


1
Benzer bir şey poz verecekti, ancak bunun yerine + 1'I ve yorum ekleyecekti. Her kategori veya kombinasyon aynı zamanda belirli öğelere odaklanarak yaratılan sayısız ayrılmaya sahiptir. Örneğin, OOP şunları söyler: Prototip tabanlı OOP, Yönelimli Programlama, Bileşen Tabanlı Programlama, vb. İşlevsel paradigmalarda, eşzamansız bir işlem veya iş parçacığının temel birim olduğu diller gibi kesintiler vardır ve paralel işlemleri birlikte oluşturarak programlarsınız.
CodexArcanum

Script dilleri, örneğin VBScript buna nasıl uyar? Biraz yordamsal olabilir ve çeşitli türler yaratabileceğinden biraz OO olabilir, bu yüzden bunu hibrit yapar mı?
JB King,

Bu tam olarak aradığım şeydi. Çok teşekkür ederim.
sova

3
@JB King OOP dilleri, genellikle en azından yöntem organlarında, prosedüreldir. Ayrıca, OOP'nin "nesneler" anlamına geldiği yaygın bir yanılgıdır. Birçok dilde veri türleri ve nesneler bulunur. OOP'nin kesin tanımının ne olduğu konusunda çok fazla tartışma vardır, ancak genellikle ana temalar olarak kalıtım ve / veya kapsülleme (özel durum) içerir. Herhangi bir biçimde olmayan bir dilin bir OOP dili olarak sınıflandırılması zor olabilir.
CodexArcanum

2
@ sova Sadece bu şekilde çalışan iki dil düşünebiliyorum. Erlang ağır paralel işlemlere dayanıyor, ancak tam olarak neden bahsettiğimi beğenmek istiyorsan, Polifonik C # ile ilgilenmelisin. Pi-Calculus'u temel alan bir araştırma dilidir (şimdi C-omega'ya katlanmıştır) (FP'nin lambda calc'ı nasıl kullandığı gibi) Pi-calc, bir işlemin birimini temel alır ve süreçleri ve senkronize ve asenkron bir kombinasyonunu ilan edersiniz. onları içine çağırır. Ayrıca FP'deki Oklara, özellikle Haskell'e bakın. Oklar buna çok benzer.
CodexArcanum

12
  • montaj
  • Usul
    • Temel
    • C
  • Nesne odaklı
    • C #
    • Java
  • bildiren
    • Prolog
    • SQL
  • Fonksiyonel
    • yanlış telaffuz
    • Haskell

Bunlar asıl olanlar, ama dışarıda bir sürü paradigma var ve aralarında çok fazla örtüşme var.


Nasıl bildirim hakkında (örneğin, Prolog, SQL)?
Bruce Alderman

@Bruce, şimdi onları aldım.

Evet, bu yol boyunca bir yerlerde öğrendiğim genel fikirdi.
sevenseacat

6
Montaj prosedür olarak kabul edilmemeli mi?
MattDavey

2
Forth ve Factor gibi birleştirici (yığın tabanlı) programlama dillerine ne dersiniz? Bunun bir tür İşlevsel programlama olduğunu düşünebilirsiniz, ancak muhtemelen bahsetmeyi hak edecek kadar belirgindir. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux

11

Programlama dilleri (Paradigmalar) türleri için buraya bakınız:
http://en.wikipedia.org/wiki/Programming_paradigm

Programlama dillerinin diğer özellikleri için (örneğin, Tip Sistemleri), buraya bakın: http://en.wikipedia.org/wiki/Programming_language


Ah! "paradigma" ne güzel bir kelime! teşekkür ederim
sova

@ sova Bunu en iyi cevap olarak kabul ediyorum, çünkü bir P.SE yanıtında listelenecek çok fazla paradigma var, her birinin nüanslarını tanımlamak için çok daha az.
Rei Miyasaka 16:11

9

PDF'i görmek için resme tıklayın. Programlama paradigmaları posteri

Aptallar için Programlama Paradigmalarına bakmalısınız : Her Programcının Peter Van Roy tarafından bilmesi gerekenler . Bu size dışarıda nasıl olup bittiği hakkında genel bir bakış verecektir.

Daha ileriye gitmek istiyorsanız, Kavramları, Teknikleri ve Bilgisayar Programlama Modellerini okuyabilirsiniz . Bu şekilde bir dil grubunu öğrenmeyeceksiniz, ancak farklı dillerin arkasında yatan paradigmaları öğreneceksiniz. Bu nedenle, yeni bir dil öğrenmek sizin için daha kolay olacaktır.


6
  • İşlem: Montaj, Java, C #, F #, Lisp, Fortran.

  • Tabanlı ayarlayın: SQL.

  • Desene dayalı: Perl, Regex, Snobol.

  • Ağaç bazlı: XSLT.

  • Dizi tabanlı: APL.


2
Farklı bir sınıflandırma türü kullanmak ve aynı zamanda 'prosedürel' ifadenin aslında diğer kişilerin sınıflandırmalarının çoğunu içerdiğini bilmek için +1. (Tabii ki bu sadece kelimenin çok az bir anlamı olduğu anlamına gelir ve et böyle alt bölümlerdedir)
Javier

4

Buna cevap vermenin farklı yolları var, ancak bunlar şöyle sınıflandırılabilir:

Makine dili: Makine dili düşük seviyeli bir programlama dilidir. Bilgisayarlar tarafından kolayca anlaşılır ancak insanlar tarafından okunması zordur. Bu yüzden insanlar daha yüksek seviyeli programlama dilleri kullanıyorlar. Ayrıca, yüksek seviyeli dillerde yazılmış programlar, bilgisayarların yürütebilmesi için derlenir ve / veya makine dilinde yorumlanır.

Assembly dili: Assembly dili, makine dilinin bir temsilidir. Başka bir deyişle, her bir montaj dili talimatı bir makine dili talimatına çevrilir. Assembly dili ifadeleri okunabilir olsa da ifadeler hala düşük düzeydedir. Assembly dilinin bir dezavantajı, taşınabilir olmamasıdır, çünkü her platform belirli bir Assembly Language ile birlikte gelir.

Üst seviye dil: Yüksek seviye diller, günümüzde çoğu programcının kullandığı dildir. C, C ++ ve Java gibi dillerin hepsi üst düzey dillerdir. Üst düzey dillerin avantajları, çok okunaklı ve taşınabilir olmalarıdır. Üst düzey dillerin bir dezavantajı, Meclis Dillerinden daha az güçlü olmalarıdır. Çünkü üst düzey bir dilde tek bir ifade birçok makine dili deyimine çevrilmiştir.

Üst düzey diller ayrıca şöyle sınıflandırılabilir:

  1. İşlevsel diller: İşlevsel dilde, bir program işlev tanımlarına bölünmüştür. İşlevsel diller bir tür bildirim dilidir. Çoğunlukla sabitleri olan tiplenmiş lambda-matematiğine dayanırlar. Ünlü İşlev dillerinden bazıları Scala, F #, Clojure ve Lisp'tir.

  2. Usul dilleri: Usul Dillerinde, bir sonuç elde etmek için izlenmesi gereken adımlar dizisine bir program yazılır. COBOL, FORTRAN ve C bazı Usul dilleridir.

  3. Nesneye Yönelik Programlama dilleri: OOP dillerinde, bir program veri içeren işlemlerin yanı sıra veri üzerinde çalışan yöntemleri de içerir. Java, C # ve C ++, OOP dilleridir.

  4. Mantık Programlama dilleri: Mantık Dilleri, bilgisayarın mantıksal olarak düşünülmesini sağlayan programlar oluşturmak için kullanılır. örneğin: Mantık dili

Derinlemesine çalışma için, göz atın:


3

Özellikler açısından düşünmeye meyilliyim:

Sözdizimi:

C Tabanlı ya da neyin var. Java, C tabanlı bir sözdizimine sahiptir. Kafanızı sözdizimden çıkarmak ve verilen bir dilin nasıl çalıştığının temelleri hakkında daha fazla düşünmek için Python veya Ruby gibi bir şey denemenizi şiddetle tavsiye ederim. Hiçbir sözdiziminin C-tabanlıdan daha ağır olması gerekmediğini ve beyaz-alan etrafında herhangi bir problem oluşturmadığını düşünüyorum.

Derlenmiş ve yorumlanmış w. Sözlü / Konsolide Yapılma İşlemi

Derleme zamanı ile çalışma zamanı ortamıyla ilgili endişelerim hakkında çok az bilgim var ama orada nadiren düşündüğüm bir sürü sorun olduğunu anlıyorum.

Aynı şekilde, Java gibi sanal bir makinenin içinde çalışmak için hala bir derleme işlemine sahip olan birçok yorumlanmış dil vardır. Bazı şeyleri değiştirmek için hala yeniden inşa etmeniz gerekiyor.

Daha sonra, canlı bir ortamda bir konsolda komut vererek komut vererek, anında çalıştırabileceğiniz JavaScript ve Python var. Üçü de kod yazmanın farklı yollarına yol açabilir.

Dinamik ve Sıkı yazma

İkisini tasarımın değişmezliği olarak görmeye meyilliyim. Çok daha düşük bir seviyedeyseniz ve performans önemlidir, statik yazım çok mantıklı olur. Hiçbir zaman birinden diğerinden "daha güvenli" olduğu fikrini hiç anlamadım, ancak yazma sisteminin nasıl çalıştığını ve temelde ne bekleyeceğinizi öğrendiğiniz çok plastik / dinamik bir dilde geldim. Type shenanigan'lar JS'de nadiren benim için bir endişe kaynağıdır. Bazı açılardan esneklik işleri daha da sağlamlaştırabilir, ancak dilde bazı çukurlar hakkında bir şey bilmiyorsanız kuşkusuz daha fazla Jr. seviyesine yönelik bir dokunuşa rağmen.

Blok Seviyesi Kapsamı - İşlev Kapsamı vs.

Blok Seviyesi en yaygın olanıdır (çoğu c-tabanlı sözdizimi dilinde {} arasındaki herhangi bir şey). JavaScript kapsamı, fonksiyonların etrafında oluşturulmaktadır (nesneler de bu kadar etkili nesneler oluşturmak için de kullanılır). İç alandan dış alana kadar ne tür erişime sahip olduğunuzda da büyük farklılıklar vardır. Diğer kapsam planlarına aşina değilim, ancak var olduklarından eminim.

Klasik OOP vs Prototip OOP vs Neredeyse OOP (C? Deki yapılar) vs OOP dışı:

Sınıf temelli OOP'ta bile değişkenlik için çok fazla yer var. Çoklu miras yapıp yapamayacağınız (ee, fazlalık, ee), arabirimleri tanımlamak, vb ...

JavaScript'te, nesnelerin oldukça daha basit, yüksek oranda değişken olduğu bir çeşit bodur hibrit prototip OOP'umuz var, ancak arayüzü hala IMO'nun kapsüllemenin önemli yönü olan iç kaygılardan ayırma yeteneğine sahibiz.

OOP ile ilgili olan şey, teknik olarak OOP olmadan temelde OOP odaklı olan birçok şeyi çekebileceğinizdir. Elbette ki puristler var ama günün sonunda, Tasarım Desenleri belirli durumlarda iyi sonuç veren belirli soyutlamaları başarmakla ilgilidir. OOP tabanlı bir dilden fikirlerin usule dayalı odaklı bir şeyde kullanılmadığını varsaymak için çok hızlı olmayın. Ve ben JavaScript hakkında konuşmuyorum. Prototip tabanlı bir OOP paradigmasının aptal versiyonuyla hiç sınırlı değil.

Birinci Sınıf İşlevler:

Bunları bir dilde olmaması benim için vazgeçmek zor. İşlevleri, diğer bağlamlarda kullanılmak üzere veri gibi etrafta geçirebilirsiniz. Bu, olay işleme planlarını özellikle uygulaması çok kolaylaştırır, ancak dili istediğiniz şekilde çalışacak şekilde uyarlamayı da kolaylaştırır. Bu, şüphelendiğim her şeyden çok, JavaScript'i nihai olarak iki hafta içinde tasarlanmış olmasına ve Java hakkında yaklaşık bir sözdizimini pazarlama planı olarak ele almasına rağmen başardı.

Kapaklar:

Tartışmanın Java için nerde olduğundan emin değilim, ancak bir çok Java geliştiricisinin bu özellik için bir veya iki yıl önce çarpıştığını biliyorum. Kapanmayan bir dilde, bir işlev kapandığında, bir şekilde bu işlevin içinden bir şeylere referans verebilecek herhangi bir şey, toplanmış çöp olduğu için ona erişemez. Bir kapanışta, yürütme bağlamı, bu kapalı işlevin içindeki öğelere, döndürülen bir nesnedeki gibi başka bir kapsamdan başvuru yapabiliyorsanız ya da temelde işlev kapandığında olduğu gibi bu değişkenleri alabileceğiniz şekilde bağlanır. Bu, atıf yapan varlığın yerel varyasyonlarına yapılan varyantların kopyaları gibi uygulandığından şüphelenmekle birlikte, çöp toplamanın kapağında ayağınızı sıkışmak gibi bir şey.

Sert / Sıkı / Güvenli - Size İstediğiniz Tüm Halatları Vermekle İlgili:

JS devs ve Java devs birbirlerini hiç anlamadılar ve bu özel tasarım yelpazesinin birbirine zıt taraflarına düşen iki dilin yapması gereken çok şey olduğunu düşünüyorum. Beni kendimden veya ekibimdeki diğer aygıtlardan korumanı istemiyorum. Duruma bağlı olarak çok daha az kodla çok daha fazlasını yapmak ve hepsini çok farklı (ancak belirli bir etki alanı için tutarlı) yöntemlerle yapmak istiyorum. Her ikisinde de kesinlikle değişimler var ve birçok dil ortada daha fazla düşme eğiliminde.


Gee sağol. Aşağı oylama çabasını açıklamaksızın yapmak gerçekten güzel.
Erik,

2

Tüm bunlara kısayol olarak, Lisp'i yarı yararlı şeyler yapacak kadar çok şey öğrenmek olduğunu düşünüyorum. Bu paradigmaların çoğu Lisp kullanmanın bir yolu olarak başladı, bu yüzden işleri denemek için basit bir yol.

Etrafında bir dizi "tür" vardır, ancak yenileri her zaman görünebilir. Temel olarak, bir dilin amacı fikirlerin, kavramların veya gereksinimlerin mümkün olduğunca doğrudan kodlanmasına izin vermektir. Bu amaçla, mevcut paradigmaların istendiği durumlar olabilir ve yenisine ihtiyaç duyulabilir.

Bakmanın bir yolu, yüzey yapısıdır. Doğrudan fikirleri tam olarak kodlamanıza nasıl olanak sağlar, böylece ne istediğiniz hakkında fikrinizi değiştirirseniz, kodda karşılık gelen değişiklik de kolaydır, hataların ortaya çıkma olasılığı çok düşüktür.

Buna bakmanın başka bir yolu kontrol yapısı açısından. Dil yürütüldüğünde (eğer öyleyse), istediğinizi başarmak için işlerin gerçekleştiği sıra nedir? Örnekler: basit doğrudan uygulama, özyineleme, geri izleme, paralellik. Keşfedilen bir I (mütevazı öksürük) diferansiyel infazdı .

Bir başka yararlı bakış açısı, bir veri yapısı tasarlandığı zaman bir dilin doğmasıdır. Veriler, içinde tarama yapan ve bir şeyler yapan uygulama programları tarafından "yürütülür". Tıpkı bir program, bir tercüman tarafından bir şeyler yapmak için kullanılan bir sürü veridir (bayt kodları gibi).


Güzel. LISP'yi öğreneceğim ve aydınlanacağım. Heyecan
verici

Ancak, bir veri yapısı kullanma eyleminin yeni bir ara dil oluşturduğunu söylerseniz, o zaman her algoritmanın (tüm işlemler mutlaka bir veri yapısı üzerinde yapılır) ve indirgeme ile yeni bir dilde doğduğunu iddia edebilirsiniz. her kod satırında doğar. Bence başka bir şey demek istiyorsun ama henüz anladığımdan emin değilim?
sova

@ sova: Benim için bilgi teorisi büyük bir vahiydi (hem Shannon hem de Kolmogorov). Bu, anlamların nasıl kodlandığı ve kanallardan geçtiği, bant genişliği kavramları, hata bulma, minimum kodlama, rastgelelik vb. İle ilgilidir. Dolayısıyla, veri kodlama bilgileri ve algoritmalar kanallardır. Programlar bilgiyi kodlar ve programlama bir kanaldır. Peki hangi bilgiler kodlanmış? nereden ve ne zaman geliyor? nereye gidiyor Hata kaynakları nelerdir (gürültü)? nasıl düzeltilir? Bunu faydalı bir bakış açısı buldum.
Mike Dunlavey

@ sova: (devam) Tüm kapalı matematiklere hakim olmanıza gerek yok. Benim için önemli olan şeyleri düşünmem için bana verdiği çerçeveydi.
Mike Dunlavey

1

Belirli uygulamalar için programlama dilleri olduğunu eklemeliyim. Akla gelen, APT (Automatic Programmed Tool), takım tezgahları imalatında kullanılan bir dildir.


Bunu hatırladım. Kullanmış bile olabilirim. Evlat, bu en son teknolojiydi. Freze makinesini manuel olarak yönlendirmek zorunda kalmadınız, sadece başlat düğmesine basın. Ve bir böcek olsaydı, tüm cehennem gevşeyecekti.
Mike Dunlavey,

Freze makineleri için gcode üreten programlar üzerinde çalıştım. Kelimenin tam anlamıyla tuttum ve sık sık benim olan programlama hatalarının sonuçlarını gördüm.
David Thornley,

20 yılı aşkın bir süredir postprocessors sistemlerini gobs üzerine kurdum.
Dave,
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.