Python là một ngôn ngữ cấp độ so với bytecode.

Python là một trong những ngôn ngữ thông dịch phổ biến nhất, nhưng bạn đã bao giờ nghĩ tại sao Python được gọi là ngôn ngữ thông dịch trong khi các ngôn ngữ lập trình khác như C, C++, Java, v.v. , tạo kết quả sau khi biên dịch? . Và ngôn ngữ này khác với ngôn ngữ tạo ra kết quả sau khi biên dịch như thế nào?

Để trả lời câu hỏi, chúng ta phải biết những gì giải nghĩa có nghĩa là

Giải thích theo thuật ngữ đơn giản có nghĩa là chạy từng dòng mã. Điều đó cũng có nghĩa là lệnh được thực thi mà không cần biên dịch toàn bộ chương trình sang ngôn ngữ máy trước đó.

Bây giờ, chúng ta hãy thảo luận về cách Python hoạt động như một ngôn ngữ thông dịch. Hãy xem xét một tình huống mà bạn đang cố chạy mã python, nhưng thật không may, bạn đã mắc một số lỗi ở cuối mã. Bạn sẽ thấy rằng có một lỗi được tạo ra vì những lý do rõ ràng, nhưng cùng với lỗi đó, bạn sẽ tìm thấy đầu ra của chương trình cho đến dòng của chương trình là chính xác. Điều này là có thể vì Python đọc từng dòng mã và tạo đầu ra dựa trên mã. Bất cứ khi nào nó tìm thấy bất kỳ lỗi nào trong dòng, nó sẽ ngừng chạy và tạo ra một thông báo lỗi

Python vừa được biên dịch vừa được giải thích

"Python là một ngôn ngữ được giải thích", là câu nói phổ biến nhất, cũng được viết trong nhiều cuốn sách khác nhau, nhưng sự thật ẩn giấu là Python vừa là ngôn ngữ được biên dịch vừa là ngôn ngữ được giải thích. Điều này có nghĩa là khi chúng ta chạy mã python, trước tiên nó được biên dịch và sau đó diễn giải từng dòng một. Phần biên dịch hầu hết bị ẩn khỏi người dùng. Trong khi chạy mã, Python tạo mã byte bên trong, mã byte này sau đó được chuyển đổi bằng máy ảo python [p. v. m] để tạo đầu ra

Trong bài viết này, chúng ta sẽ so sánh các tính năng của hai ngôn ngữ lập trình phía máy chủ; . Hãy bắt đầu với một số khác biệt về thiết kế ở cả hai ngôn ngữ

Sự khác biệt cơ bản trong thiết kế và triển khai Python và Java

Lịch sử

Có một ý tưởng về quá khứ có thể cung cấp cho chúng ta bối cảnh để hiểu tại sao mọi thứ được xây dựng theo cách hiện tại. Python được tạo ra để thu hẹp khoảng cách giữa C và shell. Nó được dự định là một ngôn ngữ thông dịch cấp cao hơn cho phép mã sạch, ngắn gọn và dễ đọc

Java được tạo ra để trở thành ngôn ngữ lập trình Hướng đối tượng độc lập với nền tảng được biên dịch. Mục đích là để đạt được tính di động của mã [viết một lần chạy ở mọi nơi] với ít hoặc không cần nỗ lực của lập trình viên. Một trong những ứng dụng đầu tiên của Java là tích hợp vào các trình duyệt như Netscape, và nó nhanh chóng trở nên phổ biến.

Bạn sẽ tìm thấy hầu hết các hệ thống cũ và ứng dụng web cấp doanh nghiệp được lập trình bằng Java hơn bất kỳ ngôn ngữ nào khác. Và bạn thường thấy Python được sử dụng như một loại "keo" để kết hợp các thành phần khác nhau trong các hệ thống này

Thiết kế

Có rất nhiều tài nguyên tuyệt vời trên internet giải thích sâu về sự khác biệt trong thiết kế, vì vậy chúng tôi sẽ không đi sâu vào những tài nguyên đó, mà thay vào đó, tôi sẽ đề cập đến một số điểm rút ra "đơn giản hóa",

  • Sự khác biệt thiết kế cơ bản nhất là Python là ngôn ngữ được giải thích và Java là ngôn ngữ được biên dịch. Sự khác biệt này chỉ ra rất nhiều tính năng và hạn chế của cả hai ngôn ngữ
  • Bất kỳ ngôn ngữ lập trình nào cũng phải dịch mã do lập trình viên viết thành một bộ hướng dẫn hoặc mã máy, có thể được thực thi trên máy. Trong các ngôn ngữ được thông dịch, quá trình này diễn ra nhanh chóng trong khi thực thi chương trình, trong khi các ngôn ngữ được biên dịch thực hiện một số xử lý trước khi thực hiện chương trình
  • Trình biên dịch Java chuyển đổi mã thành mã byte độc ​​lập với nền tảng, mã này sau đó có thể được tải và thực thi trên bất kỳ phiên bản Máy ảo Java [JVM] nào. Tương tự, mã Python được xử lý thành Python bytecode và chạy trong Máy ảo Python
  • Tuy nhiên, sự khác biệt là trong khi Python biên dịch thành mã byte trong thời gian chạy, thì Java biên dịch trước. Thời gian chạy Java cũng bao gồm trình biên dịch Just-in-time [JIT], giúp cải thiện hiệu quả bằng cách có thể biên dịch mã byte thành mã máy trong "gần như thời gian thực". "

Hậu quả của thiết kế và lịch sử

Về ngữ nghĩa

  • Python là một ngôn ngữ kiểu động, có nghĩa là nó tự suy ra các kiểu biến. Mặt khác, Java là một ngôn ngữ được nhập tĩnh, có nghĩa là các loại biến phải được khai báo rõ ràng
  • Trong Python, bạn có thể bớt lo lắng về các loại biến và tập trung nhiều hơn vào logic. Vì vậy, nếu bạn viết mã Pythonic [Ví dụ], bạn có thể làm được nhiều việc hơn với ít dòng mã hơn so với Java. Và trên hết, các quy tắc thụt đầu dòng làm cho mã dễ đọc hơn
  • Java nghiêm ngặt theo nghĩa là các lập trình viên cần viết mã dài dòng. Nhiều lỗi có thể được bắt gặp trong thời gian biên dịch trong Java. Bạn có nhiều khả năng linh hoạt và kiểm soát hơn trong việc tuân thủ các mẫu thiết kế khác nhau trong Java so với trong Python

về hiệu suất

Nhiều thứ xa xỉ trong việc triển khai CPython của Python [triển khai Python được sử dụng rộng rãi nhất] phải trả giá bằng,

  • Thời gian chạy chậm hơn do cần nhiều công việc hơn để dịch mã Python sang mã cấp độ máy. Java thực hiện nhiều việc như kiểm tra kiểu, định vị địa chỉ bộ nhớ cho các mã định danh khác nhau. Trong quá trình tiền xử lý [tạo mã byte] và nhập tĩnh cũng cung cấp cơ hội để tối ưu hóa trong thời gian chạy
  • Nhiều khả năng gặp lỗi hơn [liên quan đến kiểm tra loại và chuyển đổi] trong thời gian chạy
  • Dung lượng bộ nhớ cao hơn của các đối tượng trong Python

Đồng thời trong Python

CPython triển khai Khóa phiên dịch toàn cầu để đảm bảo an toàn cho luồng, có nghĩa là,

  • Mỗi lần chỉ có một luồng có thể thực thi trên CPU, ngay cả khi bạn có bộ xử lý đa lõi
  • Về bản chất, bạn có thể tạo nhiều luồng, nhưng chúng chạy lần lượt thay vì chạy song song [đồng thời không song song]. I/O song song vẫn có thể [và xảy ra] giữa nhiều luồng
  • Để đạt được tính song song với quá trình xử lý, bạn cần chương trình tạo ra các quy trình riêng biệt và phối hợp với chúng. Các quy trình này có thể là phiên bản của trình thông dịch thực thi mã Python hoặc các chương trình cấp thấp như tiện ích mở rộng C

Python cung cấp một số khái niệm trừu tượng để thực hiện đa xử lý thông qua mô-đun đa xử lý tích hợp sẵn. Để song song hóa các tác vụ liên quan đến I/O, Python đã bao gồm mô-đun asyncio đã nhận được đáng kể trong Python 3 gần đây. 7. phiên bản x

Đồng thời trong Java

Máy ảo Java [JVM] có khả năng thực thi song song nhiều luồng trên nhiều lõi CPU. Các lập trình viên phải đối phó với sự phức tạp của việc phân chia nhiệm vụ của họ thành các luồng và đồng bộ hóa giữa chúng. Java cung cấp lớp Thread và Java. sử dụng. gói đồng thời chứa một số trừu tượng cho đa luồng. Thực tế là hầu hết các khung tính toán phân tán phổ biến [như Spark và Hadoop] chủ yếu được viết bằng Java là bằng chứng về sự phù hợp của nó đối với việc thực thi đồng thời

Ghi chú. Chúng tôi đã thảo luận về cách triển khai Python [CPython] phổ biến nhất trong phần này. Ngoài ra còn có các triển khai khác, tạo ra một số sự đánh đổi khác vì lợi ích của hiệu suất và để hỗ trợ thực thi song song [hãy xem dự án pypy và Stackless Python, hỗ trợ biên dịch JIT và đồng thời]

So sánh các chương trình lặp và đệ quy đơn giản trong Python và Java

Chúng ta sẽ lấy hai phát biểu bài toán nổi tiếng,

  1. Tính giá trị thứ n trong dãy Fibonacci
  2. Tính giai thừa của n

Sau đây là các triển khai đơn giản giống nhau, bạn có thể quan sát một số khác biệt mà chúng ta đã thảo luận ở phần trên trong mã và kết quả

# Python version 3.8.0 [CPython implementation]
def fib[n]:
    # Iterative fibonacci
    a, b = 0, 1
    for i in range[0, n]:
        a, b = b, a + b
    return a
  
def fib_r[n]: 
  # Recursive fibonacci
  if n < 2: return n 
  return fib_r[n-1] + fib_r[n-2] 

def fac[n]:
  # Iterative factorial
  x = 1
  for i in range[2, n + 1]:
    x = x * i

def fac_r[n]:
  # Recursive factorial
  if  n >= 1:
    return n * fac_r[n - 1]
  return 1

# Printing out the run times, the value of n is decided based on execution times and maximum stack depth
print[timeit.timeit[lambda: fib[60], number=1] * 1000]
print[timeit.timeit[lambda: fib_r[40], number=1]]
print[timeit.timeit[lambda: fac_r[25], number=1] * 1000]
print[timeit.timeit[lambda: fac[25], number=1] * 1000]
/*
Java version 11.0.3
Please excuse me for using `snake_case` in the program.
 */
public class SimpleMethodsPrimitive {

    public static void main[String args[]] {
        long start_time = System.nanoTime[];
        fib[60];
        // fib_r[40];
        // fac_r[25];
        // fac[25];
        long stop_time = System.nanoTime[];
          // Printing out run time in nanoseconds
        System.out.println[stop_time - start_time];
    }

    private static long fib[int n] {
        // Iterative fibonacci
        long a = 0, b = 1;
        for [int i = 0; i < n; i++] {
            a = b;
            b = a + b;
        }
        return a;
    }

    private static int fib_r[int n] {
        // Recursive fibonacci
        return n < 2 ? n: fib_r[n-1] + fib_r[n-2];
    }

    private static long fac[int n] {
        // Iterative factorial
        long x = 1;
        for [int i = 2; i < n + 1; i++] {
            x = x * i;
        }
        return x;
    }

    private static long fac_r[int n] {
        // Recursive factorial
        return n < 1 ? 1: n * fac_r[n -1 ];
    }
}

Ngoài thiết kế - Hệ sinh thái phát triển, Thư viện và Khung

Năng suất của nhà phát triển là một yếu tố thiết yếu trong việc quyết định chọn ngôn ngữ nào. Hãy xem hệ sinh thái và thư viện hỗ trợ năng suất của nhà phát triển

Quản lý phụ thuộc và phân phối mã

Mã Java được đóng gói và phân phối dưới dạng. jar, trong khi ở Python, nó được phân phối dưới dạng. tập tin whl. Quản lý gói trong Java tương đối ổn định nhưng phức tạp hơn để tìm hiểu

Trong Python, pip là thứ bạn cần biết khá nhiều trong hầu hết các trường hợp sử dụng để quản lý các thành phần phụ thuộc. PyPI [Chỉ mục gói của Python] là nơi lưu trữ các gói để mọi người có thể sử dụng chúng

Tương đương với PyPI trong Java là MVNRRepository và các thành phần phụ thuộc được chỉ định trong tệp cấu hình của các công cụ tự động hóa bản dựng như Apache Maven và Gradle. Python hiện có hỗ trợ tích hợp từ môi trường ảo [môi trường phụ thuộc biệt lập dành riêng cho dự án];

Thư viện và Khung hỗ trợ phát triển web điển hình

Java có API JDBC [Kết nối cơ sở dữ liệu Java] mạnh mẽ để kết nối với cơ sở dữ liệu, đó cũng là lý do tại sao ngôn ngữ Java là lựa chọn phổ biến trong các hệ thống doanh nghiệp. Các lớp truy cập cơ sở dữ liệu của Python khó xử lý hơn một chút so với Java. Cả hai ngôn ngữ đều có khả năng ORM

Rất khó để viết toàn bộ phần phụ trợ từ đầu, vì vậy cả hai ngôn ngữ đều có các khung cung cấp sự trừu tượng để thiết lập một phần phụ trợ đáng tin cậy và an toàn mà không cần phát minh lại bánh xe. Cho đến nay, Spring là khung web phổ biến nhất trong Java, trong khi đó Django và Flask là hai khung web phổ biến trong Python

Xét về hiệu suất, các khung web Java nhanh hơn nhưng các khung Python cũng không kém xa [xem điểm chuẩn ]. Spring có RẤT NHIỀU phụ thuộc thân thiện với sản xuất để xử lý bộ nhớ đệm, xác thực, cơ sở dữ liệu, nhắn tin, v.v., điều đó có nghĩa là các nhà phát triển chỉ có thể tập trung vào logic nghiệp vụ. Nhược điểm của Spring là đường cong học tập lớn mà nó có [vì những thứ như tiêm phụ thuộc, cấu hình dài dòng, v.v.], với một số nhà phát triển thậm chí còn mô tả trải nghiệm học tập ban đầu của họ là "ma thuật đen". " Nó cũng tốn nhiều tài nguyên hơn so với Django hoặc Flask. Chi phí tài nguyên của Spring đôi khi có vẻ không hợp lý đối với các ứng dụng web có kích thước vừa và nhỏ

Gỡ lỗi và kiểm tra

Cả hai ngôn ngữ đều dễ gỡ lỗi, nhưng cá nhân tôi thấy dấu vết ngăn xếp và ngoại lệ trong Python hữu ích hơn. Một điều khác khiến tôi chú ý là thời gian xây dựng trong Python thường nhanh hơn nhiều so với Java [vì Python là ngôn ngữ được thông dịch], điều này thật tuyệt vời khi bạn đang thực hiện gỡ lỗi theo kiểu đánh và dùng thử. Điều này có thể đúng vì cơ sở mã Java thường lớn hơn và phức tạp hơn

Nếu bạn sử dụng một IDE hiện đại hoặc các công cụ phân tích mã tĩnh, những công cụ này có thể ngăn ngừa nhiều lỗi trước đó trong cả hai ngôn ngữ và có thể thêm các điểm dừng để kiểm tra các biến trong thời gian chạy

Java có nhiều thư viện phổ biến ở nhiều cấp độ trừu tượng khác nhau [như Junit, TestNG, PowerMock] để kiểm tra đơn vị mã của bạn. Python có thư viện kiểm tra đơn vị tích hợp có thiết kế được lấy cảm hứng từ khung JUnit của Java. Các khung cấp cao hơn khác để thử nghiệm đơn vị trong Python bao gồm pytest và nose. Kiểm tra đơn vị trong Python đòi hỏi nhiều nỗ lực hơn một chút do tính chất được nhập động của nó

Khi nói đến Phát triển theo định hướng hành vi, khung BDD phổ biến nhất trong Python là bebebe, tiếp theo là các plugin pytest như pytest-bdd. Trong Java, các lựa chọn phổ biến là Dưa chuột và Spock. Selenium, khung thử nghiệm tự động hóa web phổ biến nhất, chủ yếu được viết bằng Java. Việc tìm giải pháp cho các vấn đề của bạn sẽ dễ dàng hơn khi bạn đang sử dụng API Java của họ [Selenium cũng có API Python] để thực hiện những việc như thử nghiệm tự động hóa từ đầu đến cuối

Tài liệu cũng giúp gỡ lỗi và kiểm tra tốt. Python có một mô-đun doctest tích hợp kết hợp tốt với tính chất tương tác của ngôn ngữ, vì nó giúp viết các câu lệnh tương tác trong tài liệu nhằm phục vụ mục đích giải thích cũng như kiểm tra [bằng cách này, bạn ít có khả năng gặp phải tài liệu lỗi thời hơn . Chức năng tương tự rất phức tạp để sao chép trong Java

Cộng đồng

Cộng đồng Python ngày càng phát triển do tính phù hợp của nó trong các lĩnh vực ngoài ứng dụng web [như Phân tích dữ liệu, Xử lý hình ảnh, Học máy, v.v.]. Theo Octoverse của Github, Python là ngôn ngữ được sử dụng nhiều thứ hai trên Github, tiếp theo là Java. Trong cuộc khảo sát dành cho nhà phát triển năm 2019 của Stackoverflow, Python đã được vinh danh là ngôn ngữ lập trình phát triển nhanh nhất, vượt qua Java trong năm nay

Ai đang sử dụng Java và Python trong phát triển web?

Dưới đây là danh sách các công ty nổi tiếng sử dụng Java trong phát triển web

Và đây là danh sách các công ty sử dụng Python trong phát triển web

Phần kết luận

Trong bài viết này, chúng tôi đã thảo luận về sự khác biệt giữa Java và Python. Chúng tôi có thể nói rằng cả hai ngôn ngữ này đều phù hợp với việc phát triển web phía máy chủ. Nếu bạn sắp xây dựng một ứng dụng web rất "doanh nghiệp" trong đó hiệu suất và bảo mật là rất quan trọng, thì Java vẫn chiếm ưu thế bất chấp hệ sinh thái đang phát triển nhanh chóng của Python. Mặt khác, nếu bạn đã có kinh nghiệm phát triển Python và quan tâm nhiều hơn đến năng suất của nhà phát triển hoặc phải xử lý những việc như xử lý số mở rộng, xử lý hình ảnh, phân tích, thì Python có lợi thế hơn Java

Python có phải là ngôn ngữ cấp độ không?

Python là ngôn ngữ lập trình cấp cao hướng đối tượng.

Python có cao không

Python là một ngôn ngữ lập trình cấp cao, hướng đối tượng, high-level programming language với ngữ nghĩa động.

Ngôn ngữ mã hóa cấp độ nào là Python?

Python là một ngôn ngữ lập trình đa năng cấp cao có thể áp dụng cho nhiều loại vấn đề khác nhau.

Python có mã byte không?

Bytecode là ngôn ngữ trung gian cho máy ảo Python được sử dụng để tối ưu hóa hiệu suất. Thay vì thực thi trực tiếp mã nguồn mà con người có thể đọc được, các mã số nhỏ gọn, hằng số và tham chiếu được sử dụng để biểu thị kết quả phân tích cú pháp trình biên dịch và phân tích ngữ nghĩa.

Chủ Đề