Bazen farklı dillerde programlama yaparken (C / C ++, C #), bu düşünce aklıma geliyor:
- Her dil C programlama dilinde yazılmış mı?
- C dili tüm dillerin ana babası mı?
- Her bir konsept ( OOP , vb.) Hepsi C de uygulanmış mı?
Doğru yönde miyim?
Bazen farklı dillerde programlama yaparken (C / C ++, C #), bu düşünce aklıma geliyor:
Doğru yönde miyim?
Yanıtlar:
Hayır.
OCaml, Haskell, Lisp, Scheme gibi lehçeler ve diğer birçok dil hobi dillerinin geliştirilmesinde sıklıkla kullanılmaktadır.
Her dil bir dildir, çünkü her yerde bir dildir ve lexer-parser jeneratörleri (yacc ve bison gibi) gibi derleyici yazma araçları anlaşılır ve neredeyse her yerde olduğu gibi.
Fakat C'nin kendisi ilk yaratıldığında ilk olarak C'de geliştirilemezdi. Aslında, aslında B dili kullanılarak geliştirilmiştir . (Fortran gibi) Daha önce diller genellikle edildi bootstrapped C hiç var çok önce yerli montaj dili ve hatta makine kodunu kullanarak.
Ne yazık ki, OOP gibi dil paradigmaları genellikle dille agnostiktir. Örneğin, işlevsel paradigma, herhangi bir programlama dili bulunmadan çok önce bir matematiğin temeli olarak (Alonzo Church tarafından) geliştirildi. Usul ve yapılandırılmış programlama paradigmaları, John von Neumann gibi teorisyenlerin matematiksel çalışmalarından ortaya çıktı. Nesne yönelimi , bazıları lambda matematiği (fonksiyonel paradigma) ve bazıları Alan Kay tarafından Xerox PARC'da SmallTalk gibi dinamik programlama sistemleri dışında, birkaç farklı ve ilgisiz çaba ile geliştirilmiştir .
C, bu fikirlerin ortaya çıkmasından on yıllar sonra hikayenin yalnızca küçük bir parçası .
Her dil C dilinde yazılmış mı?
Bir dil soyut matematiksel kurallara ve kısıtlamalara ( "Ben yazarsam bir dizi bu , o olur"). Gerçekten de hiçbir şeyle yazılmış değil.
Genellikle resmi bir İngilizce alt kümesinin, matematiksel gösterimin ve belki de bazı özel şartlandırma dillerinin bir karışımında belirtilmiştir. Sözdizimi, genellikle bir EBNF veya ABNF varyantında belirtilir .
Örneğin, işte for
ISO Ruby Language Spesifikasyonundaki ifadenin özelliği:
§11.5.2.3.4
for
İfadeSözdizimi
- for-expression → for için-değişken [burada hiçbir sonlandırıcı yok] in ifade do-clause end
- değişken için → sol taraf
|
çoklu tarafsemantik
Bir ifade ifadesi aşağıdaki şekilde değerlendirilir:
- İfadeyi değerlendirin . İfadenin değerlendirmesi bir ara ifade , bir sonraki ifade veya yeniden ifade etme ile sonlandırılırsa , davranış belirtilmez. Aksi takdirde,
O
ortaya çıkan değer olsun.Let
E
olmak birincil yöntem,-çağırma biçimi birinci ifade [burada bir hat-sonlandırıcı] .each do | blok parametre listesi | blok gövdenin end değeri, birincil ifade olupO
, blok parametre listesi olan için- değişken , blok gövdesi olan bileşik-ifadesi bir do-maddesi .Değerlendirin
E
; olan bir blok durumunda, ancak blok gövdesi olan bileşik-ifadesi bir do-madde bölgesinin için ifade bu değerlendirme sırasında çağrılan, Aşama c dışında §11.3.3 adımları) ve Aşama e) 4) 'de belirtilen Bu görüşmenin değerlendirilmesi için alınmalıdır.Değeri için ifade çağırma elde edilen değerdir.
Scala'nın uygunluk kurallarından farklı bir örnek:
Polimorfik tip [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T , polimorfik tip [a1>: L ′ 1 <: U ′ 1 ,…, a n >: L < n <: U ′ n ] T ′ ise, L ′ 1 <: a varsayarak 1 <: U ′ 1 ,…, L ′ n <: a n <: U′n var T <: T ′ Ve L i <: L ′ i ve U ′ i<: U i için i ∈ {1, ..., n} .
C dili tüm dillerin ana babası mı?
Hayır öyle değil. C oldukça genç. Çok fazla eski dil var. Zaman yolculuğu fiziksel olarak imkansız olduğundan, C'nin bu eski dilleri ne olursa olsun herhangi bir etkisi olması imkansızdır.
C bile icat edilmeden önce var olanların hepsi. Ve diğerlerinin çoğunda, C varlığından sonra bile hiçbir etkisi yoktur. PASCAL dil ailesi (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Aktif Oberon, Bileşen Pascal) tamamen ayrı bir soyağaçtır. Bütün Lisp ailesi (LISP, Franz Lisp, InterLisp, MacLisp, Şema, Tatlar, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, vb.) İle de ilgilidir. İşlevsel diller (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Temiz) ve bütünüyle bağımlı tipte aile (Agda, Coq, GURU, Idris) mümkün olduğunca C kadardır. Aynısı Smalltalk ailesi (Smalltalk, Ben, Newspeak, Biz, Korz), mantık programlama ailesi (PLANNER, Prolog, Mercury), SQL ve diğerleri için de geçerlidir.
Her kavram (OOP vb.) Hepsi C dilinde mi uygulanıyor?
OO kavramlarına sahip ilk diller Simula (1960) ve Smalltalk (1972) idi, ancak nesne yönelimli sistemler 1953 yılına kadar inşa edildi (bunu söylemeden). Yine, C'nin varlığından çok önce, OO muhtemelen C ile bir ilişkiye sahip olamaz.
Birçok önemli dilin çekirdeğinin çoğu C ile yazılmıştır, ancak işler değişmektedir:
Sun Microsystems tarafından geliştirilen ilk Java derleyicisi C dilinde yazılmıştır, ancak sınıf kütüphaneleri her zaman Java dilinde yazılmıştır (çünkü Java VM'nin kendisi kullanılarak çalıştırılmak üzere tasarlanmıştır). JNI (Java Native Interface) kullanan bazı kütüphaneler, JVM DIŞINDA kullanılmaları amaçlandığı için, kısmen başka dillerde de yazılabilir.
Sun / Oracle VM, C ++ dilinde yazılmıştır. BEA / Weblogic / Oracle VM C ile yazılmıştır. Ancak Java, Lisp, SmallTalk (IBM) ile yazılmış JVM vardır.
C'nin sıklıkla seçilmesinin birçok nedeni vardır: performans, taşınabilirlik, deneyim.
Sonuncusu muhtemelen en önemlisi: Python 1991'de, 1994/1995'te PHP, 1988'de Perl, 1995'te Ruby ile başladı. O yıllarda Java henüz piyasaya sürüldü ve C ++ henüz iyi bir şekilde standartlaştırılmadı.
Biraz ilgili:
Hayır, bazı diller C’den önce gelir ve çoğu C’den bağımsız olarak uygulanır, örneğin bkz. Http://en.wikipedia.org/wiki/Lisp_%28programming_language%29
javac
% 100 (IBM'in türetilen Java ile yazılmış% 100 Java, Eclipse derleyicisi, içinde (Scala şöhret) Martin Odersky tarafından yazılan Oracle JDK / OpenJDK dan Jikes derleyici), derleyici dan IBM'in J9, ayrıca Jikes ve% 100 Java'dan türemiştir. AFAIK, Java'da yazılmayan bir şekilde yaygın kullanımdaki tek Java derleyicisi GCJ'dir
Bunu yapabilseydim bunu bir yorum yapardım, ama yapamam:
C'nin bu kadar yaygın görünmesinin nedenlerinden biri, geliştirilen ilk dillerden biri olması ve çok sayıda modern dilin yapısından (Java, Go, PHP, Perl, vb.) Dayanmasıdır - öyle görünüyor. ondan daha fazla yer.
Unutulan bir başka neden de, 1973'te Unix'in C'ye yeniden yazılmış olması ve Unix'in sistem çağrılarının birçoğunun , ikisi birbirine bağlı kılan C programları / işlevleri olarak da mevcut olmasıdır. Unix, bir bütün olarak modern programlamanın gelişiminin güçlü bir parçası olduğu için, C onunla meşhur oldu.
Bunları söyledikten sonra, sorunuzun cevabı "Hayır" dır. C, ALGOL adında bir dilden yola çıkmıştır ve hem ALGOL (FORTRAN, Lisp, COBOL) hem de C (hiçbiri akla gelmez) ile birçok rakip vardı. Program tasarımındaki tartışmasız en büyük paradigma kayması olan nesne yönelimli programlama, C ++ ile popüler değildi - C ++ çok popüler bir OOP dili olmasına rağmen (kime sorduğunuza bağlı olarak Lisp veya Simula 67'de ilk olarak ortaya çıktı). OOP ortaya çıktığında, C o kadar popülerdi ki ilk olması gerekmiyordu - o kadar popülerdi ki, tabiri caizse C ++ "genişlemesi" de birincil OOP dillerinden biri oldu. Temelde güçlü bellek kontrol özellikleri nedeniyle modern kullanımda kalır (yapılarınızın oluşturduğu belleği doğrudan tahsis edebilir ve kaldırabilirsiniz), Sıkı bellek bütçeleri (video oyunları düşünün) ve yüksek derecede optimize edilmiş derleyici (derleyiciye bağlı olarak) program oluşturma olanağı sağladı. Kuşkusuz, bu özellikler bile Java JIT derlemesi ve dil içi bellek yöneticileri daha gelişmiş hale geldikçe kaybediyor.
Belli ki değil. Daha önce C olmasaydı ilk C derleyicisi C'ye nasıl yazılabilir? Bu tavuk ve yumurta problemi değil.
Bootstrapping denilen bir dilin ilk derleyicisini yazmanın birçok yolu vardır.
Üstelik çoğu derleyici , çoğunlukla dilin ve derleyicinin kendisini tanıtmak için kendi kendini barındırabilmeyi veya kendisini kendi dilinde derlemeyi dener.
İşte onlar dillerde yanında C ile yazılmış olmayan bazı programlama dilleri, listesidir edilir uygulanan:
Bir derleyiciyi uygulamak için en iyi diller muhtemelen C'den oldukça uzakta olacak. İşlevsel diller size özyinelemeler ve monadik ayrıştırıcı birleştiriciler (tipik bir sınıf dersi olması koşuluyla) özellikle onları derleyici çalışmaları için uygun kılan şeyler verir.
İkincisi, sorunuzu C'nin "tüm programlama dillerinin ana babası" olup olmadığı olarak ele almak - aslında değil. C göründüğü zaman iyi tasarlanmış bir dildi ve kuşkusuz dil tasarımcılarını daha sonra çok farklı şeyler yapmaya devam etti. Ancak günün sonunda Haskell, C'den aslında mümkün olan her şekilde ayrılıyor. C 45 yaşında ve bu arada daha iyisini yapmayı öğrenmemiz şaşırtıcı değil.
Son olarak, üçüncü sorunuzu cevaplamak için, basitçe C'nin "tüm kavramları" uyguladığı bir durum değildir. Özellikle, C'deki fonksiyonel programlamanın (metamorfikler veya tanrı korusun, senkromorfizmler gibi) bazı gelişmiş kavramlarını uygulamaya çalışmak canavarca zor olacaktır. Özellikle nesne yönelimli programlamaya aşina değilim, ancak bazı nesne yönelimli dillerin toplam türlerinin olduğu gerçeğini biliyorum.
Programlama dilleri genellikle bazı İngilizce belgelerde yazılan spesifikasyonlar (yazılım değil!) (Bazı resmi düzenlemelerle, örneğin sözdiziminin çoğu için EBNF ; bazen onların semantikleri de kısmen resmileştirilmiştir).
Örneğin, C11 n1570 (hangi okumanız gerekir) tarafından tanımlanır . Bazı Şema lehçeleri R5RS tarafından tanımlanmıştır (ayrıca okumalısınız, çok iyi yazılmıştır).
Programlama dilleri bazı yazılımlar tarafından uygulanabilir . Bazen bu yazılım programlama dilinde yazılmış bir derleyicidir. Bootstrapping derleyicileri hakkında bilgi edinin .
Derlenmiş programlama dilinde bir derleyici yazılabilir. Bu dil XX yepyeni ise, başka bir uygulama dilinde (belki de C) asgari bir tercüman veya bir alt kümenin derleyicisini başka bir uygulama dilinde (belki de C) yazmayı içeren geçici bir adım atmanız gerekir ve daha sonra bu geçici derleyiciyi veya tercüman ("iyi" olması gerekmeyen, sadece diğer derleyiciyi derlemeye yetecek kadar). XX derleyicinizi XX ile yazılmış bir kez derledikten sonra geçici derleyicinizi atabilirsiniz.
Genellikle (ancak her zaman değil) çalışma zamanı sistemi kısmen C (özellikle çöp toplayıcı ) ile yazılmıştır .
Kemiklerin bir Scheme derleyici ve çalışma zamanının tamamen kendi içinde yazılmış olduğuna dikkat edin (ve tamamen önyüklemeli uygulamaların birçok başka örneğini de bulabilirsiniz).
BTW, C'nin derleyicilerin hedef dili olarak kullanılması uygundur .
Günümüzde, birçok programlama dili uygulaması, özgür yazılım veya açık kaynaktır . Kaynak kodlarını incelemek (ve belki katkıda bulunmak için) çekinmeyin!