Đồ án Phân biệt sự khác nhau cơ bản của các ngôn ngữ - Trần Đức Huy
Mục Lục
1> Chú Thích .2
2> Hằng .2
3> Kiểu Dữ Liệu .3
4> Kiểm Tra Kiểu,Đổi Kiểu 5
5> Không Gian Tên .6
6> Quản Lý và Cấp Phát Bộ Nhớ .6
7> Hàm Trùng Tên .7
8> Nhập Xuất 8
9> Những Điểm Đặc Biệt Khác .9
10> Nhận Xét
(kết hợp sử dung clr ) +Trong C#: là null. +Trong Java: là undefined. 3>Kiểu dữ liệu: *Khai báo ban đầu: (Initializing Value Type) +Trong C++: Ví dụ: System::DateTime dt = System::DateTime(2001,4,5); +Trong C#: Ví dụ: System.DateTime dt = new System.DateTime(2001,4,12); +Trong Java: Ví dụ: var dt : System.DateTime = new System.DateTime(2001,4); *Kiểu ký tự đặc biệt: (cả 3 đều có) \‟ Dấu nháy đơn \” Dấu nháy kép \\ Dấu chéo \0 Ký tự null \a Alert \b Backspace \f Sang trang form feed \n Dòng mới \r Đầu dòng \t Tab ngang \v Tab dọc *Bảng thống kê: Content and size C++ C# JScript Unknown data VARIANT n/a Object Decimal DECIMAL decimal decimal Date DATE DateTime DateTime Date object SBCS character (1 byte) signed char __int8 n/a sbyte Unicode character (2 bytes) wchar_t char char Unicode character sequence wchar_t* string String Boolean (platform dependent) VARIANT_BOOL bool boolean 1 byte signed char sbyte n/a 2 bytes signed short int __int16 short short 4 bytes long, (long int, signed long int) int int 8 bytes __int64 long long 1 byte unsigned BYTE bool byte byte 2 bytes unsigned unsigned short ushort n/a 4 bytes unsigned unsigned int and unsigned long uint n/a 8 bytes unsigned unsigned __int64 ulong n/a 4 bytes floating point float float float 8 bytes floating point double double Double 4>Kiểm tra kiểu,đổi kiểu. +Kiểu trả về (return) :Cả 3 ngôn ngữ đều có cách sử dụng giống nhau. (Cùng trả về tham số) Ví dụ: int abs (int i) { return i;} +Đổi kiểu: Cả 3 ngôn ngữ đều có chung 2 cơ chế đổi kiểu,đó là chuyển đổi tường minh và chuyển đổi ngầm định. Ví dụ: //Đổi kiểu ngầm định: short x = 10; int y = x; // chuyển đổi ngầm định //Đổi kiểu tường minh: short x; int y = 100; x = y; // Không biên dịch, lỗi !!! //Để kô bị lỗi ta cần viết lại như sau. short x; int y = 100; x = (short) y; //Ép kiểu tường minh,kô gây lổi 5>Không gian tên: +C#: Hàm “ Main() “ (Viết Hoa ở ký tự đầu). +Java và C++:Hàm “ main() “ (Viết Thường ở ký tự đầu). Một điều quan trọng là C# và Java kô sử dụng không gian tập tin (header) như C++.Tất cả mã nguồn được viết trong khai báo lớp. 6>Quản lý và cấp phát bộ nhớ. +Trong C++:Cấp phát bộ nhớ sử dụng hàm new kết hợp với hàm giải phóng bộ nhớ delete. Ví dụ: int x; x = new int; Và delete x; +Trong Java và C#: (Trong Stack và Heap) (Thu gom bộ nhớ tự động) Tự cấp phát bộ nhớ : *Kiểu giá trị như kiểu số nguyên cấp phát ở vùng Stack. *Kiểu tham chiếu như các đối tượng cấp ở vùng Heap. Thu gom bộ nhớ: *Cơ chế thu gom sẽ hũy đối tượng trong stack sau khi một vùng trong stack được đánh dấu là kết thúc. Thông thường một vùng trong stack được định nghĩa bởi một hàm. Do đó, nếu chúng ta khai báo mộtbiến cục bộ trong một hàm là một đối tượng thì đối tượng này sẽ đánh dấu để hũy khi kết thúc hàm. *Những đối tượng trên heap sẽ được thu gom sau khi một tham chiếu cuối cùng đến đối tượng đó được gọi. 7>Hàm trùng tên: +Trong C++: Cho phép trùng tên hàm (miễn khác tham số khai báo trong hàm là được). (nên gọi là chồng hàm) Ví dụ: Ta có 2 hàm int Gan() và int Gan (int x) Lưu ý: Hai hàm int Gan() và float Gan (int x) sẽ bị lỗi vì kô phù hợp qui luật chồng hàm. +Trong Java và C#: Sử dụng namespace để tránh sự xung đột giữa việc sử dụng các thư viện khác nhau từ các nhà cung cấp. Ví dụ: namespace MyLib { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } } 8>Nhập xuất: *Nhập: +Trong C++ :có thể gán trong trình biên dịch hoặc lúc thông dịch. Ví dụ: int n; int n=1; hoặc cin>>n; +Trong C# và Java : có tính phức tạp hơn (vì kô sử dụng thư viện)(phải gán giá trị ban đầu). *Xuất: +Trong C++: Kô sử dụng. Ví dụ: int n; cout<<n; +Trong Java và C#:Phức tạp. Ví dụ: System.Console.WriteLine("Hello"); 9>Những điểm đặc biệt khác: -Kiểu cấu trúc Struct : +C++: là kiểu dữ liệu,thường xuyên dùng.(nhưng trong LTHDT thì khác) +C# :Là 1 kiểu dữ liệu,ít dùng. +Java: Kô có. -Khác nhau về Kiểu liệt kê (Enumerator): +C++ và C#: (giá trị mặc định ban đầu là 0) Ví dụ: public enum Color { Green, //defaults to 0 Orange, //defaults to 1 Red, //defaults to 2 Blue //defaults to 3 } +Java:Kô hỗ trợ. -Khai báo Mảng: +C# :Có thể khai báo trực tiếp. Ví dụ: int[] x; hoặc int[] x= {1,2,3,4,5}; +Java và C++: Tích hợp thêm cách khai báo. Ví dụ: Char ch[]; hoặc Char ch[]=new char[10]; hoặc Char ch[]={„A‟,‟B‟}; -Trong biên dịch ra Mã trung gian: (Tên gọi khác nhau) +C# biên dich ra MSIL.(Microsoft Intermediate Language). +Java biên dịch ra Bytecode. -Về Biến con trỏ: +C++ vẫn sử dụng thường xuyên. +C#: Vẫn dùng biến con trỏ nhưng đã loại bỏ những phức tạp và rắc rối phát sinh từ con trỏ bằng cách sử dụng bộ thu gom bộ nhớ tự động và kiểu dữ liệu an toàn được tích hợp vào ngôn ngữ. (những đoạn sử dụng con trỏ trong C# sẽ được đánh dấu là kô an toàn (unsafe code)) +Java:Loại bỏ hẳn. -Về cấu trúc câu sử dụng từ khóa switch: +C++: Cho phép kô cần sử dụng lệnh break ở sau default. Ví dụ: switch(n) { case 0: printf_s("Zero\n"); break; default: printf_s("?\n");} +C#: Bắt buộc phải dùng từ khóa break hoặc goto trong câu lệnh case. Nếu kô sử dụng trình biên dịch báo lỗi: Control cannot fall through from one case label („case 3:‟) to another. Ví dụ: const int mauDo = 0; const int mauLuc = 1; int chonMau = mauLuc; switch ( chonMau ) { case mauDo: Console.WriteLine( "Ban cho mau do" ); break; default: Console.WriteLine( "Ban khong chon mau nao het"); break; } +Java: Cho phép kô cần sử dụng break. Ví dụ: int switching = 3; switch(switching) { case 3: System.out.println(“here”); default: System.out.println(“and here”); } -Về mặt tổng quan, +C# đã loại bỏ sự phức tạp,rối rắm của những ngôn ngữ như Java và C++,bao gồm việc loại bỏ những macro,những template,đa kế thừa,và lớp cơ sở ảo (virtual base class).Chúng là những nguyên nhân gây ra sự nhầm lẫn hay những vấn đề cho người phát triển C++. +C# đã từ bỏ ý tưởng đa kế thừa của C++. -Vòng lặp: Cả 3 đều sử dụng vòng lặp như while,do-while và for. +C++: Có thể sử dụng những ký tự ngầm định. (như “ %d …”) Ví dụ: for(int n=1; n<11; n++) { printf_s("%d\n",n); } +C#: Kô hỗ trợ ký tự ngầm định,có thêm vòng lặp foreach. Ví dụ: foreach (int i in testArr) { Console.WriteLine(i); } +Java: Kô hỗ trợ ký tự ngầm định và vòng lặp foreach. Ví dụ: for (var prop in obj) obj[prop] = 42 -Bảng thống kê về tính so sánh: C++ C# JScript Additive Addition + + + Subtraction - - - Multiplicative Multiplication * * * Division / / / Integer division /1 /1 Modulus division (returning only the remainder) % % % (also works with floating point) Exponentiation n/a n/a n/a Assignment Assignment = = = Addition += += += Subtraction -= -= -= Multiplication *= *= *= Division /= /= /= Integer division n/a /=1 n/a String concatenation += += += Modulus division %= %= %= Left shift <<= <<= <<= Right shift >>= >>= >>= Bitwise AND &= &= &= Bitwise exclusive OR ^= ^= ^= Bitwise inclusive OR |= |= |= Null coalescing n/a ?? n/a Relational and equality Less than < < < Less than or equal to <= <= <= Greater than > > > Greater than or equal to >= >= >= Equal == == == Not equal != != != Reference variable comparison n/a == == Reference type comparison n/a x is Class1 (also see as and typeof) instanceof String comparison (There are functions to compare and concatenate strings) == Equals == CString concatenation + + Short circuited Boolean AND && && && Short circuited Boolean OR || || || Bit shift Left shift << << << Right shift >> >> >> >>> Scope resolution Scope resolution :: . base n/a Postfix2 Array element [ ] [ ] [ ] Function call ( ) ( ) ( ) Type cast or (type) (type) type( ) conversion Member selection . -> . . Postfix increment ++ ++ ++ Postfix decrement -- -- -- Unary3 Indirection * * (unsafe mode only) n/a Address of & & (unsafe mode only; also see fixed) n/a Logical NOT ! ! ! One's complement ~ ~ ~ Prefix increment ++ ++ ++ Prefix decrement -- -- -- Size of type sizeof sizeof n/a Comma , n/a , Bitwise Bitwise AND & & & Bitwise exclusive OR ^ ^ ^ Bitwise inclusive OR | | | Logical Logical AND & & && Logical OR | | || Conditional Ternary conditional ?: ?: ?: Pointer to member Pointer to member .* -> . (Unsafe mode only) n/a Reference Reference & n/a (use reference types) n/a 9>Lời Nhận Xét: *Về mặt tổng quan: -Cả 3 ngôn ngữ đều là ngôn ngữ lập trình hướng đối tượng. -C# và Java là những ngôn ngữ hoàn thiện hơn C++ (tránh được những lỗi mà ta thường gặp ở ngôn ngữ C++) vì được phát triển (thừa kế) từ ngôn ngữ C/C++. +C# là ngôn ngữ đơn giản,hiện đại,mạnh mẽ,ít từ khóa,module hóa và là ngôn ngữ phổ biến,tuy còn phụ thuộc vào CPU (giống như C++) +Java cũng từ bỏ ý tưởng đa kế thừa giống như C#,là ngôn ngữ có đặc trưng kô phụ thuộc vào thiết bị và Hệ điều hành,biểu hiện của khả năng 1 chương trình được viết tại 1 máy nhưng có thể chạy bất cứ đâu,vì vậy, nó đã trở thành ngôn ngữ lập trình cho Internet (với sự hỗ trợ của Máy ảo Java). ---Hết---
File đính kèm:
- Đồ án Phân biệt sự khác nhau cơ bản của các ngôn ngữ - Trần Đức Huy.pdf