thảo luận Python đá Java ra chuồng gà !

  • Người tạo chủ đề Người tạo chủ đề Angelino
  • Ngày bắt đầu Ngày bắt đầu

Bạn thích Python hay Java ?

  • Python

  • Java


Chỉ xem được kết quả sau khi bình chọn.
Nếu dùng từ dịch rất dễ hiểu lầm vì thông dịch với biên dịch là 2 khái niệm hoàn toàn khác nhau. Python là thông dịch từng dòng và cả biên dịch, thông dịch khi file code chỉ chứa code python thuần, ko có import module. :D
Bác này nói như thế có thể hiểu Python không dịch sang byte code 1 lần mà chạy từng dòng, nên mình đưa ra dẫn xuất .pyc là để chứng minh Python cũng có dịch sang byte code để đưa vào VM :shame:
 
Cái thông dịch này là thông dịch từ byte code ra mã máy chứ ko phải python code. Còn từ python code ra byte code là compile.

Thông dịch từng dòng cho byte code thôi. Còn python code phải được compile ra byte code trước chứ sao mà thông dịch rồi chạy đươc.

Chỉ trường hợp run trong Interative console mới run thẳng thôi. Còn chuyện chạy không generate ra file byte code thì cũng có paramter để config cho PVM nhưng bên trong vẫn là compile ra byte code hết rồi mới chạy vì PVM chỉ hiểu byte code.
Thì mình mới nói là trong trường hợp có import module và ko có import module đó. Thực ra chugn1 ta có thể biên dịch code python cho file code.py (không chứa import module) để có file .pyc. Thì lần sau chạy đúng nghĩa chỉ thông dịch từng dòng.
 
Thực ra ý này đúng 100% nhé "Trong khi đó thằng Python nó sẽ vừa dịch từng dòng vừa chạy luôn"

2/ Python chạy như thế nào?

Khi viết code Python sẽ có 2 cases:
Trường hợp một là file code chỉ chứa code thông thường, không có import module.
VD: file code.py chứa 1 dòng print("hello world")
Khi đó thì python mỗi lần chạy sẽ phải biên dịch dòng print("hello world") ra byte code (một ngôn ngữ trung gian mức thấp để interpreter đọc).
Vậy việc biên dịch code python này diễn ra như thế nào và có phải do interpreter đảm nhiệm như chúng ta hay nhầm tưởng không? Câu trả lời là không, vì interpreter dịch là là trình thông dịch, đúng với cái tên thì nó không thể đảm nhiệm việc biên dịch code python được, nhiệm vụ của nó là đọc mã byte code để thông dịch qua mã máy để thực thi. Python Virtual Machine gồm có 2 thành phần chính là compiler và interpreter. Compiler thì thường sẽ viết bằng C/C++ còn interpreter có thể viết bằng C (Cpython), Python (PyPy), Java (JPython) đây là cái chúng ta hay nhầm với python compiler. Vì thế việc biên dịch code python ra byte code là do một python compiler (py_compile) đảm nhiệm. Sau đó interpreter mới bắt đầu đọc byte code đã được compiled này để in ra dòng "hello world".
Trước hết thì như nhiều bác đã nói trong này, không có khái niệm "ngôn ngữ thông dịch" hay "ngôn ngữ biên dịch", cái quyết định là cài đặt của ngôn ngữ chứ không phải bản thân ngôn ngữ đó.
Như C++ thường được coi là ngôn ngữ biên dịch nhưng thực ra vẫn có C++ interpreter (https://root.cern/cling/).

Python cũng vậy. Bản chính thức của Python là CPython là một interpreter, nó đọc từng chỉ thị bytecode đọc đến đâu thì thực thi đến đó. Nhưng cũng có một số cài đặt khác không phải interpreter. Bác có nhắc đến PyPy, nó là JIT (Just-in-time) compiler, không phải interpreter. Có nghĩa khi thực thi bytecode thì nó dịch một phần hoặc toàn bộ ra mã máy rồi thực thi phần đó, cho nên hiệu năng hơn vài lần so với CPython.
JIT compiler thậm chí nhiều lúc còn có thể nhanh hơn cả compiler, vì nó có thông tin về kiến trúc máy tính được chạy hay tập dữ liệu đầu vào. Chẳng hạn một chương trình C++ nếu khi build chỉ tune cho kiến trúc x86 generic thì có thể sẽ chậm hơn chương trình Java chạy các đoạn mã sử dụng tập lệnh AVX512 do JIT compiler sinh ra.

Nói thêm thì còn một loại nữa là AOT (Ahead-of-time) compiler, tức khi cài chương trình thì nó dịch bycode / code toàn bộ ra mã máy thành file nhị phân. Nhưng lần sau khi chạy chương trình thì dùng file nhị phân đó. Đại diện là bộ ART của Android hay mới đây có cái Rosetta 2 của Mac M1.
 
Trước hết thì như nhiều bác đã nói trong này, không có khái niệm "ngôn ngữ thông dịch" hay "ngôn ngữ biên dịch", cái quyết định là cài đặt của ngôn ngữ chứ không phải bản thân ngôn ngữ đó.
Như C++ thường được coi là ngôn ngữ biên dịch nhưng thực ra vẫn có C++ interpreter (https://root.cern/cling/).

Python cũng vậy. Bản chính thức của Python là CPython là một interpreter, nó đọc từng chỉ thị bytecode đọc đến đâu thì thực thi đến đó. Nhưng cũng có một số cài đặt khác không phải interpreter. Bác có nhắc đến PyPy, nó là JIT (Just-in-time) compiler, không phải interpreter. Có nghĩa khi thực thi bytecode thì nó dịch một phần hoặc toàn bộ ra mã máy rồi thực thi phần đó, cho nên hiệu năng hơn vài lần so với CPython.
JIT compiler thậm chí nhiều lúc còn có thể nhanh hơn cả compiler, vì nó có thông tin về kiến trúc máy tính được chạy hay tập dữ liệu đầu vào. Chẳng hạn một chương trình C++ nếu khi build chỉ tune cho kiến trúc x86 generic thì có thể sẽ chậm hơn chương trình Java chạy các đoạn mã sử dụng tập lệnh AVX512 do JIT compiler sinh ra.

Nói thêm thì còn một loại nữa là AOT (Ahead-of-time) compiler, tức khi cài chương trình thì nó dịch bycode / code toàn bộ ra mã máy thành file nhị phân. Nhưng lần sau khi chạy chương trình thì dùng file nhị phân đó. Đại diện là bộ ART của Android hay mới đây có cái Rosetta 2 của Mac M1.
Cảm ơn bạn đã bổ sung thêm . :D
 
Byte code nó khác mã máy. Mã máy là CPU đọc và chạy thẳng được. Python nó chậm hơn C cũng y như Java, C# chậm hơn C là do chạy thông qua máy ảo JVM, CLR.

202044872042-cbc8-4694-8d2e-93740a694eb7.png


via theNEXTvoz for iPhone
Thế như vậy giữa Java và Python em nghĩ speed cũng không thể khác nhau quá nhiều. Nhưng em làm leetcode thì thấy Java nhanh hơn hẳn Python dù cùng 1 thuật toán, nhưng mem thì có vẻ ăn hơn. Bác phân tích giúp em được không? Em cảm ơn trước
 
Thế như vậy giữa Java và Python em nghĩ speed cũng không thể khác nhau quá nhiều. Nhưng em làm leetcode thì thấy Java nhanh hơn hẳn Python dù cùng 1 thuật toán, nhưng mem thì có vẻ ăn hơn. Bác phân tích giúp em được không? Em cảm ơn trước

So sánh performance Python, Java thì khó nói lắm, tuỳ use case, tuỳ platform, OS nữa, có bác nào nói bên trên rồi.

Ở đây chỉ kết luận là C thì nhanh hơn đám Python, Java, .Net vì 3 thằng này phải chạy qua máy ảo thôi.
 
Thế như vậy giữa Java và Python em nghĩ speed cũng không thể khác nhau quá nhiều. Nhưng em làm leetcode thì thấy Java nhanh hơn hẳn Python dù cùng 1 thuật toán, nhưng mem thì có vẻ ăn hơn. Bác phân tích giúp em được không? Em cảm ơn trước
Nhiều lý do, nhưng cái dễ thấy nhất
  • (Mặc định) python là interpreter còn Java là JIT compiler,
  • Java là static typing còn Python là dynamic typing nên không cần phải qua bước type check ở runtime,
  • Với Python mọi thứ là object, kể cả primitive như int, float, tức là phải allocate và manage memory cho nó. Còn Java thì chỉ có kiểu Class mới cần allocate.


So sánh performance Python, Java thì khó nói lắm, tuỳ use case, tuỳ platform, OS nữa, có bác nào nói bên trên rồi.

Ở đây chỉ kết luận là C thì nhanh hơn đám Python, Java, .Net vì 3 thằng này phải chạy qua máy ảo thôi.
Chưa chắc. Như mình đã nói ở trên thì cùng một thuật toán, tùy trường hợp mà C có thể chạy chậm hơn Java nếu như không được build để tận dụng các tập lệnh hiệu năng cao của arch.
 
Sửa lần cuối:
Giờ trừ trường hợp microbenchmark hay ứng dụng realtime khủng chứ Java bắt kịp với các ngôn ngữ hạng sang về thời gian execution rồi.
Java 9 cải thiện thêm phần GC nữa nên giờ tít lắm.
 
Giờ trừ trường hợp microbenchmark hay ứng dụng realtime khủng chứ Java bắt kịp với các ngôn ngữ hạng sang về thời gian execution rồi.
Java 9 cải thiện thêm phần GC nữa nên giờ tít lắm.
Oracle bây giờ cứ 6 tháng là cập nhật một bản Java mới!
Tháng 9 ra mắt Java 15, đến tháng 3 sang năm lại có Java 16 :D
 
Nguyên lý hoạt động python hệt java. Đều cần một môi trường ảo để control sang mã máy.
 
Mấy bác nói thấy ai cũng có lý cả. Mình thì chỉ nêu quan điểm của mình thôi.
Thứ nhất lấy C++ ra so với Python là k0 công bằng, C/C++ bên là ngôn ngữ cấp thấp, Python là ngôn ngữ cấp cao,
Thứ 2 : mọi ngôn ngữ lập trình đều có lý do tại sao nó ra đời để thay thế hay giúp developers dễ dàng hơn công việc thôi. Cho IoT, ML thì chọn Python thôi, vì sao?vì nó có nhiều library hỗ trợ cho việc đó.
Thứ 3: chậm hay nhanh thì hiện nay có thể giải quyết khi mà CPU , RAM ngày càng nhanh và nhiều. Nhanh hơn hay chậm hơn vài giây thì mình nghĩ chả vấn đề gì cho những vấn đề trong cuộc sống trừ phi làm khoa học cần nhanh hơn vài ms.
 
Mấy bác nói thấy ai cũng có lý cả. Mình thì chỉ nêu quan điểm của mình thôi.
Thứ nhất lấy C++ ra so với Python là k0 công bằng, C/C++ bên là ngôn ngữ cấp thấp, Python là ngôn ngữ cấp cao,
Thứ 2 : mọi ngôn ngữ lập trình đều có lý do tại sao nó ra đời để thay thế hay giúp developers dễ dàng hơn công việc thôi. Cho IoT, ML thì chọn Python thôi, vì sao?vì nó có nhiều library hỗ trợ cho việc đó.
Thứ 3: chậm hay nhanh thì hiện nay có thể giải quyết khi mà CPU , RAM ngày càng nhanh và nhiều. Nhanh hơn hay chậm hơn vài giây thì mình nghĩ chả vấn đề gì cho những vấn đề trong cuộc sống trừ phi làm khoa học cần nhanh hơn vài ms.
RAM hơn 30 năm nay chả nhanh hơn được bao nhiêu. CAS latency vẫn trong khoảng 8 - 15s. Người ta phải tăng prefetch để lấy transfer rate bù lại, nhưng cũng chỉ cải thiện được hiệu năng truy cập tuần tự.
CPU thì có nhanh hơn nhưng cũng chỉ 3-5 lần, và đang có dấu hiện chạm đến giới hạn. Nhưng khác biệt giữa chương trình có tối ưu và không tối ưu, giữa biên dịch và thông dịch có thể hơn mức đó.

Điểm bất lợi của việc phần cứng ngày càng phát triển là bên phần mềm có cớ để nghĩ ra và dùng những thứ abstraction quái dị, dẫn đến đầy bloatware.
 
Python chậm vl ra mà sao đá java gì vậy :feel_good: làm mấy ứng dụng enterprise java mới chịu tải được chứ python thì ăn lol

via theNEXTvoz for iPhone
 
tại nó mắc.
a xài .Net thì phải theo cả họ MS.
vd a làm web đi. code thì mua VS. deploy phải mua win server để cài IIS chạy. tốn bỏ mẹ
Free hết từ hồi .net core ra đời 5, 6 năm trước rồi. Đồ của M$ giờ toàn MIT license.

VS thì có bản community, C# giờ cross platform nên cũng ko còn phụ thuộc vào IIS
 
.net core sao bằng .net. doanh nghiệp ng ta chẳng muốn đổi xoành xoạch đâu
Lý do kinh phí với kẹt legacy system thì mình đồng ý. Chứ nói .net core không bằng .net thì chắc do thím ko chơi với hàng .net nên ít nắm thông tin bên này. Chính mic còn lệt kê mấy lý do dùng .net cũ toàn là vì vướng legacy system hoặc vấn đề compatibility này:

https://docs.microsoft.com/en-us/dotnet/standard/choosing-core-framework-server

MS từ mấy năm trước push rất mạnh vào phát triền .net core rồi, chuẩn bị sắp tới là gom hết vào .net 5, công ty nào nắm bắt được thì họ chuẩn bị plan để migrate hoặc phát triển app mới trên nền tảng .net core/ EF core. Mình làm java nhưng pet project toàn làm C# với Rust nên cũng hóng dc tình hình, với cả trong cty cũng chung division với mấy team .net nữa, mấy buổi tech talk cũng hay bàn về vấn đề này :big_smile:

Giờ dev C# nhìn .net 4.8 chắc ngang cỡ dev java thấy project xài java 6 :beat_brick:
 
Mấy bác nói thấy ai cũng có lý cả. Mình thì chỉ nêu quan điểm của mình thôi.
Thứ nhất lấy C++ ra so với Python là k0 công bằng, C/C++ bên là ngôn ngữ cấp thấp, Python là ngôn ngữ cấp cao,
Thứ 2 : mọi ngôn ngữ lập trình đều có lý do tại sao nó ra đời để thay thế hay giúp developers dễ dàng hơn công việc thôi. Cho IoT, ML thì chọn Python thôi, vì sao?vì nó có nhiều library hỗ trợ cho việc đó.
Thứ 3: chậm hay nhanh thì hiện nay có thể giải quyết khi mà CPU , RAM ngày càng nhanh và nhiều. Nhanh hơn hay chậm hơn vài giây thì mình nghĩ chả vấn đề gì cho những vấn đề trong cuộc sống trừ phi làm khoa học cần nhanh hơn vài ms.
Bác chưa lập trình cho các thiết bị có cấu hình thấp, lúc đấy bác mới biết là Python không có cửa
 

Thống kê chủ đề

Ngày tạo
Angelino,
Người trả lời cuối
Khang.Hy.Gia.222,
Trả lời
121
Lượt xem
24.894
Quay lại
Lên đầu trang