❶ 總結Linux下的4種常用的編譯開發工具——編輯器、編譯器、調試器及項目管理器的功能。
編輯器:vi,getedit等,寫代碼用的。
編譯器:gcc/g++,把代碼編譯成二進製程序
調試器:gdb,kgdb等,調試程序用的
項目管理器:一般用eclipse等IDE來管理工程
❷ 求簡單行編譯器
C++ 實現的,用的一個Editor類.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class Editor
{
public:
Editor(){} //預設構造函數
Editor(const string s):line(s){} //帶參數構造函數
void ReadFile(const char * filename); //如果從文件讀取
int Find(const string & f) const; //查找
int Replace(const string & from,const string & to); //替換
int ReplaceAll(const string & from,const string & to); //替換所有
int Edit(); //編輯
void display() const //輸出
{
cout<<line<<endl;
}
private:
string line;
};
void Editor::ReadFile(const char * filename)
{
fstream infile(filename,ios::in);
if(! infile)
{
cerr<<"初始化失敗!"<<endl;
exit(0);
}
getline(infile,line);
}
int Editor::Find(const string & f) const
{
return line.find(f,0);
}
int Editor::Replace(const string & from,const string & to)
{
if(Find(from)==string::npos)
return 0;
line.replace(Find(from),from.size(),to);
return 1;
}
int Editor::ReplaceAll(const string & from,const string & to)
{
while(Find(from)!=string::npos)
Replace(from,to);
return 1;
}
int Editor::Edit()
{
cout<<"input the new line:"<<endl;
getline(cin,line);
return 1;
}
int main()
{
Editor e("how are you today! you are right!");
e.display();
e.ReplaceAll("you","we");
e.display();
return 0;
}
❸ 命令行編譯器
yun
❹ 開發一個 C++ 編譯器的難度有多大,難點又在哪裡
C++的前端是出了名的復雜度和可靠性要求並駕齊驅的軟體。
(這兩點都比它高一個數量級的大概就只有OS了)
對於這種系統,唯一的辦法就是燒錢。
燒錢的作用主要包括:
1.留人;
2.填坑;
3.買買買。
先說留人:復雜度一般是「細節」的代名詞。現實中的編譯器大多數以遞歸下降為主,自底向上的歸納推導為輔。這兩樣在教科書上也就是幾頁紙的事情。但是現實總是很殘酷的,人們總想讓語言更加「易用」,這就意味著各種上下文相關的情況都會出現。
對於C++來說,你要判斷一個符號是類型或者變數(比如這個符號被用在模板參數中),要看前面的聲明/定義。這就是一個上下文相關的推導。然後你就會寫大量的if else switch case之類的代碼來解決各種各樣的可能分支。寫它的人當然知道它是做什麼的,但是如果這個人離職了,新來一個人,就呆掉了,這寫的都是什麼煞筆玩意兒。因為它不知道現實中怎樣的需求會導致奇形怪狀的邏輯。所以人員的穩定,對於這種長周期迭代、邏輯復雜的項目是很重要的。但是人的水平要求高嗎?不算高也不算低。總結來說就是:有邏輯,知好歹。技術什麼都可以培養,但是態度和基本智商是比較難培養起來的。
至於怎麼保證人員穩定?很簡單:加薪。
再說填坑:編譯器是對正確性要求很高的基礎軟體。這里的正確性既包括產生的代碼的正確性,也包括編譯器自身對於各種問題的容忍度和足夠豐富的錯誤提示。容錯和錯誤提示本身也是代碼,也有很大的出錯幾率。所以這些軟體,bug少不了。但是作為基礎軟體,你又不能隨便就2+3搞成了2*3,這樣還怎麼讓別人相信愛情。所以要燒很多錢來養一幫debugger。
再說買買買:古人日:我們不用很麻煩很辛苦也可以成佛。既然這么費神我們自己做干什麼,不如買別人的吧。於是MS就乾脆不自己做了,直接去EDG整了個前端,這樣就可以少了不少人年。這就是傳統土豪和水果這種新暴發戶想的不一樣的地方。
傳統土豪想的是:我們有這么多錢為什麼還要自己解決問題呢?買買買!
水果新貴則是:啊呀,不小心有了這么多錢,我們要不要給自己製造點問題好把這些錢花出去?
❺ java寫一個行編譯器,編譯時提示找不到源,問題在string的用法中,是什麼原因
把環境變數path,classpath里多餘的東西刪掉,path里加%JAVA_HOME%\bin;(要確定JAVA_HOME是對的),classpath里先要加上「.;」,再加上這幾個包:%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
不知道你的情況是不是和我當初遇到的一樣,試試看!
❻ c++編 行編輯器(急用)
別人寫的
//送你一個吧.
#include "stdio.h"
#include "stdlib.h"
struct line{
char text[81];
int num; /*行號*/
struct line *next; /*指向下一個輸入項目的指針 */
struct line *prior; /*指向前一個項目的指針 */
};
struct line *start; /*指向表中第一個項目的指針 */
struct line *last; /*指向表中作後一個項目的指針 */
struct line *find(int),*dls_store(struct line *);
void patchup(int,int),delete_text(),list(),save(char *),load(char *);
menu_select();
enter(int linenum);
void main(int argc,char *argv[])
{
char s[80],choice,fname[80];
// struct line *info;
int linenum=1;
start=NULL;
last=NULL;
if(argc==2) load(argv[1]);/*裝入命令行上的文件 */
do{
choice=menu_select();
switch(choice){
case 1:printf("\t行號:");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case 2:delete_text();
break;
case 3:list();
break;
case 4:printf("\t文件名:");
gets(fname);
save(fname);
break;
case 5:printf("\t文件名:");
gets(fname);
load(fname);
break;
case 6:exit(0);
}
}while(1);
}
/* 顯示菜單,供用戶選擇 */
menu_select()
{
char s[80];
int c;
printf("\t\t1.輸入\n");
printf("\t\t2.刪除一行\n");
printf("\t\t3.顯示一行\n");
printf("\t\t4.文件存檔\n");
printf("\t\t5.裝入文件\n");
printf("\t\t6.退出\n");
do{
printf("\n\n\t\t請按數字選擇:");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
/*將文本插在指定行端部 */
enter(int linenum)
{
struct line *info;
//char t[81];
for(;;){
/* */
info=(struct line *)malloc(sizeof(struct line));
if(!info){
printf("\t! 內存不夠!\n");
return(NULL);
}
printf("%d:",linenum);
gets(info->text);
info->num=linenum;
if(*info->text){
if(find(linenum)) patchup(linenum,1);
if(*info->text) start=dls_store(info);
}
else break;
linenum++;
}
return(linenum);
}
/*當文本內容插在文件中間時其下面的內容的行號必須增加1,而 */
/*刪除時,被刪除的文本後面的行號必須減1 */
void patchup(int n,int incr)
{
struct line *i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行號排序後插入 */
struct line *dls_store(struct line *i)
{
struct line *old,*p;
if(last==NULL){
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=start;
old=NULL;
while(p){
if(p->num){
old=p;
p=p->next;
}
else{
if(p->prior){
p->prior->next=i;
i->next=p;
p->prior=i;
return start;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
return start;
}
/*刪除一行 */
void delete_text()
{
struct line *info;
char s[80];
int linenum;
printf("\t行號:");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info){
if(start==info){
start=info->next;
if(start) start->prior=NULL;
else last=NULL;
}
else{
info->prior->next=info->next;
if(info!=last)
info->next->prior=info->prior;
else last=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本 */
struct line *find(int linenum)
{
struct line *info;
info=start;
while(info){
if(linenum==info->num) return(info);
info=info->next;
}
return(NULL);
}
/*顯示文本 */
void list()
{
struct line *info;
info=start;
while(info){
printf("%d:%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
/*存文件 */
void save(char *fname)
{
struct line *info;
char *p;
FILE *fp;
if((fp=fopen("text.txt","w"))==NULL){
printf("\t文件打不開!\n");
exit(0);
}
printf("\t正在存入文件:\n");
info=start;
while(info){
p=info->text;
while(*p) putc(*p++,fp);
//putc('\r',fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
/*裝入文件 */
void load(char *fname)
{
struct line *info,*temp;
char *p;
FILE *fp;
//int t,size,inct;
int size,inct;
if((fp=fopen("text.txt","r"))==NULL){
printf("\t文件打不開!\n");
exit(0);
}
while(start){
temp=start;
start=start->next;
free(temp);
}
printf("\n\t正裝入文件 !\n");
size=sizeof(struct line);
start=(struct line*)malloc(size);
if(!start){
printf("\n\t內存已經用完!");
return;
}
info=start;
p=info->text;
inct=1;
while((*p=getc(fp))!=EOF){
p++;
while((*p=getc(fp))!='\n') p++;
//getc(fp); /*丟掉'\n' */
*p='\0';
info->num=inct++;
info->next=(struct line*)malloc(size);
if(!info->next){
printf("\n\t內存已經用完!");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=info->text;
}
temp->next=NULL;
last=temp;
free(info);
start->prior=NULL;
fclose(fp);
}
❼ 在國內從事C/C++編譯器的開發有發展前景嗎
我給你講講我的經歷。 我大概十年工作經驗,大概五年c++編譯器前端經驗(在兩家500強做靜態分析),四五年項目管理和品質過程改善經驗。其他主流語言都會用,實現的大概方式也明白。 前一段時間找工作,投了二十幾個c++職位一個電話都沒有。唯一的面試是朋友內推的阿里的項目管理專家。跑去面試,悲催,直接換崗成p5-p6的測試來面試,問了幾個測試問題直接讓我回家了(順便吐槽一下,他們對於測試過程感覺還沒問到點上) 最後的結局就是,沒人要,轉行去製造加工業了。我總結一下為什麼找不到工作(可能只是我偏頗的認識:一是這行需求太少,二是hr根本不知道你是幹嘛的,三是做這行的根本不好意思寫精通c++。
❽ 急求C++行編譯器
http://www.cfans8.cn,在這里找
❾ 行編譯器是文本編輯器么
行編譯器不是文本編輯器.
編譯器是用來編譯程序代碼的,編譯的結果是,生成二進制文件和可執行文件,如TC2.0,VC6.0等.
文本編輯器是用來編輯文本的,如windos下的"記事本".