Computer >> Máy Tính >  >> Phần cứng >> CPU

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Một trong những điều đầu tiên chúng ta tìm hiểu về máy tính là chúng chỉ hiểu 0s và 1s , hoặc bit .

Mặt khác, con người chúng ta giao tiếp các con số thông qua hệ thống thập phân. Hệ thống này sử dụng các chữ số từ 0 đến 9 cùng với các dấu cộng và trừ (+ và -) để biểu thị các số dương hoặc âm.

Vì máy tính chỉ có thể sử dụng hai chữ số - 0 và 1 - các kỹ sư và nhà toán học ngày xưa đã thiết kế các kỹ thuật thông minh để biểu diễn các số âm và để thực hiện số học với chúng. Hãy cùng khám phá vẻ đẹp của những kỹ thuật đó.

Trước tiên, một số thông tin cơ bản về cách máy tính hoạt động

Phần mềm, hình ảnh, văn bản, video, số và mọi thứ ở giữa là 0 và 1 ở mức thấp nhất trong máy tính của chúng tôi.

Đối với hình ảnh, văn bản, video và số, chúng tôi có các lược đồ mã hóa quyết định cách những thứ này sẽ chuyển về 0s và 1s. Ví dụ:ASCII và Unicode cho văn bản.

Các chương trình phần mềm mà chúng tôi viết mã nhận được thành 0s và 1s thông qua trình biên dịch và trình lắp ráp. Những bộ 0 và 1 đó được gọi là mã máy (hoặc lệnh máy) trước tiên được lưu trữ trong bộ nhớ chính của máy tính (RAM) trước khi bộ xử lý có thể thực thi chúng.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU
Chu trình thực thi giải mã tìm nạp được tạo bởi Sir John von Neumann. Mọi máy tính kỹ thuật số tuân theo chu trình này để chạy mã máy.

Bộ xử lý bắt đầu chu kỳ thực thi bằng cách tìm nạp hướng dẫn từ bộ nhớ chính, sau đó là đơn vị điều khiển của bộ xử lý giải mã các hướng dẫn đó thành hai phần - mã hoạt động (opcode) và toán hạng.

Opcode quyết định hành động tiếp theo cần được thực hiện như ADD (thêm), JMP (nhảy), INC (tăng), v.v. Toán hạng là các giá trị (hoặc vị trí bộ nhớ) mà thao tác đó sẽ được thực hiện.

Các hướng dẫn đã giải mã được gửi đến Đơn vị số học và logic (ALU) để thực thi . Trong ALU, lệnh được thực thi dựa trên opcode trên các toán hạng và kết quả được lưu lại trong bộ nhớ.

Ví dụ:mã lắp ráp ADD eax, 42 lần đầu tiên được chuyển thành mã máy (0s và 1s) bởi trình lắp ráp. Sau đó, nó được lưu trữ vào bộ nhớ chính trước khi chu trình tìm nạp-giải mã-thực thi có thể bắt đầu.

Khi tìm nạp mã máy cho ADD eax, 42 từ bộ nhớ kết thúc, lệnh được giải mã. Đầu ra được giải mã cho biết mã opcode là ADD và các toán hạng là eax42 .

eax là một thanh ghi - một vị trí bộ nhớ được tích hợp sẵn trong bộ xử lý mà bộ xử lý có thể truy cập ngay lập tức. eax thanh ghi được gọi là bộ tích lũy trong hầu hết các bộ xử lý.

ADD eax, 42 mã lắp ráp được thiết kế để thêm 42 vào giá trị hiện tại của eax đăng ký (bộ tích lũy) và lưu trữ số tiền đó trong eax . Nó là eax = eax + 42 .

Giả sử rằng hiện tại eax là 20. Điều này có nghĩa là giá trị của eax sau khi thực hiện ADD eax, 42 sẽ là 20 + 42 =62.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU
EDVAC là một trong những máy tính nhị phân điện tử đầu tiên được chế tạo cho Phòng thí nghiệm nghiên cứu đạn đạo của quân đội Hoa Kỳ. (Nguồn hình ảnh, Miền công cộng).

Việc thiết kế các máy tính đầu tiên như EDVAC bắt đầu với mong muốn làm cho các phép tính toán học tẻ nhạt trở nên dễ dàng hơn và nhanh hơn.

Toàn bộ trách nhiệm làm cho máy tính tính toán nằm trên vai của các bộ cộng - mạch cộng hai số. Điều này là do các phép toán phức tạp như trừ, nhân và chia sử dụng các bộ cộng trong mạch của chúng.

Cuối cùng thì máy tính cũng chỉ là một cỗ máy số học nhanh với khả năng logic. Hiểu được những thách thức và vẻ đẹp của thiết kế số học nhị phân (của số nguyên dương và đặc biệt là số nguyên âm) là một trong những khái niệm cơ bản nhất trong bộ xử lý máy tính .

Đầu tiên chúng ta hãy xem số thập phân được biểu diễn như thế nào trong hệ nhị phân và cách cộng hai giá trị nhị phân. Sau đó chúng ta sẽ bắt đầu khám phá vẻ đẹp.

Cách hệ thống nhị phân hoạt động

Nếu tôi yêu cầu bạn đọc ra 872500 , bạn có thể sẽ nói 872,5K . Hãy xem cách trí óc của chúng ta thực hiện điều này.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Chúng tôi chỉ định vị trí của một người cho chữ số đầu tiên từ bên phải, sau đó vị trí của mười cho chữ số thứ hai từ bên phải, hàng trăm đến thứ ba, v.v., mỗi lần tăng theo lũy thừa của 10.

Các lũy thừa của 10 ở mỗi nơi là trọng số của các nơi. Trọng lượng của vị trí thứ một trăm là một trăm. Chúng tôi nhân các chữ số ở mỗi nơi với trọng lượng của chúng và cộng lại tất cả để được một số hoàn chỉnh.

Trong biểu đồ trên, bạn có thể thấy rằng sự tăng trưởng trọng lượng của mỗi địa điểm là theo lũy thừa của 10, bắt đầu từ 10^0 và đi qua 10^5 . Đó là lý do tại sao số thập phân được gọi là hệ thống mười cơ số.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Trong hệ nhị phân, trọng lượng của mỗi địa điểm tăng lên theo lũy thừa 2. Điều này có nghĩa là trọng lượng của địa điểm bắt đầu từ 2^0 và kết thúc ở 2^something . Đó là sự khác biệt duy nhất.

00110101 trong số thập phân có nghĩa là 53. Máy tính giải thích hệ nhị phân theo cách giống như con người chúng ta giải thích các số thập phân, đó là nhân mỗi chữ số của mỗi vị trí với trọng lượng của nó và cộng chúng lại.

Cách thêm số 1 và số 0

Phép cộng hoạt động trong hệ nhị phân giống như cách nó được thực hiện trong số thập phân. Hãy xem điều đó qua một ví dụ. Chúng tôi sẽ thêm hai số nhị phân:1101 (13) và 1100 (12).

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Như chúng ta làm trong hệ thập phân, chúng ta bắt đầu từ vị trí của một người (2^0 ). Thêm 1 và 0 cho chúng ta 1. Vì vậy, chúng ta đặt 1 ở đó. Hãy ở bên tôi và bạn sẽ có được bức tranh toàn cảnh.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

0 cộng với 0 là 0. Tiếp tục.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

1 cộng với 1 là 2. Và 2 trong hệ nhị phân được biểu diễn dưới dạng 10 . Chúng tôi mang 1 đến vị trí tiếp theo và giữ 0 do vị trí hiện tại chúng tôi đang ở. Điều này không giống với việc vượt quá 9 ở một vị trí trong phép cộng thập phân phải không?

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Chúng tôi có hai số 1 ở đó và một số 1 đã được chuyển tiếp từ vị trí trước đó, vì vậy có tổng cộng ba số 1. Tổng của chúng sẽ là 3 và trong hệ nhị phân 3 là 11 vì vậy chúng tôi viết 11 . Kết quả cuối cùng là 11001 hoặc 25 ở dạng thập phân, thực sự là 13 + 12.

Tính toán trên giả định rằng chúng ta có năm bit có sẵn để lưu trữ kết quả. Nếu một máy tính 4 bit thực hiện việc bổ sung này, thì nó sẽ chỉ có bốn bit có sẵn để lưu trữ kết quả.

Bit thứ năm đó sẽ được gọi là tràn trong máy tính 4-bit. Trong số học số nguyên, bit tràn bị bỏ qua hoặc loại bỏ. Vì vậy, chúng tôi sẽ có 1001 (9) là kết quả của chúng tôi nếu chúng tôi đang sử dụng máy tính 4 bit.

Vẻ đẹp của thiết kế số học nhị phân

Hai thuật ngữ quan trọng mà chúng ta cần hiểu trước khi tiếp tục là bit ít quan trọng nhất bit quan trọng nhất .

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Bit ở ngoài cùng bên phải là bit ít quan trọng nhất vì nó có vị trí nhỏ nhất (2^0 ). Và bit ở ngoài cùng bên trái là bit quan trọng nhất vì nó có vị trí cao nhất (2^7 ).

Nếu thế giới chỉ có các số dương, thì đây sẽ là phần cuối của bài viết này (vì chúng ta đã học cách biểu diễn số thập phân trong hệ nhị phân và cách cộng chúng trong hệ nhị phân).

Rất may, chúng tôi cũng có số âm.

Vẻ đẹp của thiết kế số học của CPU nằm trong sự tiêu cực.

Vậy máy tính biểu diễn số âm như thế nào, và cơ chế số học trên số âm hoạt động như thế nào? Hãy xem một cách tiếp cận mã hóa cho vấn đề này.

Xin lưu ý rằng trong các phần dưới đây, chúng tôi sẽ làm việc với máy tính 4 bit để hiểu các khái niệm, nghĩa là bit thứ năm sẽ được coi là phần tràn. Các nguyên tắc tương tự áp dụng cho tất cả các kiến ​​trúc CPU như 16-bit, 32-bit hoặc 64-bit để tính toán số học.

Phương pháp mã hóa cường độ dấu hiệu

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

1101 ở dạng thập phân sẽ là -5 trong lược đồ mã hóa này. Ngoài cùng bên trái hoặc bit quan trọng nhất là bit dấu. Nó cho bộ xử lý biết về dấu hiệu của số - tức là số đó là số dương hay số âm.

0 trong bit dấu đại diện cho một giá trị dương và 1 đại diện cho một giá trị âm. Các bit còn lại cho chúng ta biết độ lớn thực tế.

Trong 1101 , bit dấu là 1 , vì vậy số là âm. 101 bằng 5 trong số thập phân. Vì vậy, 1101 sẽ tính thành -5 ở dạng thập phân.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU
Tất cả các số khả thi có thể được biểu thị bằng bốn bit với lược đồ mã hóa bit dấu

Trong sơ đồ trên, bạn có thể thấy tất cả các số nguyên có thể được biểu diễn bằng bốn bit bằng cách sử dụng phương pháp mã hóa này. Tất cả có vẻ tốt cho đến thời điểm này.

Nhưng nếu chúng ta quan sát kỹ hơn, chúng ta có thể thấy một vấn đề thiết kế rất nghiêm trọng trong sơ đồ mã hóa này. Hãy đối mặt với vấn đề đó.

Hãy thêm một số dương và một số âm. Ví dụ, chúng tôi sẽ thêm +4 và -1. Câu trả lời của chúng tôi phải là (+4) + (-1) = (+3) đó là 0011 .

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Hãy xem, kết quả là 1101 (-5). Câu trả lời thực tế phải là 0011 (+3). Nếu chúng tôi triển khai phương pháp này trên một bộ xử lý thì chúng tôi sẽ cần thêm logic để giải quyết vấn đề này và các kỹ sư ghét sự phức tạp bổ sung trong logic của họ.

Khi chúng tôi thêm nhiều mạch, mức tiêu thụ điện năng tăng lên và hiệu suất bị ảnh hưởng.

Điều này nghe có vẻ là một vấn đề nhỏ đối với các máy tính dựa trên bóng bán dẫn hiện đại.

Nhưng hãy nghĩ đến những chiếc máy tính thời kỳ đầu như EDVAC được chạy trên hàng nghìn ống chân không tiêu thụ điện năng tính bằng kilowatt do hàng trăm người vận hành mỗi ngày. Và chính phủ đã chi hàng triệu USD để xây dựng chúng.

Trong những ngày đó, việc đặt thêm các mạch và ống chân không có nghĩa là hàng ngàn đô la và rắc rối bảo trì nghiêm trọng.

Vì vậy, các kỹ sư đã phải nghĩ ra một thiết kế mã hóa thông minh hơn.

Giờ đây, đã đến lúc cần phải tiết lộ vẻ đẹp sẽ giải quyết vấn đề này và làm cho hệ thống của chúng tôi đơn giản hơn, hoạt động hiệu quả hơn và ít tốn điện hơn.

Một hệ thống mã hóa đẹp đi vào và CPU tỏa sáng ❤️

Trong sơ đồ mã hóa này, giống như trong sơ đồ trước, bit ngoài cùng bên trái hoạt động như một bit dấu - nhưng với một số kỹ thuật liên quan để biểu diễn số âm.

Các số dương được biểu diễn theo cách chính xác giống như lược đồ mã hóa trước đó:0 đứng đầu tiếp theo là các bit còn lại cho độ lớn. Ví dụ:trong lược đồ mã hóa này cũng vậy, 6 sẽ được biểu diễn dưới dạng 0110 .

Để biểu diễn một số âm, một quy trình toán học hai bước được chạy trong phần đối âm của nó. Có nghĩa là để biểu diễn -6, chúng ta sẽ thực hiện một quy trình toán học hai bước trên +6 để đến -6 trong hệ nhị phân.

Hãy xem cách -6 sẽ mã hóa thành nhị phân:

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Trong phương pháp tiếp cận cường độ dấu hiệu trước đó, để tính âm của +6, chúng tôi chỉ cần thay đổi bit dấu từ 0 thành 1 . 0110 (+6) sẽ trở thành 1110 (-6).

Trong lược đồ mã hóa mới này, đầu tiên chúng tôi đảo các bit. Thay đổi số không thành một và một thành số không. 0110 (+6) trở thành 1001 . Việc đảo các bit được gọi là "phần bổ sung của một người", vì vậy ở đây chúng tôi đã tính phần bổ sung của một người là 0110 dẫn đến 1001 . Sau đó ...

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Chúng tôi thêm 0001 (+1) cho phần bổ sung của một người mà chúng tôi nhận được từ bước một (1001 ). Kết quả 1010 sẽ là biểu diễn nhị phân của -6. Lược đồ mã hóa này được gọi là phần bù của hai. Vì vậy, hãy nhớ rằng việc tính phần bù của hai cho một số nguyên dương sẽ cho chúng ta phần đối âm của nó.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Các bit đảo ngược cung cấp cho chúng ta phần bổ sung của một người. Việc thêm một vào phần bổ sung của một người sẽ cho chúng ta phần bổ sung của hai phần của các bit ban đầu mà chúng ta đã bắt đầu. Đơn giản, phải không?

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU
Tất cả các số khả thi có thể được biểu diễn bằng bốn bit với lược đồ mã hóa bổ sung của hai phần

Bây giờ, chúng ta hãy xem tại sao lược đồ mã hóa này lại đẹp như vậy. Chúng tôi sẽ thêm 0100 (+4) và 1111 (-1).

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Hãy xem, chúng tôi nhận được kết quả chính xác với sơ đồ mã hóa bổ sung của cả hai. Bây giờ chúng ta có thể thêm các số nguyên mà không cần lo lắng về các dấu hiệu của chúng.

Chúng ta đã học cách biểu diễn một số nguyên âm dưới dạng 0 và 1 thông qua mã hóa bổ sung của hai. Bây giờ, giả sử chúng ta thực thi ADD eax, -3 và giá trị hiện tại trong thanh ghi eax là -1. Vì vậy, giá trị trong eax sau khi thực thi ADD eax, -3 sẽ là -4 (là 1100 trong mã hóa bổ sung của hai).

Khi hệ điều hành truy xuất 1100 từ eax để trình bày kết quả cho người dùng, hệ điều hành giải mã 1100 như thế nào sang số thập phân? Hoặc giả sử nếu chúng ta là một lập trình viên bắt gặp 1100 , làm thế nào chúng tôi có thể tìm ra số nào 1100 đại diện?

Tất nhiên, chúng ta không thể tiếp tục tính toán phần bù của hai cho mỗi số nguyên dương để xem khi nào chúng ta nhấn 1100 . Điều đó sẽ quá chậm.

Các lập trình viên và hệ điều hành sử dụng một thuộc tính tuyệt đẹp của phần bù của hai để giải mã nhị phân thành thập phân.

Khi chúng ta tính toán phần bù của hai của một số dương, chúng ta nhận được phần đối âm của nó. Chà, điều ngược lại cũng đúng - có nghĩa là tính phần bù của hai của một số âm sẽ cho chúng ta phần dương của nó. Chúng tôi sẽ xem lý do tại sao của điều này trong một phút.

Trước tiên, hãy hiểu cách hệ điều hành hoặc một lập trình viên sẽ giải mã 1100 sang số thập phân.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Khi truy xuất 1100 từ thanh ghi eax, Hệ điều hành sẽ thấy 1 như bit dấu báo hiệu rằng số nguyên là âm. Hai phần bổ sung của 1100 được tính toán cung cấp cho đối số dương của 1100 xuất hiện dưới dạng 0100 (+4). Sau đó, hệ điều hành sẽ thêm một dấu âm vào phần dương và trả về câu trả lời cuối cùng là -4. Đọc lại đoạn này một lần nữa và bạn sẽ hiểu rõ hơn.

Sau đó CPU mỉm cười và tạm biệt vẻ đẹp của ngày hôm nay;)

CPU đã đến nhà của nó để gặp mẹ của nó. Bây giờ chúng ta có nhiều thời gian để thảo luận về hoạt động bên trong của nghệ thuật bổ sung hai thứ.

Tại sao và cách mã hóa bổ sung của hai hoạt động?

Nếu tôi bảo bạn tìm âm của một số, giả sử +42, thì cách đơn giản nhất để tìm âm của +42 là gì?

Có thể cho rằng, cách đơn giản nhất là trừ số cho số 0, phải không? 0 - (+42) = -42 . Nếu chúng tôi lặp lại điều này, chúng tôi sẽ quay trở lại giá trị dương, 0 - (-42) = +42 . Đây là tất cả phép toán mà phần bù của hai được xây dựng dựa trên.

Bộ vi xử lý Lãng mạn với số nguyên âm - Cách thức và lý do thiết kế số học CPU

Chúng tôi đang thực hiện 10000 (0 ở dạng thập phân vì số 1 ngoài cùng bên trái là phần tràn) trừ đi 0101 (+5). Chúng tôi nhận được 1011 đó là -5 ở dạng thập phân trong mã hóa bổ sung của hai. Bỏ qua cách thực hiện phép trừ. Cai đo không quan trọng. Hiểu được trực giác đằng sau sự bổ sung của cả hai là điều quan trọng.

10000 có thể được viết là 1111 + 0001 (thử thêm hai cái này, bạn sẽ nhận được 10000 ). Vì vậy, thực sự chúng tôi đang làm:

        10000       -   0101
=>  (1111 + 0001)   -   0101

Sắp xếp lại phương trình trên, chúng ta có thể viết nó là:

    (1111 + 0001)  -  0101
=>  (1111 - 0101)  +  0001

Step 1: subtract 0101 from 1111

        1 1 1 1
       -0 1 0 1
       ---------
        1 0 1 0
        
       see, subtracting 0101 from 1111 is equivalent 
       to inverting the bits of 0101, as we got 1010 as a result. 

  
       
Step 2: add 0001 to the above result  

        1 0 1 0  ---> result of step 1
       +0 0 0 1
       ---------
        1 0 1 1      
       
       we get 1011 that is -5 in two's complement encoding.      

Bạn có thấy rằng về cơ bản hệ thống bù trừ của hai số 0 trừ số không? Đảo các bit và thêm một bit là một cách nhanh chóng và thông minh để trừ số cho 0.

Đây là lý do tại sao chúng ta nhận được số dương của một số âm và âm của một số dương khi chúng ta tính toán phần bù của hai số của nó - bởi vì chúng ta thực sự đang trừ số cho 0 (0 - number ).

Máy tính vào những năm 1900 từng chỉ có logic số học cộng vì sơ đồ mã hóa bổ sung của hai phép tính này rất đẹp nên phép trừ có thể dễ dàng thực hiện.

Ví dụ, để trừ 12 cho 100, CPU sẽ tính toán phần bù của hai là +12 tạo ra -12, sau đó chúng ta cộng -12 với 100 để cho ra kết quả đầu ra cần thiết.

Tại sao chúng ta không trừ trực tiếp từ 0 để tìm số âm của một số hoặc ngược lại trong hệ nhị phân?

Bởi vì phép trừ là một quá trình chậm và phức tạp (nhờ vay mượn) nên máy tính của chúng ta sẽ cần một mạch trừ đắt tiền nếu chúng ta đi theo cách đó. Hãy tưởng tượng trừ 0 mỗi khi chúng ta muốn biểu diễn một số nguyên âm. Đó sẽ là một cơn ác mộng cho chúng tôi và cho cả máy tính của chúng tôi!

Mã hóa bổ sung của cả hai là một giải pháp hiệu quả hơn, dẫn đến thiết kế mạch đơn giản và tiết kiệm rất nhiều tiền. Điều này là do chúng ta không cần một mạch đắt tiền cho phép trừ và không có logic bổ sung để xử lý số học của + và - số nguyên. Chỉ đơn giản là cộng và chúng ta phải làm cả hai - cộng và trừ.

Vì vậy, chúng ta hãy đánh giá cao các nhà thiết kế máy tính của chúng tôi về sơ đồ mã hóa tuyệt đẹp này - sự bổ sung của cả hai ❤️.

Lời cuối cùng

Tôi đã tự hứa với mình rằng tôi sẽ không bao giờ tính phí cho bất kỳ tài liệu học tập nào do tôi sản xuất. Bất cứ điều gì tôi làm cho giáo dục, cho dù đó là một bài báo đơn giản hay một khóa học hay một cuốn sách điện tử, sẽ luôn miễn phí và mở 100%.

Tôi đăng các nguồn hữu ích và chia sẻ những suy nghĩ có ý nghĩa trên tài khoản Twitter của mình. Bạn có thể theo dõi tôi ở đó và gửi cho tôi một tin nhắn trực tiếp nếu bạn học được điều gì đó mới từ bài viết này. Nó sẽ làm nên ngày của tôi :)

Mọi nhà phát triển, mọi tác giả và mọi con người đều học hỏi từ ai đó. Tôi tin rằng những người và tài nguyên mà chúng ta học hỏi được nên được trích dẫn và lan truyền. Điều này khuyến khích những người tốt đó làm được nhiều việc hơn cho tất cả chúng ta. Vì vậy, đây là những cái tốt của tôi.

Animesh của mycodeschool đã dạy tôi nhiều khái niệm lập trình tốt hơn bất kỳ ai khác, bao gồm cả những khái niệm tôi đã viết trong bài viết này.

André Jaenisch, người cố vấn và người bạn của tôi, nếu không có những nỗ lực xem xét và hỗ trợ thường xuyên của anh ấy, tôi sẽ không viết bài báo này.

Chúc bạn học vui vẻ!