Câu trả lời:
Sự khác biệt giữa thời gian biên dịch và thời gian chạy là một ví dụ về cái mà các nhà lý thuyết đầu nhọn gọi là phân biệt pha . Đây là một trong những khái niệm khó học nhất, đặc biệt là đối với những người không có nhiều nền tảng về ngôn ngữ lập trình. Để tiếp cận vấn đề này, tôi thấy hữu ích khi hỏi
Những gì có thể đi sai là lỗi thời gian chạy :
Ngoài ra có thể có lỗi được phát hiện bởi chính chương trình:
Tôi nghĩ về điều đó về các lỗi, và khi chúng có thể bị bắt.
Thời gian biên dịch:
string my_value = Console.ReadLine();
int i = my_value;
Một giá trị chuỗi không thể được chỉ định một biến kiểu int, vì vậy trình biên dịch biết chắc chắn tại thời điểm biên dịch rằng mã này có vấn đề
Thời gian chạy:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Ở đây kết quả phụ thuộc vào chuỗi nào được trả về bởi ReadLine (). Một số giá trị có thể được phân tích thành int, một số khác thì không. Điều này chỉ có thể được xác định tại thời gian chạy
.app
tiện ích mở rộng không? hoặc nó xảy ra khi khởi chạy bởi mỗi khi người dùng khởi động ứng dụng?
Compile-time: khoảng thời gian mà bạn, nhà phát triển, đang biên dịch mã của bạn.
Run-time: khoảng thời gian mà người dùng đang chạy phần mềm của bạn.
Bạn có cần bất kỳ định nghĩa rõ ràng hơn?
int x = 3/0
nhưng bạn không làm gì với biến này. Chúng tôi không in nó hoặc bất cứ điều gì. Điều đó vẫn sẽ được coi là một lỗi thời gian chạy?
( chỉnh sửa : những điều sau đây áp dụng cho C # và các ngôn ngữ lập trình được gõ mạnh tương tự. Tôi không chắc điều này có giúp gì cho bạn không).
Ví dụ, lỗi sau sẽ được trình biên dịch phát hiện (tại thời gian biên dịch ) trước khi bạn chạy chương trình và sẽ dẫn đến lỗi biên dịch:
int i = "string"; --> error at compile-time
Mặt khác, trình biên dịch không thể phát hiện ra lỗi như sau. Bạn sẽ nhận được một lỗi / ngoại lệ tại thời gian chạy (khi chương trình đang chạy).
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
Dịch mã nguồn thành công cụ xảy ra trên màn hình [đĩa | đĩa | mạng] có thể xảy ra theo (khoảng) hai cách; gọi họ biên dịch và giải thích.
Trong một chương trình được biên dịch (ví dụ là c và fortran):
Những điều xảy ra trong bước đầu tiên được cho là xảy ra vào "thời gian biên dịch", những điều xảy ra trong bước thứ hai được cho là xảy ra vào "thời gian chạy".
Trong một chương trình diễn giải (ví dụ MicroSoft basic (on dos) và python (tôi nghĩ)):
Trong trường hợp này, sự khác biệt giữa thời gian biên dịch và thời gian chạy khá khó để xác định và ít liên quan hơn đến lập trình viên hoặc người dùng.
Java là một loại lai, trong đó mã được biên dịch thành mã byte, sau đó chạy trên một máy ảo thường là trình thông dịch cho mã byte.
Ngoài ra còn có một trường hợp trung gian trong đó chương trình được biên dịch thành mã byte và chạy ngay lập tức (như trong awk hoặc perl).
Về cơ bản nếu trình biên dịch của bạn có thể hiểu được ý của bạn hoặc giá trị là "tại thời điểm biên dịch" thì nó có thể mã hóa phần này thành mã thời gian chạy. Rõ ràng nếu mã thời gian chạy của bạn phải thực hiện một phép tính mỗi lần nó sẽ chạy chậm hơn, vì vậy nếu bạn có thể xác định một cái gì đó tại thời gian biên dịch thì tốt hơn nhiều.
Ví dụ.
Gấp liên tục:
Nếu tôi viết:
int i = 2;
i += MY_CONSTANT;
Trình biên dịch có thể thực hiện phép tính này tại thời gian biên dịch vì nó biết 2 là gì và MY_CONSTANT là gì. Như vậy, nó tự lưu từ việc thực hiện một phép tính mỗi lần thực hiện.
Những thứ được thực hiện trong thời gian biên dịch phát sinh (gần như) không mất chi phí khi chương trình kết quả được chạy, nhưng có thể phải chịu một chi phí lớn khi bạn xây dựng chương trình.
Nhiều hay ít thì ngược lại. Ít chi phí khi bạn xây dựng, chi phí nhiều hơn khi chương trình được chạy.
Từ phía bên kia; Nếu một cái gì đó được thực hiện tại thời gian biên dịch, nó chỉ chạy trên máy của bạn và nếu một cái gì đó là thời gian chạy, nó sẽ chạy trên máy người dùng của bạn.
Một ví dụ về nơi điều này quan trọng sẽ là một loại mang đơn vị. Phiên bản thời gian biên dịch (như Boost.Units hoặc phiên bản của tôi trong D ) kết thúc nhanh như giải quyết vấn đề với mã dấu phẩy động gốc trong khi phiên bản thời gian chạy kết thúc phải đóng gói thông tin về các đơn vị có giá trị trong và thực hiện kiểm tra trong chúng cùng với mọi hoạt động. Mặt khác, các phiên bản thời gian biên dịch yêu cầu các đơn vị của các giá trị được biết tại thời điểm biên dịch và không thể xử lý trường hợp chúng đến từ đầu vào thời gian chạy.
Sau câu trả lời tương tự trước đó của câu hỏi Sự khác biệt giữa lỗi thời gian chạy và lỗi trình biên dịch là gì?
Biên dịch / Thời gian biên dịch / Cú pháp / Lỗi ngữ nghĩa: Lỗi thời gian biên dịch hoặc biên dịch là lỗi do lỗi đánh máy, nếu chúng ta không tuân theo cú pháp và ngữ nghĩa thích hợp của bất kỳ ngôn ngữ lập trình nào thì trình biên dịch sẽ bị lỗi do trình biên dịch. Họ sẽ không để chương trình của bạn thực thi một dòng duy nhất cho đến khi bạn loại bỏ tất cả các lỗi cú pháp hoặc cho đến khi bạn gỡ lỗi các lỗi thời gian biên dịch.
Ví dụ: Thiếu dấu chấm phẩy trong C hoặc nhập sai int
thành Int
.
Lỗi thời gian chạy: Lỗi thời gian chạy là lỗi được tạo khi chương trình ở trạng thái chạy. Những loại lỗi này sẽ khiến chương trình của bạn hoạt động bất ngờ hoặc thậm chí có thể giết chết chương trình của bạn. Chúng thường được gọi là Ngoại lệ.
Ví dụ: Giả sử bạn đang đọc một tệp không tồn tại, sẽ dẫn đến lỗi thời gian chạy.
Tìm hiểu thêm về tất cả các lỗi lập trình ở đây
Là một phần bổ sung cho các câu trả lời khác, đây là cách tôi giải thích nó với một giáo dân:
Mã nguồn của bạn giống như bản thiết kế của một con tàu. Nó xác định cách thức con tàu nên được thực hiện.
Nếu bạn giao bản thiết kế của mình cho xưởng đóng tàu và họ phát hiện ra khuyết điểm trong khi đóng tàu, họ sẽ dừng việc xây dựng và báo cáo cho bạn ngay lập tức, trước khi con tàu rời khỏi ụ tàu hoặc chạm vào nước. Đây là một lỗi thời gian biên dịch. Con tàu thậm chí không bao giờ thực sự nổi hoặc sử dụng động cơ của nó. Lỗi được tìm thấy vì nó ngăn cản con tàu thậm chí được thực hiện.
Khi mã của bạn biên dịch, nó giống như con tàu đang được hoàn thành. Được xây dựng và sẵn sàng để đi. Khi bạn thực thi mã của mình, điều đó giống như khởi động con tàu trong một chuyến đi. Các hành khách đã lên máy bay, các động cơ đang chạy và thân tàu đang ở trên mặt nước, vì vậy đây là thời gian chạy. Nếu con tàu của bạn có một lỗ hổng nghiêm trọng khiến nó chìm trong hành trình đầu tiên của nó (hoặc có thể là một số chuyến đi sau khi bị đau đầu thêm) thì nó đã bị lỗi thời gian chạy.
Ví dụ: Trong một ngôn ngữ được gõ mạnh, một loại có thể được kiểm tra tại thời gian biên dịch hoặc tại thời gian chạy. Tại thời điểm biên dịch, điều đó có nghĩa là trình biên dịch sẽ phàn nàn nếu các loại không tương thích. Trong thời gian chạy có nghĩa là bạn có thể biên dịch chương trình của mình tốt nhưng trong thời gian chạy, nó sẽ ném một ngoại lệ.
thời gian biên dịch: Nhà phát triển viết chương trình ở định dạng .java và chuyển đổi thành Mã byte là tệp lớp, trong quá trình biên dịch này, bất kỳ lỗi nào xảy ra đều có thể được định nghĩa là lỗi thời gian biên dịch.
Thời gian chạy: Tệp. Class được tạo được ứng dụng sử dụng cho chức năng bổ sung của nó & logic hóa ra là sai và đưa ra lỗi là lỗi thời gian chạy
Dưới đây là trích dẫn của Daniel Liang, tác giả của 'Giới thiệu về lập trình JAVA', về chủ đề biên soạn:
"Một chương trình được viết bằng ngôn ngữ cấp cao được gọi là chương trình nguồn hoặc mã nguồn. Bởi vì máy tính không thể thực thi chương trình nguồn, chương trình nguồn phải được dịch sang mã máy để thực thi . Có thể thực hiện dịch bằng công cụ lập trình khác một thông dịch viên hoặc một trình biên dịch . " (Daniel Liang, "Giới thiệu về lập trình JAVA" , tr8).
...Ông tiếp tục...
"Trình biên dịch dịch toàn bộ mã nguồn thành tệp mã máy và tệp mã máy sau đó được thực thi"
Khi chúng ta đấm vào mã cấp cao / con người có thể đọc được, lúc đầu, nó vô dụng! Nó phải được dịch thành một chuỗi 'sự kiện điện tử' trong CPU nhỏ bé của bạn! Bước đầu tiên hướng tới điều này là biên soạn.
Nói một cách đơn giản: một lỗi thời gian biên dịch xảy ra trong giai đoạn này, trong khi lỗi thời gian chạy xảy ra sau đó.
Hãy nhớ rằng: Chỉ vì một chương trình được biên dịch không có lỗi không có nghĩa là nó sẽ chạy mà không có lỗi.
Lỗi thời gian chạy sẽ xảy ra trong phần sẵn sàng, đang chạy hoặc chờ của vòng đời chương trình trong khi lỗi thời gian biên dịch sẽ xảy ra trước giai đoạn 'Mới' của vòng đời.
Ví dụ về lỗi thời gian biên dịch:
Lỗi Cú pháp - làm thế nào mã của bạn có thể được biên dịch thành các hướng dẫn cấp độ máy nếu chúng không rõ ràng ?? Mã của bạn cần tuân thủ 100% với các quy tắc cú pháp của ngôn ngữ nếu không nó không thể được biên dịch thành mã máy làm việc .
Ví dụ về lỗi thời gian chạy:
Hết bộ nhớ - Ví dụ, một cuộc gọi đến một hàm đệ quy có thể dẫn đến tràn ngăn xếp với một biến có mức độ cụ thể! Làm thế nào điều này có thể được dự đoán bởi trình biên dịch!? nó không thể.
Và đó là sự khác biệt giữa lỗi thời gian biên dịch và lỗi thời gian chạy
Thời gian biên dịch:
Những thứ được thực hiện trong thời gian biên dịch phát sinh (gần như) không mất chi phí khi chương trình kết quả được chạy, nhưng có thể phải chịu một chi phí lớn khi bạn xây dựng chương trình. Thời gian thực hiện:
Nhiều hay ít thì ngược lại. Ít chi phí khi bạn xây dựng, chi phí nhiều hơn khi chương trình được chạy.
Từ phía bên kia; Nếu một cái gì đó được thực hiện tại thời gian biên dịch, nó chỉ chạy trên máy của bạn và nếu một cái gì đó là thời gian chạy, nó sẽ chạy trên máy người dùng của bạn.
Thời gian biên dịch: Thời gian thực hiện để chuyển đổi mã nguồn thành mã máy để nó trở thành một tệp thực thi được gọi là thời gian biên dịch.
Thời gian chạy: Khi một ứng dụng đang chạy, nó được gọi là thời gian chạy.
Biên dịch lỗi thời gian là những lỗi cú pháp, thiếu lỗi tham chiếu tệp. Lỗi thời gian chạy xảy ra sau khi mã nguồn đã được biên dịch thành chương trình thực thi và trong khi chương trình đang chạy. Ví dụ là sự cố chương trình, hành vi chương trình không mong muốn hoặc các tính năng không hoạt động.
Hãy tưởng tượng rằng bạn là một ông chủ và bạn có một trợ lý và một người giúp việc, và bạn đưa cho họ một danh sách các nhiệm vụ phải làm, trợ lý (biên dịch thời gian) sẽ lấy danh sách này và kiểm tra xem các nhiệm vụ có dễ hiểu không và bạn đã không viết bằng bất kỳ ngôn ngữ hoặc cú pháp khó xử nào, vì vậy anh ta hiểu rằng bạn muốn giao ai đó cho Công việc nên anh ta giao anh ta cho bạn và anh ta hiểu rằng bạn muốn uống cà phê, vì vậy vai trò của anh ta đã hết và người giúp việc (hết giờ) bắt đầu thực hiện những nhiệm vụ đó để cô ấy pha cà phê cho bạn, nhưng đột nhiên cô ấy không tìm thấy bất kỳ loại cà phê nào để cô ấy ngừng làm nó hoặc cô ấy hành động khác và pha cho bạn một tách trà (khi chương trình hoạt động khác đi vì anh ấy thấy có lỗi ).
Dưới đây là phần mở rộng cho Câu trả lời cho câu hỏi "sự khác biệt giữa thời gian chạy và thời gian biên dịch?" - Sự khác nhau về tổng phí liên quan đến thời gian chạy và thời gian biên dịch?
Hiệu suất thời gian chạy của sản phẩm đóng góp vào chất lượng của nó bằng cách cung cấp kết quả nhanh hơn. Hiệu suất thời gian biên dịch của sản phẩm góp phần vào tính kịp thời của nó bằng cách rút ngắn chu trình chỉnh sửa-biên dịch-gỡ lỗi. Tuy nhiên, cả hiệu suất thời gian chạy và hiệu suất thời gian biên dịch là các yếu tố phụ trong việc đạt được chất lượng kịp thời. Do đó, người ta chỉ nên xem xét cải tiến hiệu suất thời gian chạy và thời gian biên dịch khi được chứng minh bằng những cải tiến về chất lượng và tính kịp thời của sản phẩm.
Một nguồn tuyệt vời để đọc thêm ở đây :
Tôi đã luôn nghĩ về nó liên quan đến chi phí xử lý chương trình và làm thế nào nó ảnh hưởng đến sự phù hợp như đã nêu trước đây. Một ví dụ đơn giản sẽ là, xác định bộ nhớ tuyệt đối cần thiết cho đối tượng của tôi trong mã hay không.
Một boolean được xác định sẽ lấy x bộ nhớ, sau đó trong chương trình được biên dịch và không thể thay đổi. Khi chương trình chạy, nó biết chính xác dung lượng bộ nhớ để phân bổ cho x.
Mặt khác, nếu tôi chỉ xác định một loại đối tượng chung (nghĩa là loại giữ chỗ không xác định hoặc có thể là một con trỏ tới một số blob khổng lồ) thì bộ nhớ thực sự cần thiết cho đối tượng của tôi không được biết cho đến khi chương trình được chạy và tôi gán một cái gì đó cho nó , do đó, nó phải được đánh giá và phân bổ bộ nhớ, v.v. sau đó sẽ được xử lý linh hoạt trong thời gian chạy (chi phí thời gian chạy nhiều hơn).
Làm thế nào nó được xử lý động sau đó sẽ phụ thuộc vào ngôn ngữ, trình biên dịch, hệ điều hành, mã của bạn, v.v.
Tuy nhiên, trên lưu ý đó thực sự sẽ phụ thuộc vào bối cảnh bạn đang sử dụng thời gian chạy so với thời gian biên dịch.
chúng ta có thể phân loại chúng theo hai nhóm khác nhau ràng buộc tĩnh và ràng buộc động. Nó dựa trên thời điểm ràng buộc được thực hiện với các giá trị tương ứng. Nếu các tham chiếu được giải quyết tại thời gian biên dịch, thì đó là liên kết tĩnh và nếu các tham chiếu được giải quyết trong thời gian chạy thì đó là liên kết động. Liên kết tĩnh và liên kết động cũng được gọi là liên kết sớm và ràng buộc muộn. Đôi khi chúng còn được gọi là đa hình tĩnh và đa hình động.
Joseph Kulandai.
Sự khác biệt chính giữa thời gian chạy và thời gian biên dịch là:
int a = 1
int b = a/0;
ở đây dòng đầu tiên không có dấu chấm phẩy ở cuối ---> biên dịch lỗi thời gian sau khi thực hiện chương trình trong khi thực hiện thao tác b, kết quả là vô hạn ---> lỗi thời gian chạy.
đây là một câu trả lời rất đơn giản:
Thời gian chạy và thời gian biên dịch là các thuật ngữ lập trình đề cập đến các giai đoạn phát triển chương trình phần mềm khác nhau. Để tạo chương trình, trước tiên, nhà phát triển viết mã nguồn, định nghĩa chương trình sẽ hoạt động như thế nào. Các chương trình nhỏ chỉ có thể chứa vài trăm dòng mã nguồn, trong khi các chương trình lớn có thể chứa hàng trăm nghìn dòng mã nguồn. Mã nguồn phải được biên dịch thành mã máy để trở thành chương trình thực thi. Quá trình biên dịch này được gọi là thời gian biên dịch. (Hãy nghĩ về trình biên dịch như một dịch giả)
Một chương trình được biên dịch có thể được mở và chạy bởi người dùng. Khi một ứng dụng đang chạy, nó được gọi là thời gian chạy.
Các thuật ngữ "thời gian chạy" và "thời gian biên dịch" thường được các lập trình viên sử dụng để chỉ các loại lỗi khác nhau. Lỗi thời gian biên dịch là một vấn đề như lỗi cú pháp hoặc thiếu tham chiếu tệp khiến chương trình không thể biên dịch thành công. Trình biên dịch tạo ra các lỗi thời gian biên dịch và thường chỉ ra dòng mã nguồn nào gây ra sự cố.
Nếu mã nguồn của chương trình đã được biên dịch thành chương trình thực thi, nó vẫn có thể có lỗi xảy ra trong khi chương trình đang chạy. Ví dụ bao gồm các tính năng không hoạt động, hành vi chương trình không mong muốn hoặc sự cố chương trình. Những loại vấn đề này được gọi là lỗi thời gian chạy vì chúng xảy ra trong thời gian chạy.
IMHO bạn cần đọc nhiều liên kết, tài nguyên để đưa ra ý tưởng về sự khác biệt giữa thời gian chạy so với thời gian biên dịch vì đây là một chủ đề rất phức tạp. Tôi có danh sách bên dưới một số hình ảnh / liên kết này mà tôi đề nghị.
Ngoài những gì được nói ở trên, tôi muốn thêm rằng đôi khi một bức tranh trị giá 1000 từ:
CLR_diag biên dịch thời gian và sau đó runtime2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
Thời gian chạy, thời gian chạy hoặc thời gian chạy có thể tham khảo:
Tin học
Thời gian chạy (giai đoạn vòng đời chương trình) , khoảng thời gian mà chương trình máy tính đang thực thi
Thư viện thời gian chạy , thư viện chương trình được thiết kế để thực hiện các chức năng được tích hợp trong ngôn ngữ lập trình
Hệ thống thời gian chạy , phần mềm được thiết kế để hỗ trợ thực hiện các chương trình máy tính
Thực thi phần mềm, quá trình thực hiện từng hướng dẫn trong giai đoạn chạy
Danh sách các trình biên dịch https://en.wikipedia.org/wiki/List_of_compilers
;
3.2 sự khác biệt giữa 3 điều này: biên dịch so với xây dựng và thời gian chạy
https://www.quora.com/What-is-the-difference-b between-build-run-and-compile Fernando Padoan, Một nhà phát triển chỉ hơi tò mò về thiết kế ngôn ngữ Đã trả lời vào ngày 23 tháng 2 cho câu trả lời khác:
đang chạy sẽ nhận được một số thực thi nhị phân (hoặc một tập lệnh, đối với các ngôn ngữ được dịch), được thực hiện tốt như một quy trình mới trên máy tính; biên dịch là quá trình phân tích cú pháp một chương trình được viết bằng một số ngôn ngữ cấp cao (cao hơn so với mã máy), kiểm tra cú pháp, ngữ nghĩa, liên kết thư viện, có thể thực hiện một số tối ưu hóa, sau đó tạo chương trình thực thi nhị phân làm đầu ra. Việc thực thi này có thể ở dạng mã máy hoặc một loại mã byte - nghĩa là hướng dẫn nhắm mục tiêu một số loại máy ảo; việc xây dựng thường bao gồm kiểm tra và cung cấp các phụ thuộc, kiểm tra mã, biên dịch mã thành nhị phân, chạy kiểm tra tự động và đóng gói nhị phân kết quả và các tài sản khác (hình ảnh, tệp cấu hình, thư viện, v.v.) vào một số định dạng cụ thể của tệp có thể triển khai. Lưu ý rằng hầu hết các quy trình là tùy chọn và một số phụ thuộc vào nền tảng được nhắm mục tiêu mà bạn đang xây dựng. Ví dụ, đóng gói một ứng dụng Java cho Tomcat sẽ xuất ra tệp .war. Xây dựng một mã thực thi Win32 từ mã C ++ chỉ có thể xuất chương trình .exe hoặc cũng có thể đóng gói nó trong trình cài đặt .msi.
Nhìn vào ví dụ này:
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
Đoạn mã trên được biên dịch thành công, không có lỗi cú pháp, nó hoàn toàn hợp lệ. Nhưng tại thời điểm chạy, nó ném lỗi sau.
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
Giống như khi trong thời gian biên dịch, một số trường hợp đã được kiểm tra, sau thời gian chạy đó, một số trường hợp đã được kiểm tra một khi chương trình đáp ứng tất cả các điều kiện bạn sẽ nhận được đầu ra. Nếu không, bạn sẽ nhận được thời gian biên dịch hoặc lỗi thời gian chạy.
lớp công khai RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
Đó không phải là một câu hỏi hay cho SO (nó không phải là một câu hỏi lập trình cụ thể), nhưng nói chung nó không phải là một câu hỏi tồi.
Nếu bạn nghĩ nó tầm thường: thế còn thời gian đọc so với thời gian biên dịch, và khi nào thì đây là một sự khác biệt hữu ích để thực hiện? Điều gì về các ngôn ngữ mà trình biên dịch có sẵn trong thời gian chạy? Guy Steele (không có hình nộm, anh) đã viết 7 trang trong CLTL2 về EVAL-WHEN, mà các lập trình viên CL có thể sử dụng để kiểm soát điều này. 2 câu chỉ đủ cho một định nghĩa , mà bản thân nó còn thiếu một lời giải thích .
Nói chung, đó là một vấn đề khó khăn mà các nhà thiết kế ngôn ngữ dường như cố gắng tránh. Họ thường chỉ nói "đây là một trình biên dịch, nó thực hiện mọi thứ trong thời gian biên dịch; mọi thứ sau đó là thời gian chạy, hãy vui vẻ". C được thiết kế đơn giản để thực hiện, không phải là môi trường linh hoạt nhất để tính toán. Khi bạn không có trình biên dịch có sẵn trong thời gian chạy hoặc khả năng dễ dàng kiểm soát khi biểu thức được đánh giá, bạn có xu hướng kết thúc bằng các bản hack trong ngôn ngữ để sử dụng macro phổ biến giả hoặc người dùng đưa ra Mô hình thiết kế để mô phỏng có cấu trúc mạnh hơn. Một ngôn ngữ dễ thực hiện chắc chắn có thể là một mục tiêu đáng giá, nhưng điều đó không có nghĩa đó là ngôn ngữ cuối cùng của thiết kế ngôn ngữ lập trình. (Tôi không sử dụng EVAL-WHEN nhiều, nhưng tôi không thể tưởng tượng cuộc sống mà không có nó.)
Và không gian vấn đề xung quanh thời gian biên dịch và thời gian chạy là rất lớn và phần lớn vẫn chưa được khám phá. Điều đó không có nghĩa là SO là nơi thích hợp để thảo luận, nhưng tôi khuyến khích mọi người khám phá lãnh thổ này hơn nữa, đặc biệt là những người không có định kiến về những gì nó nên có. Câu hỏi không đơn giản cũng không ngớ ngẩn, và ít nhất chúng ta có thể chỉ ra người điều tra đi đúng hướng.
Thật không may, tôi không biết bất kỳ tài liệu tham khảo tốt về điều này. CLTL2 nói về nó một chút, nhưng nó không tuyệt vời để tìm hiểu về nó.