ภาษาการเขียนโปรแกรมสามารถทำงานได้ดีโดยไม่มีคำสั่ง?


9

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


2
ใช่มีหลายภาษาที่เป็นนิพจน์เช่น Ruby และภาษา Lisp ทุกภาษา
amara

@sparkleshy ฉันเห็นเพียงเดา: พวกเขาทุกคนมีโอเปอเรเตอร์ที่สอดคล้องกับเครื่องหมายจุลภาคของ JavaScript (มันประมวลผลสองคำสั่งและส่งคืนค่าสุดท้าย) นี่เป็นวิธีแก้ปัญหาสำหรับการดำเนินการสองคำสั่งตามลำดับหรือไม่? ฉันคาดว่า progn ของ CL เป็นแบบอะนาล็อกฉันเดาแม้ว่ามันจะใช้ได้กับการแสดงออก 2 ครั้ง
MaiaVictor

1
ทุกอย่าง - is - an-expression ไม่จำเป็นต้องดูแตกต่างจากภาษาคำสั่งสามัญ, งบเพียง ... มีค่า หากคุณทำนิพจน์คำสั่ง javascript รหัสที่มีอยู่ทั้งหมดจะถูกต้องสมบูรณ์
amara

1
CoffeeScriptเป็นภาษาที่เป็นนิพจน์ทุกอย่างที่รวบรวมไปยัง JavaScript
Spoike

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

คำตอบ:


14

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

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

งบถูกใช้เพราะในกระบวนทัศน์ที่จำเป็นมีการดำเนินงานทั่วไปจำนวนมากที่ไม่มีคุณค่าของผลลัพธ์ที่เป็นประโยชน์และเนื่องจากแนวคิดของคำสั่งต่อเนื่อง(แทนที่จะคำนวณ) เหมาะกับกระบวนทัศน์นั้นค่อนข้างดี หากส่วนใหญ่ของโปรแกรมของคุณกำลังกลายพันธุ์อยู่แทนที่จะคำนวณค่าใหม่มันไม่สมเหตุสมผลเลยที่จะต้องสร้างค่า (ผลลัพธ์ของ a for for loop คืออะไร) ในทางตรงกันข้ามเมื่อกระบวนทัศน์ทั้งหมดของคุณ (FP) ถูกสร้างขึ้นจากการคำนวณค่าผู้ที่ไม่มีค่าผลลัพธ์จะไม่ได้รับการยกเว้น: แทนที่จะให้ผลลัพธ์ที่ไม่มีความหมาย


-1 สิ่งนี้ไม่เป็นความจริงเลย
amara

3
@sparkleshy ส่วนไหนไม่เป็นความจริงและอย่างไร

1
ย่อหน้าแรก: คุณสงสัยว่าความคิดที่ว่าข้อความมีค่าตอบแทนที่เป็นประโยชน์ (แต่มีหลายคน) เสนอสิ่งที่น่าเกลียด (เพราะอะไร) ย่อหน้าที่สอง: ประกาศว่าภาษาโปรแกรมที่ใช้งานได้ทั้งหมดใช้แนวความคิดที่น่าเกลียดนี้ซึ่งไร้สาระ ย่อหน้าที่สาม: เท็จเรามีที่ในบล็อก {} แล้วค่าจะถูกละเว้นและจะไม่ทำให้เกิดปัญหาใด ๆ ที่ไม่ถูกต้อง; คุณได้ให้โมฆะตามตัวอักษรของพวกเขาแล้วค่าโมฆะมีความหมายน้อยกว่านั้นอย่างไร? โดยรวม: สิ่งนี้ไม่เป็นความจริงเลย
amara

2
@sparkleshy - ไม่มีงบมีค่าผลตอบแทนที่เป็นประโยชน์นั่นเป็นเหตุผลที่พวกเขากำลังงบ อาจมีผลข้างเคียงที่เป็นประโยชน์(เช่นการมอบหมาย) แต่นั่นไม่ใช่สิ่งเดียวกัน นี่ไม่ใช่แนวคิดที่แท้จริง เป็นที่ทราบกันดีว่าหากไม่ได้ปฏิบัติจริงทั้งหมดหากเรียนในระดับ Nth และค่า Sentinel นั้นไม่ได้เป็นโมฆะหรือเป็นโมฆะมันเป็นหน่วยที่แตกต่างอย่างละเอียดจากทั้งสองอย่าง +1 สำหรับ delnan เพื่อชดเชยสิ่งนี้
Telastyn

4
@sparkleshy (1) คุณอาจสร้างความสับสนให้กับนิพจน์ (ซึ่งเป็นส่วนประกอบเดียวของคำสั่ง) ที่มีคำสั่ง (ซึ่งไม่ใช่การแสดงออกและไม่มีค่าผลลัพธ์) (2) อะไร ผู้ให้การสนับสนุนใด ๆ จะยืนยันว่า (และยืนยันว่าเป็นสิ่งที่ดี) หรือมันเป็นเพียงส่วน "ทั้งหมด" ที่คุณคัดค้าน? (3) บล็อก {} เป็นสิ่งที่ฉันกำลังพูดถึง ("แนวคิดเกี่ยวกับคำสั่งตามลำดับ") และฉันจะพูดอะไรที่ทำให้เกิดปัญหาใด ๆ ? ความแตกต่างระหว่างvoidและnull/ unitคือว่าหลังเป็นค่าและสามารถผ่านไปได้ในขณะที่voidพิเศษในที่ไม่มีค่าประเภทนั้น

5

ขึ้นอยู่กับวิธีที่คุณกำหนด "คำสั่ง" และ "การแสดงออก"

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

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

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


+1 สำหรับความคิดเห็นเกี่ยวกับความสามารถในการอ่าน ... ในที่สุดมนุษย์จำเป็นต้องเข้าใจ ...
mattnz

1

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


1

ใช่.

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

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


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