คำถามติดแท็ก programming-languages

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

4
ทำไมฟังก์ชั่นที่มี polymorphic type `forall t: Type, t-> t` ต้องเป็นฟังก์ชันเฉพาะตัว?
ฉันใหม่กับทฤษฎีภาษาโปรแกรม ฉันกำลังดูการบรรยายออนไลน์ที่อาจารย์อ้างว่าฟังก์ชั่นที่มีประเภท polymorphic นั้นforall t: Type, t->tเป็นตัวตน แต่ไม่ได้อธิบายว่าทำไม บางคนสามารถอธิบายให้ฉันทำไม อาจพิสูจน์ข้อเรียกร้องจากหลักการแรก

3
มีทฤษฎีของลำดับชั้นการยกเว้นหรือไม่?
ฉันคุ้นเคยกับภาษาการเขียนโปรแกรมหลายสิบภาษาที่มีข้อยกเว้นบางประการ แต่ฉันก็มาพบกับแนวโน้ม "พยาธิวิทยา" สองประการ ดูเหมือนจะไม่มีรูปแบบทั่วไปหรือลำดับชั้นของข้อยกเว้น ทุกภาษาจะม้วนเวอร์ชั่นของตัวเองและหากข้อยกเว้นทำให้เป็นมาตรฐานแล้วชนิดของข้อยกเว้นที่พบในมาตรฐานจะค่อนข้างโดยพลการ สตริงหรือข้อยกเว้นในการเรียกใช้ดีบักเกอร์หรือสิ่งที่เกิดขึ้นเมื่อไม่พบไฟล์ ฯลฯ ) ข้อยกเว้นที่กำหนดโดยภาษานั้นไม่ค่อยได้ใช้ซ้ำโดยโปรแกรมผู้ใช้ โดยปกติจะมีข้อยกเว้นที่ได้รับความนิยมหนึ่งหรือสองรายการ (ตัวอย่างเช่น "not Implement") แม้ว่าโปรแกรมเมอร์ส่วนใหญ่จะสร้างข้อยกเว้นของตนเอง (เปรียบเทียบสิ่งนี้กับการสร้างประเภทตัวเลขใหม่หรือประเภทคอลเลกชันใหม่) ดูเหมือนว่าฉันจะไม่สนใจเลย ทำไมไม่มีใครรู้ว่าจะต้องมีข้อผิดพลาดประเภทใดในโปรแกรมผู้ใช้ ฉันหวังว่าจะมีลำดับชั้นที่ดีคล้ายกับประเภทตัวเลขคอลเลกชันระบบวัตถุ ฯลฯ ยิ่งไปกว่านั้น Goolge และ Wikipedia ยังให้ความช่วยเหลือเพียงเล็กน้อยในเรื่องนี้ จนถึงตอนนี้ฉันเพิ่งพบบทความเกี่ยวกับข้อยกเว้นการทำงานที่เปิดขึ้นเป็นตอน: บทความนี้ระบุว่าการเขียนโปรแกรมการทำงานที่ขี้เกียจไม่เพียง แต่ทำให้กลไกการจัดการข้อยกเว้นในตัวไม่จำเป็น แต่ยังให้เครื่องมือที่มีประสิทธิภาพสำหรับการพัฒนาและการแปลงโปรแกรมที่ใช้ข้อยกเว้น (ทฤษฎีการทำงานของข้อยกเว้น, Mike Spivey, 1988) แต่ฉันคิดว่าข้อยกเว้นนั้นดี ฉันไม่ต้องการแปลงโปรแกรมที่ใช้ข้อยกเว้นในทางตรงกันข้ามฉันต้องการใช้ข้อยกเว้นให้วุ่นวายน้อยลง คำถาม: มีทฤษฎีของข้อยกเว้นหรือไม่? ถ้าเป็นเช่นนั้นมันจะเรียกว่าอะไร? อะไรคือสิ่งสำคัญถ้าสิ่งสำคัญคือการทำงานที่สรุปพื้นฐานของมันได้หรือไม่

3
ปัญหาการใช้งานการปิดในการตั้งค่าที่ไม่ทำงาน
ในภาษาการเขียนโปรแกรมการปิดเป็นคุณสมบัติที่นิยมและมักต้องการ Wikipediaพูดว่า (เหมืองที่เน้น): ในวิทยาการคอมพิวเตอร์การปิด (... ) คือฟังก์ชั่นร่วมกับสภาพแวดล้อมอ้างอิงสำหรับตัวแปรที่ไม่ใช่ท้องถิ่นของฟังก์ชั่นนั้น การปิดช่วยให้ฟังก์ชั่นเข้าถึงตัวแปรนอกขอบเขตศัพท์ได้ทันที ดังนั้นการปิดจึงเป็นค่าฟังก์ชัน (ไม่ระบุชื่อ) ซึ่งสามารถใช้ตัวแปรที่อยู่นอกขอบเขตของตัวเอง จากประสบการณ์ของฉันนี่หมายความว่ามันสามารถเข้าถึงตัวแปรที่อยู่ในขอบเขตที่จุดนิยามได้ ในทางปฏิบัติแนวคิดนี้ดูเหมือนจะเบี่ยงเบนไป แต่อย่างน้อยก็อยู่นอกการโปรแกรมเชิงปฏิบัติ ภาษาที่แตกต่างกันใช้ความหมายที่แตกต่างกันแม้ดูเหมือนว่าจะมีสงครามของ Verifyons โปรแกรมเมอร์หลายคนดูเหมือนจะไม่รู้ว่าการปิดคืออะไรดูพวกเขาน้อยกว่าฟังก์ชั่นที่ไม่ระบุชื่อ นอกจากนี้ดูเหมือนว่าจะมีอุปสรรคสำคัญเมื่อดำเนินการปิด สิ่งที่น่าสังเกตมากที่สุดคือ Java 7 น่าจะรวมเอาไว้ แต่ฟีเจอร์ดังกล่าวจะถูกส่งกลับไปยังรีลีสในอนาคต เหตุใดการปิดจึงยากที่จะเข้าใจ คำถามนี้กว้างเกินไปและคลุมเครือดังนั้นขอให้ฉันมุ่งเน้นไปที่คำถามที่เชื่อมต่อกันเหล่านี้มากขึ้น: มีปัญหาเกี่ยวกับการแสดงการปิดในพิธีการทางความหมายทั่วไป (ขั้นตอนเล็ก ๆ ขั้นตอนที่ใหญ่ ... )? ระบบชนิดที่มีอยู่ไม่เหมาะสำหรับการปิดและไม่สามารถขยายได้อย่างง่ายดายหรือไม่? เป็นปัญหาหรือไม่ที่จะนำการปิดให้สอดคล้องกับการแปลขั้นตอนแบบดั้งเดิม โปรดทราบว่าคำถามส่วนใหญ่เกี่ยวข้องกับภาษาเชิงโพรซีเดอร์เชิงวัตถุและสคริปต์ เท่าที่ฉันรู้ภาษาการทำงานไม่มีปัญหาใด ๆ

8
OOP แก้ปัญหาในทางปฏิบัติอย่างไร
ผมได้ศึกษาหนังสือ"C ++ Demystified" ตอนนี้ฉันเริ่มอ่าน"การเขียนโปรแกรมเชิงวัตถุใน Turbo C ++ รุ่นแรก (รุ่นที่ 1)"โดย Robert Lafore ฉันไม่มีความรู้เกี่ยวกับการเขียนโปรแกรมใด ๆ ซึ่งอยู่นอกเหนือหนังสือเหล่านี้ หนังสือเล่มนี้อาจล้าสมัยเพราะอายุ 20 ปี ฉันมีฉบับล่าสุดฉันใช้รุ่นเก่าเพราะฉันชอบส่วนใหญ่ฉันแค่ศึกษาแนวคิดพื้นฐานของ OOP ที่ใช้ใน C ++ ผ่านหนังสือรุ่นแรกของ Lafore หนังสือของ Lafore เน้นว่า "OOP" มีประโยชน์สำหรับโปรแกรมขนาดใหญ่และซับซ้อนเท่านั้น มีการกล่าวในหนังสือ OOP ทุกเล่ม (รวมถึงในหนังสือของ Lafore) ว่ากระบวนทัศน์กระบวนงานมีแนวโน้มที่จะเกิดข้อผิดพลาดเช่นข้อมูลทั่วโลกและมีความเสี่ยงจากการทำงานได้ง่าย ว่ากันว่าโปรแกรมเมอร์สามารถทำผิดพลาดอย่างสุจริตในภาษาขั้นตอนเช่นโดยการทำหน้าที่ที่เสียหายข้อมูลโดยไม่ตั้งใจ พูดอย่างสุจริตฉันกำลังโพสต์คำถามของฉันเพราะฉันไม่เข้าใจคำอธิบายที่ให้ไว้ในหนังสือเล่มนี้: การเขียนโปรแกรมเชิงวัตถุใน C ++ (รุ่นที่ 4)ฉันไม่เข้าใจข้อความเหล่านี้ที่เขียนไว้ในหนังสือของ Lafore: การเขียนโปรแกรมเชิงวัตถุได้รับการพัฒนาเนื่องจากข้อ จำกัด ถูกค้นพบในแนวทางก่อนหน้าของการเขียนโปรแกรม .... เนื่องจากโปรแกรมมีขนาดใหญ่ขึ้นและซับซ้อนยิ่งขึ้นแม้แต่วิธีการเขียนโปรแกรมที่มีโครงสร้างก็เริ่มแสดงสัญญาณของความเครียด ... …

2
ฟังก์ชั่น Scott ต่อเนื่อง: นิยามทางเลือก
ฉันกำลังดิ้นรนกับอสังหาริมทรัพย์นี้จริงๆ: ให้X,YX,YX,Yเป็นช่องว่างที่เชื่อมโยงกันและf:Cl(X)→Cl(Y)f:Cl(X)→Cl(Y)f: Cl(X) \rightarrow Cl(Y)เป็นฟังก์ชั่นโมโนโทน ต่อเนื่องหากสำหรับเช่นนั้นเป็นชุดกำกับffff(⋃x∈Dx)=⋃x∈Df(x)f(⋃x∈Dx)=⋃x∈Df(x)f(\bigcup_{x\in D} x)=\bigcup_{x \in D}f(x)D⊆Cl(X)D⊆Cl(X)D \subseteq Cl(X)DDD ชุดกำกับการถูกกำหนดไว้ดังนี้: poset คือชุดกำกับ IFFเช่นและZ ย่อมาจาก cliques X:เชื่อมโยงกัน\}D⊆D⊆D \subseteq ∀x,x′∈D∀x,x′∈D \forall x, x' \in D ∃z∈D∃z∈D \exists z \in D x⊆zx⊆z x \subseteq zx′⊆zx′⊆zx' \subseteq z Cl(X)Cl(X)Cl(X) {x⊆|X|∣a,b∈x⇒a{x⊆|X|∣a,b∈x⇒a\{x \subseteq |X| \mid a,b \in x \Rightarrow ab}b}b \} หนังสือหลายเล่มให้คำจำกัดความของฟังก์ชั่นสก็อตต์อย่างต่อเนื่องแต่ไม่ใช่ครูของฉัน เขาให้คำจำกัดความต่อเนื่องกับเรานี้: …

3
วิธีทำ homoiconic ภาษา
ตามบทความนี้บรรทัดของเสียงกระเพื่อมพิมพ์ "Hello world" ไปยังเอาต์พุตมาตรฐาน (format t "hello, world") เสียงกระเพื่อมซึ่งเป็นภาษา homoiconicสามารถรักษารหัสเป็นข้อมูลด้วยวิธีนี้: ตอนนี้จินตนาการว่าเราเขียนมาโครต่อไปนี้: (defmacro backwards (expr) (reverse expr)) ย้อนกลับเป็นชื่อของแมโครซึ่งใช้นิพจน์ (แสดงเป็นรายการ) และย้อนกลับ นี่คือ "สวัสดีโลก" อีกครั้งคราวนี้ใช้มาโคร: (backwards ("hello, world" t format)) เมื่อคอมไพเลอร์เสียงกระเพื่อมเห็นบรรทัดของรหัสนั้นมันจะดูที่อะตอมแรกในรายการ ( backwards) และสังเกตว่ามันตั้งชื่อแมโคร มันจะส่งรายการที่ไม่ได้ประเมินค่า("hello, world" t format)ไปยังแมโครซึ่งจัดเรียงรายการ(format t "hello, world")ใหม่เป็น รายการผลลัพธ์แทนที่นิพจน์แมโครและเป็นสิ่งที่จะถูกประเมินในเวลาทำงาน สภาพแวดล้อมเสียงกระเพื่อมจะเห็นว่าอะตอมแรก ( format) เป็นฟังก์ชั่นและประเมินมันส่งผ่านข้อโต้แย้งที่เหลือ ในเสียงกระเพื่อมบรรลุภารกิจนี้เป็นเรื่องง่าย (แก้ไขฉันถ้าฉันผิด) เพราะรหัสจะดำเนินการตามรายการ ( s- นิพจน์ ?) …

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

2
อะไรทำให้ทัวริงทัวริงสมบูรณ์
ฉันรู้ว่ามันสามารถพิสูจน์ได้ว่า PROLOG นั้นเสร็จสมบูรณ์โดยการสร้างโปรแกรมที่จำลองเครื่องทัวริงดังนี้: turing(Tape0, Tape) :- perform(q0, [], Ls, Tape0, Rs), reverse(Ls, Ls1), append(Ls1, Rs, Tape). perform(qf, Ls, Ls, Rs, Rs) :- !. perform(Q0, Ls0, Ls, Rs0, Rs) :- symbol(Rs0, Sym, RsRest), once(rule(Q0, Sym, Q1, NewSym, Action)), action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), perform(Q1, Ls1, Ls, Rs1, Rs). symbol([], b, []). …

1
การอนุมานประเภทด้วยประเภทผลิตภัณฑ์
ฉันกำลังทำงานกับคอมไพเลอร์สำหรับภาษาที่ต่อกันและต้องการเพิ่มการสนับสนุนการอนุมานประเภท ฉันเข้าใจ Hindley - Milner แต่ฉันได้เรียนรู้ทฤษฎีประเภทเมื่อฉันไปดังนั้นฉันไม่แน่ใจว่าจะปรับตัวอย่างไร ระบบต่อไปนี้เป็นระบบเสียงที่ดี คำคือตัวอักษรองค์ประกอบของคำพูดคำพูดของคำหรือดั้งเดิม E : : = x||อีอี||[ e ]||...e::=x|ee|[e]|… e ::= x \:\big|\: e\:e \:\big|\: [e] \:\big|\: \dots เงื่อนไขทั้งหมดแสดงถึงฟังก์ชั่น สำหรับสองฟังก์ชั่นและ ,นั่นคือ juxtaposition แสดงถึงการจัดองค์ประกอบย้อนกลับ ตัวอักษรหมายถึงฟังก์ชั่น niladice 2อี1e1e_1อี2e2e_2อี1อี2= e2∘ e1e1e2=e2∘e1e_1\:e_2 = e_2 \circ e_1 คำอื่น ๆ นอกเหนือจากการแต่งมีกฎประเภทพื้นฐาน: x : ι[Lit]แกมมา⊢อีเมล์: σแกมมา⊢ [ E ] : ∀ …

4
ภาษาของโปรแกรมสามารถอ่อนไหวได้เพียงพอที่จะอนุญาตให้โปรแกรมขยายความหมายของภาษาหรือไม่
ด้วยการอ้างอิงถึงคุณสมบัติในภาษาต่างๆเช่น ruby ​​(และ javascript) ซึ่งอนุญาตให้โปรแกรมเมอร์ขยาย / ลบล้างคลาสได้ตลอดเวลาหลังจากกำหนด (รวมถึงคลาสเช่น String) ในทางทฤษฎีแล้วมันเป็นไปได้ในทางทฤษฎีในการออกแบบภาษา ความหมายของมัน เช่นทับทิมไม่อนุญาตให้มีการสืบทอดหลายอย่าง แต่ฉันสามารถขยาย / ลบล้างพฤติกรรมภาษาเริ่มต้นเพื่ออนุญาตการใช้งานการสืบทอดหลายมรดก มีภาษาอื่นที่อนุญาตสิ่งนี้หรือไม่? อันที่จริงเรื่องนี้เป็นเรื่องของนักออกแบบภาษาหรือไม่? ดูทางเลือกของการใช้ ruby ​​สำหรับการสร้างเฟรมเวิร์กเรลสำหรับการพัฒนาเว็บแอปพลิเคชันภาษาดังกล่าวอาจมีประสิทธิภาพมากในการอนุญาตการออกแบบเฟรมเวิร์ก (หรือ DSL) สำหรับการใช้งานที่หลากหลาย

3
ภาษาการวิจัยใดที่มีระบบการพิมพ์ที่ดีกว่า Haskell และทำไม
ที่นี่ฉันอ่านแล้ว: Haskell ไม่มีระบบการพิมพ์ขั้นสูงสุด (ไม่ปิดแม้แต่ถ้าคุณนับภาษาการวิจัย) แต่จากภาษาทั้งหมดที่ใช้ในการผลิตจริง Haskell น่าจะอยู่ด้านบน ดังนั้นฉันถามสองสิ่ง: ภาษาวิจัยใดที่มีระบบพิมพ์ที่ทรงพลังกว่า Haskell พวกเขาปรับปรุงอะไร ฉันเป็นโปรแกรมเมอร์ดังนั้นฉันไม่รู้วัตถุทางคณิตศาสตร์มากมายที่ใช้ในทฤษฎีชนิดโปรดอธิบายอย่างนุ่มนวลหากคุณสามารถ

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

7
ทำไมดัชนีอาเรย์เชิงลบจึงสมเหตุสมผล
ฉันเจอประสบการณ์แปลก ๆ ในการเขียนโปรแกรม C พิจารณารหัสนี้: int main(){ int array1[6] = {0, 1, 2, 3, 4, 5}; int array2[6] = {6, 7, 8, 9, 10, 11}; printf("%d\n", array1[-1]); return 0; } เมื่อฉันรวบรวมและเรียกใช้สิ่งนี้ฉันจะไม่ได้รับข้อผิดพลาดหรือคำเตือนใด ๆ ดังที่วิทยากรของฉันกล่าวว่าดัชนีอาร์เรย์-1เข้าถึงตัวแปรอื่น ฉันยังสับสนอยู่ทำไมภาษาโปรแกรมโลกถึงมีความสามารถนี้ ฉันหมายความว่าทำไมอนุญาตให้ดัชนีอาเรย์เชิงลบ

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

2
คำขออ้างอิง: ทฤษฎีหมวดหมู่ตามที่ใช้กับระบบการพิมพ์
ฉันคอยฟังว่าจะต้องเรียนรู้ทฤษฎีหมวดหมู่อย่างไรเพื่อให้เข้าใจทฤษฎีภาษาโปรแกรมอย่างแท้จริง จนถึงตอนนี้ฉันได้เรียนรู้ PL จำนวนมากโดยไม่ต้องก้าวเข้าสู่หมวดหมู่ อย่างไรก็ตามฉันคิดว่ามันเป็นเวลาที่จะก้าวกระโดดเพื่อดูสิ่งที่ฉันได้หายไป น่าเสียดายที่ไม่มีแหล่งข้อมูลใดที่ฉันสามารถค้นหาได้ทำการเชื่อมต่อกับระบบประเภทหรือการเขียนโปรแกรม พวกเขาบอกว่าเป็นการแนะนำทฤษฎีหมวดหมู่สำหรับนักวิทยาศาสตร์คอมพิวเตอร์ แต่หลังจากนั้นก็เปลี่ยนไปเป็นเรื่องไร้สาระทั่วไป ฉันเดาคำถามของฉันเป็นสองเท่าจริง: ทฤษฎีหมวดหมู่จำเป็นสำหรับการทำความเข้าใจ "แนวคิดที่ลึกซึ้ง" ใน PL หรือไม่? แหล่งที่มาที่อธิบายทฤษฎีหมวดหมู่จากมุมมองของแอปพลิเคชันเชิงปฏิบัติเพื่อพิมพ์ระบบและการเขียนโปรแกรมคืออะไร จนถึงตอนนี้สิ่งที่ไกลที่สุดที่ฉันได้รับคือความคิดที่คลุมเครือของ functors (ซึ่งดูเหมือนจะไม่เกี่ยวข้องกับ functors ใน ML เท่าที่ฉันจะบอกได้) ฉันกลัวสิ่งที่เป็นนามธรรมฉันจะต้องเก็บไว้ในหัวของฉันที่จะเข้าใจพระจากมุมมองตามทฤษฎีหมวดหมู่

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