ทุกภาษาเขียนด้วยภาษา C หรือไม่


180

บางครั้งในขณะที่การเขียนโปรแกรมในภาษาต่างๆ (C / C ++, C #) ความคิดนี้อยู่ในใจของฉัน:

  • ภาษาแต่ละภาษาเขียนด้วยภาษา C หรือไม่?
  • ภาษา C เป็นแม่ / พ่อของทุกภาษาหรือไม่
  • แต่ละแนวคิด ( OOPฯลฯ ) ถูกนำไปใช้ใน C หรือไม่

ฉันไปในทิศทางที่ถูกต้องหรือไม่


58
@XLAnt: คอมไพเลอร์ C จำนวนมาก (อาจจะมากที่สุด) เขียนด้วยภาษาซี
Jörg W Mittag

32
@Neil: C ++ ไม่ได้คอมไพล์อะไรเลย C ++ เป็นภาษา ภาษาไม่คอมไพล์คอมไพเลอร์ทำ
Jörg W Mittag

12
@ XLAnt: ฉันไม่คิดอย่างนั้น ตัวอย่างเช่นคอมไพเลอร์ Oberon ตัวแรกเขียนขึ้นใน Oberon แล้วแปลด้วยมือ (ซึ่งเป็นรูปแบบการคอมไพล์ฉันเดา) กับ Fortran คอมไพเลอร์นี้ถูกคอมไพล์แล้วด้วยคอมไพเลอร์ Fortran ผลลัพธ์ของคอมไพเลอร์ Oberon จะใช้ในการรวบรวมคอมไพเลอร์ Oberon และจากจุดนั้นเป็นต้นไปคอมไพเลอร์รุ่นก่อนหน้านี้จะใช้ในการรวบรวมคอมไพเลอร์ถัดไป
Jörg W Mittag

18
@ Neil มันไม่ได้อวดความรู้เรื่องนั้นจริงๆ มันแม่นยำ: ภาษาเป็นข้อมูลจำเพาะ มันอาจถูกนำมาใช้เป็นคอมไพเลอร์เป็นล่ามไฮบริดและอื่น ๆ คุณสามารถเขียนคอมไพเลอร์สำหรับภาษา แต่คอมไพเลอร์ไม่ใช่ภาษา ฉันเดาว่าปัญหาจะเกิดความสับสนเพราะมีภาษาที่ไม่มีสเป็คเขียนไว้ยกเว้นการใช้อ้างอิง แต่แม้ในกรณีเหล่านั้นฉันก็เถียงภาษา (เช่นอุดมคติที่ผู้เขียนมีในใจของเขา / เธอ) จะแตกต่างจากการใช้งาน / คอมไพเลอร์ / ล่าม / ล่าม / ฯลฯ
Andres F.

21
Downvoters: นี่เป็นคำถามที่สมเหตุสมผลและมีคำตอบที่ชัดเจน นั่นคือคำตอบคือ "ไม่" ไม่มีเหตุผลที่จะลงคะแนน พิจารณาการตอบและอธิบายแทน
Andres F.

คำตอบ:


207

เลขที่

OCaml, Haskell, Lisp dialects เช่น Scheme และภาษาอื่น ๆ อีกหลายภาษามักใช้ในการพัฒนาภาษางานอดิเรก

หลายภาษาถูกนำมาใช้ใน C เพราะมันเป็นภาษาที่แพร่หลายและเครื่องมือการเขียนคอมไพเลอร์เช่นเครื่องกำเนิดไฟฟ้า lexer-parser (เช่น yacc และ bison) มีความเข้าใจดีและเกือบจะแพร่หลาย

แต่แรกเริ่มนั้นตัว C เองก็ไม่สามารถพัฒนาเป็น C ได้ อันที่จริงแล้วมันถูกพัฒนาโดยใช้ภาษาB ภาษาก่อนหน้านี้ (เช่น Fortran) มักจะbootstrappedโดยใช้ภาษาแอสเซมบลีดั้งเดิมหรือแม้แต่รหัสเครื่องนานก่อนที่จะมี C

Unrelatedly,กระบวนทัศน์ภาษาเช่น OOP โดยทั่วไปจะมีภาษาที่ไม่เชื่อเรื่องพระเจ้า ตัวอย่างกระบวนทัศน์การทำงานได้รับการพัฒนา (โดย Alonzo Church) เป็นรากฐานของคณิตศาสตร์มานานก่อนที่ภาษาการเขียนโปรแกรมใด ๆ ที่เคยมีอยู่ กระบวนทัศน์การเขียนโปรแกรมขั้นตอนและมีโครงสร้างมาจากงานคณิตศาสตร์ของนักทฤษฎีอย่าง John von Neumann การวางแนววัตถุได้รับการพัฒนาโดยความพยายามที่แตกต่างและไม่เกี่ยวข้องหลายอย่างออกมาจากแคลคูลัสแลมบ์ดา (กระบวนทัศน์การทำงาน) และบางส่วนของระบบการเขียนโปรแกรมแบบไดนามิกเช่น SmallTalk ที่ Xerox PARC โดย Alan Kay

C เป็นเพียงส่วนเล็ก ๆ ของเรื่องราวทศวรรษที่ผ่านมาหลังจากความคิดเหล่านี้เข้ามา


40
ในขณะที่มันเป็นความจริงที่เห็นได้ชัดว่าคอมไพเลอร์ C ตัวแรกไม่สามารถเขียนเป็น C ได้ แต่ตอนนี้เป็นไปได้อย่างแน่นอน
reirab

17
@ เรียบ Posible และ true GCC ถูกเขียนใน C และเรียบเรียง usally ใช้ GCC
Darkhogg

9
แน่นอนว่าตอนนี้ GCC กำลังถูกเขียนใหม่ใน C ++ แต่นั่นไม่สำคัญเท่ากับความจริงที่ว่าคอมไพเลอร์ C ตัวแรกไม่สามารถเขียนได้ใน C.
greyfade

10
@greyfade gccไม่ได้เป็น C มาระยะหนึ่งแล้ว ไม่ใช่ "ตอนนี้กำลังเขียนใหม่" เป็น "ถูกเขียนใน C ++ เป็นเวลานานกว่าสองปี" (มันเก่ากว่านั้นแม้ว่าจะเป็นเมื่อมีการผสานเกิดขึ้นซึ่งย้ายไปยัง C ++)

13
@greyfade ไม่ใช่ "C แต่ด้วยคุณสมบัติ C ++" เรียงลำดับของคำจำกัดความของ C ++?
KutuluMike

91

แต่ละภาษามีการเขียนด้วยภาษา C หรือไม่?

ภาษาเป็นชุดของกฎทางคณิตศาสตร์ที่เป็นนามธรรมและข้อ จำกัด ( "ถ้าผมเขียนนี้ , ที่เกิดขึ้น") มันไม่ได้เขียนอะไรเลยจริงๆ

มันมีการระบุโดยปกติจะเป็นส่วนผสมของชุดย่อยของภาษาอังกฤษอย่างเป็นทางการสัญกรณ์ทางคณิตศาสตร์และอาจมีบางภาษาสเปคพิเศษ ไวยากรณ์มักจะถูกระบุไว้ในตัวแปรของEBNFหรือABNF

ตัวอย่างเช่นนี่คือข้อมูลจำเพาะของforนิพจน์จากข้อกำหนดภาษา ISO Ruby:

§11.5.2.3.4การforแสดงออก

วากยสัมพันธ์

  • for-expression for สำหรับตัวแปร [ไม่มีตัวต่อบรรทัดที่นี่] in expression do-clause end
  • สำหรับตัวแปร ด้านซ้ายมือ | หลายด้านซ้ายมือ

อรรถศาสตร์

For -expressionได้รับการประเมินดังนี้:

  1. ประเมินการแสดงออก หากการประเมินผลของนิพจน์ถูกยกเลิกโดยการแสดงออก , การแสดงออกครั้งต่อไปหรือการทำซ้ำการแสดงออกพฤติกรรมที่ไม่ได้ระบุ มิฉะนั้นให้Oเป็นค่าผลลัพธ์
  2. ให้Eเป็นหลัก-วิธี-ภาวนาของรูปแบบหลักของการแสดงออก [ไม่มีสายเทอร์มินี่] .each do | บล็อกพารามิเตอร์รายการ | บล็อกร่างกาย endที่ค่าของหลักแสดงออกเป็นOที่บล็อกพารามิเตอร์รายการเป็นดังใจ ตัวแปรที่บล็อกของร่างกายเป็นสารประกอบคำสั่งของการทำข้อ

    ประเมินE; อย่างไรก็ตามหากบล็อกที่มีเนื้อความเป็นคำสั่งผสมของส่วนคำสั่งของนิพจน์จะถูกเรียกในระหว่างการประเมินนี้ขั้นตอนใน§ 11.3.3 ยกเว้นขั้นตอน c) และขั้นตอน e) 4) นำมาประเมินผลการโทรนี้

  3. ค่าของนิพจน์คือค่าผลลัพธ์ของการเรียกใช้

นี่คือตัวอย่างที่แตกต่างจากกฎความสอดคล้องประเภทของ Scala:

polymorphic type [a 1 >: L 1 <: U 1 , …, a n >: L n <: U n ] Tสอดคล้องกับประเภท polymorphic [a1>: L ′ 1 <: U′ 1 , …, a n >: L ′ n <: คุณ′ n ] T ′ถ้าสมมติว่าL′ 1 <: a 1 <: U ′ 1 , …, L′ n <: a n <:หนึ่งhasnมีT <: T ′และL i <: L′ iและU ′ i<: U ฉันสำหรับฉัน∈ {1, ... , n}


ภาษาแม่ / พ่อของทุกภาษาคืออะไร?

ไม่มันไม่ใช่. C ยังเด็กอยู่ มีภาษาเก่ามากมาย เนื่องจากการเดินทางข้ามเวลาเป็นไปไม่ได้ทางร่างกายจึงเป็นไปไม่ได้เลยที่ C จะมีอิทธิพลใด ๆ ต่อภาษาเก่าเหล่านั้น

  • Plankalkül (2486)
  • การเข้ารหัสความเร็ว (1953)
  • Fortran (1954)
  • IPL (1956)
  • เสียงกระเพื่อม (1958)
  • อัลกอล (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • ขั้นพื้นฐาน (1964)
  • PL / I (1964)
  • สวมบทบาท (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • ออกมา (1968)
  • โลโก้ (2511)
  • อ้างอิง (1968)
  • B (1969)
  • BLISS (1970)
  • ปาสกาล (1971)
  • KRL (1971)
  • สมอลล์ทอล์ค (1972)

สิ่งเหล่านี้มีอยู่ก่อนที่ C จะถูกประดิษฐ์ขึ้นมา และอีกหลายคนไม่มีอิทธิพลของ C ในตัวพวกเขาแม้ว่าจะมีอยู่ก็ตาม ตระกูลภาษา PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) เป็นเชื้อสายที่แยกจากกันโดยสิ้นเชิง ครอบครัว Lisp ทั้งหมด (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavours, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, แร็กเกตและอื่น ๆ ) ก็ไม่มีความเกี่ยวข้องเช่นกัน ภาษาที่ใช้งานได้ (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) และตระกูลที่พิมพ์ได้ทั้งหมด (Agda, Coq, GURU, Idris) ห่างจาก C มากที่สุด เช่นเดียวกับตระกูล Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), ตระกูลการเขียนโปรแกรมเชิงตรรกะ (PLANNER, Prolog, Mercury), SQL และอื่น ๆ อีกมากมาย

แต่ละแนวคิด (OOP ฯลฯ ) ถูกนำมาใช้ในภาษา C หรือไม่

ภาษาแรกที่มีแนวคิด OO คือ Simula (1960) และ Smalltalk (1972) แต่ระบบเชิงวัตถุได้ถูกสร้างขึ้นมาตั้งแต่ปี 1953 (โดยไม่เรียกพวกเขาว่า) อีกครั้งก่อนที่ C จะมีอยู่ดังนั้น OO จึงไม่สามารถมีความสัมพันธ์กับ C ได้



2
@leftaroundabout: นั่นเป็นบล็อกที่ยอดเยี่ยมซึ่งเป็นหนึ่งในรายการโปรดของฉันมานานหลายปี
Jörg W Mittag

1
@ FrancisDavey: ขอบคุณ ฉันเริ่มรวบรวมรายการจากหน่วยความจำจากนั้นฉันเพิ่มวันที่ฉันจำไม่ได้ด้วยการค้นหาใน Wikipedia หลังจากนั้นฉันพบเส้นเวลาของภาษาใน Wikipedia และเลือกภาษาอีกสองสามภาษาจากที่นั่น เนื่องจากบทความเกี่ยวกับ BCPL อ้างอิง 1966 แต่ไทม์ไลน์อ้างอิง 1967 ฉันไม่ได้สังเกตเห็นว่าฉันได้เพิ่ม BCPL แล้ว ฉันจะลบสิ่งที่ซ้ำกัน
Jörg W Mittag

1
ในรายการของคุณจะไม่สะกด "htroF" ย้อนหลังใช่ไหม
chux

2
“ การเดินทางข้ามเวลาเป็นไปไม่ได้ทางร่างกาย” - นั่นเป็นข้อกล่าวอ้างที่ถกเถียงกันมาก ไม่เบี่ยงเบนจากคุณค่าของคำตอบนี้แน่นอน
Konrad Rudolph

50

แกนกลางของภาษาสำคัญ ๆ ส่วนใหญ่เขียนด้วยภาษา C แต่สิ่งต่าง ๆ กำลังเปลี่ยนแปลง:

  • การใช้งานการอ้างอิงของ Python ( CPython ) ถูกเขียนใน C (แต่มีการใช้งานอื่น ๆ ที่เขียนในภาษาอื่นเช่น Jython / Java, PyPy / Python, IronPython / C # ... )
  • PHP Zend Engine เขียนด้วยภาษา C
  • คอมไพเลอร์ Java ตัวแรกที่พัฒนาโดย Sun Microsystems ถูกเขียนใน C แต่ตอนนี้คลาสไลบรารีนั้นถูกเขียนใน Java เสมอ (เนื่องจากพวกมันตั้งใจจะรันโดยใช้ Java VM เอง) บางไลบรารีที่ใช้ JNI (Java Native Interface) อาจถูกเขียนบางส่วนในภาษาอื่น ๆ เนื่องจากพวกมันตั้งใจจะใช้นอก JVM

    Sun / Oracle VM เขียนด้วย C ++ BEA / Weblogic / Oracle VM เขียนเป็น C แต่มี JVM เขียนใน Java, Lisp, SmallTalk (IBM) ...

  • Perl ถูกนำมาใช้เป็นล่ามหลักที่เขียนใน C พร้อมกับคอลเลกชันขนาดใหญ่ของโมดูลที่เขียนใน Perl และ C (แต่Pugs , คอมไพเลอร์และล่ามสำหรับภาษาการเขียนโปรแกรม Perl 6 เป็นภาษา Haskell)
  • Ruby interpreter อย่างเป็นทางการซึ่งมักถูกเรียกว่า Matz's Ruby Interpreter หรือ MRI นั้นเขียนขึ้นใน Cและใช้เครื่องเสมือน Ruby-specific ของตัวเอง (แต่มี JRuby ซึ่งเป็นการนำ Java มาใช้กับ Java virtual machine; Rubinius, C ++ เครื่องเสมือน bytecode ที่ใช้ LLVM เพื่อคอมไพล์รหัสเครื่องตอนรันไทม์ ... )
  • ประมาณ50% ของ Rเขียนไว้ใน C
  • และแน่นอนC คือ (เคย) เขียนใน C ! (แต่คอมไพเลอร์ C แรกที่กำหนดเป้าหมายไปยัง PDP-11 เป็นส่วนผสมของ B และแอสเซมเบลอร์)

มีหลายเหตุผลที่เลือก C บ่อยครั้ง: ประสิทธิภาพการทำงานพกพาประสบการณ์

สุดท้ายอาจเป็นสิ่งที่สำคัญที่สุด: Python เริ่มต้นในปี 1991, PHP ในปี 1994/1995, Perl ในปี 1988, Ruby ในปี 1995 ในปีที่ผ่านมา Java เพิ่งเปิดตัวและ C ++ ยังไม่ได้มาตรฐานที่ดี


ค่อนข้างเกี่ยวข้อง:


5
จากมุมมองของการใช้งานคอมไพเลอร์ / ล่าม C ได้รับ / เป็นจุดอ้างอิง นอกจากนี้มันยังมีอิทธิพลโดยตรงหรือโดยอ้อมในหลาย ๆ ภาษา (อย่างน้อย syntactically)
manlio

2
ในไม่ช้าคุณจะสามารถพูดได้ว่า C # เขียนด้วย C #! (ชนิด)
DLeh

1
Mono ส่วนใหญ่ (ซึ่งรวมถึงคอมไพเลอร์ C # และไลบรารี่ฐาน. NET ส่วนใหญ่ / ส่วนใหญ่) ถูกเขียนใน C #
Charlie Kilian

3
คำตอบสำหรับคำถาม "C คือแม่ / พ่อของทุกภาษาหรือไม่" คือ "ไม่" ดังนั้นฉันไม่คิดว่าจะมีประโยชน์ในการแสดงตัวอย่างมากมายที่เขียนใน C. ตัวอย่าง Counter จะช่วยได้ แต่ตัวเลือกของคุณยังคงสืบทอดมาจาก C ตัวอย่างเช่นแม้ว่า Java, Python ฯลฯ ตอนนี้โฮสติ้งด้วยตนเองพวกเขายังคง bootstrapped จาก C ดังนั้นพวกเขาจึงเป็นเหมือน "หลาน" ของ C. ภาษาเช่น LISP, FORTRAN, ML และ (แน่นอน) รหัสเครื่องเป็นตัวอย่างเคาน์เตอร์จริงเนื่องจาก C ไม่เคยเกี่ยวข้อง การสร้างของพวกเขา
Warbo

2
แน่นอนว่าความปรารถนาสำหรับหลาย ๆ ภาษานั้นจะต้องดำเนินการให้ได้มากที่สุดเท่าที่จะเป็นไปได้ อย่างไรก็ตามดูเหมือนว่าภาษาส่วนใหญ่ขึ้นอยู่กับ C เพราะภาษาส่วนใหญ่จำเป็นต้องสามารถเรียก C ให้เป็นประโยชน์ได้ API ระบบปฏิบัติการที่ทันสมัยส่วนใหญ่และไลบรารีที่มีประโยชน์มักจะมีการเชื่อม C คุณต้องระวังเกี่ยวกับสิ่งที่คุณหมายถึงโดย "เขียนใน" โดยทั่วไปแล้วการใช้ภาษานั้นมีหลายส่วน: อย่างน้อยก็คอมไพเลอร์และระบบรันไทม์ ระบบรันไทม์มักเขียนใน C เพื่อเชื่อมต่อกับ OS ได้ดียิ่งขึ้น
นามแฝง

10

ไม่บางภาษามีการเตรียมการล่วงหน้าและมีการใช้งานหลายภาษาแยกต่างหากจาก C เช่นดูที่http://en.wikipedia.org/wiki/Lisp_%28programming_language%29


2
มีการนำไปใช้งานหลายอย่างของจาวาส่วนใหญ่เขียนด้วยภาษาจาวา การนำ GNU ของ Objective-C มาเขียนใน C (หรือ C ++ พวกเขาเปลี่ยนไปเมื่อเร็ว ๆ นี้ผมเชื่อว่า) การใช้งาน LLVM นั้นเขียนใน C ++ และเคยเป็นล่ามที่เขียนใน C # มีการใช้งานของ Python มากมายหนึ่งเขียนใน RPython หนึ่งใน Java หนึ่งใน C # และหนึ่งใน C. PHP มีหกการใช้งานหลักสองใน Java สองใน C # หนึ่งใน C และหนึ่งใน C ++
Jörg W Mittag

1
ไม่นักออกแบบภาษาได้รับอิทธิพลจากภาษาอื่น ๆ อย่างแน่นอน แต่พวกเขาสามารถเลือกที่จะเพิกเฉยต่ออิทธิพลเหล่านั้นได้หากต้องการ
Jörg W Mittag

2
@FaizanRabbani ในภาษาเป็นแนวคิดและตัวเลือกของกระบวนทัศน์รูปแบบและการประนีประนอม - บ่อยครั้งที่ "ภาษาถูกสร้าง / ดัดแปลงจากภาษาอื่น ๆ " แต่ที่ไม่เกี่ยวข้องกับภาษาการใช้งานของคอมไพเลอร์; ภาษา X สามารถมาจากภาษา Y แต่นำไปใช้ใน C หรืออย่างอื่น - และที่มักจะเป็นกรณี และในกรณีนี้ 'บรรพบุรุษทางความคิด' มีความสำคัญ แต่ภาษาคอมไพเลอร์เป็นเพียงความแตกต่างทางเทคนิคที่แทบจะไม่เกี่ยวข้องซึ่งสามารถเปลี่ยนแปลงได้ตลอดเวลา
Peteris

3
การเชื่อมโยงครั้งสุดท้ายถ้ามีค่าน่าสงสัย - ข้อผิดพลาดมากเกินไปที่จะทำอย่างจริงจัง
Coder ที่ไม่รู้จัก

4
@SebastianGodelet: HotSpot ไม่ใช่การนำภาษาจาวามาใช้ มันเป็นการใช้งานภาษา JVM bytecode ภาษาเหล่านี้เป็นสองภาษาที่แตกต่างกันอย่างสิ้นเชิง การใช้งานกันอย่างแพร่หลายของภาษาจาวาjavacมาจาก Oracle JDK / OpenJDK ที่เขียนโดย Martin Odersky (จาก Scala fame) ใน 100% Java, Eclipse Compiler, เขียนด้วยภาษา Java 100% (มาจากJikesของไอบีเอ็ม IBM ), คอมไพเลอร์จาก ไอบีเอ็ม J9 มาจาก Jikes และ Java 100% AFAIK คอมไพเลอร์ Java ตัวเดียวที่ใช้กันอย่างแพร่หลายและไม่ได้เขียนใน Java คือ GCJ
Jörg W Mittag

4

ฉันจะทำให้ความคิดเห็นนี้ถ้าฉันทำได้ แต่ฉันไม่สามารถไปที่นี่:

หนึ่งในเหตุผลที่ C ดูเหมือนแพร่หลายดังนั้นเพราะมันเป็นหนึ่งในภาษาที่เก่าแก่ที่สุดที่พัฒนาขึ้นและภาษาสมัยใหม่จำนวนมหาศาลนั้นใช้โครงสร้างของมัน (Java, Go, PHP, Perl, ฯลฯ ) - ทำให้ดูเหมือนว่ามันเป็น สถานที่มากกว่าที่เป็นอยู่

อีกเหตุผลที่ถูกลืมคือในปี 1973 Unix ถูกเขียนขึ้นใหม่ใน C และการเรียกใช้ระบบของ Unix จำนวนมากก็มีให้ในโปรแกรม / ฟังก์ชั่น C ทำให้ทั้งสองเชื่อมโยงกันอย่างมาก เนื่องจากยูนิกซ์เป็นส่วนที่ทรงพลังของการพัฒนาโปรแกรมสมัยใหม่โดยรวม C จึงถูกลากเข้าหาชื่อเสียง

คำตอบสำหรับคำถามของคุณคือ "ไม่" C ใช้ภาษาที่เรียกว่า ALGOL และมีคู่แข่งมากมายทั้ง ALGOL (FORTRAN, Lisp, COBOL) และ C (ไม่มีใครนึกถึง) การเขียนโปรแกรมเชิงวัตถุเนื้อหากระบวนทัศน์ที่ใหญ่ที่สุดในการออกแบบการเขียนโปรแกรมไม่ได้มากับ C - แม้ว่า C ++ เป็นภาษา OOP ที่นิยมมาก (มันปรากฏตัวครั้งแรกใน Lisp หรือ Simula 67 ขึ้นอยู่กับคนที่คุณถาม) เมื่อถึงเวลาที่ OOP เกิดขึ้น C ก็เป็นภาษายอดนิยมที่ไม่จำเป็นต้องเป็นอันดับแรก - มันเป็นที่นิยมอย่างมากที่การขยายตัวของ C ++ ดังนั้นการพูดก็กลายเป็นหนึ่งในภาษา OOP หลักด้วยเช่นกัน มันยังคงอยู่ในการใช้งานที่ทันสมัยส่วนใหญ่เป็นเพราะคุณสมบัติการควบคุมหน่วยความจำที่มีประสิทธิภาพ (คุณสามารถจัดสรรและยกเลิกการจัดสรรหน่วยความจำที่โครงสร้างของคุณสร้างโดยตรง) อนุญาตให้สร้างโปรแกรมบนงบประมาณหน่วยความจำที่ จำกัด (คิดว่าวิดีโอเกม) และคอมไพเลอร์ที่ได้รับการปรับปรุงให้ดีที่สุด (ขึ้นอยู่กับคอมไพเลอร์) แม้คุณสมบัติเหล่านี้จะสูญเสียไปเนื่องจากการรวบรวม Java JIT และผู้จัดการหน่วยความจำในภาษากลายเป็นขั้นสูงขึ้น


1
สิ่งนี้ดูเหมือนจะไม่นำเสนออะไรมากมายเกินกว่าที่ทำคะแนนและอธิบายไว้ในคำตอบก่อนหน้านี้โดยเฉพาะอย่างยิ่งในอันดับต้นๆ ยกเว้นคำแถลงที่น่าสงสัยว่า "C อิงจากภาษาที่เรียกว่า ALGOL"
gnat

4
พื้นฐานของซีใน ALGOL แทบจะไม่สงสัย ... ดูcm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder

เรื่องราวที่เกิดขึ้นจริงมีความซับซ้อนมากขึ้นและน่าสนใจกว่านั้น; ฉันจะบอกว่าวิธีการวางสิ่งที่นี่มีประโยชน์น้อยมากสำหรับผู้อ่าน
ริ้น

3

เห็นได้ชัดว่าไม่ คอมไพเลอร์ C ตัวแรกจะเขียนเป็น C ได้อย่างไรถ้า C ไม่เคยมีมาก่อน นี่ไม่ใช่ปัญหาไก่และไข่

มีหลายวิธีในการเขียนคอมไพเลอร์แรกของภาษาที่เรียกว่าbootstrapping

ยิ่งไปกว่านั้นคอมไพเลอร์ส่วนใหญ่พยายามที่จะใช้โฮสติ้งด้วยตนเองหรือแปลเป็นภาษาของตัวเองเพื่อส่งเสริมภาษาและคอมไพเลอร์เอง


12
ครั้งแรกที่คอมไพเลอร์ Oberon ถูกเขียนใน Oberon เป็นเรื่องที่ดีอย่างสมบูรณ์หากคุณเป็นอาจารย์และมีนักเรียนจำนวนมากที่จะแปลคอมไพเลอร์ให้คุณ (ศาสตราจารย์ Prof. Wirth)
Jörg W Mittag

@ Jorg ที่กล่าวถึงในบทความ bootstrapping ที่ลิงก์ด้านบนดังนั้นฉันจึงไม่ต้องกังวลกับการเขียนเพราะคำถามนี้เกี่ยวกับ C และไม่มีคอมไพเลอร์ C ที่ถูกเขียนขึ้นด้วยวิธีนี้
phuclv

14
@ JörgWMittag - คอมไพเลอร์ Oberon อัตโนมัติเครื่องแรกถูกเขียนใน Oberon คอมไพเลอร์ Oberon ตัวแรกที่เกิดขึ้นจริงเป็นนักเรียนกลุ่มหนึ่ง
nnnnnn

4
@nnnnnn: ฉันจะพิจารณาล่าม "พวงนักเรียน" นี้ไม่ใช่ผู้แปล
Paŭlo Ebermann

4
@ เปาโล Ebermann ต้องการเพิ่มอีกหนึ่งองค์ประกอบของมนุษย์: "คอมพิวเตอร์" เดิมเป็นชื่องาน
chux

2

นี่คือรายการภาษาการเขียนโปรแกรมบางภาษาที่ไม่ได้เขียนด้วยภาษา C พร้อมกับภาษาที่ใช้ใน:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • ปรอท - ปรอท
  • สนิม - สนิม (เริ่มต้น OCaml)
  • ไป - ไป
  • คริสตัล - คริสตัล
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

ภาษาที่ดีที่สุดสำหรับการใช้งานคอมไพเลอร์น่าจะอยู่ไกลจาก C. ภาษาที่ใช้งานได้จะให้สิ่งต่าง ๆ เช่นชุดการเรียกซ้ำและตัวแยกวิเคราะห์ monadic combinators

ประการที่สองเพื่อตอบคำถามของคุณว่า C เป็น "แม่ / พ่อของทุกภาษาโปรแกรม" หรือไม่ - C เป็นภาษาที่ได้รับการออกแบบมาอย่างดีในเวลาที่ปรากฏและไม่ต้องสงสัยเลยว่ามีอิทธิพลต่อนักออกแบบภาษาซึ่งต่อมาได้ทำสิ่งที่แตกต่างกันมาก แต่ในตอนท้ายของวันแฮสเค็ลล์ออกจาก C ในทุก ๆ ทางที่เป็นไปได้ C มีอายุ 45 ปีและไม่น่าแปลกใจที่เราได้เรียนรู้ที่จะทำดีขึ้นในระหว่างนี้

ในที่สุดเพื่อตอบคำถามที่สามของคุณไม่ใช่กรณีที่ C ใช้ "แนวคิดทั้งหมด" โดยเฉพาะอย่างยิ่งการพยายามที่จะใช้แนวคิดขั้นสูงบางอย่างจากการเขียนโปรแกรมเชิงปฏิบัติ (เช่นการเปลี่ยนแปลงรูปแบบหรือการห้ามพระเจ้า ฉันไม่คุ้นเคยกับการเขียนโปรแกรมเชิงวัตถุเป็นพิเศษ แต่ฉันรู้ว่าภาษาเชิงวัตถุบางประเภทมีประเภทผลรวม


C ไม่เคย "เป็นภาษาที่ออกแบบมาอย่างดีอย่างไม่น่าเชื่อ" หูดที่เราเห็นในทุกวันนี้เป็นที่รู้กันว่าเป็นหูดตั้งแต่แรก แต่มันก็ดีพอที่จะเป็นภาษาพื้นเมืองของระบบปฏิบัติการ Unix ที่เป็นมิตรกับผู้พัฒนาและหลังจาก Bell Labs ผลัก Unix ออกไปสู่มหาวิทยาลัย C / Unix กลายเป็นภาษา / ระบบปฏิบัติการที่ชื่นชอบสำหรับผู้เชี่ยวชาญด้านคอมพิวเตอร์รุ่นใหม่
โซโลมอนช้า

PS. มีไม่มากของความคิดเดิมในเซลเซียสหากคุณกำลังมองหาแม่ / พ่อของบล็อกทั้งหมดโครงสร้างการเขียนโปรแกรมภาษาขั้นตอนที่คุณอาจต้องการที่จะมีลักษณะที่ALGOL
โซโลมอนช้า

Lisp Macros นั้นดีกว่า C มากและ ALGOL และ Smalltalk มีฟังก์ชันบล็อกการปิดและฟังก์ชันซ้อนเพื่อช่วยจัดระเบียบโค้ด แน่นอน Lisp อาจถูกใช้เป็น Macro-processor สำหรับแอสเซมเบลอร์และสร้างโค้ดที่สั้นและเร็วกว่า (การประมวลผล S-expressions แบบกำหนดเอง) กว่า C. ต้น Simula ที่ออกมาก่อน C มี polymorphism Lisp, APL และ Smalltalk มี "shells" ซึ่งทำงานได้อย่างสมบูรณ์ (โค้ดเดียวกันระหว่างเชลล์และโปรแกรม) ซึ่งแตกต่างจาก "sh" vs "C" ของ Unix ที่อนุญาตให้แปลและคอมไพล์โค้ดเป็น interleaved ตัวชี้ง่ายกว่าใน Lisp (rplaca / rplacd)
aoeu256

ข้อได้เปรียบที่ใหญ่ที่สุดของ C คือมันง่ายกว่าในการสร้าง "คอมไพเลอร์" สำหรับ C และดังนั้นจึงสามารถแพร่กระจายได้ง่ายขึ้น ... เหมือนไวรัสและด้วยโปรแกรมเมอร์ C ที่ทันสมัยไม่มีความรู้ในการสร้างโปรแกรมเป็นโมดูล (ความไม่แน่นอนทำให้เกิดความเสียหายแบบแยกส่วน) ไม่มีความคิดเกี่ยวกับคำวิเศษณ์ / คำสั่งผสม / ฟังก์ชันลำดับสูงกว่า [เขียนห่วงของคุณทุกครั้ง] และ CPU ของเราถูก จำกัด ด้วยคอขวด "von neumann" เพราะระบบปฏิบัติการของเราเขียนด้วย C CPU เพื่อเรียกใช้รหัส C สำหรับความเข้ากันได้ย้อนหลัง
aoeu256

1

ภาษาการเขียนโปรแกรมเป็นข้อมูลจำเพาะ (ไม่ใช่ซอฟต์แวร์!) มักจะเขียนในเอกสารภาษาอังกฤษบางส่วน (ที่มีการทำให้เป็นระเบียบบางอย่างเช่นEBNFสำหรับไวยากรณ์ส่วนใหญ่บางครั้งความหมายของพวกเขาก็เป็นทางการด้วย)

ตัวอย่างเช่น C11 ถูกกำหนดโดยn1570 (ซึ่งคุณควรอ่าน) ภาษาถิ่นของ Scheme บางอย่างถูกกำหนดโดยR5RS (ซึ่งคุณควรอ่านมันเป็นลายลักษณ์อักษรที่ดีมาก)

ภาษาบางโปรแกรมอาจมีการใช้งานโดยซอฟต์แวร์บางตัว บางครั้งซอฟต์แวร์นั้นเป็นคอมไพเลอร์ที่เขียนด้วยภาษาโปรแกรมเอง อ่านข้อมูลเกี่ยวกับคอมไพเลอร์ร่วมมือ

หนึ่งสามารถเขียนคอมไพเลอร์ในภาษาโปรแกรมคอมไพล์เอง หากภาษานั้น XX เป็นแบรนด์ใหม่คุณต้องผ่านขั้นตอนชั่วคราวซึ่งเกี่ยวข้องกับการเขียนล่ามหรือคอมไพเลอร์ชุดย่อยของภาษานั้นในภาษาการใช้งานอื่น ๆ (อาจเป็น C) และหลังจากนั้นคุณสามารถทิ้งคอมไพเลอร์ชั่วคราวหรือ ล่าม (ซึ่งไม่จำเป็นต้อง "ดี" เพียงเพื่อรวบรวมคอมไพเลอร์อื่น ๆ ) เมื่อคุณรวบรวมคอมไพเลอร์ XX ของคุณที่เขียนใน XX คุณสามารถทิ้งคอมไพเลอร์ชั่วคราวของคุณ

บ่อยครั้งที่ (แต่ไม่เสมอไป) ระบบรันไทม์เขียนบางส่วนใน C (โดยเฉพาะตัวเก็บรวบรวมขยะ )

ขอให้สังเกตว่ากระดูกเป็นคอมไพเลอร์ Scheme และรันไทม์เขียนทั้งหมดในตัวเอง (และคุณสามารถหาตัวอย่างอื่น ๆ ของการใช้งาน bootstrapped อย่างเต็มที่)

BTW มันสะดวกที่จะใช้ C เป็นภาษาเป้าหมายของคอมไพเลอร์

วันนี้เป็นจำนวนมากของการเขียนโปรแกรมภาษาการใช้งานที่เป็นซอฟต์แวร์เสรีหรือโอเพนซอร์ส อย่าลังเลที่จะศึกษา (และอาจช่วย) ซอร์สโค้ดของพวกเขา!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.