Python กับ Ruby สำหรับ metaprogramming [ปิด]


90

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

ฉันได้อ่านเกี่ยวกับ Lisp นิดหน่อยและฉันชอบที่จะหาภาษาที่อนุญาตให้มีสิ่งดีๆที่ Lisp ทำ แต่ไม่มีไวยากรณ์แปลก ๆ ฯลฯ ของ Lisp ฉันไม่ต้องการเริ่มสงครามเปลวไฟทางภาษาและฉันแน่ใจว่าทั้ง Ruby และ Python มีข้อแลกเปลี่ยนกันดังนั้นฉันจะแสดงรายการสิ่งที่สำคัญสำหรับฉันเป็นการส่วนตัว โปรดบอกฉันว่า Ruby, Python หรือภาษาอื่น ๆ จะดีที่สุดสำหรับฉัน

สำคัญ:

  1. metaprogramming ที่ดี ความสามารถในการสร้างคลาสเมธอดฟังก์ชัน ฯลฯ ที่รันไทม์ โดยเฉพาะอย่างยิ่งความแตกต่างเพียงเล็กน้อยระหว่างรหัสและข้อมูลลักษณะเสียงกระเพื่อม
  2. ไวยากรณ์ที่ดีสะอาดมีเหตุผลและความหมายที่ใช้งานง่ายสม่ำเสมอ โดยพื้นฐานแล้วเป็นภาษาสมัยใหม่ที่มีความคิดดีสนุกสนานและใช้งานง่าย
  3. หลายกระบวนทัศน์ ไม่มีกระบวนทัศน์ใดที่เหมาะสมสำหรับทุกโครงการหรือแม้แต่ทุกปัญหาย่อยภายในโครงการ
  4. ภาษาที่น่าสนใจซึ่งมีผลต่อวิธีคิดเกี่ยวกับการเขียนโปรแกรม

ค่อนข้างสำคัญ:

  1. ประสิทธิภาพ. คงจะดีถ้าประสิทธิภาพดี แต่เมื่อประสิทธิภาพเป็นสิ่งสำคัญอย่างแท้จริงฉันจะใช้ D แทน
  2. มีเอกสารอย่างดี

ไม่สำคัญ:

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

1
+1 สำหรับคำถามที่ถามกันทั่วไป
Triptych

น่าเสียดายที่คำตอบที่ได้รับคะแนนสูงโดยทั่วไปมักพูดว่า "มันขึ้นอยู่กับ" และคำตอบที่ต่ำกว่านั้นเป็นสงครามเปลวไฟ Python vs Ruby
Dan Burton

คุณเคยพิจารณา Clojure หรือไม่?
Mark Thomas

คำตอบคือจูเลีย ! มันไม่มีอยู่จริงในตอนนั้น: bit.ly/julia_meta ... ดีใจ! Julia ครอบคลุมประเด็นสำคัญทั้งหมดที่ระบุโดย @dsimcha รวมถึงประสิทธิภาพและประเด็นอื่น ๆ ทั้งหมดจะกลายเป็นจริงเมื่อจูเลียเติบโตเต็มที่
SalchiPapa

คำตอบ:


15

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


30
มีแน่นอนที่สุดจะอยู่ไม่ได้ในสิ่งเดียวกัน รูปลักษณ์ที่คล้ายกันบนพื้นผิว แต่สิ่งที่คุณใช้คุณสมบัติที่ทรงพลังที่สุดของ Ruby คุณเข้าใจว่า Python นั้นไม่ตรงกัน ตัวอย่างเช่นลองเขียน DSL ใน Ruby เทียบกับการเขียน Python หนึ่งตัวหรือสร้างฟังก์ชันเมธอดคลาส ฯลฯ ในขณะรันไทม์ มันตรงไปตรงมามากกว่าใน Ruby
FelipeC

14
ไม่ใช่เรื่องยากที่คุณจะต้องทำ metaprogramming มันเป็นเรื่องยากที่จะทำสำเร็จ ทั้งหมดยกเว้นโปรแกรมที่ไม่สำคัญที่สุดมีรูปแบบการทำซ้ำซึ่งไม่ได้อยู่ในเครื่องมือการปรับโครงสร้างปกติ แต่สามารถถูกฆ่าได้อย่างง่ายดายด้วยการเขียนโปรแกรมเมตา
Wayne Conrad

10
Ruby และ Python มีความแตกต่างกันอย่างมากแม้จะเป็นแนวคิดที่ควบคุมการออกแบบ Python ต้องการอย่างใดอย่างหนึ่งและหวังว่าจะเป็นวิธีหนึ่งที่ชัดเจนในการทำสิ่งต่างๆ ซึ่งโดยทั่วไปจะทำให้ภาษาไม่แสดงออกเท่า Ruby แต่ทำให้สอดคล้องกันมากขึ้น Ruby มาจากวิธี Perl อีกเล็กน้อยซึ่งมีหลายวิธีในการทำสิ่งต่างๆ นอกจากนี้ Ruby ยังทำให้บางสิ่งง่ายสุด ๆ และรวมถึงแนวคิดของสมาชิกส่วนตัวด้วย ในทางกลับกัน Python ส่วนใหญ่ทำให้บางสิ่งทำได้ยากขึ้นดังนั้นคุณต้องชัดเจนมากขึ้น (เช่นเพิ่มหรือลบล้างพฤติกรรมในคลาส)
Sean Copenhaver

5
คุณควรทำหลักสูตรที่ผิดพลาดในทั้งสองอย่าง แต่สำหรับการเขียนโปรแกรมเมตาอย่างง่ายดูเหมือนว่า Ruby จะเหมาะสมกว่า ฉันไม่มีประสบการณ์มากนักดังนั้นให้ทานเกลือเม็ดหนึ่ง
Sean Copenhaver

7
ทับทิมและ Python เป็นเพียงที่คล้ายกันในความเป็นจริงที่ว่าพวกเขาสั่งสอน "รหัสที่สวยงาม" พวกเขามีมุมมองที่แตกต่างกันโดยสิ้นเชิงเกี่ยวกับความงามนั้น (ซึ่ง IMO ดี)
Gabi Purcaru

69

ฉันได้อ่านเกี่ยวกับ Lisp นิดหน่อยและฉันชอบที่จะหาภาษาที่อนุญาตให้มีสิ่งดีๆที่ Lisp ทำ แต่ไม่มีไวยากรณ์แปลก ๆ ฯลฯ ของ Lisp

เราจะไม่ทั้งหมด

ความแตกต่างน้อยที่สุดระหว่างรหัสและข้อมูลลักษณะเสียงกระเพื่อม

น่าเศร้าที่ความแตกต่างเพียงเล็กน้อยระหว่างรหัสและข้อมูลและไวยากรณ์ที่ "แปลก" นั้นเป็นผลมาจากกันและกัน

หากคุณต้องการไวยากรณ์ที่อ่านง่ายคุณมี Python อย่างไรก็ตามรหัสไม่ได้แสดงอยู่ในโครงสร้างข้อมูลในตัวที่ใช้กันทั่วไป มันล้มเหลวเช่นเดียวกับภาษาส่วนใหญ่ในรายการ # 1 ของรายการ "สำคัญ" ของคุณ นั่นทำให้ยากที่จะให้ความช่วยเหลือที่เป็นประโยชน์

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


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

11
ผู้คนพบว่า Lisp อ่านยากเพราะไม่คุ้นเคยกับไวยากรณ์ ฉันพบว่า Lisp อ่านง่ายกว่า C # มาก (แต่ยากกว่า Python)
Jules

1
ฉันเห็นด้วยกับประเด็นนี้เป็นส่วนใหญ่ แต่ประสบการณ์ของฉันเกี่ยวกับ Ruby และ Lisp แสดงให้เห็นว่าอดีตนั้นดีสำหรับการเขียนโปรแกรมเมตาพอ ๆ กับที่ได้รับโดยไม่มีวงเล็บ ทางเลือกอื่น ๆ ที่เข้ามาใกล้อาจเป็น TCL และ JavaScript แต่ฉันจะไม่ชอบด้วยเหตุผลอื่น
inger

Long agi มีภาษาหนึ่งเรียกว่า Dylan ซึ่งน่าจะเป็นเช่นนั้น
Friedrich

17

ตามจริงแล้วเท่าที่โปรแกรม metaprogramming ไป Ruby และ Python นั้นมีความคล้ายคลึงกันมากกว่าที่ผู้ติดตามบางคนต้องการยอมรับ บทวิจารณ์ของทั้งสองภาษานี้มีการเปรียบเทียบ / บทวิจารณ์ที่ค่อนข้างดี:

ดังนั้นเพียงเลือกหนึ่งตามเกณฑ์บางอย่าง บางทีคุณอาจชอบ Rails และต้องการศึกษาโค้ดนั้น บางที SciPy ก็เป็นของคุณ ดูระบบนิเวศของห้องสมุดชุมชน ฯลฯ แล้วเลือกหนึ่งอย่าง แน่นอนว่าคุณจะไม่สูญเสียนิพพานไปกับโปรแกรม metaprogramming ตามการเลือกของคุณ


รายการบล็อกนั้นดูเหมือนจะเกี่ยวข้องกับความชอบส่วนบุคคลมากกว่า (พอใช้ แต่ความสวยงามอยู่ในสายตาของคนดู) มากกว่าการเขียนโปรแกรมเมตา - ซึ่งเป็นประเด็นหลักของ OP
inger

16

ข้อจำกัดความรับผิดชอบ: ฉันแค่ตะลุยในภาษาใดภาษาหนึ่ง แต่อย่างน้อยฉันก็เขียนโปรแกรมทำงานขนาดเล็ก (ไม่ใช่แค่สคริปต์ด่วนที่ฉันใช้ Perl, bash หรือ GNU make) ทั้งสองอย่าง

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

Python ดูเหมือนว่าฉันจะคาดเดาได้ง่ายกว่าเล็กน้อย (อาจสัมพันธ์กับ 'clean' และ 'sane' point 2) แต่ฉันไม่รู้จริงๆว่าเป็นเพราะภาษาเองหรือเพียงแค่ว่าคนที่มีค่าต่างกันมักใช้ . ฉันไม่เคยลองใช้เวทมนตร์ระดับลึกใน Python แน่นอนฉันจะบอกว่าทั้งสองภาษาได้รับการพิจารณาอย่างดี

ทั้งคู่ทำคะแนนได้ดีใน 1 และ 4 [แก้ไข: อันที่จริงแล้ว 1 เป็นที่ถกเถียงกันอยู่ - มี "eval" ในทั้งสองอย่างเหมือนกันในภาษาที่ตีความได้ คุณสามารถกำหนดการปิดกำหนดวิธีการให้กับวัตถุและอะไรก็ได้ ไม่แน่ใจว่าจะไปได้ไกลเท่าที่คุณต้องการหรือไม่]

โดยส่วนตัวแล้วฉันคิดว่า Ruby สนุกกว่า แต่ส่วนหนึ่งเป็นเพราะมันง่ายกว่าที่จะคิดฟุ้งซ่านถึงวิธีการทำสิ่งต่างๆ ฉันใช้ Python มากกว่านี้จริงๆ บางครั้งคุณไม่อยากเท่ก็อยากจะทำก่อนนอน ...

ทั้งสองอย่างนั้นยากที่จะเข้ามาดังนั้นคุณสามารถตัดสินใจที่จะทำงานย่อยถัดไปในงานเดียวและงานอื่น ๆ หรือหยิบหนังสือแนะนำตัวจากห้องสมุดอ่านทั้งสองเล่มแล้วดูว่าอะไรที่ดึงดูดคุณได้


15

คุณเคยพิจารณา Smalltalk หรือไม่? มีไวยากรณ์ที่เรียบง่ายชัดเจนและขยายได้มากพร้อมด้วยการไตร่ตรองและความสามารถในการวิปัสสนาและสภาพแวดล้อมการพัฒนาแบบบูรณาการที่ใช้ประโยชน์จากความสามารถเหล่านั้น ดูงานบางส่วนที่กำลังทำในSqueak Smalltalkเช่น นักวิจัยจำนวนมากที่ใช้ Squeak อยู่ในรายชื่ออีเมลของ Squeakและ #squeak บน freenode เพื่อให้คุณสามารถรับความช่วยเหลือเกี่ยวกับปัญหาที่ซับซ้อนได้อย่างง่ายดาย

ตัวบ่งชี้อื่น ๆ ของความเกี่ยวข้องในปัจจุบัน: มันทำงานบนแพลตฟอร์มใดก็ได้ที่คุณต้องการตั้งชื่อ (รวมถึงiPhone ) Gilad Bracha กำลังติดตามผลงานของ Newspeak ใน Squeak; ทีม V8 ตัดฟันบนSmalltalk VMs ; และ Dan Ingalls และ Randal Schwartz เพิ่งกลับมาทำงาน Smalltalk หลังจากหลายปีในถิ่นทุรกันดาร

ขอให้โชคดีกับการค้นหาของคุณ - แจ้งให้เราทราบถึงสิ่งที่คุณตัดสินใจในตอนท้าย


14

Lisp ตรงตามเกณฑ์ทั้งหมดของคุณรวมถึงประสิทธิภาพและเป็นภาษาเดียวที่ไม่มีไวยากรณ์ (แปลก ๆ ) หากคุณละทิ้งมันไปโดยไม่รู้ตัว / หัวผิดอย่างน่าประหลาดใจและทำให้พลาดประสบการณ์การใช้งานเช่น Emacs + SLIME + CL คุณจะได้รับความเสียหายอย่างมาก


4
หรือคุณสามารถลอง Clojure ซึ่งฉันคิดว่าดีมาก
pupeno

1
เห็นด้วยอย่างยิ่ง หากคุณต้องการพลังของ Lisp เพียงแค่ดำน้ำและมีมัน! การทำความคุ้นเคยกับ parens นั้นค่อนข้างง่าย ไม่ใช่เรื่องใหญ่อย่างที่คนส่วนใหญ่กำหนดให้เป็น
Dan Burton

11

จุด "สำคัญ" 4 จุดของคุณนำไปสู่ ​​Ruby อย่างแน่นอนในขณะที่ 2 จุด "ค่อนข้างสำคัญ" ที่ปกครองโดย Python ไม่ว่าจะเป็น


11

คุณกำลังอธิบาย Ruby

  • metaprogramming ที่ดี ความสามารถในการสร้างคลาสเมธอดฟังก์ชัน ฯลฯ ที่รันไทม์ โดยเฉพาะอย่างยิ่งความแตกต่างเพียงเล็กน้อยระหว่างรหัสและข้อมูลลักษณะเสียงกระเพื่อม

มันง่ายมากที่จะขยาย และแก้ไขสิ่งดั้งเดิมที่มีอยู่ในรันไทม์ ในทับทิมทุกอย่างเป็นวัตถุสตริงจำนวนเต็มแม้แต่ฟังก์ชัน

นอกจากนี้คุณยังสามารถสร้างทางลัดสำหรับน้ำตาลประโยคตัวอย่างเช่นกับclass_eval class_eval

  • ไวยากรณ์ที่ดีสะอาดมีเหตุผลและความหมายที่ใช้งานง่ายสม่ำเสมอ โดยพื้นฐานแล้วเป็นภาษาสมัยใหม่ที่มีความคิดดีสนุกสนานและใช้งานง่าย

ทับทิมเป็นไปตามหลักการของความประหลาดใจน้อยลงและเมื่อเปรียบเทียบรหัส Ruby กับรหัสที่เทียบเท่าในภาษาอื่นหลายคนมองว่า "สวยงาม" กว่า

  • หลายกระบวนทัศน์ ไม่มีกระบวนทัศน์ใดที่เหมาะสมสำหรับทุกโครงการหรือแม้แต่ทุกปัญหาย่อยภายในโครงการ

คุณสามารถปฏิบัติตามความจำเป็นเชิงวัตถุใช้งานได้และสะท้อนแสง

  • ภาษาที่น่าสนใจซึ่งมีผลต่อวิธีคิดเกี่ยวกับการเขียนโปรแกรม

นั่นเป็นเรื่องส่วนตัวมาก แต่จากมุมมองของฉันความสามารถในการใช้หลายกระบวนทัศน์ในเวลาเดียวกันทำให้ได้แนวคิดที่น่าสนใจมาก

ฉันได้ลองใช้ Python แล้วและไม่ตรงกับจุดสำคัญของคุณ


11
-1 ฉันใช้ Python และมันลงตัวมากความแตกต่างระหว่าง Python และ Ruby วางไว้ในแง่มุมอื่น Fanboy-ish noisemaker คุณคือ
gorsky

6
พูดมาก แต่ไม่มีการเดิน โปรดยกตัวอย่างใน Python ของการเพิ่มวิธีการแบบไดนามิกเพื่อพูดคลาส String?
FelipeC

6
@ john นั่นคือประเด็นของฉัน มันซับซ้อนและน่าเกลียดมาก (ไม่ต้องพูดถึงเป็นไปไม่ได้สำหรับคลาส String) OTOH ใน Ruby มันง่ายมาก: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC

2
ทับทิมอาจพยายามที่จะปฏิบัติตาม Pols แต่ฉันไม่อยากจะบอกว่ามันไม่ ตัวอย่างเช่นlambda/ Proc.newระเบียบถูกเรียกว่า "พฤติกรรมที่น่าประหลาดใจ" และ "มีการตอบโต้อย่างมาก" ที่นี่ใน SO :-) ภาษาใด ๆ ที่ใหญ่และซับซ้อนเท่า Ruby ก็ต้องมีส่วนที่สับสนเช่นนี้
Ken

2
@Token นี่คือตัวอย่างของลิงปะStringในรูบีเพื่อวัตถุประสงค์ metaprogramming: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/... Subclassing จะไม่ทำ อย่างไรก็ตามฟังก์ชันสองอาร์กิวเมนต์ธรรมดาจะ
P Shved

8

เปรียบเทียบตัวอย่างโค้ดที่ทำสิ่งเดียวกัน (เข้าร่วมกับคำอธิบายรายการขึ้นบรรทัดใหม่ที่ไม่ว่างเปล่าจากไฟล์myListรายการ) ในภาษาต่างๆ (ภาษาจัดเรียงตามลำดับตัวอักษรย้อนกลับ):

ทับทิม :

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

หรือ

myList.map(&:description).reject(&:empty?).join("\n")

Python :

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

หรือ

"\n".join(f.description() for f in mylist if f.description())

Perl :

join "\n", grep { $_ } map { $_->description } @myList;

หรือ

join "\n", grep /./, map { $_->description } @myList;

Javascript :

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

ไอโอ :

myList collect(description) select(!="") join("\n")

นี่คือคู่มือไอโอ


3
(format nil "~ {~ a ~ ^ ~% ~}" (remove nil (mapcar # 'description mylist)))
Rainer Joswig

ดี แต่ metaprogramming อยู่ที่ไหน? ดูเหมือนว่าจะเป็นรูปแบบที่ใช้งานได้เล็กน้อยซึ่งเกี่ยวข้องกับคำถามจากระยะไกล
inger

6

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

เสียงกระเพื่อมค่อนข้างเย็นและน่ามอง อย่างที่คุณบอกขนาดของชุมชน ฯลฯ สามารถเปลี่ยนแปลงได้ค่อนข้างเร็ว ดังที่กล่าวมาขนาดของตัวเองไม่สำคัญเท่ากับคุณภาพของชุมชน ตัวอย่างเช่น#ruby-langช่องนี้ยังคงเต็มไปด้วยผู้คนที่ฉลาดอย่างไม่น่าเชื่อ เสียงกระเพื่อมดูเหมือนจะดึงดูดคนที่ฉลาดจริงๆด้วย ฉันไม่สามารถพูดเกี่ยวกับชุมชน Python ได้มากนักเนื่องจากฉันไม่มีประสบการณ์โดยตรงมากนัก แต่ในบางครั้งดูเหมือนว่าจะ "ใหญ่เกินไป" (ฉันจำได้ว่าผู้คนค่อนข้างหยาบคายในช่อง IRC ของพวกเขาและจากสิ่งที่ฉันได้ยินจากเพื่อนที่เข้าสู่ Python จริงๆดูเหมือนว่าจะเป็นกฎมากกว่าข้อยกเว้น)

อย่างไรก็ตามแหล่งข้อมูลบางอย่างที่คุณอาจพบว่ามีประโยชน์ ได้แก่ :

1) ซีรีส์ Metaprogramming ของโปรแกรมเมอร์ที่ใช้งานได้จริง ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - ไม่ฟรี แต่ตอนต่อมาค่อนข้างน่าสนใจ (รหัสนี้ฟรีหากคุณต้องการดาวน์โหลดและดูว่าคุณกำลังเรียนรู้อะไร)

2) On Lisp โดย Paul Graham ( http://www.paulgraham.com/onlisp.html ) มันเก่าไปหน่อย แต่มันคลาสสิก (และดาวน์โหลดได้ฟรี)


5

ฉันใช้ Python ในหลาย ๆ โปรเจ็กต์และฉันคิดว่า Python มีคุณสมบัติทั้งหมดที่คุณขอ

สำคัญ:

  1. Metaprogramming: Python รองรับ metaclasses และ runtime class / method generation เป็นต้น
  2. ไวยากรณ์: นั่นเป็นเรื่องส่วนตัว ฉันชอบไวยากรณ์ของ Pythons สำหรับความเรียบง่าย แต่บางคนบ่นว่า Python นั้นไวต่อช่องว่าง
  3. Paradigms: Python รองรับการเขียนโปรแกรมเชิงขั้นตอนเชิงวัตถุและฟังก์ชันพื้นฐาน
  4. ฉันคิดว่า Python มีรูปแบบที่เน้นการใช้งานจริงมันเป็นแรงบันดาลใจสำหรับฉันมาก

ค่อนข้างสำคัญ:

  1. ประสิทธิภาพ: เป็นภาษาสคริปต์ แต่การเขียนส่วนขยาย C สำหรับ Python เป็นแนวทางปฏิบัติทั่วไปในการเพิ่มประสิทธิภาพ
  2. เอกสารประกอบ: ฉันไม่สามารถบ่นได้ มันไม่ค่อยละเอียดเท่าที่ใครบางคนอาจรู้จักจาก Java แต่มันดีพอ

ในฐานะที่คุณเป็นนักเรียนที่จบคุณอาจต้องการที่จะอ่านบทความนี้อ้างว่างูหลามเป็นทุกความต้องการของนักวิทยาศาสตร์ น่าเสียดายที่ฉันไม่สามารถเปรียบเทียบ Python กับ Ruby ได้เนื่องจากฉันไม่เคยใช้ภาษานั้น

ขอแสดงความนับถือเดนนิส


3
Python ไม่ไวต่อการเว้นวรรคมันไวต่อการเยื้อง
jfs

5

@ Jason ฉันไม่เห็นด้วยตามลำดับ มีความแตกต่างที่ทำให้ Ruby เหนือกว่า Python สำหรับ metaprogramming - ทั้งในเชิงปรัชญาและเชิงปฏิบัติ สำหรับ starters, ทับทิมได้รับมรดกที่ถูกต้องกับเดี่ยวมรดกและ Mixins และเมื่อมันมาถึง metaprogramming คุณก็ต้องเข้าใจว่ามันเป็นเรื่องของตัวเอง ความแตกต่างที่ยอมรับได้ที่นี่คือใน Ruby คุณสามารถเข้าถึงวัตถุตัวเองในขณะรันไทม์ - ใน Python คุณไม่ได้

แตกต่างจาก Python ตรงที่ Ruby ไม่มีเฟสคอมไพล์หรือรันไทม์แยกต่างหาก ใน Ruby โค้ดทุกบรรทัดจะถูกเรียกใช้กับอ็อบเจกต์ตัวเองโดยเฉพาะ ใน Ruby ทุกคลาสจะสืบทอดมาจากทั้งอ็อบเจกต์และเมตาคลาสที่ซ่อนอยู่ สิ่งนี้ทำให้เกิดพลวัตที่น่าสนใจ:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

การใช้self.nameเข้าถึงเมธอดชื่อเมตาคลาสของคลาส Ninja เพื่อส่งคืนชื่อคลาสของ Ninja ดอกไม้ metaprogramming สวยมากใน Python หรือไม่? ฉันสงสัยอย่างจริงใจ!


4

ถ้าคุณไม่ชอบไวยากรณ์เสียงกระเพื่อมบางทีแอสเซมเบลอร์เป็นวิธีที่จะไป :-)

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


ฉันคิดว่าฉันได้ทำการเขียนโปรแกรมเมตาในภาษาแอสเซมบลีมากกว่าภาษาอื่น ๆ รหัสคือข้อมูลและข้อมูลสามารถพยายามเป็นรหัสได้ และข้อมูลไม่ได้ลงนามหรือไม่ได้ลงนามมันเป็นตัวเลือกที่ตัดสินใจ
Nosredna

1
ฉันมีรหัสแอสเซมเบลอร์ที่คุณสามารถอ้างว่าเป็น OO มีหลายอย่างที่ดูเหมือนวิธีการ - คุณเรียกวิธีที่ขึ้นอยู่กับ "คลาส"
justintime

4

ไอโอตอบสนองทุกจุด "สำคัญ" ของคุณ ฉันไม่คิดว่าจะมีภาษาที่ดีกว่านี้สำหรับการแฮ็กเมตาบ้าๆ


ขอบคุณสำหรับสิ่งนั้นไม่รู้ ดูสนุกในตอนแรกอาจมี (()) มากมาย แต่อย่างไรก็ตาม หวังว่าฉันจะหาเวลาได้ดูเร็ว ๆ นี้
flq

3

สิ่งที่รองรับการแฮ็ก metaprogramming ที่ไม่สามารถทำได้ในภาษาที่คอมไพล์แบบคงที่

ฉันชอบที่จะหาภาษาที่ช่วยให้สิ่งดีๆที่Lispทำ

เรียบเรียงเสียงกระเพื่อมได้



3

คำตอบของฉันจะไม่เป็นเช่นนั้น ฉันรู้ทั้งสองภาษาเรียนเกี่ยวกับ Ruby และเขียนโปรแกรมใน python มาหลายปีแล้ว Lisp สามารถเขียนโปรแกรม metaprogramming ได้ดีเนื่องจากจุดประสงค์เพียงอย่างเดียวคือการแปลงรายการซอร์สโค้ดของตัวเองเป็นเพียงรายการโทเค็นดังนั้นการเขียนโปรแกรมเมตาจึงเป็นไปตามธรรมชาติ สามภาษาที่ฉันชอบที่สุดสำหรับประเภทนี้คือ Rebol, Forth และ Factor Rebol เป็นภาษาถิ่นที่แข็งแกร่งมากซึ่งใช้รหัสจากอินพุตสตรีมเรียกใช้นิพจน์กับมันและแปลงโดยใช้กฎที่เขียนในภาษา แสดงออกได้ดีมากและพูดภาษาถิ่นได้ดีมาก Factor และ Forth มีการหย่าร้างจากไวยากรณ์อย่างสมบูรณ์มากหรือน้อยและคุณตั้งโปรแกรมโดยการกำหนดและเรียกคำ โดยทั่วไปมักเขียนด้วยภาษาของตนเอง คุณไม่ได้เขียนแอปพลิเคชันตามความหมายดั้งเดิม คุณขยายภาษาโดยการเขียนคำของคุณเองเพื่อกำหนดแอปพลิเคชันเฉพาะของคุณ Factor เป็นสิ่งที่ดีเป็นพิเศษเนื่องจากมีคุณสมบัติมากมายที่ฉันเคยเห็นใน smalltalk สำหรับการประเมินและทำงานกับซอร์สโค้ด พื้นที่ทำงานที่ดีจริงๆเอกสารโต้ตอบ ฯลฯ


2

มีการแยก Python และ Ruby ออกจากกันไม่มากนัก ฉันว่าชุมชน Python นั้นใหญ่และโตกว่าชุมชน Ruby และนั่นสำคัญมากสำหรับฉัน Ruby เป็นภาษาที่ยืดหยุ่นกว่าซึ่งมีผลกระทบเชิงบวกและเชิงลบ อย่างไรก็ตามฉันแน่ใจว่าจะมีผู้คนมากมายที่จะลงรายละเอียดเกี่ยวกับทั้งสองภาษานี้ดังนั้นฉันจะโยนตัวเลือกที่สามลงในวงแหวน แล้ว JavaScript ล่ะ?

เดิม JavaScript ได้รับการออกแบบให้เป็น Scheme สำหรับเว็บและเป็นแบบต้นแบบซึ่งเป็นข้อได้เปรียบเหนือ Python และ Ruby เท่าที่เกี่ยวข้องกับหลายกระบวนทัศน์และ metaprogramming ไวยากรณ์ไม่ดีเท่าอีกสองภาษา แต่น่าจะเป็นภาษาที่มีการใช้งานอย่างแพร่หลายที่สุดและประสิทธิภาพจะดีขึ้นทุกวัน


2

หากคุณชอบแนวคิดโค้ด is-data แบบเสียงกระเพื่อม แต่ไม่ชอบไวยากรณ์ Lispy บางทีPrologอาจเป็นทางเลือกที่ดี

ไม่ว่าจะเป็น "ภาษาที่ใช้สนุกและทันสมัย" ฉันจะฝากให้คนอื่นตัดสิน ;-)



2

OCaml ล่ะ?

คุณสมบัติของ OCaml: ระบบประเภทคงที่, การอนุมานประเภท, ความหลากหลายเชิงพาราเมติก, การวนซ้ำของหาง, การจับคู่รูปแบบ, การปิดศัพท์ชั้นหนึ่ง, functors (โมดูลพาราเมตริก), การจัดการข้อยกเว้นและการรวบรวมขยะอัตโนมัติแบบเพิ่มหน่วย

ฉันคิดว่ามันเป็นไปตามสิ่งต่อไปนี้:

สำคัญ:

  1. ไวยากรณ์ที่ดีสะอาดมีเหตุผลและความหมายที่ใช้งานง่ายสม่ำเสมอ โดยพื้นฐานแล้วเป็นภาษาสมัยใหม่ที่มีความคิดดีสนุกสนานและใช้งานง่าย
  2. หลายกระบวนทัศน์ ไม่มีกระบวนทัศน์ใดที่เหมาะสมสำหรับทุกโครงการหรือแม้แต่ทุกปัญหาย่อยภายในโครงการ
  3. ภาษาที่น่าสนใจซึ่งมีผลต่อวิธีคิดเกี่ยวกับการเขียนโปรแกรม

ค่อนข้างสำคัญ:

  1. ประสิทธิภาพ. คงจะดีถ้าประสิทธิภาพดี แต่เมื่อประสิทธิภาพเป็นสิ่งสำคัญอย่างแท้จริงฉันจะใช้ D แทน
  2. มีเอกสารอย่างดี

OCaml ช่วยให้คุณสร้างคลาส / วิธีการที่รันไทม์? ทำงานอย่างไร?
Jason Creighton

ฉันเพิ่งอ่านเกี่ยวกับ OCaml และอาจไม่สามารถสร้างสิ่งต่าง ๆ ในรันไทม์ได้ดังนั้นฉันจึงลบมันออกไป
Robert Vuković

2

ฉันใช้ Python มาก แต่ Ruby มากกว่ามาก อย่างไรก็ตามฉันขอยืนยันว่าทั้งคู่ให้สิ่งที่คุณขอ

ถ้าฉันเห็นทั้งสี่ข้อของคุณอย่างน้อยคุณก็ควรตรวจสอบ: http://www.iolanguage.com/

และ Mozart / Oz อาจน่าสนใจสำหรับคุณเช่นกัน: http://mozart.github.io/

ขอแสดงความนับถือฟรีดริช


1

สำหรับไวยากรณ์หลามสไตล์และเสียงกระเพื่อมเหมือนแมโคร (แมโครที่มีรหัสจริง) และ DSL ดีเห็นบรรจบ


1

ฉันไม่แน่ใจว่า Python จะตอบสนองทุกสิ่งที่คุณต้องการ (โดยเฉพาะประเด็นเกี่ยวกับความแตกต่างระหว่างโค้ดและข้อมูลเพียงเล็กน้อย) แต่มีอาร์กิวเมนต์หนึ่งที่สนับสนุน python มีโครงการอยู่ที่นั่นซึ่งทำให้คุณสามารถตั้งโปรแกรมส่วนขยายสำหรับ python ใน D ได้อย่างง่ายดายดังนั้นคุณจึงสามารถมีสิ่งที่ดีที่สุดจากทั้งสองโลกได้ http://pyd.dsource.org/celerid.html



1

ฉันอยากจะแนะนำให้คุณไปกับทับทิม

เมื่อฉันเริ่มเรียนรู้ครั้งแรกฉันพบว่ามันง่ายมากที่จะรับ


1

อย่าผสมภาษาการเขียนโปรแกรม Ruby กับ Ruby Implementations โดยคิดว่าเธรด POSIX ไม่สามารถทำได้ใน Ruby

คุณสามารถคอมไพล์ด้วยการสนับสนุน pthread และสิ่งนี้เป็นไปได้แล้วในขณะที่เธรดนี้ถูกสร้างขึ้นหากคุณให้อภัยการเล่นสำนวน

คำตอบสำหรับคำถามนี้ง่ายมาก ถ้าคุณชอบเสียงกระเพื่อมคุณอาจจะชอบทับทิมมากกว่า หรืออะไรก็ได้ที่คุณต้องการ


0

ฉันขอแนะนำให้คุณลองใช้ทั้งสองภาษาและเลือกภาษาที่คุณสนใจ ทั้ง Python และ Ruby สามารถทำสิ่งที่คุณต้องการได้

อ่านกระทู้นี้ด้วย



0

เกี่ยวกับประเด็นหลักของคุณ (การเขียนโปรแกรมเมตา): Groovy เวอร์ชัน 1.6 มีการเขียนโปรแกรม AST (Abstract Syntax Tree) ในตัวเป็นคุณลักษณะมาตรฐานและแบบบูรณาการ Ruby มี RubyParser แต่เป็นส่วนเสริม

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