Thời gian chạy so với thời gian biên dịch


370

Sự khác biệt giữa thời gian chạy và thời gian biên dịch là gì?


Tôi đã đưa ra một ví dụ rất nhỏ nhưng rõ ràng .... Nó không đáng sợ với chi tiết lớn. Sau đó, tất cả các câu trả lời có thể được thông qua. Chúng thật tuyệt vời ...
sankar banerjee

Câu trả lời:


479

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

  1. Chương trình bất biến nào thỏa mãn?
  2. Điều gì có thể đi sai trong giai đoạn này?
  3. Nếu giai đoạn thành công, các postconditions (chúng ta biết gì)?
  4. Đầu vào và đầu ra là gì, nếu có?

Thời gian biên dịch

  1. Chương trình không cần phải thỏa mãn bất kỳ sự bất biến nào. Trong thực tế, nó không cần phải là một chương trình tốt. Bạn có thể cung cấp HTML này cho trình biên dịch và xem nó ...
  2. Điều gì có thể đi sai trong thời gian biên dịch:
    • Lỗi cú pháp
    • Lỗi đánh máy
    • (Hiếm khi) trình biên dịch gặp sự cố
  3. Nếu trình biên dịch thành công, chúng ta biết gì?
    • Chương trình được hình thành tốt --- một chương trình có ý nghĩa trong bất kỳ ngôn ngữ nào.
    • Có thể bắt đầu chạy chương trình. (Chương trình có thể thất bại ngay lập tức, nhưng ít nhất chúng ta có thể thử.)
  4. Đầu vào và đầu ra là gì?
    • Đầu vào là chương trình đang được biên dịch, cộng với bất kỳ tệp tiêu đề, giao diện, thư viện hoặc voodoo nào khác mà nó cần nhập để được biên dịch.
    • Đầu ra hy vọng là mã lắp ráp hoặc mã đối tượng có thể định vị lại hoặc thậm chí là một chương trình thực thi. Hoặc nếu có lỗi xảy ra, đầu ra là một loạt các thông báo lỗi.

Thời gian chạy

  1. Chúng ta không biết gì về bất biến của chương trình --- chúng là bất cứ thứ gì mà lập trình viên đưa vào. Các bất biến thời gian chạy hiếm khi được thực thi bởi trình biên dịch; nó cần sự giúp đỡ từ lập trình viên
  2. Những gì có thể đi sai là lỗi thời gian chạy :

    • Chia cho số không
    • Dereferences một con trỏ null
    • Hết bộ nhớ

    Ngoài ra có thể có lỗi được phát hiện bởi chính chương trình:

    • Đang cố mở một tệp không có ở đó
    • Cố gắng tìm một trang web và phát hiện ra rằng một URL bị cáo buộc không được hình thành tốt
  3. Nếu thời gian chạy thành công, chương trình kết thúc (hoặc tiếp tục) mà không gặp sự cố.
  4. Đầu vào và đầu ra hoàn toàn phụ thuộc vào lập trình viên. Tập tin, cửa sổ trên màn hình, gói mạng, công việc được gửi đến máy in, bạn đặt tên cho nó. Nếu chương trình phóng tên lửa, đó là đầu ra và nó chỉ xảy ra vào thời gian chạy :-)

13
Câu trả lời rất hay cho những gì nó bao gồm (+1) tuy nhiên bạn thậm chí không chạm vào các khía cạnh lập trình meta của thời gian biên dịch so với thời gian chạy và đó, IMHO, là phần thú vị nhất. Tôi sẽ cấp, với câu trả lời này đã được chấp nhận, rằng nó có thể nằm ngoài những gì OP đang tìm kiếm.
BCS

4
Thật tuyệt, nếu ai đó hỏi tôi về điều đó trong các bài giảng của tôi, tôi sẽ sử dụng anwser của bạn :-)
e-satis

12
Đây là câu trả lời thực sự tốt đẹp. Nó là khá rõ ràng và dễ hiểu. Không dễ để tìm thấy nhiều câu trả lời rõ ràng trong Google.
Tarik

7
Ngay cả khi bạn đã lập trình được một lúc, vẫn không dễ để có được ... đó không chỉ là người mới. Câu hỏi hay của OP.
Tích cực,

11
"Chương trình không cần phải thỏa mãn bất kỳ sự bất biến nào. Trên thực tế, nó hoàn toàn không phải là một chương trình được hình thành tốt. Bạn có thể cung cấp HTML này cho trình biên dịch và xem nó không ..." Tôi không biết bạn đang nói gì đây. Bạn có thể giải thích điều này bằng các thuật ngữ đơn giản, không tắc nghẽn với tất cả rác kỹ thuật này?
Tích cực,

175

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


59
Bây giờ đây là một cái gì đó tất cả chúng ta có thể hiểu. Không có từ công nghệ rác nói chung ở đây. Đẹp.
Tích cực,

Đối với Ứng dụng iPhone: Thời gian biên dịch có phải là lần đầu tiên mã được nhà phát triển biên dịch thành .apptiệ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?
Mật ong

1
@Honey nó được nhà phát triển biên dịch lần đầu tiên thành một .app
maytham-

2
Đây là một câu trả lời tuyệt vời, dưới cùng bao gồm sự khác biệt giữa thời gian biên dịch và thời gian chạy theo khái niệm. Tôi đánh giá cao câu trả lời học thuật, giáo sư đã được chọn là tốt, nhưng câu trả lời này là rõ ràng và súc tích. Sau khi đọc câu trả lời này, tôi có thể quay lại và đọc câu trả lời đã chọn, và nó có ý nghĩa hơn. Cảm ơn
mojave

72

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?


12
@BCS: OP có thể đã có một giới thiệu cực kỳ đơn giản về lập trình bằng cách sử dụng một ngôn ngữ được dịch hoặc biên dịch-biên dịch-sau đó chạy trong một bước để không cần phải phân biệt. Câu hỏi ngây thơ, nhưng không ngớ ngẩn.
dmckee --- ex-moderator mèo con

@dmckee: Tôi nghĩ rằng câu trả lời này thậm chí sẽ không được sử dụng cho người dùng của bạn vì nó không có nhiều nội dung thông tin hơn câu hỏi ban đầu. Bất cứ ai sẽ hỏi câu hỏi mà câu trả lời này trả lời không có lập trình kinh doanh (và tôi không nghĩ OP đã hỏi điều đó).
BCS

Tôi có một câu hỏi nhanh. Khi ai đó nói rằng một lỗi thời gian chạy thông thường đang chia cho 0 nhưng nếu bạn có một biến, hãy nói int x = 3/0như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?
Robben

Đối với Ứng dụng iPhone: Thời gian biên dịch có phải là lần đầu tiên mã được nhà phát triển biên dịch thành phần mở rộng .app 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? Nếu đó là thời gian biên dịch mà mã của nhà phát triển đang được biên dịch, thì tại sao tôi lại quan tâm đến nó? Tôi có nghĩa là điều này sẽ không ảnh hưởng đến trải nghiệm người dùng phải không? Vì nó sẽ giết thời gian dành cho nhà phát triển!
Mật ong

1
@Robben tôi cho rằng bạn đã có câu trả lời của mình sau tất cả thời gian này, nhưng tôi sẽ trả lời nó cho người khác. Có thể đó là lỗi thời gian chạy ngay cả khi bạn không sử dụng nó
فربد روري

22

( 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

Ngoại lệ. Hashtable là một nhưng tôi đã tìm thấy bước lớn nhất là .net 1.1 đến .net 2.0, đi từ bộ dữ liệu được gõ vào bộ dữ liệu (và bây giờ là linq). Cố gắng khắc phục sự cố một hình thức bị hỏng với cơ sở dữ liệu tinh ranh được sử dụng để làm cho tôi rất buồn!
Spence

19

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):

  1. Mã nguồn được đưa vào một chương trình khác (thường được gọi là trình biên dịch - hình vẽ), tạo ra một chương trình thực thi (hoặc một lỗi).
  2. Việc thực thi được chạy (bằng cách nhấp đúp vào nó hoặc nhập tên của nó trên dòng lệnh)

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ĩ)):

  1. Mã nguồn được đưa vào một chương trình khác (thường được gọi là trình thông dịch) "chạy" trực tiếp. Ở đây trình thông dịch đóng vai trò là lớp trung gian giữa chương trình của bạn và hệ điều hành (hoặc phần cứng trong các máy tính thực sự đơn giản).

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).


11

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.


Và nó dễ dàng để duy trì mã thời gian biên dịch hơn mã ràng buộc thời gian chạy. Tại thời điểm biên dịch, bạn có thể sử dụng trình biên dịch để kiểm tra một số thứ. Các công cụ tương tự trong thời gian chạy mất nhiều thời gian hơn để kiểm tra vì liên quan đến thử nghiệm.
dùng1154664

10

Hmm, ok, thời gian chạy được sử dụng để mô tả một cái gì đó xảy ra khi một chương trình đang chạy.

Thời gian biên dịch được sử dụng để mô tả một cái gì đó xảy ra khi một chương trình đang được xây dựng (thông thường, bởi một trình biên dịch).


8

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.

Sự liên quan

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.


8

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 intthà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


7

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.


5

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ệ.


4

Chỉ đơn giản là khác biệt từ b / w Biên dịch thời gian & Thời gian chạy.

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


4

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á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


2

Thời gian chạy có nghĩa là một cái gì đó xảy ra khi bạn chạy chương trình.

Biên dịch thời gian có nghĩa là một cái gì đó xảy ra khi bạn biên dịch chương trình.


2

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.


2

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.


2

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 ).


1

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 :


1

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.


1

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.


1

Sự khác biệt chính giữa thời gian chạy và thời gian biên dịch là:

  1. Nếu có bất kỳ lỗi cú pháp và kiểm tra kiểu nào trong mã của bạn, thì nó sẽ đưa ra lỗi thời gian biên dịch, trong đó là thời gian chạy: nó sẽ kiểm tra sau khi thực thi mã. Ví dụ:

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.

  1. Thời gian biên dịch không tìm kiếm đầu ra của chức năng được cung cấp bởi mã của bạn, trong khi thời gian chạy thì có.

1

đâ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.

Các tài liệu tham khảo


0

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ừ:

  1. thứ tự của hai thứ này: đầu tiên là thời gian biên dịch và sau đó bạn chạy 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à runtime: biên dịch thời gian và sau đó runtime1 biên dịch thời gian và sau đó runtime1;

CLR_diag biên dịch thời gian và sau đó runtime2  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

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây Danh sách các trình biên dịch https://en.wikipedia.org/wiki/List_of_compilersnhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

  • tìm kiếm trên google và so sánh lỗi thời gian chạy với lỗi biên dịch:

lỗi thời gian chạy

biên dịch lỗi ;

  1. Theo tôi, một điều rất quan trọng cần biết: 3.1 sự khác biệt giữa xây dựng so với biên dịch và Vòng đời xây dựng https://maven.apache.org/guides/int sinhtion / inttiontion-to-the-lifecycle.html

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.


0

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.


0

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{

}


0

Bạn có thể hiểu cấu trúc biên dịch mã từ việc đọc mã thực tế. Cấu trúc thời gian chạy không rõ ràng trừ khi bạn hiểu mô hình đã được sử dụng.


-1

Đó 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ó.


4
anh bạn những gì không phải là một câu hỏi lập trình tốt cho bạn là tất cả tương đối. Tôi nghĩ rằng đó là một câu hỏi tuyệt vời và một cái gì đó tôi muốn tìm hiểu thêm. Có, tôi biết "khái niệm" chung và thời gian biên dịch và thời gian chạy là gì nhưng tôi muốn biết nội dung xảy ra thực sự vào thời gian chạy so với thời gian biên dịch. Đó là những vấn đề quan trọng khi bạn lập trình và cần phải nhận thức được. Nó không cụ thể lắm nên đó là lý do tại sao anh ấy hỏi. Tôi ghét nó khi mọi người ngồi đây và nói những câu hỏi chung chung như thế này là vô giá trị khi chúng là một trong những câu hỏi quan trọng nhất cần nắm bắt cho bất kỳ nhà phát triển nào.
Tích cực,

1
Nếu bạn không thấy giá trị trong một câu hỏi, đó là vấn đề của bạn. Nếu nó nói chung, có một lý do cho nó. Chỉ vì bạn không thích những câu hỏi chung chung không có nghĩa là thế giới xoay quanh những gì bạn nghĩ là hữu ích. Anh ta có một ý định nhất định khi hỏi điều này và anh ta muốn có một loạt các câu trả lời để hiểu rõ hơn và xác định cả hai. Hiểu rồi?
Tích cực,
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.