Προς το περιεχόμενο

Διαφορές C, C++ και C#


xrist0f0r0s

Προτεινόμενες αναρτήσεις

Η παραπληροφόρηση που υπάρχει σε αυτό το topic δεν έχει προηγούμενο. To ότι ξέρει κάποιος το συντακτικό μιας γλώσσας δε πάει να πει ότι ξέρει και την γλώσσα. Το ότι ξέρει κάποιος C δε σημαίνει ότι ξέρει C++ (και το ανάποδο βεβαίως). H μόνη σχέση που έχουν αυτές οι γλώσσες είναι ότι η C++ βασίστηκε στη φιλοσοφία της C (κληρονομώντας και το συντακτικό της), η οποία έλεγε πως ο προγραμματιστής δεν θα πρέπει να πληρώνει (σε χρόνο/χώρο) για features της γλώσσας που δε χρησιμοποιεί.Aπό κει και πέρα είναι δύο εντελώς διαφορετικές γλώσσες.

 

Για την ακρίβεια ο Stroustrap (δημιουργός της C++) κατασκεύασε έναν preprocessor που ονόμασε C with Classes, ο οποίος μετέτρεπε κάποιες αντικειμενοστρεφείς μακροεντολές σε μακροεντολές preprocessor C. Μετά ξεκίνησε η δημιουργία του πρώτου compiler C++. Όποιος ενδιαφέρεται μπορεί να διαβάσει το 'The Design and Evolution of C++'.

 

Το να ξέρεις να γράφεις αποδοτικό (και κυρίως σωστό) κώδικα C βοηθάει στο να κατανοήσεις καλύτερα την C++ και να γράφεις κι εκεί γρήγορο και αποδοτικό κώδικα. Επίσης βοηθάει στην κατανόηση των pointers που στη C++ βέβαια χρησιμοποιούνται σε αρκετά υψηλότερο επίπεδο απ'οτι στη C.

 

Στον αντίποδα, ένας προγραμματιστής C που θα πάει να γράψει κώδικα σε C++, θα έχει πρόβλημα με την σχεδίαση του κώδικα καθώς η μία γλώσσα χρησιμοποιείται εντελώς διαφορετικά από την άλλη σε επίπεδο τεχνολογίας λογισμικού. Λογικό όταν η μια είναι διαδικαστική και η άλλη multi-paradigm, που χρησιμοποιείται για τις αντικειμενοστρεφής της ιδιότητες στο 90% των περιπτώσεων.

Θύμαμαι ένα άρθρο που διάβασα, ότι στη δεκαετία του 90' που κάναν migrate πολλές εταιρίες από C σε C++, παρατηρούταν το φαινόμενο ότι οι προγραμματιστές απλά γράφαν C χρησιμοποιώντας που και που κανα αντικείμενο και STL αχρηστεύοντας τις δυνατότητες της γλώσσας. Αν βρω το link θα το ποστάρω.

 

Προσωπικά γράφω κώδικα σε C++ εδώ και 4 χρόνια και ΣΥΝΕΧΩΣ μαθαίνω καινούργια πράγματα (από βιβλία, άρθρα, γράφοντας κώδικα). Νιώθω μλκας για όσες φορές έχω πει σε συζήτηση 'ξέρω C++', παπάρια ξέρω.

 

Οπότε δε θα συνιστούσα σε κανέναν που γράφει κώδικα σε C να γράψει στο βιογραφικό του ότι ξέρει να γράφει και σε C++ γιατί με πολύ μεγάλη πιθανότητα θα βρεθεί προ εκπλήξεων.

 

@original poster.

η C# τώρα είναι μια εξαιρετική γλώσσα ποργραμματισμού η οποία δημιουργήθηκε για να καλύψει τις αδυναμίες της C++ και κυρίως της JAVA.

Είναι πολύ παραγωγική και μπορείς να κάνεις σχεδόν τα πάντα με αυτή. Το μειονέκτημά της είναι ότι δε μπορείς να πετύχεις την ταχύτητα που θα πετύχαινες σε C ή C++ σε μια εφαρμογή απαιτητική σε πόρους και χρόνο (πχ ένας web server, ένα high-end παιχνίδι, ένα λειτουργικό σύστημα). Αυτό βέβαια δεν ενδιαφέρει τον μέσο προγραμματιστή, πχ. μπορείς να δεις στο youtube πολλά casual ή χαμηλών απαιτήσεων παιχνίδια που έχουν γραφεί σε C#.

 

Οπότε η επιλογή εξαρτάται από τον λόγο τον οποίο θες να μάθεις μια γλώσσα προγραμματισμού.

Αν είναι για λόγους επαγγελματικής αποκατάστασης, μάθε C γιατί εκτός από μια γλώσσα θα μάθεις τι θα πει πραγματικός προγραμματισμός.

Αν το θες για hobby, μάθε C# για να έχεις αποτελέσματα σε πολύ λιγότερο χρόνο. H C# ενδιαφέρεται για την ψυχική υγεία των προγραμματιστών της, η C και η C++ δε δίνουν δεκάρα.

 

Σόρρυ για το post-σεντόνι.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οπότε δε θα συνιστούσα σε κανέναν που γράφει κώδικα σε C να γράψει στο βιογραφικό του ότι ξέρει να γράφει και σε C++ γιατί με πολύ μεγάλη πιθανότητα θα βρεθεί προ εκπλήξεων.

Τοτε γιατι στο Visual Studio 2010 αυτο ειναι C++ ; :confused:

 

>
// try.cpp : Defines the entry point for the application.
//

// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name

// Forward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

	// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;

// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_TRY, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
	return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TRY));

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
	if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style			= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc	= WndProc;
wcex.cbClsExtra		= 0;
wcex.cbWndExtra		= 0;
wcex.hInstance		= hInstance;
wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TRY));
wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_TRY);
wcex.lpszClassName	= szWindowClass;
wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
  HWND hWnd;

  hInst = hInstance; // Store instance handle in our global variable

  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  if (!hWnd)
  {
     return FALSE;
  }

  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  return TRUE;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
	wmId    = LOWORD(wParam);
	wmEvent = HIWORD(wParam);
	// Parse the menu selections:
	switch (wmId)
	{
	case IDM_ABOUT:
		DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
		break;
	case IDM_EXIT:
		DestroyWindow(hWnd);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	break;
case WM_PAINT:
	hdc = BeginPaint(hWnd, &ps);
	// TODO: Add any drawing code here...
	EndPaint(hWnd, &ps);
	break;
case WM_DESTROY:
	PostQuitMessage(0);
	break;
default:
	return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
	return (INT_PTR)TRUE;

case WM_COMMAND:
	if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
	{
		EndDialog(hDlg, LOWORD(wParam));
		return (INT_PTR)TRUE;
	}
	break;
}
return (INT_PTR)FALSE;
}

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δε καταλαβαίνω την ερώτηση σου. C++ είναι που χρησιμοποιεί βιβλιοθήκη C για backwards compatibility. Έχω δει προγράμματα γραμμένα σε Lua που χρησιμοποιούν ρουτίνες γραμμένες σε C για λόγους αποδοτικότητας. Αυτό πάει να πεί ότι όποιος ξέρει Lua, ξέρει αυτομάτως C? Πραγματικά δε μπορώ να καταλάβω τον συνειρμό.

 

Επίσης φέρνοντας μου παράδειγμα με το τι κάνει μια συγκεκριμένη εταιρία (MS), με τον δικό της compiler, δε μου λέει κάτι. Αυτό είναι Visual C++, η οποία δε συμβαδίζει καν με το ANSI C++ standard.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τοτε γιατι στο Visual Studio 2010 αυτο ειναι C++ ; :confused:

 

Αυτο ειναι Window application..... Λογικο να στο'χει σε C εφοσον το win gdi ειναι σε C.

Γιατι δεν postαρεις MFC, ATL, DirectX, OLE τα οποια ειναι σε C++;

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Erevis, απλα λεω οτι οποιος "ξερει/γραφει" C++ στην ουσια "ξερει/γραφει" και αρκετο μερος της/σε C... ;)

 

Αυτό που προσπαθώ να πω εγω είναι ότι αυτή η λογική είναι εντελώς λάθος. Και η Java μοιάζει στο συντακτικό με τη C, αλλα αυτό δε σημαίνει ότι αν ξέρεις C, θα βάλεις στο βιογραφικό σου ότι ξέρεις και Java. Εκτός αν το κάνεις για παραπλάνηση, αλλά μετά αν κάτι πάει στραβά θα υποστείς και τις ανάλογες συνέπειες.

 

Είμαστε σύμφωνοι ότι η C++ είναι ένα υπερσύνολο της C, αλλά αυτό τελικά στην πράξη δεν έχει καμία σημασία. Ένα παράδειγμα θα σου δώσω. Ψάξε να δεις τι σημαίνει το keyword auto στη C και τι σημαίνει πλέον στη C++.

 

 

Γιαυτο ειπα οτι οταν λες C/C++ ειωαοι σαν να εννοεις C, ενω οταν λες C++ εννοεις C++...

 

Αυτό από πού προκύπτει? Δηλαδή αυτός που ξέρει όντως και τις δύο γλώσσες τι πρέπει να γράφει?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η παραπληροφόρηση που υπάρχει σε αυτό το topic δεν έχει προηγούμενο.

 

Αν είναι για λόγους επαγγελματικής αποκατάστασης, μάθε C γιατί εκτός από μια γλώσσα θα μάθεις τι θα πει πραγματικός προγραμματισμός.

 

Αυτη η καραμελα... Το μονο πραγματικο που θα μαθεις ειναι procrdural & structored porgramming paradigm...........

 

Ποιος παραπληροφορει ποιον;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι, δεν είναι το μόνο που θα μάθεις και δεν είναι καν σημαντικό αυτό που λες. Αυτό μπορείς να το μάθεις χρησιμοποιώντας οποιαδήποτε γλώσσα προγραμματισμού. Αυτό που σου δίνει η C είναι προγραμματιστικό υπόβαθρο για το τι συμβαίνει "στα παρασκήνια". Δεν είμαι καν ζηλωτής της C, έχω ασχοληθεί εκτενώς αλλα προτιμώ άλλες γλώσσες. Δε μπορώ όμως να μην αναγνωρίζω αυτά που μου πρόσφερε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όχι, δεν είναι το μόνο που θα μάθεις και δεν είναι καν σημαντικό αυτό που λες. Αυτό μπορείς να το μάθεις χρησιμοποιώντας οποιαδήποτε γλώσσα προγραμματισμού. Αυτό που σου δίνει η C είναι προγραμματιστικό υπόβαθρο για το τι συμβαίνει "στα παρασκήνια". Δεν είμαι καν ζηλωτής της C, έχω ασχοληθεί εκτενώς αλλα προτιμώ άλλες γλώσσες. Δε μπορώ όμως να μην αναγνωρίζω αυτά που μου πρόσφερε.

 

Δηλαδη τωρα πρεπει να σου παιρνω τις λεξεις με το τσιγκελη;

 

Τι υπαρχει στα παρασκηνια;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Erevis, απλα λεω οτι οποιος "ξερει/γραφει" C++ στην ουσια "ξερει/γραφει" και αρκετο μερος της/σε C... ;)

 

Δεν ισχύει αυτό. Νομίζω αυτό που θέλεις να πείς είναι ότι "όποιος ξέρει C++, μπορεί σχετικά εύκολα να μάθει να γράφει και C".

 

φιλικά,

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτη η καραμελα... Το μονο πραγματικο που θα μαθεις ειναι procrdural & structored porgramming paradigm...........

 

Ποιος παραπληροφορει ποιον;

 

Και πάλι. Η C δεν είναι κάτι ξεπερασμένο ή κάτι που δεν έχει τίποτα να προσφέρει όπως μάλλον υπονοείς.

Εξαρτάται το αντικείμενο με το οποίο θα ασχοληθείς.

 

Για παράδειγμα, μετά από συζητήσεις που είχα με τους καθηγητές μου στο Πολυτεχνείο( πολλοί από αυτούς έχουν δουλέψει στην Αμερικάνικη βιομηχανία ως μηχανικοί software-hardware) και άλλα άτομα που άφησαν τα κόκκαλά τους σε IBM και λοιπά, από προγραμματισμό τόνισαν 2 γλώσσες προγραμματισμού για να τα "βγάλεις πέρα": C( σαν την μητρική σου) και μια script. Αλλά κυρίως C! Εννοείται πως έχεις και γνώσεις assembly. Όπως καταλαβαίνεις, σε αυτόν τον τομέα όσον αφορά τον προγραμματισμό πρέπει να κρατιέσαι σε χαμηλό επίπεδο. Προγραμματισμός πυρήνα λειτουργικών, παράλληλος προγραμματισμός εφαρμογών με τη βιβλιοθήκη CUDA και και και...

 

Αν θες να ασχοληθείς για hobby, εννοείται ότι δε θα δώσεις μεγάλη σημασία σε assembly και οι pointers δε θα είναι η καούρα σου. Ξεκινάς με λίγη C για να μπεις στο πνεύμα( δομημένος προγραμματισμός..) αν δεν έχεις ασχοληθεί καθόλου στο παρελθόν και πιάνεις κάποια γλώσσα η οποία θα σου κάνει αυτό που θες χωρίς "βαθιές" γνώσεις προγραμματισμού, π.χ. JAVA, python.

 

Καμία γλώσσα δεν είναι τέλεια. Αν ήταν έτσι θα υπήρχε μόνο μία, η JAVAC++ ξέρω 'γω.

 

Αυτά..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δηλαδη τωρα πρεπει να σου παιρνω τις λεξεις με το τσιγκελη;

 

Τι υπαρχει στα παρασκηνια;

 

Κυρίως

 

-η διαχείριση μνήμης, και ναι δε μιλάω μόνο για το τετριμμένο malloc/free, αλλά για την δημιουργία custom allocators και custom pools.

-η αλληλεπίδραση με το kernel στον προγραμματισμό συστήματος.

-η αλληλεπίδραση με τις περιφερειακές συσκευές.

-η δημιουργία δομών δεδομένων πού στις γλώσσες πολύ υψηλού επιπέδου υπάρχουν έτοιμες.

-η δημιουργία δομών δεδομένων που σε γλώσσες πολύ υψηλού επιπέδου είναι δύσκολο να επιτευχθεί λόγω αποδοτικότητας, πχ. Β+ δένδρα. Γι'αυτό και τα περισσότερα rdbms είναι γραμμένα σε C.

 

αυτά μου έρχονται πρόχειρα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Και πάλι. Η C δεν είναι κάτι ξεπερασμένο ή κάτι που δεν έχει τίποτα να προσφέρει όπως μάλλον υπονοείς.

Εξαρτάται το αντικείμενο με το οποίο θα ασχοληθείς.

 

 

Ειπα εγω οτι ειναι ξεπερασμενη; Βασικα βλεπεις να εχω γραψει κατι το αρνητικο για την C;

Οπως ειπες πολυ σωστα! Εξαρταται το αντικειμενο που σε απασχολει.

 

Κυρίως

 

-η διαχείριση μνήμης, και ναι δε μιλάω μόνο για το τετριμμένο malloc/free, αλλά για την δημιουργία custom allocators και custom pools.

-η αλληλεπίδραση με το kernel στον προγραμματισμό συστήματος.

-η αλληλεπίδραση με τις περιφερειακές συσκευές.

-η δημιουργία δομών δεδομένων πού στις γλώσσες πολύ υψηλού επιπέδου υπάρχουν έτοιμες.

-η δημιουργία δομών δεδομένων που σε γλώσσες πολύ υψηλού επιπέδου είναι δύσκολο να επιτευχθεί λόγω αποδοτικότητας, πχ. Β+ δένδρα. Γι'αυτό και τα περισσότερα rdbms είναι γραμμένα σε C.

 

αυτά μου έρχονται πρόχειρα.

 

Δηλαδη αν ασχοληθεις με C θα μαεις για ποιο λογο θα πρεπει να φτιαξεις pool και το τι ειναι το TLB ή αλλα συστηματα διαχηρησεις physical memory.

Kernels,drivers etc.. ολα αυτα εχουν C ABI, πολλες γλωσσες υποστηριζουν C ABI.

 

Ok καταλαβα την αποψη σου. Driver programmer ειναι πραγματικος προγραμματισμος. Το εχω ακουσει πολλες φορες...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...