Tại sao một phương thức chính tĩnh trong Java và C #, chứ không phải là một hàm tạo?


54

Tôi đang tìm kiếm một câu trả lời dứt khoát từ một nguồn chính hoặc phụ cho lý do tại sao (đáng chú ý) Java và C # quyết định có một phương thức tĩnh làm điểm vào của chúng, thay vì đại diện cho một cá thể ứng dụng bằng một thể hiện của một Applicationlớp (với điểm vào là một nhà xây dựng thích hợp).


Bối cảnh và chi tiết nghiên cứu trước đây của tôi

Điều này đã được hỏi trước đây. Thật không may, các câu trả lời hiện tại chỉ đơn thuần là cầu xin câu hỏi . Cụ thể, các câu trả lời sau đây không thỏa mãn tôi, vì tôi cho rằng chúng không chính xác:

  • Sẽ có sự mơ hồ nếu các nhà xây dựng bị quá tải. - Trên thực tế, C # (cũng như C và C ++) cho phép các chữ ký khác nhau cho Maincùng một sự mơ hồ tiềm năng tồn tại và được xử lý.
  • Một staticphương thức có nghĩa là không có đối tượng nào có thể được khởi tạo trước vì vậy thứ tự khởi tạo là rõ ràng. - Điều này thực sự sai, một số đối tượng được khởi tạo trước (ví dụ: trong một hàm tạo tĩnh).
  • Vì vậy, chúng có thể được gọi bởi bộ thực thi mà không cần phải khởi tạo một đối tượng cha. - Đây không phải là câu trả lời nào cả.

Chỉ để biện minh thêm tại sao tôi nghĩ rằng đây là một câu hỏi hợp lệ và thú vị:

  • Nhiều khuôn khổ làm sử dụng các lớp học để đại diện cho các ứng dụng, và nhà thầu như điểm nhập cảnh. Ví dụ, khung ứng dụng VB.NET sử dụng hộp thoại chính chuyên dụng (và hàm tạo của nó) làm điểm vào 1 .

  • Cả Java và C # về mặt kỹ thuật đều không cần một phương thức chính. Chà, C # cần một cái để biên dịch, nhưng Java thậm chí không như vậy. Và trong cả hai trường hợp là không cần thiết để thực hiện. Vì vậy, điều này dường như không phải là một hạn chế kỹ thuật. Và, như tôi đã đề cập trong đoạn đầu tiên, đối với một quy ước đơn thuần, nó dường như không phù hợp với nguyên tắc thiết kế chung của Java và C #.

Rõ ràng, không có một bất lợi cụ thể nào khi có một mainphương pháp tĩnh , nó thật kỳ quặc , khiến tôi tự hỏi liệu có một lý do kỹ thuật nào đó đằng sau nó không.

Tôi quan tâm đến một câu trả lời dứt khoát từ một nguồn chính hoặc phụ, không chỉ là suy đoán.


1 Mặc dù có một cuộc gọi lại ( Startup) có thể chặn điều này.


4
@mjfgates Ngoài ra, tôi đã hy vọng đã nói rõ rằng đây không chỉ đơn giản là tại sao mọi người không làm theo cách tôi muốn, và tôi thực sự quan tâm đến lý do.
Konrad Rudolph

2
Đối với Java tôi nghĩ rằng lý do rất đơn giản: Khi phát triển Java, họ biết rằng hầu hết mọi người học ngôn ngữ sẽ biết trước C / C ++. Do đó, Java không chỉ trông rất giống C / C ++ thay vì nói smalltalk, mà còn chiếm lĩnh cả idiosynchrasies từ C / C ++ (chỉ cần nghĩ về các số nguyên bát phân). Vì cả c / c ++ đều sử dụng một phương thức chính, làm tương tự cho java có ý nghĩa từ quan điểm đó.
Voo

5
@Jarrod Bạn không công bằng. Tôi nghĩ rằng tôi đã làm cho nó khá rõ ràng không thành một cơn thịnh nộ. Mùi không mang tính xây dựng? Làm sao vậy Tôi rõ ràng yêu cầu tài liệu tham khảo, không chỉ các cuộc thảo luận hoang dã. Bạn tất nhiên là không đồng ý rằng đây là một câu hỏi thú vị . Nhưng nếu loại câu hỏi này là OT ở đây, tôi thực sự thất bại trong việc xem các lập trình viên có mục đích gì.
Konrad Rudolph

2
Thảo luận về Meta có liên quan .
yannis

3
Câu hỏi: Nếu là đối tượng ứng dụng, bạn không cần hai thứ. 1) Một nhà xây dựng. 2) Một phương thức trên đối tượng để chạy ứng dụng của bạn. Hàm tạo phải hoàn thành để đối tượng hợp lệ và do đó có thể chạy được.
Martin York

Câu trả lời:


38

TL; DR

Trong Java, lý do public static void main(String[] args)

  1. Mong muốn
  2. mã được viết bởi một người có kinh nghiệm về C (không phải bằng Java)
  3. được thực thi bởi ai đó đã từng chạy PostScript trên NeWS

http://i.stack.imgur.com/qcmzP.png

 
Đối với C #, lý do tương tự quá mức để nói. Các nhà thiết kế ngôn ngữ giữ cú pháp điểm nhập chương trình quen thuộc với các lập trình viên đến từ Java. Như kiến ​​trúc sư C #, Anders Hejlsberg ,

... Cách tiếp cận của chúng tôi với C # đơn giản là cung cấp một giải pháp thay thế ... cho các lập trình viên Java ...

 

Phiên bản dài

mở rộng ở trên và sao lưu với các tài liệu tham khảo nhàm chán.

 

Kẻ hủy diệt java Hasta la vista Em yêu!

VM Spec, Khởi động máy ảo 2.17.1

... Cách thức mà lớp ban đầu được chỉ định cho máy ảo Java nằm ngoài phạm vi của đặc tả này, nhưng thông thường, trong các môi trường máy chủ sử dụng các dòng lệnh, cho tên đủ điều kiện của lớp được chỉ định là một đối số dòng lệnh và cho các đối số dòng lệnh tiếp theo được sử dụng làm chuỗi được cung cấp làm đối số cho phương thức chính. Ví dụ: sử dụng SDK Java 2 của Sun cho Solaris, dòng lệnh

java Terminator Hasta la vista Baby!

sẽ khởi động một máy ảo Java bằng cách gọi phương thức chính của lớp Terminator(một lớp trong gói không tên) và truyền cho nó một mảng chứa bốn chuỗi "Hasta", "la", "vista" và "Baby!" ...

... Xem thêm: Phụ lục: Tôi cần quần áo, ủng và xe máy của bạn

  • Giải thích của tôi:
    thực thi được nhắm mục tiêu để sử dụng như các tập lệnh điển hình trong giao diện dòng lệnh.

 

sidestep quan trọng

... Điều đó giúp tránh một vài dấu vết sai trong cuộc điều tra của chúng tôi.

VM Spec, 1.2 Máy ảo Java

Máy ảo Java không biết gì về ngôn ngữ lập trình Java ...

Tôi nhận thấy ở trên khi nghiên cứu chương trước - 1.1 Lịch sử mà tôi nghĩ có thể hữu ích (nhưng hóa ra vô dụng).

  • Giải thích của tôi:
    việc thực thi bị chi phối bởi chỉ số VM, điều này
    tuyên bố rõ ràng rằng nó không liên quan gì đến ngôn ngữ Java
    => OK để bỏ qua JLS và mọi thứ liên quan đến ngôn ngữ Java

 

Gosling: một sự thỏa hiệp giữa C và ngôn ngữ kịch bản ...

Dựa vào bên trên, tôi bắt đầu tìm kiếm trên web cho lịch sử JVM . Không giúp được gì, quá nhiều rác trong kết quả.

Sau đó, tôi nhớ lại những truyền thuyết về Gosling và thu hẹp tìm kiếm của tôi vào lịch sử JVM của Gosling .

Eureka! Thông số JVM đã trở thành như thế nào

Trong bài phát biểu này từ Hội nghị thượng đỉnh về ngôn ngữ JVM 2008, James Gosling thảo luận về ... sáng tạo của Java, ... một sự thỏa hiệp giữa ngôn ngữ C và ngôn ngữ kịch bản ...

  • Giải thích của tôi:
    tuyên bố rõ ràng rằng tại thời điểm sáng tạo,
    C và kịch bản đã được coi là ảnh hưởng quan trọng nhất.
     
    Đã nhìn thấy cái gật đầu để kịch bản trong VM Spec 2.17.1,
    đối số dòng lệnh đầy đủ giải thích String[] args
    nhưng staticmainkhông có được nêu ra, cần phải đào thêm ...

Lưu ý trong khi nhập cái này - kết nối C, script và VM Spec 1.2 với Java không có gì - Tôi cảm thấy như một cái gì đó quen thuộc, một cái gì đó ... hướng đối tượng đang dần biến mất. Nắm lấy tay tôi và tiếp tục di chuyển 'Đừng làm chậm chúng tôi gần đến bây giờ

Các slide chính có sẵn trực tuyến: 20_Gosling_keynote.pdf , khá thuận tiện để sao chép các điểm chính.

    trang 3

        Tiền sử của Java
        * Điều gì định hình suy nghĩ của tôi

    trang 9

        Tin tức
        * Hệ thống cửa sổ mở rộng nối mạng
        * Một hệ thống cửa sổ dựa trên kịch bản ....
          PostScript (!!)

    trang 16

        Mục tiêu lớn (nhưng yên tĩnh):
          Tôi có thể đến gần như thế nào
          "kịch bản" cảm thấy ...

    trang 19

        Khái niệm ban đầu
        * Là tất cả về xây dựng
          mạng lưới của sự vật,
          được dàn dựng bởi một kịch bản
          ngôn ngữ
        * (Shell Unix, AppleScript, ...)

    trang 20

        Một con sói mặc quần áo cừu
        * Cú pháp C để tạo nhà phát triển
          Thoải mái

A-ha! Chúng ta hãy nhìn sâu hơn về cú pháp C .

Ví dụ "xin chào, thế giới" ...

main()
{
    printf("hello, world\n");
}

... một chức năng có tên chính đang được xác định. Các chính chức năng phục vụ một mục đích đặc biệt trong chương trình C; môi trường thời gian chạy gọi hàm chính để bắt đầu thực hiện chương trình.

... Hàm chính thực sự có hai đối số int argcchar *argv[], tương ứng, có thể được sử dụng để xử lý các đối số dòng lệnh ...

Có phải chúng ta đang tiến gần hơn? bạn đặt cược Nó cũng có giá trị theo liên kết "chính" từ trích dẫn ở trên:

chức năng chính là nơi một chương trình bắt đầu thực thi. Nó chịu trách nhiệm tổ chức cấp cao về chức năng của chương trình và thường có quyền truy cập vào các đối số lệnh được cung cấp cho chương trình khi chương trình được thực thi.

  • Giải thích của tôi:
    Để được thoải mái cho nhà phát triển C, điểm vào chương trình phải được main.
    Ngoài ra, vì Java yêu cầu bất kỳ phương thức nào phải ở trong lớp, Class.maincũng
    gần như nó nhận được: lời gọi tĩnh, chỉ tên lớp và dấu chấm,
    không có hàm tạo nào làm ơn - C không biết gì như vậy.
     
    Điều này cũng áp dụng quá mức cho C #, có tính đến
    ý tưởng di chuyển dễ dàng từ Java.

Người đọc nghĩ rằng điểm vào chương trình quen thuộc không thành vấn đề được mời tìm kiếm và kiểm tra các câu hỏi Stack Overflow nơi những người đến từ Java SE đang cố gắng viết Hello World cho Java ME MIDP. Lưu ý điểm vào MIDP không có maincũng không có static.

 

Phần kết luận

Dựa vào bên trên tôi sẽ nói rằng static, mainString[] argstại thời điểm tạo Java và C #, các lựa chọn hợp lý nhất để xác định điểm vào chương trình .

 

Phụ lục: Tôi cần quần áo, ủng và xe máy của bạn

Phải thừa nhận, đọc VM Spec 2.17.1 rất thú vị.

... dòng lệnh

java Terminator Hasta la vista Baby!

sẽ khởi động một máy ảo Java bằng cách gọi phương thức chính của lớp Terminator(một lớp trong gói không tên) và truyền cho nó một mảng chứa bốn chuỗi "Hasta", "la", "vista" và "Baby!".

Bây giờ chúng tôi phác thảo các bước mà máy ảo có thể thực hiện Terminator, như một ví dụ về các quá trình tải, liên kết và khởi tạo được mô tả thêm trong các phần sau.

Nỗ lực ban đầu ... phát hiện ra rằng lớp Terminatorkhông được tải ...

Sau khi Terminatorđược tải, nó phải được khởi tạo trước khi main có thể được gọi và một kiểu (lớp hoặc giao diện) phải luôn được liên kết trước khi nó được khởi tạo. Liên kết (§2.17.3) liên quan đến xác minh, chuẩn bị và (tùy chọn) giải quyết ...

Xác minh (§2.17.3) kiểm tra xem đại diện được tải Terminatorcó được hình thành tốt không ...

Độ phân giải (§2.17.3) là quá trình kiểm tra các tham chiếu tượng trưng từ lớp Terminator...

 
Tài liệu tham khảo tượng trưng từ Terminatoroh yeah.


2
Vì một số lý do, tôi đã có một thời gian khó tin rằng "tính hiện đại" là một từ thực sự.
someguy

Câu chuyện @Songo của câu trả lời cũng giống như một bộ phim. Nó đã được đăng lần đầu tiên tại meta , trong một cuộc thảo luận về việc đóng câu hỏi: "Nếu câu hỏi sẽ được mở lại, có lẽ tôi sẽ viết một câu trả lời như dưới đây ..." Sau đó, nó được sử dụng để sao lưu kháng cáo để mở lại và cuối cùng được chuyển đến đây
gnat

16

Điều đó chỉ cảm thấy mơ hồ lạm dụng với tôi. Một constructor được sử dụng để khởi tạo một đối tượng: nó thiết lập một đối tượng, sau đó được sử dụng bởi mã đã tạo ra nó.

Nếu bạn đặt chức năng sử dụng cơ bản bên trong hàm tạo, và sau đó không bao giờ thực sự sử dụng đối tượng mà hàm tạo tạo trong mã bên ngoài, thì bạn đã vi phạm các nguyên tắc của OOP. Về cơ bản, làm một cái gì đó thực sự kỳ lạ mà không có lý do rõ ràng.

Tại sao bạn vẫn muốn làm điều đó?


5
Nhưng không phải là ví dụ ứng dụng của Wikipedia mà logic là một đối tượng? Tại sao điều đó sẽ bị lạm dụng? Đối với việc sử dụng đối tượng - nó có một mục đích: đại diện cho ứng dụng đang chạy. Âm thanh rất SoC -y với tôi. Tại sao bạn muốn làm điều đó? VÌ - Tôi chỉ quan tâm đến lý do cho quyết định vì tôi thấy nó không hợp lý với phần còn lại của tâm lý.
Konrad Rudolph

7
@KonradRudolph: Một nhà xây dựng, giống như một trình thu thập thuộc tính, thường được dự kiến ​​sẽ hoàn thành trong thời gian giới hạn mà không phải chờ một số sự kiện không đồng bộ (như đầu vào của người dùng) xảy ra. Có thể có một hàm tạo khởi chạy một luồng ứng dụng chính, nhưng điều đó thêm một mức độ phức tạp có thể không cần thiết cho tất cả các ứng dụng. Yêu cầu một ứng dụng bảng điều khiển chỉ cần in "Hello world" thành đầu ra tiêu chuẩn sẽ tạo ra một luồng bổ sung sẽ trở nên ngớ ngẩn. Sử dụng một Mainphương pháp hoạt động tốt cho trường hợp đơn giản và thực sự không phải là vấn đề trong các trường hợp khó hơn, vậy tại sao không?
supercat

9

Đối với Java tôi nghĩ rằng lý do rất đơn giản: Khi phát triển Java, các nhà phát triển biết rằng hầu hết mọi người học ngôn ngữ sẽ biết trước C / C ++.

Do đó, Java không chỉ trông rất giống C / C ++ thay vì nói smalltalk, mà còn chiếm lĩnh cả idiosynchrasies từ C / C ++ (chỉ cần nghĩ về các số nguyên bát phân). Vì cả c / c ++ đều sử dụng một phương thức chính, làm tương tự cho java có ý nghĩa từ quan điểm đó.

Tôi khá chắc chắn rằng tôi nhớ bloch hoặc ai đó nói điều gì đó dọc theo lý do tại sao họ thêm chữ nguyên số bát phân, tôi sẽ xem liệu tôi có thể tìm thấy một số nguồn không :)


2
Nếu nhìn giống như C ++ rất quan trọng đối với Java, tại sao họ lại thay đổi :thành extends? Và public static void main(String [ ] args)bên trong một lớp học khá khác so với int main(int argc, char **argv)bên ngoài một lớp học.
Svick

2
@svick Một khả năng: Java đã giới thiệu các giao diện và rõ ràng họ muốn tách hai khái niệm (kế thừa giao diện / lớp) - chỉ với một "từ khóa" không hoạt động. Và "khá khác biệt"? Đây là ánh xạ gần nhất có thể có của nó và cho đến nay tôi chưa bao giờ thấy một lập trình viên c ++ nào có vấn đề hiểu rằng phương thức chính tĩnh là điểm vào. Trái ngược với việc có một lớp gọi là Ứng dụng hoặc một cái gì đó mà hàm tạo của nó được sử dụng, là thứ trông có vẻ lạ đối với hầu hết các lập trình viên c ++.
Voo

@svick int in c to void in java phải với cách tạo mã trả về từ một ứng dụng - trong java, 0 của nó trừ khi System.exit (int) được gọi. Việc thay đổi các tham số có liên quan đến cách các chuỗi của chuỗi được truyền trong mỗi ngôn ngữ. Tất cả mọi thứ trong java là trong một lớp - không có tùy chọn để có nó ở nơi khác. Thay đổi :thành extendsmột vấn đề của cú pháp và về cơ bản là giống nhau. Tất cả những thứ khác được quyết định bởi ngôn ngữ.

@MichaelT Nhưng tất cả những quyết định thiết kế đó làm cho Java khác với C ++. Vậy tại sao việc giữ Java giống như C ++ lại quan trọng trong trường hợp này main(), khi nó dường như không đủ quan trọng trong các trường hợp khác.
Svick

@svick Ngoại trừ việc bạn hoàn toàn không trả lại bất cứ thứ gì từ chính trong C và những điều tầm thường như vậy hầu như không gây nhầm lẫn cho bất cứ ai. Vấn đề không phải là tái tạo c ++ và tất cả các lỗi của nó mà chỉ làm cho lập trình viên ở nhà nhiều hơn. Bạn nghĩ gì về một lập trình viên C ++ sẽ có thời gian đọc dễ dàng hơn: Java hoặc mã object-c? Bạn nghĩ điều gì sẽ rõ ràng hơn đối với một lập trình viên C ++, một phương thức chính hoặc một hàm tạo của một số lớp làm điểm vào?
Voo

6

Chà, có rất nhiều chức năng chính ngoài kia chỉ chạy một vòng lặp vô hạn. Một constructor làm việc theo cách này (với một đối tượng không bao giờ được xây dựng) là điều có vẻ kỳ lạ đối với tôi.

Có rất nhiều điều thú vị về khái niệm này. Logic của bạn chạy trên một đối tượng chưa sinh, các đối tượng sinh ra để chết (vì chúng làm tất cả công việc của chúng trong hàm tạo), ...

Không phải tất cả các tác dụng phụ này sẽ làm hỏng nhiều toa xe OO hơn là một công khai đơn giản (bởi vì nó cần được truy cập bởi một tĩnh không xác định) (vì chúng tôi không cần phải bắt đầu) void main (vì đó là điểm vào )?

Để một điểm nhập hàm đơn giản, đơn giản, tồn tại trong Java, công khai và tĩnh sẽ tự động được yêu cầu. Mặc dù là một phương thức tĩnh , nhưng nó tập trung vào những gì chúng ta có thể đến gần hơn với một hàm đơn giản để thực hiện những gì mong muốn: một điểm vào đơn giản.

Nếu bạn sẽ không chấp nhận một điểm nhập đơn giản, đơn giản, chức năng như một điểm nhập cảnh. Điều gì tiếp theo không có vẻ kỳ quặc như một công cụ điều phối không có nghĩa là để xây dựng?


1
Tôi muốn nói rằng vấn đề không có chức năng hạng nhất. Dán main () bên trong một đối tượng (không được khởi tạo trước khi chính được gọi) là một chút chống mẫu. Có lẽ họ nên có một đối tượng "ứng dụng" được xây dựng và chạy phương thức main () không tĩnh của nó, sau đó bạn có thể đặt khởi tạo khởi động vào hàm tạo, và sẽ cảm thấy tốt hơn nhiều so với các phương thức tĩnh, mặc dù là một phương thức đơn giản = cấp chính () fn cũng sẽ tốt. Chính tĩnh là một chút của tất cả trong tất cả.
gbjbaanb

3

Bạn có thể nhanh chóng chạy một số bài kiểm tra độc lập trên một lớp, trong quá trình phát triển, bằng cách gắn một bài main()trong lớp bạn đang cố kiểm tra.


1
Điều này với tôi có lẽ là lý do hấp dẫn nhất, vì nó cũng cho phép nhiều điểm vào trong quá trình phát triển để thử nghiệm các cấu hình khác nhau, v.v.
cgull

0

Bạn phải bắt đầu từ đâu đó. Chính tĩnh là môi trường thực thi đơn giản nhất mà bạn có thể có - không có trường hợp nào (ngoài JVM và các tham số chuỗi đơn giản) cần được tạo - vì vậy nó có thể "xuất hiện" với mức tối thiểu phiền phức (và khả năng thấp của một lỗi mã hóa ngăn chặn khởi động, v.v.) và có thể làm những việc đơn giản mà không cần nhiều thiết lập khác.

Về cơ bản là một ứng dụng của KISS.

[Và, tất nhiên, lý do chính là: Tại sao không?]


3
Như tôi đã nói, tôi không bị thuyết phục bởi điều đó. Đối tượng làm được khởi tạo trước đó, và mã được thực hiện trước. Nó cần một trích dẫn từ một trong những nhà phát triển ban đầu để thuyết phục tôi rằng đây là lý do.
Konrad Rudolph

2
Lượng công việc cần thiết để khởi tạo một lớp từ mã C khá giống với cách gọi một phương thức tĩnh .. Thậm chí bạn phải thực hiện các kiểm tra tương tự (lớp có tồn tại không? Tốt, nó có một hàm tạo công khai với chữ ký đúng không? tốt rồi đi tiếp).
Voo

Không có đối tượng người dùng cần phải được tạo. Hàm tạo đối tượng không được thực thi. API rất đơn giản. Và đó là cách dễ hiểu nhất.
Daniel R Hicks

0

Theo hiểu biết của tôi lý do chính là đơn giản. Sun là một công ty Unix bán các máy Unix và Unix là quy ước C "chính (args)" để gọi một nhị phân được thiết kế cho.

Ngoài ra, Java được thiết kế rõ ràng để dễ dàng nhận các lập trình viên C và C ++, vì vậy không có lý do chính đáng nào cho việc không chỉ đơn giản là chọn quy ước C.

Cách tiếp cận được chọn trong đó mọi lớp có thể có một phương thức gọi khá linh hoạt, đặc biệt là kết hợp với Main-Classdòng trong tệp MANIFEST.MF trong một tệp có thể chạy được.


Tất nhiên, tập tin jar không được phát minh cho đến sau này.
Daniel R Hicks

-1

Không phù hợp với triết lý OOP rằng một chương trình sẽ là một đối tượng theo quan điểm quá trình của hệ điều hành, vì không có cách nào để có nhiều hơn một định nghĩa.

Trên hết, một nhà xây dựng không phải là một điểm vào bằng bất kỳ phương tiện nào.

Đối với tôi, nó có vẻ như là sự lựa chọn hợp lý nhất để có hàm chính là hàm tĩnh, mà nó thực sự là vào cuối ngày. Với kiến ​​trúc của các máy ảo như JVM và CLR, bất kỳ lựa chọn nào khác sẽ không cần thiết phải đẩy nó.


1
Tôi nghĩ bạn sai ở đó. Nó có thể có nhiều hơn một quá trình, do đó nhiều hơn một đối tượng. Ngẫu nhiên, điều này hoàn toàn tương đương với Runnablecác đối tượng khởi tạo để có nhiều luồng.
Konrad Rudolph

Một quy trình là một chương trình đang chạy và bạn chỉ có thể bắt đầu một quy trình một lần thông qua một điểm nhập cảnh. Chủ đề có điểm nhập cảnh riêng của họ nhưng vẫn trong cùng một quá trình.
Yam Marcovic

1
Giống như tôi đã nói dưới đây câu trả lời của someguy, điều này không liên quan. Những gì liên quan là tính nhất quán hợp lý . Về mặt logic, các quy trình được biểu diễn dưới dạng đối tượng bởi trình khởi chạy (OS, JVM, bất cứ thứ gì) và được khởi tạo.
Konrad Rudolph

@KonradRudolph Đúng, nhưng việc khởi tạo chương trình chỉ là một phần của việc khởi tạo quy trình và không hợp pháp hóa trình xây dựng chương trình.
Yam Marcovic
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.