Sự khác biệt giữa REPL và shell tương tác


37

Câu hỏi của Noob. Tôi không hoàn toàn có thể nói sự khác biệt giữa REPLshell tương tác chỉ bằng cách đọc các định nghĩa trên Wikipedia.

Wiki lưu ý rằng REPL là một loại vỏ ngôn ngữ tương tác cụ thể . Nó có phải là một tập hợp con đúng không? Định nghĩa Wiki dường như hạn chế thuật ngữ REPL đối với các ngôn ngữ giống Lisp, trong khi các thuộc tính đã nêu không thực sự chứa bất kỳ tính năng phân biệt nào.

Cụ thể, liệu có đúng khi gọi IPython là REPL không?

Câu trả lời:


24

REPL: Đây là một thủ tục chỉ lặp, chấp nhận một lệnh tại một thời điểm, thực hiện nó và in kết quả.

Ba bước tại mỗi lần lặp của vòng lặp là:

  1. Gọi đọc để đọc các ký tự tạo thành biểu thức văn bản từ bộ đệm đầu vào bàn phím và xây dựng cấu trúc dữ liệu để thể hiện nó,
  2. Gọi eval để đánh giá biểu thức - bằng trực giác, eval "tìm ra ý nghĩa của biểu thức" và "thực hiện những gì nó nói", trả về giá trị của biểu thức - và
  3. Gọi viết để in một văn bản đại diện của kết quả từ eval, để người dùng có thể nhìn thấy nó.

Bạn có thể viết vòng lặp đọc-in của riêng mình cho các chương trình của riêng bạn, để người dùng có thể nhập biểu thức và bạn có thể diễn giải chúng theo bất kỳ cách nào bạn muốn. Bạn có thể khởi động vòng lặp đọc-in của mình (bằng cách nhập vào (vòng lặp lặp lại)) và nó sẽ tiếp quản từ vòng lặp đọc-in sơ đồ thông thường, diễn giải các biểu thức theo cách của bạn.

Đây là một vòng lặp đọc-in rất đơn giản:

  (define (rep-loop)
  (display "repl>")      ; print a prompt
  (write (eval (read)))  ; read expr., pass to eval, write result
  (rep-loop))            ; loop (tail-recursive call) to do it again

Lưu ý rằng biểu thức (write (eval (read))) thực hiện mọi thứ theo thứ tự đọc-eval-print thích hợp, bởi vì đối số cho mỗi lệnh gọi thủ tục được tính trước cuộc gọi thực tế.

Shell tương tác: Shell tương tác đọc các lệnh từ đầu vào của người dùng trên thiết bị đầu cuối. Trong số những thứ khác, shell như vậy đọc các tệp khởi động khi kích hoạt, hiển thị lời nhắc và cho phép kiểm soát công việc theo mặc định. Người dùng có thể tương tác với shell. Đó là cách tên shell tương tác ra đời. Hãy để chúng tôi xem xét kịch bản bash này:

     #!/bin/bash
     echo -n "Enter the value of variable 'var1': "
     read var1
     echo "var1 = $var1"
     echo

    echo -n "Enter the values of variables 'var2' and 'var3' "
    echo =n "(separated by a space or tab): "
    read var2 var3
    echo "var2 = $var2      var3 = $var3"
    #  If you input only one value,
    #+ the other variable(s) will remain unset (null).

    exit 0

Bây giờ đoạn script trên tương tác với người dùng, nó yêu cầu người dùng nhập các đầu vào dựa trên đó nó thực hiện các phép tính của nó. Đó là lý do tại sao nó hoạt động như một vỏ tương tác.

Similary, trình thông dịch python mà hầu hết mọi người sử dụng để học python là một trình tương tác khi nó giao tiếp với người dùng của nó.


1
@ The Dark Knight: Vì vậy, dựa trên lý thuyết trên, chúng ta có thể nói rằng thanh công cụ dành cho nhà phát triển (bằng chrome) hoặc phần mở rộng firebird (trong firefox) là REPL không?
Rajkishore

9

Về mặt kỹ thuật, thật đúng khi nói rằng shell là một thể hiện của REPL. Tuy nhiên, đó không phải là vấn đề định nghĩa chương trình vì đây là một trong những tình huống sử dụng phổ biến.

Bash, ví dụ, được viết bằng C, nhưng nó cũng có thể được viết bằng Python. Vào thời điểm đó, nếu bạn nói về các tính năng và khả năng của chương trình, liệu có đúng không khi nói rằng Bash là một cái vỏ trong khi Python thì không?

Bạn cũng có thể nói rằng Shell là về việc chạy các lệnh trong khi REPL là về việc chạy các lệnh và chức năng gọi. Nhưng bạn không thể chạy các lệnh trong REPLs (Python's os.system, os.popen, v.v.) và bạn không thể chạy (hoặc xác định) các hàm trong Bash, bằng cách sử dụng nhiều hàm dựng sẵn của nó?

Như đã nói ở trên, đó là vấn đề sử dụng. Nếu bạn sắp xếp các tệp và chương trình làm sẵn, bạn đang sử dụng nó làm vỏ. Nếu bạn đang kiểm tra thư viện hoặc ngữ nghĩa ngôn ngữ, thì đó là REPL.

Mong rằng sẽ giúp.


3

Câu hỏi StackOverflow này thảo luận về chính câu hỏi đó (trong số những thứ khác).

Tôi là cá nhân trên hàng rào liên quan đến Python tương tác. Nhưng, nếu bạn muốn gọi nó là REPL, tôi không nghĩ ai sẽ tức giận với bạn (có quá nhiều thứ hoạt động trong các tệp mã nguồn, nhưng không phải trong vỏ tương tác để tôi hoàn toàn hài lòng với việc gọi đó là một REPL).


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.