เหตุใดภาษาการเขียนโปรแกรมยอดนิยมหลายภาษาจึงมีอิทธิพลต่อ C [ปิด]


23

ภาษาโปรแกรม 10 อันดับแรกตามดัชนี TIOBEดูเหมือนจะได้รับอิทธิพลอย่างมากจาก C:

1. Java

ภาษามาจากไวยากรณ์ส่วนใหญ่จาก C และ C ++ แต่มีโมเดลวัตถุที่ง่ายกว่าและมีสิ่งอำนวยความสะดวกในระดับต่ำน้อยลง - wikipedia.org

2. ค

C เป็นหนึ่งในภาษาการเขียนโปรแกรมที่ใช้กันอย่างแพร่หลายตลอดเวลาและมีสถาปัตยกรรมคอมพิวเตอร์น้อยมากที่คอมไพเลอร์ C ไม่มีอยู่ - wikipedia.org

3. C #

ในระหว่างการพัฒนา. NET Framework นั้นคลาสไลบรารีถูกเขียนโดยใช้ระบบคอมไพเลอร์โค้ดที่ได้รับการจัดการที่เรียกว่า Simple Managed C (SMC) ในเดือนมกราคม 1999 Anders Hejlsberg ได้จัดตั้งทีมเพื่อสร้างภาษาใหม่ในเวลาที่เรียกว่า Cool ซึ่งย่อมาจาก "C-like Object Oriented Language" - wikipedia.org

4. C ++

ได้รับการพัฒนาโดย Bjarne Stroustrup เริ่มต้นในปี 2522 ที่ Bell Labs เพื่อพัฒนาภาษา C - wikipedia.org

5. วัตถุประสงค์ -C

Objective-C เป็นภาษาโปรแกรมเชิงวัตถุที่สะท้อนแสงซึ่งเพิ่มการส่งข้อความในรูปแบบ Smalltalk ไปยังภาษาการเขียนโปรแกรม C - wikipedia.org

6. PHP

เขาเขียนสคริปต์เหล่านี้ใหม่เป็นภาษาการเขียนโปรแกรมภาษา C Common Gateway Interface (CGI) ซึ่งขยายพวกเขาเพื่อเพิ่มความสามารถในการทำงานกับเว็บฟอร์มและเพื่อสื่อสารกับฐานข้อมูลและเรียกการใช้งานนี้ว่า "Home Home / Forms Interpreter" หรือ PHP / FI - wikipedia.org

8. Python

งูเหลือมถูกค้นพบในช่วงปลายทศวรรษที่ 1980 และการดำเนินการเริ่มต้นขึ้นในเดือนธันวาคม 1989 โดยกุยโดแวนรอสซัมที่ CWI ในเนเธอร์แลนด์ในฐานะผู้สืบทอดภาษาโปรแกรม ABC (ตัวเองได้รับแรงบันดาลใจจาก SETL) ซึ่งสามารถยกเว้นการจัดการ - wikipedia.org

ABC (ภาษาโปรแกรม) นักออกแบบอ้างว่าโดยทั่วไปแล้วโปรแกรม ABC มักมีขนาดเท่ากับโปรแกรมภาษาปาสคาลหรือซีประมาณหนึ่งในสี่และสามารถอ่านได้มากกว่า - wikipedia.org

9. Perl

Perl ยืมคุณสมบัติจากภาษาโปรแกรมอื่น ๆ เช่น C, shell scripting (sh), AWK และ sed - wikipedia.org

10. จาวาสคริปต์

JavaScript ใช้ไวยากรณ์ที่ได้รับอิทธิพลจาก C. - wikipedia.org

ปรากฏว่าพวกเขาส่วนใหญ่ยืมไวยากรณ์ของพวกเขาจาก C และ / หรือได้รับอิทธิพลอย่างมากในรูปแบบอื่น ๆ อย่างน้อยในการเริ่มต้นของพวกเขา ทำไม?


15
การมี c like syntax ไม่เหมือนกับการใช้ c
Oded

15
นอกจากนี้ TIOBE ยังเป็นดัชนีขยะ
DeadMG

3
แต่ฉันจะถามได้ไหมว่าเพราะเหตุใดภาษาการเขียนโปรแกรมบน C จึงเป็นที่นิยมมากกว่า?
Manoj R

3
@ YannisRizos กู้ที่ดีของคำถาม! ตอนนี้เป็นคำถามที่ยอดเยี่ยมจริงๆ
maple_shaft

16
เนื่องจาก C เป็นผู้สืบทอดของ ALGOL และ ALGOL คือการปิดกั้นห้องปฏิบัติการเชิงบังคับที่มีขอบเขต จำกัด สิ่งที่อับราฮัมมีไว้สำหรับคริสเตียนชาวยิวและมุสลิม
Ingo

คำตอบ:


40

ด้วยการเพิ่มขึ้นของ UNIX ในปี 1970 ภาษาโปรแกรมระบบมาตรฐาน C กลายเป็นภาษากลางของโลกแห่งการเขียนโปรแกรมอย่างรวดเร็ว ในขณะที่ C ได้รับคำสั่งในทางปฏิบัติสำหรับโปรแกรมเมอร์ทุกคน ดังนั้นความจริงที่ว่า C มีอิทธิพลต่อภาษาการเขียนโปรแกรมเกือบทุกภาษาที่เกิดขึ้นในภายหลังไม่ทางใดก็ทางหนึ่งนั้นแทบไม่น่าแปลกใจเลยด้วยเหตุผลสองประการ:

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

แต่ภาษาอื่นมีอยู่และพวกเขาก็ยังทำอยู่บางคนถึงกับกด C - มีตระกูล LISP (CL, Clojure และ Scheme ซึ่งเป็นภาษาถิ่นที่ได้รับความนิยมมากที่สุด) ตระกูล ML (มีหลายภาษาในปัจจุบัน) มีกองทัพทั้งหมดของ ภาษาเบสิกขั้นพื้นฐาน (VB.NET และ VBA เป็นการนำไปใช้ที่ทันสมัย) มีภาษาปาสคาลและญาติของมัน (Delphi เป็นที่รู้จักกันดีที่สุด) และภาษา 'คี่บอล' จำนวนมากที่ได้รับอิทธิพลจากภาษาอื่น ๆ มากมาย ตัวอย่าง ได้แก่ Go, Python, Lua, Haskell (และบรรพบุรุษของมัน Miranda), Prolog และ Erlang ในขณะที่ไม่มีภาษาเหล่านี้ (ยกเว้น Python) อยู่ใน 10 อันดับแรกของคุณ แต่หลายภาษามีฐานผู้ใช้ที่มั่นคงและชุมชนที่ใช้งานอยู่ แน่นอนพวกเขาจะไม่หายไป

นอกจากนี้ควรสังเกตว่าปริมาณของอิทธิพล C ในภาษาเหล่านี้แตกต่างกันอย่างมากตั้งแต่ภาษาที่เข้ากันได้เกือบ 100% C ++ และ Objective-C จนถึง Python (ซึ่งจงใจละทิ้งคุณลักษณะทางไวยากรณ์ของ C จำนวนมาก) และนั่นเป็นเพียงวากยสัมพันธ์: ในแง่ของความหมายภาษาส่วนใหญ่ในรายการนั้นไม่ค่อยมีอะไรเหมือนกันกับซีส่วนใหญ่ที่ครอบงำมีการจัดการหน่วยความจำในภาษาดังนั้นจึงคัดลอกความหมายการส่งผ่านข้อโต้แย้ง ฯลฯ แตกต่างกันมาก ตัวอย่างเช่น JavaScript มีอิทธิพลความหมายที่แข็งแกร่งจาก Scheme ในขณะที่ไวยากรณ์ได้รับการออกแบบให้คล้ายกับ Java (ซึ่งในทางกลับกันฐานของมันบิตและชิ้นส่วนไวยากรณ์บน C แต่ไม่ใช่ความหมายของมัน) ความแตกต่างอื่น ๆ (ยกเว้น C ++ และ Objective-C ซึ่งส่วนใหญ่เข้ากันได้กับ C ย้อนหลัง) รวมถึงการจัดการข้อผิดพลาดกฎขอบเขต#include) และความจริงที่ว่าหลายภาษาเหล่านี้เป็น 'เสมือนจริง' นั่นคือพวกเขาทำงานบนล่าม, คอมไพเลอร์ JIT หรือเครื่องเสมือน

Python มีอิทธิพลต่อ C บางประการ แต่แน่นอนว่าไม่ใช่ "อิง" C ทั้งไวยากรณ์และความหมายแตกต่างกันอย่างมากจาก C และนี่คือการออกแบบ Python ยืมเฉพาะฟีเจอร์จาก C ที่ทางเลือกอื่นมีความเท่าเทียมกัน "ดี" (ตาม "Zen of Python" - พิมพ์import thisใน python interpreter)

สำหรับอนาคตของการเขียนโปรแกรม การคาดการณ์แตกต่างกันไป อิทธิพลของ C จะไม่หายไป แต่การพัฒนาล่าสุดของฮาร์ดแวร์ (เครื่องจักรแบบ multi-core กลายเป็นเรื่องธรรมดา, GPU ที่มีประสิทธิภาพ, CPU จะกลายเป็นคอขวดที่มีประสิทธิภาพโดยทั่วไป, การเชื่อมต่อเครือข่ายที่รวดเร็วและเชื่อถือได้เป็นต้น) โดยทั่วไป ใครก็ตามที่เคยเขียนแอพพลิเคชั่นแบบกระจายตัวแบบมัลติเธรดในภาษาที่จำเป็นสามารถบอกได้ว่ามันยากอย่างเหลือเชื่อในขณะที่ภาษาอย่าง Haskell มีคุณสมบัติที่ช่วยขจัดปัญหาทั่วไปส่วนใหญ่และนำเสนอแนวทางที่เป็นนามธรรมและมีโครงสร้างมากขึ้น (ความบริสุทธิ์เป็นแนวคิดที่สำคัญในบริบทนี้) ภาษาการเขียนโปรแกรมที่ใหม่กว่า (เช่น C # หรือ D) มีฟีเจอร์มากมายที่สนับสนุนสำนวนดังกล่าวแล้ว ไม่ว่าในกรณีใด


คำตอบที่ดี แต่ "CPU สิ้นสุดลงเพื่อเป็นคอขวดประสิทธิภาพโดยทั่วไป"? จากประสบการณ์ของฉันมีปัญหาเรื่องประสิทธิภาพมาก - CPU, IO คุณตั้งชื่อมัน ถ้าไม่ใช้ก็ไม่จำเป็นต้องใช้โปรไฟล์แม้ว่าจะไม่มีประสิทธิภาพก็ตาม
Mike Dunlavey

6
@MikeDunlavey: โดยปกติแล้วคอขวดที่ฉันพบนั้นเกิดจาก I / O, เครือข่าย, ประสิทธิภาพแคช CPU, ปริมาณงานบัสและการสื่อสารระหว่างกระบวนการ (ไม่มีประสิทธิภาพ) ย้อนกลับไปในสมัยก่อนซีพียูแทบจะเป็นคอขวดอย่างหลีกเลี่ยงไม่ได้ สิ่งนี้ไม่เป็นความจริงอีกต่อไป
tdammers

1

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

อย่างไรก็ตามไทม์ไลน์ "ประวัติภาษาคอมพิวเตอร์" ( http://www.levenez.com/lang/ ) ให้คำตอบทั้งหมดที่อาจมี


6
เพราะบริเตนใหญ่จาก 1600-1880 ประมาณเป็นโรงไฟฟ้าอุตสาหกรรมและการเงินที่สำคัญของโลกตามด้วยสหรัฐอเมริกาจาก 1880- ปัจจุบัน (<- เป็นที่ถกเถียงกัน) มันกลายเป็นภาษาของธุรกิจระหว่างประเทศและพูดได้อย่างคล่องแคล่วโดยกว่า 2 พันล้านคนทั่วโลก นั่นและไม่มีใครอยากพูดภาษาสเปนหรือดัตช์ :)
maple_shaft

6
@maple_shaft - "ไม่มีใครต้องการพูดภาษาสเปน"! ... คุณรู้หรือไม่ว่ามีการพูดในกี่ประเทศ en.wikipedia.org/wiki/Spanish_language
Rook

12
@ S.Lott: คุณหมายถึงส่วนที่จักรวรรดิอังกฤษเป็นอาณาจักรที่ใหญ่ที่สุดที่เคยมีอยู่และครอบครอง 25% ของพื้นผิวโลกทั้งหมดหรือไม่ "ไม่มีพลัง" แบบนั้น?
DeadMG

3
@DeadMG: ฉันไม่ได้พูดถึงโลก ฉันกำลังพูดถึงสหรัฐอเมริกาในปี 1700 ซึ่งเป็นที่ที่ชาวอังกฤษได้เข้ามาในพื้นที่เล็ก ๆ ตามแนวชายฝั่ง ฉันกำลังพูดถึงการพ่ายแพ้ทางทหารของอังกฤษในโรงละครนี้เท่านั้น ฝรั่งเศสควบคุมได้อย่างชัดเจนว่าเป็นสหรัฐอเมริกา ยัง สหรัฐฯกระทบกระเทือนการพูดภาษาอังกฤษ ไม่ใช่ภาษาฝรั่งเศส การวิเคราะห์เดียวกันนี้ใช้กับ C. มันเป็นประวัติศาสตร์ที่ซับซ้อนที่มีปัจจัยที่มีอิทธิพลมากมาย ไม่มีคำตอบเล็กน้อยที่น่าสนใจ
S.Lott

4
@ S.Lott ชาวฝรั่งเศสไม่ได้ชนะทุกนัด แค่มองไปที่อเมริกาเหนือพวกเขาชนะเสียงข้างมาก แต่การแพ้ 4 ใน 5 การต่อสู้ครั้งสำคัญใน NA ระหว่างปี 1559/60 ส่งผลให้พ่ายแพ้อย่างรุนแรงในโรงภาพยนตร์ การยึดครองของป้อมปราการติคอนเดอโรกาและไนแองกา, ที่ราบแห่งอับราฮัมและการต่อสู้ของ Restigouche ล้วนเป็นชัยชนะของชาวอังกฤษ ด้วยการตัดอุปทาน / การเสริมกำลังทำให้ชัยชนะของฝรั่งเศสที่ Sainte-Foy ไม่เกี่ยวข้อง
Dan Neely

0

หากคุณสร้างภาษาการเขียนโปรแกรมใหม่การมีไวยากรณ์คล้ายกับภาษาที่มีอยู่ในปัจจุบันทำให้การเรียนรู้ง่ายขึ้นสำหรับผู้ใช้ใหม่ของคุณ โดยเฉพาะอย่างยิ่งหากแนวคิดหลายอย่างมีความคล้ายคลึงกันระหว่างภาษา

นอกจากนี้ฉันคิดว่าไวยากรณ์แบบ C นั้นอ่านง่าย ในการเปรียบเทียบกับ Pascal การใช้สัญลักษณ์ "{" และ "}" สำหรับบล็อกของรหัสนั้นอ่านง่ายกว่า "เริ่มต้น" และ "สิ้นสุด" ซึ่งมีลักษณะคล้ายกับตัวระบุ Python นั้นอ่านง่ายขึ้น แต่การรวมช่องว่างในไวยากรณ์เปิดชุดของปัญหาใหม่ด้วยการแก้ไข อีกตัวอย่างหนึ่ง: เสียงกระเพื่อมและ JavaScript แบ่งปันแนวคิดเล็กน้อย แต่เมื่อสิ่งเดียวกันถูกเขียนในรูปแบบ C-style มันจะคลุมเครือน้อยลง

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


-1

ภาษาการเขียนโปรแกรมมีการพัฒนาอยู่ตลอดเวลาเช่นเดียวกับภาษาธรรมชาติโดยที่ภาษาที่เก่ากว่าบางอย่างมีอิทธิพลต่อการวิวัฒนาการในทางที่แข็งแกร่งกว่าในขณะที่คนอื่น ๆ เลือนหายไปสู่ความสับสนและอิทธิพลของพวกเขานั้นยากต่อการติดตามระดับพื้นผิว

อิทธิพลของ C มาจากหลาย ๆ แหล่ง - มันอยู่ในระดับต่ำแพร่หลายและได้รับการสนับสนุนทั้งใน Unix และ Microsoft นอกจากนี้ยังมีการเอาชีวิตรอดจากปัญหาที่เหมาะสมที่สุด - เป็นเรื่องง่ายที่จะเห็นไวยากรณ์ C-like สั้น ๆ มีความดึงดูดมากกว่าไวยากรณ์ที่ได้รับจาก Algol ของ Pascal และคู่แข่งอื่น ๆ ของ C ในปี 1970 และ 1980 ดังนั้นจึงเป็นที่ยอมรับอย่างกว้างขวางโดยภาษาที่มาหลังจากนั้น

ด้วยการเติบโตในปัจจุบันของความสำคัญของการเขียนโปรแกรมแบบมัลติเธรดและภาษาที่ใช้งานได้ดีโดยเฉพาะอย่างยิ่งมันจะบอกว่าเราจะเห็นอิทธิพลของพวกเขาเติบโตขึ้นในอนาคต ตรงจุด: Python ซึ่งทำรายการนั้นในโพสต์คำถาม

มุมมองเส้นเวลาที่ดีของประวัติศาสตร์ภาษาที่ต้องไตร่ตรอง


คุณเข้าใจผิด ทั้ง PASCAL และ C เป็นลูกหลานของ ALGOL
Ingo

จริง แต่ Algol เองก็เป็นลูกหลานของ Fortran และเลือกโครงสร้างบางอย่างที่ฉันพูดถึงนั่น (โปรแกรม, สิ้นสุด, รูทีนย่อยเมื่อเทียบกับวงเล็บของ c) ถึงกระนั้นสิ่งที่ฉันมีอยู่ในใจก็คือในความเป็นจริงแล้วไวยากรณ์ที่คล้ายกับ Algol แก้ไข
scrwtp

ไวยากรณ์ C-like ที่สั้นลงมีความดึงดูดมากกว่าจากนั้นก็ใช้ไวยากรณ์ที่ได้มาจาก Algol ของ Pascal และคู่แข่งรายอื่นของ C ในยุค 70 และยุค 80 +1 สำหรับสิ่งนั้น เริ่มโปรแกรมเมอร์มนุษย์เกินไปจบ เริ่มต้น ผู้ที่เชื่อว่ามันเป็นความสะดวกในการ map ป้ายเครื่องหมายวรรคตอนคำต้องการเริ่มต้นการสิ้นสูญเสียการต่อสู้ของพวกเขาเพื่อวงเล็บปีกกาจบของเรื่อง
ริ้น

ฉันไม่เห็นหลักฐานว่าไวยากรณ์ C ไม่ชัดเจนน้อยกว่ายกเว้นในแง่ที่นักพัฒนาส่วนใหญ่รู้จักภาษา C หรือภาษาที่เกี่ยวข้องกับ C บางประเภทและดังนั้นจึงดูคุ้นเคยกว่า AFAICT, C ชนะ Pascal เนื่องจากโครงสร้างของมันและความจริงที่ว่าการใช้งานไม่จำเป็นต้องกลิ้งการเชื่อมโยงของตัวเองไม่ใช่ไวยากรณ์
David Thornley

@ David - จากสิ่งที่ฉันจำได้หนึ่งในเหตุผลที่ C ชนะมากกว่าภาษาอื่น ๆ ก็เนื่องมาจากความสะดวกในการเข้าถึงหน่วยความจำใน C (เช่นตัวชี้) ฉันรู้ว่าตอนนี้พวกเขารู้สึกประหลาดใจ แต่กลับมาเมื่อแรม 1 KB มีหน่วยความจำมากมายนั่นเป็นคุณสมบัติที่ทรงพลังของภาษา ฉันรู้ว่าภาษาอื่นให้ตัวชี้เช่นเดียวกับคุณสมบัติ แต่ไม่มีใครง่ายเหมือนกับ C.
Dunk

-3

ภาษาส่วนใหญ่ที่คุณแสดงไม่มีส่วนเกี่ยวข้องกับ C นอกเหนือจากความคล้ายคลึงกันทางไวยากรณ์ที่ไม่เกี่ยวข้อง อนุพันธ์ C จริงเพียงสองรายการคือ Objective-C และ C ++


หากเราไม่พิจารณาไวยากรณ์แล้วความแตกต่างเพียงอย่างเดียวระหว่างภาษาใด ๆ คือความพร้อมใช้งานของการสร้างภาษาทั่วไป (ลูป, เงื่อนไข, ตัวแปร, นามธรรมของสิ่งเหล่านี้เช่นคลาสและการปิด ฯลฯ ) และพวกเขาทั้งหมดเท่ากับพฤติกรรมของเครื่อง รหัส. ภาษาระดับต่ำทั้งหมดมีความคล้ายคลึงกันและภาษาระดับสูงทั้งหมดจะคล้ายกันมากในตอนนั้น
maple_shaft

2
คุณไม่ควรคิดถึงภาษาว่ามีฟังก์ชั่นการใช้งานแบบใด แต่จะสื่อสารพฤติกรรมของแอปพลิเคชันอย่างไร รหัสต้นฉบับของคุณเป็นระดับต่ำสุดของเอกสารและเขียนรหัสที่มาสำหรับคนและไม่ได้สำหรับเครื่อง ถ้าเราเขียนโค้ดอย่างเคร่งครัดสำหรับเครื่องเราทุกคนจะได้รับการเข้ารหัสในการประกอบ
maple_shaft

1
@maple_shaft: ใช่เลย! ฉันถูกถามในการสัมภาษณ์เพื่ออธิบายความแตกต่างระหว่างภาษาเครื่อง (แอสเซมเบลอร์) และภาษาการเขียนโปรแกรม คำตอบของฉันคือ: "ภาษาเครื่องสำหรับเครื่องจักรภาษาโปรแกรมสำหรับโปรแกรมเมอร์"
Treb

1
@maple_shaft: ไวยากรณ์ที่ไม่เกี่ยวข้องเป็นไปของการสื่อสารเพื่อคน หากฉันแทนที่คำภาษาอังกฤษด้วยการสะกดที่แตกต่างกันภาษาอังกฤษจะยังคงเป็นภาษาเดียวกัน รูปแบบวากยสัมพันธ์นั้นไม่เกี่ยวข้องสิ่งที่สื่อความหมายคือความหมายของภาษา
DeadMG

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