Tüm diller temelde aynı mıdır?


39

Son zamanlarda, hiç bilmediğim bir dilde yazılmış küçük bir programın tasarımını anlamam gerekiyordu ( bilmeniz gerekiyorsa ABAP ). Çok fazla zorluk çekmeden çözebilirdim.

Yeni bir dilin ustalaşılmasının tamamen farklı bir top oyunu olduğunu fark ettim, ancak bir kaç dil biliyorsanız (tercihen birkaç dil biliyorsanız), herhangi bir dilde kodun amacını (özellikle de karmaşık olması gerekmeyen üretim standart kodunu) açıkça anlamak bir prosedür / OO ve bir işlevsel).

Bu genel olarak doğru mu? Tüm programlama dilleri döngüler, koşullu ifadeler ve fonksiyonlar arasında geçen mesaj gibi benzer yapılardan oluşuyor mu? Tipik bir Java / Ruby / Haskell programcısının anlayamayacağı ezoterik olmayan diller var mı? Tüm dillerin ortak bir kökeni var mı?


4
Seni Paul Graham tarafından Ortalamaları Yenmeye yönlendireceğim . Her şeyi okumak isteyebilirsiniz veya istemeyebilirsiniz, ancak ilgili kısım için "The Blub Paradox" başlığını arayın. Bay Graham metin duvarına çapa koymaktan rahatsız olamaz, bu yüzden doğrudan bağlantı kuramıyorum.
kwatford

4
Dillerin ortak bir kökeni yoktur. Ancak tüm diller bazı problemleri çözmeye çalışır. Konuşulan dilin biraz benzer olduğunu düşünüyorum. Amaç kendini ifade etmektir. 1 yordam / OO / fonksiyonel bilgisine dayanarak dilleri anlamanın ileriye dönük olduğunu söyleyemem. Bunu yapmadım, ancak bu soruyu soracak olsaydım, perl veya lisp'a birçok parantezle bakardım ve her türden 1 dili bilmenin yeterli olduğunu söyleyemezdim.
shahkalpesh

1
Bu durumda: Lambda hesabı. Belki 'gerçek' bir dil değildir, ancak bir anlamda bütün programlama dillerinin annesidir. Bir zamanlar lambda ifadelerinde derlenecek şekilde işlevsel bir dil uygulamak zorunda kaldım (bunlar doğrudan yorumlandı). Tüm ilgili tanımlayıcıları muhafaza etmeme rağmen sonuçlar (benim için en azından) okunamıyordu. Özellikle Y-birleştiriciyi kullanan özyinelemeli fonksiyonlar. Bazı örnek ifadelerin ne yaptığını anlamanın tek pratik yolu, onları el ile değerlendirmektir. Fibonnaci ve birleştirme sıralama gibi basit şeyler okunamıyordu.
kwatford

2
İşlevsel dilleri biliyorsanız, döngülerin her dilde mümkün olmadığını bilmelisiniz.
jalf 4

Piet oldukça farklı. :)

Yanıtlar:


88

Prosedürel dillerin temelleri hemen hemen aynıdır.

Onların teklifi:

  • Skaler veri tipleri: genellikle boolean, tamsayılar, değişkenler ve karakterler
  • Bileşik veri tipleri: diziler (dizeler özel durumdur) ve yapılar
  • Temel kod yapıları: skalerlere göre aritmetik, dizi / yapı erişimi, ödevler
  • Basit kontrol yapıları: if-then, if-then-else, while, döngüler için
  • Kod blok paketleri: fonksiyonlar, parametreli prosedürler
  • Kapsamlar: tanımlayıcıların belirli anlamları olan alanlar

Bunu anlarsan, gezegendeki dillerin% 90'ını iyi anlarsın. Bu dillerin anlaşılmasını biraz zorlaştıran şey, insanların aynı temel şeyleri söylemek için kullandıkları inanılmaz sözdizimi çeşitliliğidir. Bazıları tuhaf noktalama işaretleri içeren kısa notlar kullanır (APL aşırıdır). Bazıları çok fazla anahtar kelime kullanır (COBOL mükemmel bir temsilcidir). Bu önemli değil. Önemli olan, dilin kendi başınıza saçınızı yırtmanıza neden olmadan karmaşık işler yapacak kadar eksiksiz olması. (Window DOS kabuk betiğine hack bazı ciddi dize kodlama deneyin: Turing yetenekli ama her şey gerçekten kötü).

Daha ilginç prosedürel diller sunar

  • İç içe veya sözcüksel kapsamlar, ad alanları
  • Dinamik depolama tahsisi ile bir işletmenin diğerine gönderme yapmasını sağlayan işaretçiler
  • İlgili kodun paketlenmesi: paketler, yöntemlerle nesneler, özellikler
  • Daha karmaşık kontrol: özyineleme, süreklilik, kapanışlar
  • Özel operatörler: string ve array işlemleri, matematik fonksiyonları

Her ne kadar teknik olarak dillerin mülkiyeti değil, aynı zamanda bu dillerin yaşadığı ekosistemin bir mülkiyeti olmasına rağmen, geliştirme aracının bir parçası olarak kolayca erişilebilen veya dil ile sağlanan kütüphanelerdir. Çok çeşitli kütüphane olanaklarına sahip olmak yazma uygulamalarını basitleştirir / hızlandırır, çünkü bir kişi kütüphanelerin yaptıklarını yeniden icat etmek zorunda kalmaz. Java ve C # yaygın olarak kendi başlarına iyi diller olarak düşünülse de, onları gerçekten faydalı kılan, onlarla birlikte gelen büyük kütüphaneler ve kolayca ulaşılabilir uzantı kütüphaneleridir.

Anlaşılması zor olan diller prosedür dışı dillerdir:

  • Hiçbir atama veya yan etkisi olmayan tamamen işlevsel diller
  • Sembolik hesaplamanın ve birleşmenin gerçekleştiği Prolog gibi mantık dilleri
  • Sorunla eşleşen şekilleri belirlediğiniz desen eşleştirme dilleri ve genellikle eylemler bir eşleşme tarafından tetiklenir
  • Kısıtlama dilleri, ilişkileri belirlemenizi ve denklemleri otomatik olarak çözmenizi sağlar
  • Her şeyin paralel olarak yürütüldüğü donanım açıklama dilleri
  • SQL, Renkli Petri Ağları vb.

Dillerin iki ana temsili stili vardır:

  • Tanımlayıcıların ad varlıklarını ve bilgi akışlarını içeren metin tabanlı, tanımlayıcıları varlıkları adlandırmak için kullanan formüllerde örtük olarak kodlanır (Java, APL, ...)
  • Varlıkların düğüm olarak çizildiği ve varlıklar arasındaki ilişkilerin bu düğümler arasında açık yaylar olarak çizildiği grafiksel (UML, Simulink, LabView)

Grafik diller genellikle metin alt dillerine düğümlerde ve yaylardaki ek açıklamalar olarak izin verir. Garip grafik dilleri tekrar tekrar grafiklere izin verir (metin :) düğümlerde ve yaylarda. Gerçekten garip grafik dilleri, açıklama grafiklerinin açıklamalı grafiklere işaret etmesine izin verir.

Bu dillerin çoğu çok az sayıda hesaplama modeline dayanmaktadır:

  • Lambda matematiği (Lisp ve tüm işlevsel diller için temel)
  • Post sistemleri (veya string / ağaç / grafik yeniden yazma teknikleri)
  • Turing makineleri (durum değişikliği ve yeni hafıza hücrelerinin seçimi)

Endüstrinin çoğu tarafından prosedürel diller ve karmaşık kontrol yapıları üzerine odaklanıldığında, bu kategorideki daha ilginç dillerden birini, özellikle de bir nesne yönelimi içeriyorsa, iyi öğrenirseniz, size iyi hizmet verilmektedir.

Özellikle şahane bir kitaptan öğrenme planını şiddetle tavsiye ederim: Bilgisayar Programlarının Yapısı ve Yorumlanması . Bu, tüm bu temel kavramları açıklar. Bunları biliyorsanız, diğer dillerin saçma sözdizimi dışında oldukça basit görünecek.


3
Mükemmel cevap! Bir takip olarak (SO'da bir takip sorusu sormanın bir yolu var mı?), Programlama yazılımında tüm kavramları anladığımı iddia edebileceğim bir dil var mı? Lisp mi (yoksa Scheme gibi bir lehçe) mi?

@Anirudh: Resmi bir takip mekanizması yoktur, ancak yeni bir soru açabilirsiniz. Bir mantık ve bu soruya bir bağlantı içeriyorsa, kapalı bile olmayabilir. ;) İzlemenize cevap vermek için, paradigmalar çok farklı olduğu için gönülden tek bir dilin olmadığına inanıyorum.

@Anirudh: John Y ile anlaştım, sadece bir tane yok. Ancak bu alanda göreceli olarak yeni iseniz, prosedürel paradigmaya hakim olmak için kayda değer bir enerji harcamalısınız (OO'nun sadece bir uzmanlık olduğunu düşünüyorum). Nasıl çalıştıklarını anlamak için diğer paradigmalara (mantık, kısıtlama, veri akışı) bakmaktan zarar gelmez, ancak çoğu gün endüstriyel çalışma için, prosedürel diller oldukça kraldır.
Ira Baxter,

1
Tıpkı doğal dillerde olduğu gibi, "anlamak zor" öznel ve öğrendiğiniz ilk dile bağlı.
NullUserException 10:11

1
@NullUserException: Bu, başkalarını anlama kolaylığını en üst düzeye çıkarmak için ilk dilinizi dikkatlice seçmeniz gerektiğini önerir. Bu, Planın konusu ve özellikle de SICP kitabı.
Ira Baxter

6

Donanım açıklama dilleri programlama dilleridir, ancak kavramsal olarak çok farklıdırlar. Boyut için VHDL veya Verilog'u deneyin. FPGA'ların programlanması ortaktır. (Tamam, bu yüzden işlemciler değiller, ama bunlar genel amaçlı bilgi işlem aygıtlarıdır. Ve bunun bilgisayar bilimi konuları için geçerli bir donanım olduğu düşünülmelidir.) Her şeyin açıkça seri hale getirilmesi gerekir. Tamamen farklı bir model. İstisna olarak kural olarak paralel olarak gerçekleşen şeyleri düşünürsünüz. Verilog'daki döngüler için paralel donanıma genişletin. Dolayısıyla "beklenen" davranış beklediğiniz gibi olmayabilir.


İyi bir noktaya değindin. Verilog / VHDL'ye bakacağım.

Her zaman geleneksel programlama dillerinin VHDL gibi doğal olarak paralel olan programları kodlamak için gerçekten utanç verici olduğunu düşündüm. Bir donanım tasarımcısı olarak başladığınızda, seri bir şekilde meydana gelen her şey hakkında bu inanılmaz sakar görünüyor. (İnsanlara yanlış programlama dillerini ilk dilleri olarak öğretiyoruz: Verilog olmalı!).
Ira Baxter,

4

"Temelde" ile ne demek istediğine bağlı. Herhangi bir esnekliğin tüm dilleri Turing tamamlandı. Bu anlamda: evet, hepsi temelde aynı.

Düşük düzeyde, hepsi benzer işlem dizilerini gerçekleştirir ve tüm Windows, Linux ve (son) OS X öğeleri, aynı komut setlerini kullanarak Intel uyumlu işlemcilerde çalışır. Bu şekilde onlar da temelde aynıdır.

Sortada "temel olarak" tanımladığınız sortaların, ancak gerçekten cevaplamak için bu tanımın çok daha rafine edilmiş olması gerektiğinin farkındayım. Birçok yönden hepsi birbirine benziyor. Birçok yönden belirgindirler. Hepsi "bağlıdır" demek çok kolay. Her ikisini de uçarsanız, soru neye niyetlendiğinize cevap vermeyecektir, bu nedenle bu çizginin çizildiği yerde sorunuzu yanıtlamak için çok önemlidir.


3

Bir dilin anlamı kodladığını söyleyebilirim. Anlamın bir bağlamda bir anlamı varsa, anlamı ifade edebilen tüm dillerin, anlam ve bağlamla sınırlı olarak eşdeğer olduğu söylenebilir.

Bu bağlamı standart bir Von Neumann makinesiyle sınırlandırırsanız, bir cpudaki belleği ve bilgisayarı değiştirmenin hesaplamalı anlamlarının orijin olduğu söylenebilir - ve muhtemelen tüm dillerin ortak olduğu tek anlam. Diğer tüm şeyler bunlar üzerine inşa edilmiş soyutlamadır.


1
John von Neumann. Ve daha "noyman" gibi "newman" gibi telaffuz edilmez.

Düzeltme için teşekkürler - Yine de söylediğin gibi telaffuz ediyorum.
Preet Sangha

Birisi bir düzeltme önerdiğinde, yayınınızı yansıtacak şekilde düzenleyebilirsiniz.
Phil Miller

2

Programlama dilleri aynı zamanda düşünme aracıdır. Başka bir düşünce perspektifiyle, bazı problemler kaybolur veya farklı, daha yönetilebilir bir tür haline dönüşür (örneğin, birçok C ++ tarzı tasarım deseni sadece Lisp'te düşündüğünüzde kaybolur (örneğin, bu Peter Norvik'in sunumuna bakın ) ve Erlang sizi düşünmekten kurtarır bazı düşük seviyeli eşzamanlılık veya dağıtılmış hesaplama yapıları ve yalnızca uygulama mantığına odaklanmanıza izin verir).

Bununla birlikte, bazen "yeni" paradigmaların kısmen "eski" programlama dillerine uygulanabileceğini, örneğin Java programcıları için işlevsel programlama öğreten kitapların neden açıklandığını not edin . Ancak, dil düzeyinde daha güçlü bir paradigmayı doğal olarak desteklemek ve bütünleştirmek, paradigmanın daha doğal uygulanmasını sağlar (ve sonuç olarak, diğer cevapların da belirttiği gibi, yabancı paradigmayı destekleyen bir dilde programları anlamayı imkansız kılar - @Ira usul olmayan dilleri listelemek ve kwatford Paul Graham'a atıfta bulunarak ).


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

En düşük seviyede, her programlama dili "aynı" dır, ancak bu, etkileşime girdiğiniz düzeyde aynı oldukları anlamına gelmez. Onlar sizin için sorunları soyutlar; bu, aynı sorunları soyutladıkları veya her sorunu aynı şekilde soyutladıkları anlamına gelmez.


1

Olgun dillerin genellikle birkaç hedefi vardır ve bir şeyden ötekine fedakarlık yaptıkları takaslar yapar. Genel amaçlı bir dil hiçbir şey için kullanılabilir, ancak hiçbir alanda hiçbir dilde üstünlük sağlanamaz. Birkaç örnek:

C ideal bir sistem programlama dili olmaya çalışır. Bu amaçla düşük seviye kontrolü ve hızı için okunabilirliği ve güvenliği feda eder.

Python ideal bir betik dili olmayı hedeflemektedir. Bu amaçla verimlilik ve taşınabilirlik için hızı ve doğrulanabilirliği feda eder.

Haskell güvenli, matematiksel olarak saf bir dil olmaya çalışır. Bu amaçla, doğrulanabilirlik ve güvenilirlik için öğrenilebilirliği ve konvansiyonu feda eder.

Bu fedakarlıklar ve faydalar , dilde büyük bir fark yaratıyor. Evet, çoğu programlama dilleri bir bilgisayar tarafından yapılabilir bir şey için kullanılabilir, ancak bu aynı dillerin hiçbiri gereken her şey için kullanılabilir. Yukarıdaki dillerin tümü, belirli görevler için seçtiğim diller ancak diğerleri için değil. Bir işletim sistemi programlıyorsam C'yi seçerdim. Bir web sitesi için arka uç yazıyor olsaydım, Python kullanırdım. Ve eğer bir finansal sistem yazıyorsam Haskell kullanırdım.

Sonunda, programcı olarak seçiminiz, iş için doğru aracın ne olduğudur.

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.