Đồ á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

