บางครั้งในขณะที่การเขียนโปรแกรมในภาษาต่างๆ (C / C ++, C #) ความคิดนี้อยู่ในใจของฉัน:
- ภาษาแต่ละภาษาเขียนด้วยภาษา C หรือไม่?
- ภาษา C เป็นแม่ / พ่อของทุกภาษาหรือไม่
- แต่ละแนวคิด ( OOPฯลฯ ) ถูกนำไปใช้ใน C หรือไม่
ฉันไปในทิศทางที่ถูกต้องหรือไม่
บางครั้งในขณะที่การเขียนโปรแกรมในภาษาต่างๆ (C / C ++, C #) ความคิดนี้อยู่ในใจของฉัน:
ฉันไปในทิศทางที่ถูกต้องหรือไม่
คำตอบ:
เลขที่
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 เป็นเพียงส่วนเล็ก ๆ ของเรื่องราวทศวรรษที่ผ่านมาหลังจากความคิดเหล่านี้เข้ามา
แต่ละภาษามีการเขียนด้วยภาษา C หรือไม่?
ภาษาเป็นชุดของกฎทางคณิตศาสตร์ที่เป็นนามธรรมและข้อ จำกัด ( "ถ้าผมเขียนนี้ , ที่เกิดขึ้น") มันไม่ได้เขียนอะไรเลยจริงๆ
มันมีการระบุโดยปกติจะเป็นส่วนผสมของชุดย่อยของภาษาอังกฤษอย่างเป็นทางการสัญกรณ์ทางคณิตศาสตร์และอาจมีบางภาษาสเปคพิเศษ ไวยากรณ์มักจะถูกระบุไว้ในตัวแปรของEBNFหรือABNF
ตัวอย่างเช่นนี่คือข้อมูลจำเพาะของfor
นิพจน์จากข้อกำหนดภาษา ISO Ruby:
§11.5.2.3.4การ
for
แสดงออกวากยสัมพันธ์
- for-expression → for สำหรับตัวแปร [ไม่มีตัวต่อบรรทัดที่นี่] in expression do-clause end
- สำหรับตัวแปร → ด้านซ้ายมือ
|
หลายด้านซ้ายมืออรรถศาสตร์
For -expressionได้รับการประเมินดังนี้:
- ประเมินการแสดงออก หากการประเมินผลของนิพจน์ถูกยกเลิกโดยการแสดงออก , การแสดงออกครั้งต่อไปหรือการทำซ้ำการแสดงออกพฤติกรรมที่ไม่ได้ระบุ มิฉะนั้นให้
O
เป็นค่าผลลัพธ์ให้
E
เป็นหลัก-วิธี-ภาวนาของรูปแบบหลักของการแสดงออก [ไม่มีสายเทอร์มินี่] .each do | บล็อกพารามิเตอร์รายการ | บล็อกร่างกาย endที่ค่าของหลักแสดงออกเป็นO
ที่บล็อกพารามิเตอร์รายการเป็นดังใจ ตัวแปรที่บล็อกของร่างกายเป็นสารประกอบคำสั่งของการทำข้อประเมิน
E
; อย่างไรก็ตามหากบล็อกที่มีเนื้อความเป็นคำสั่งผสมของส่วนคำสั่งของนิพจน์จะถูกเรียกในระหว่างการประเมินนี้ขั้นตอนใน§ 11.3.3 ยกเว้นขั้นตอน c) และขั้นตอน e) 4) นำมาประเมินผลการโทรนี้ค่าของนิพจน์คือค่าผลลัพธ์ของการเรียกใช้
นี่คือตัวอย่างที่แตกต่างจากกฎความสอดคล้องประเภทของ 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 จะมีอิทธิพลใด ๆ ต่อภาษาเก่าเหล่านั้น
สิ่งเหล่านี้มีอยู่ก่อนที่ 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 ได้
แกนกลางของภาษาสำคัญ ๆ ส่วนใหญ่เขียนด้วยภาษา 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) ...
มีหลายเหตุผลที่เลือก C บ่อยครั้ง: ประสิทธิภาพการทำงานพกพาประสบการณ์
สุดท้ายอาจเป็นสิ่งที่สำคัญที่สุด: Python เริ่มต้นในปี 1991, PHP ในปี 1994/1995, Perl ในปี 1988, Ruby ในปี 1995 ในปีที่ผ่านมา Java เพิ่งเปิดตัวและ C ++ ยังไม่ได้มาตรฐานที่ดี
ค่อนข้างเกี่ยวข้อง:
ไม่บางภาษามีการเตรียมการล่วงหน้าและมีการใช้งานหลายภาษาแยกต่างหากจาก C เช่นดูที่http://en.wikipedia.org/wiki/Lisp_%28programming_language%29
javac
มาจาก Oracle JDK / OpenJDK ที่เขียนโดย Martin Odersky (จาก Scala fame) ใน 100% Java, Eclipse Compiler, เขียนด้วยภาษา Java 100% (มาจากJikesของไอบีเอ็ม IBM ), คอมไพเลอร์จาก ไอบีเอ็ม J9 มาจาก Jikes และ Java 100% AFAIK คอมไพเลอร์ Java ตัวเดียวที่ใช้กันอย่างแพร่หลายและไม่ได้เขียนใน Java คือ GCJ
ฉันจะทำให้ความคิดเห็นนี้ถ้าฉันทำได้ แต่ฉันไม่สามารถไปที่นี่:
หนึ่งในเหตุผลที่ 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 และผู้จัดการหน่วยความจำในภาษากลายเป็นขั้นสูงขึ้น
เห็นได้ชัดว่าไม่ คอมไพเลอร์ C ตัวแรกจะเขียนเป็น C ได้อย่างไรถ้า C ไม่เคยมีมาก่อน นี่ไม่ใช่ปัญหาไก่และไข่
มีหลายวิธีในการเขียนคอมไพเลอร์แรกของภาษาที่เรียกว่าbootstrapping
ยิ่งไปกว่านั้นคอมไพเลอร์ส่วนใหญ่พยายามที่จะใช้โฮสติ้งด้วยตนเองหรือแปลเป็นภาษาของตัวเองเพื่อส่งเสริมภาษาและคอมไพเลอร์เอง
นี่คือรายการภาษาการเขียนโปรแกรมบางภาษาที่ไม่ได้เขียนด้วยภาษา C พร้อมกับภาษาที่ใช้ใน:
ภาษาที่ดีที่สุดสำหรับการใช้งานคอมไพเลอร์น่าจะอยู่ไกลจาก C. ภาษาที่ใช้งานได้จะให้สิ่งต่าง ๆ เช่นชุดการเรียกซ้ำและตัวแยกวิเคราะห์ monadic combinators
ประการที่สองเพื่อตอบคำถามของคุณว่า C เป็น "แม่ / พ่อของทุกภาษาโปรแกรม" หรือไม่ - C เป็นภาษาที่ได้รับการออกแบบมาอย่างดีในเวลาที่ปรากฏและไม่ต้องสงสัยเลยว่ามีอิทธิพลต่อนักออกแบบภาษาซึ่งต่อมาได้ทำสิ่งที่แตกต่างกันมาก แต่ในตอนท้ายของวันแฮสเค็ลล์ออกจาก C ในทุก ๆ ทางที่เป็นไปได้ C มีอายุ 45 ปีและไม่น่าแปลกใจที่เราได้เรียนรู้ที่จะทำดีขึ้นในระหว่างนี้
ในที่สุดเพื่อตอบคำถามที่สามของคุณไม่ใช่กรณีที่ C ใช้ "แนวคิดทั้งหมด" โดยเฉพาะอย่างยิ่งการพยายามที่จะใช้แนวคิดขั้นสูงบางอย่างจากการเขียนโปรแกรมเชิงปฏิบัติ (เช่นการเปลี่ยนแปลงรูปแบบหรือการห้ามพระเจ้า ฉันไม่คุ้นเคยกับการเขียนโปรแกรมเชิงวัตถุเป็นพิเศษ แต่ฉันรู้ว่าภาษาเชิงวัตถุบางประเภทมีประเภทผลรวม
ภาษาการเขียนโปรแกรมเป็นข้อมูลจำเพาะ (ไม่ใช่ซอฟต์แวร์!) มักจะเขียนในเอกสารภาษาอังกฤษบางส่วน (ที่มีการทำให้เป็นระเบียบบางอย่างเช่นEBNFสำหรับไวยากรณ์ส่วนใหญ่บางครั้งความหมายของพวกเขาก็เป็นทางการด้วย)
ตัวอย่างเช่น C11 ถูกกำหนดโดยn1570 (ซึ่งคุณควรอ่าน) ภาษาถิ่นของ Scheme บางอย่างถูกกำหนดโดยR5RS (ซึ่งคุณควรอ่านมันเป็นลายลักษณ์อักษรที่ดีมาก)
ภาษาบางโปรแกรมอาจมีการใช้งานโดยซอฟต์แวร์บางตัว บางครั้งซอฟต์แวร์นั้นเป็นคอมไพเลอร์ที่เขียนด้วยภาษาโปรแกรมเอง อ่านข้อมูลเกี่ยวกับคอมไพเลอร์ร่วมมือ
หนึ่งสามารถเขียนคอมไพเลอร์ในภาษาโปรแกรมคอมไพล์เอง หากภาษานั้น XX เป็นแบรนด์ใหม่คุณต้องผ่านขั้นตอนชั่วคราวซึ่งเกี่ยวข้องกับการเขียนล่ามหรือคอมไพเลอร์ชุดย่อยของภาษานั้นในภาษาการใช้งานอื่น ๆ (อาจเป็น C) และหลังจากนั้นคุณสามารถทิ้งคอมไพเลอร์ชั่วคราวหรือ ล่าม (ซึ่งไม่จำเป็นต้อง "ดี" เพียงเพื่อรวบรวมคอมไพเลอร์อื่น ๆ ) เมื่อคุณรวบรวมคอมไพเลอร์ XX ของคุณที่เขียนใน XX คุณสามารถทิ้งคอมไพเลอร์ชั่วคราวของคุณ
บ่อยครั้งที่ (แต่ไม่เสมอไป) ระบบรันไทม์เขียนบางส่วนใน C (โดยเฉพาะตัวเก็บรวบรวมขยะ )
ขอให้สังเกตว่ากระดูกเป็นคอมไพเลอร์ Scheme และรันไทม์เขียนทั้งหมดในตัวเอง (และคุณสามารถหาตัวอย่างอื่น ๆ ของการใช้งาน bootstrapped อย่างเต็มที่)
BTW มันสะดวกที่จะใช้ C เป็นภาษาเป้าหมายของคอมไพเลอร์
วันนี้เป็นจำนวนมากของการเขียนโปรแกรมภาษาการใช้งานที่เป็นซอฟต์แวร์เสรีหรือโอเพนซอร์ส อย่าลังเลที่จะศึกษา (และอาจช่วย) ซอร์สโค้ดของพวกเขา!