Minimalist Forum Reader
như tít, đang tự học C/C++ và không qua được cái con trỏ =((=((
Câu hỏi của bạn bị sai về bản chất. C không được "tạo ra" bởi "ngôn ngữ" khác. Lý do thì mình giải thích ở dưới.

Máy tính vốn chỉ thực hiện các lệnh nhị phân (binary instructions), cái này mình đoán là bạn đã biết từ trước. Nhiều lệnh nhị phân gộp lại thì nó được gọi là chương trình máy tính. Các lệnh nhị phân có thể được biểu diễn dưới dạng cho con người đọc bằng thứ mà bây giờ gọi là Assembly (hợp ngữ) - lưu ý là mỗi kiến trúc CPU có một tập cách lệnh khác nhau. Tất cả mọi thứ bạn đang dùng với máy tính hiện giờ: hệ điều hành, trình duyệt để lướt voz, game chơi giải trí qua ngày,... đều có thể bẻ nhỏ ra những lệnh nhị phân để điều khiển máy tính hết.

Vấn đề với lệnh nhị phân là con người khó mà đọc được, nhất là khi công việc ngày càng phức tạp. Ngày xưa người ta chỉ dùng máy tính để cộng trừ nhân chia thì còn xử lý được, chứ đến khi nhu cầu giải quyết các bài toán phức tạp hơn thì khó mà quản lý nổi. Nhiều khi máy chạy ra kết quả sai ở đâu cũng không biết đường mà sửa. Hãy tưởng tượng bạn đang làm một chương trình soạn thảo văn bản mà phải đi dò nội dung thanh ghi (register) 32-bit toàn 0 với 1 thì bao giờ bạn mới làm xong chương trình?

Ngôn ngữ lập trình ra đời để giải quyết vấn đề này. Ý tưởng đằng sau rất đơn giản: người ta gộp một hoặc nhiều lệnh nhị phân vào một cái gì đó mà con người dễ đọc, dễ hiểu. Tổng hợp các quy tắc đó lại thì ta có một thứ tạm gọi là ngôn ngữ lập trình. Việc ánh xạ các quy tắc đó, làm sao biến đổi từ những từ ngữ và câu lệnh do con người viết thành lệnh nhị phân cho máy tính có thể chạy được thực hiện bằng một chương trình khác, gọi là trình dịch (compiler). Nội dung của trình biên dịch đơn giản chỉ là: à chỗ này vòng lặp thì ra 4 lệnh máy, chỗ kia gán biến thì là 2 lệnh, v.v... chú ý là con số chỉ mang tính minh họa cho vấn đề. Compiler các đời đầu hiển nhiên là được làm bằng assembly theo kiểu như vậy.

Không chỉ C mà có nhiều ngôn ngữ khác đều được tạo ra bằng cách tương tự, Pascal là một ví dụ.

Compiler còn giải quyết một vấn đề khác, đó là nếu có cùng một file mã nguồn có thể dịch ra đem chạy trên CPU loại A, file đó có thể đem dịch lại cho CPU loại B rồi chạy với kết quả giống nhau. Điều này giúp tiết kiệm công sức, đỡ phải làm cùng một công việc với hai tập lệnh khác nhau. Khi cần chạy ở máy khác thì cứ quăng cho compiler nó dịch lại là xong, đỡ phải ngồi soi mói.

Vẫn cần nhắc lại, máy tính không "hiểu" ngôn ngữ lập trình, chúng chỉ có thể chạy các lệnh nhị phân. Và người ta không "tạo ra" ngôn ngữ lập trình này từ ngôn ngữ lập trình khác.
Reactions: vesonat, Kenirous, AccDuyNhat and 27 others
Thế cuối cùng ng ta tạo ra ngôn ngữ lập trình từ 0 với 1 à bác?
Thế cuối cùng ng ta tạo ra ngôn ngữ lập trình từ 0 với 1 à bác?
người ta không tạo ra ngôn ngữ lập trình từ 0 với 1. Ngôn ngữ lập trình được tạo ra bằng Anh ngữ.

Trình biên dịch nguyên thủy được tạo ra bằng mã nhị phân 0, 1, chạy bằng bìa đục lỗ.


Ngôn ngữ C được tạo ra bằng Ngôn ngữ Anh. Quyển "The C Programming Language" xuất bản lần đầu tiên năm 1978 bằng tiếng Anh, tất cả các spec hiện nay cũng bằng tiếng Anh.

Ngôn ngữ C khởi thủy được cải tiến từ ngôn ngữ B. Trình biên dịch C đầu tiên được viết bằng Assembly.
như tít, đang tự học C/C++ và không qua được cái con trỏ =((=((
không thấy vào thì thôi học cho pass thôi sau này nếu không đi theo c c++ thì cũng chả cần quan tâm lắm mấy cái con trỏ đâu
Nếu các thím hứng thú với compiler và lịch sử nói chung, có thể đọc bài của Dennis Ritchie: The Development of the C Language* - Dennis M. Ritchie - Bell Labs/Lucent Technologies

Cụ Dennis cùng với cụ Brian Kernighan là tác giả của ngôn ngữ C, cũng là tác giả của sách The C Programming Language luôn.
Bác cũng làm bên phát triển game hả? cũng lĩnh vực với mình
Bác có kiến thức nền tốt, có dịp giao lưu nhé
Reactions: tao_la_giang
Dạo trc có tìm cái này thì ra compiler đầu tiên của c++ được viết bằng c++
Trình biên dịch C đầu tiên được viết bằng Assembly.
Trình biên dịch C đầu tiên được viết bằng Assembly, vậy cho hỏi khi viết bằng Assembly xong rồi người ta dùng công cụ gì hay trình biên dịch gì để dịch ra trình biên dịch C?
Trình biên dịch C đầu tiên được viết bằng Assembly, vậy cho hỏi khi viết bằng Assembly xong rồi người ta dùng công cụ gì hay trình biên dịch gì để dịch ra trình biên dịch C?
Assembly hay gọi là hợp ngữ thì nó dùng Assembler để biên dịch thành các mã máy. Thằng ngôn ngữ cấp cao thường thì sẽ cần một thằng biên dịch ở cấp thấp hơn đễ dịch cho nó, thấp nhất là mã máy nhị phân.
Assembly hay gọi là hợp ngữ thì nó dùng Assembler để biên dịch thành các mã máy. Thằng ngôn ngữ cấp cao thường thì sẽ cần một thằng biên dịch ở cấp thấp hơn đễ dịch cho nó, thấp nhất là mã máy nhị phân.
Bác cho hỏi người ta dùng ngôn ngữ gì và trình biên dịch gì để tạo ra Assembler, hay là sử dụng mã máy nhị phân?
Bác cho hỏi người ta dùng ngôn ngữ gì và trình biên dịch gì để tạo ra Assembler, hay là sử dụng mã máy nhị phân?
Thường mỗi ngôn ngữ sẽ có trình biên dịch riêng.
Ví dụ thím viết C# thì sẽ có 1 compiler dịch C# ra ngôn ngữ thấp hơn (IL - Intermediate language, ngôn ngữ trung gian, do M$ viết ra, nằm trong file exe hoặc dll), sau đó khi chạy file exe thì IL sẽ được dịch tiếp thành native code, native code này chính là các lệnh mà CPU hiểu được.
net_structure_2.png

Thằng java cũng tương tự thế, java code => java byte code => native code.
Khác biệt là thèn compiler ra native của C# chỉ chạy được trên windows, còn compiler ra native của Java thì chạy đa hệ điều hành, nên java đc xem là đa nền tảng.
Cái Assembler thím nói nằm trong quá trình biên dịch ra native code, tuỳ thuộc vào hệ điều hành và kiến trúc CPU, nhưng nói chung cuối cùng nó cũng sẽ dịch về tập lệnh mà CPU hiểu được. Viết kiểu gì thì để tôi rảnh google rồi trả lời thím, hồi xưa có học nhưng lâu quá quên bà rồi.
P.S: Thật ra tôi chém gió đấy :love:
Reactions: orien and lucifergod
> C itself is a descendant of the language B, originally created (as others have suggested) for the PDP-7. The first C compiler was written in something (short lived) that Dennis called NB or NewB. NB was written on and targeted to the PDP-11 not the PDP-7. NB was created because of deficiencies the team had run into when they moved their B code to the PDP-11. NewB was written in B, because by that time B had been written in itself. That said, Thompson original B compiler was written in PDP-7 assembler. NB was refined and gave birth to C. C itself was refined by Dennis multiple times (again described in his document).
Thường mỗi ngôn ngữ sẽ có trình biên dịch riêng.
Ví dụ thím viết C# thì sẽ có 1 compiler dịch C# ra ngôn ngữ thấp hơn (IL - Intermediate language, ngôn ngữ trung gian, do M$ viết ra, nằm trong file exe hoặc dll), sau đó khi chạy file exe thì IL sẽ được dịch tiếp thành native code, native code này chính là các lệnh mà CPU hiểu được.
net_structure_2.png

Thằng java cũng tương tự thế, java code => java byte code => native code.
Khác biệt là thèn compiler ra native của C# chỉ chạy được trên windows, còn compiler ra native của Java thì chạy đa hệ điều hành, nên java đc xem là đa nền tảng.
Cái Assembler bác nói nằm trong quá trình biên dịch ra native code, tuỳ thuộc vào hệ điều hành và kiến trúc CPU, nhưng nói chung cuối cùng nó cũng sẽ dịch về tập lệnh mà CPU hiểu được. Viết kiểu gì thì để tôi rảnh google rồi trả lời thím, hồi xưa có học nhưng lâu quá quên bà rồi.
P.S: Thật ra tôi chém gió đấy :love:
Bổ sung thêm là h c# chạy đa nền tảng giống thằng java rồi nhé
Bác cho hỏi người ta dùng ngôn ngữ gì và trình biên dịch gì để tạo ra Assembler, hay là sử dụng mã máy nhị phân?

Với asm thì mỗi cpu nó có 1 cái Instruction set architecture khác nhau. Cái này như là cái guideline về cách sử dụng/truy cập data, memory, I/O... của từng loại kiến trúc cpu vậy. Nó bao gồm cả opcode (ko rõ nên dịch là gì - mã thực thi?) của từng loại kiến trúc, rất rất gần với mã máy, là dạng mã hóa dễ đọc của 1 hành động/phép toán trên cpu. Opcode sẽ mapping 1-1 với mã máy. Asm chính là 1 tập hợp của các opcode.

Mình nhớ đại khái như vậy.
Bác cho hỏi người ta dùng ngôn ngữ gì và trình biên dịch gì để tạo ra Assembler, hay là sử dụng mã máy nhị phân?
Để viết trình biên dịch cho ngôn ngữ X, người ta thường viết phiên bản cơ bản nhất bằng 1 ngôn ngữ khác. Kết quả được 1 phiên bản nguyên thủy v0 X compiler. Phiên bản nguyên thủy đó được dùng để dịch một phiên bản nguyên thủy v0.1 viết bằng ngôn ngữ X. Sau khi có v0.1, người ta tiếp tục viết v0.2, v0.3, v0.4,... Trong thời kỳ đầu tiên của máy tính, assembly thường được dùng để viết v0, sau đó đến các ngôn ngữ cao hơn như COBOL hoặc FORTRAN.

Assembly là ngôn ngữ cấp thấp, mỗi 1 lệnh trong assembly tương ứng với 1 chỉ thị mã máy. Assembly có thể dịch sang mã máy và ngược lại với tương quan 1:1.

Ví dụ: MOV AL, 61h
Mã máy của MOV là 10110, thanh ghi AL là 000, như vậy byte đầu tiên 10110000 (B0) là mã máy để chuyển 1 byte vào thanh ghi AL. Byte tiếp theo là giá trị cần chuyển 01100001 (61). Mã máy của lệnh "MOV AL, 61h" là "10110000 01100001" (hay B0 61).
Reactions: Cụ Dumbledore, ngocquocktqd, saotenbitrunghoai and 3 others
Để viết trình biên dịch cho ngôn ngữ X, người ta thường viết phiên bản cơ bản nhất bằng 1 ngôn ngữ khác. Kết quả được 1 phiên bản nguyên thủy v0 X compiler. Phiên bản nguyên thủy đó được dùng để dịch một phiên bản nguyên thủy v0.1 viết bằng ngôn ngữ X. Sau khi có v0.1, người ta tiếp tục viết v0.2, v0.3, v0.4,... Trong thời kỳ đầu tiên của máy tính, assembly thường được dùng để viết v0, sau đó đến các ngôn ngữ cao hơn như COBOL hoặc FORTRAN.

Assembly là ngôn ngữ cấp thấp, mỗi 1 lệnh trong assembly tương ứng với 1 chỉ thị mã máy. Assembly có thể dịch sang mã máy và ngược lại với tương quan 1:1.

Ví dụ: MOV AL, 61h
Mã máy của MOV là 10110, thanh ghi AL là 000, như vậy byte đầu tiên 10110000 (B0) là mã máy để chuyển 1 byte vào thanh ghi AL. Byte tiếp theo là giá trị cần chuyển 01100001 (61). Mã máy của lệnh "MOV AL, 61h" là "10110000 01100001" (hay B0 61).

Thím này nói đúng này. Thực ra assembly không phải một ngôn ngữ. Mỗi kiến trúc CPU lại có tập lệnh riêng. Bản thân tool dùng để chuyển assembly sang machine code cũng không được gọi là compiler, mà gọi là assembler là vì thế.
Ngắn gọn mình có thể giải thích là C không được ngôn ngữ nào tạo ra. C được tạo ra bởi con người. Người tạo ra nó đặt tên “nó” là C.
C nói riêng và ngôn ngữ lập trình nói chung được gọi là các quy tắc để cho compiller biên dịch thành mã máy cho máy tính chạy.
Còn mã máy là gì thì tự google

via vozForums for iPhone
Trình biên dịch C đầu tiên được viết bằng Assembly, vậy cho hỏi khi viết bằng Assembly xong rồi người ta dùng công cụ gì hay trình biên dịch gì để dịch ra trình biên dịch C?
Dựa theo nguồn này: https://en.wikipedia.org/wiki/Compiler#History
Thì thằng này là ngôn ngữ viết ra compiler C lúc sơ khai.
"BCPL (Basic Combined Programming Language) designed in 1966 by Martin Richards at the University of Cambridge was originally developed as a compiler writing tool.[17] Several compilers have been implemented, Richards' book provides insights to the language and its compiler.[18] BCPL was not only an influential systems programming language that is still used in research[19] but also provided a basis for the design of B and C languages. "

Còn ngôn ngữ viết ra cái trình biên dịch đầu tiên chắc có lẽ là Opcode, nguồn: https://en.wikipedia.org/wiki/Opcode
Reactions: ngocquocktqd
như tít, đang tự học C/C++ và không qua được cái con trỏ =((=((
Con trỏ nó chỉ là cái địa chỉ ô nhớ dữ liệu thôi, sao phải làm quá lên nhỉ ? Trong C++ thì phải tự giải phóng bộ nhớ cho con trỏ, chứ ngôn ngữ khác mà ko có thằng nào tham chiếu là nó tự dọn luôn.