起点是评估他们在执行各种任务时的“简洁性”(而不是对任何语言的效率或效力做出任何判断)。
这引出了我Rosettacode.org,这是任何编程爱好者的一个很棒的信息来源。它提供了各种任务(超过870个)和代码片段来解决它们,在许多编程语言中(超过680个)。
探索Rosettacode.org并比较不同的编程语言。它可以帮助您找到解决您在“本土”语言中遇到的问题的新方法,并找出其他思维方式。为此,我写了一个小应用程序来促进这个过程,我将在这里与大家分享。
该应用程序,非常基本。它只是将Rosettacode.org的代码片段长度与不同的任务和语言进行比较,并使用我最喜欢的Javascript库在条形图上显示结果。
Python,Flask,Highcharts和Azure环境
Azure是微软的云(免责声明,我为微软工作)。它是托管数据,创建机器人和自动执行任务,部署Python应用程序或利用AI的绝佳基础架构。
在本演示中,我在Azure上安装了一个python 3.4环境和一些库(Beautiful Soup和Flask)第1步:Scraping
第一步是刮掉RosettaCode以获取所有可用任务。我写了一个非常简短的python脚本来进行抓取。我预先选择了一部分编程语言(见languages_dict
下文),以避免刮掉太多不相关的数据。
# Selected language names and corresponding spelling/encoding as in HTML page languages_dict={"Java":"Java","JavaScript":"JavaScript","C":"C","C.2B.2B":"C++","C.23":"C#","COBOL":"Cobol","Haskell":"Haskell","Python":"Python","R":"R","Julia":"Julia","MATLAB_.2F_Octave":"Matlab","Pascal":"Pascal","Fortran":"Fortran","BASIC":"BASIC","Go":"Go","Ruby":"Ruby","SAS":"SAS","Stata":"Stata","Swift":"Swift","Processing":"Processing","UNIX_Shell":"UNIX Shell","VBA":"VBA","PowerShell":"PowerShell"}#store language names in an arraylanguage_name=[]#populate the array from the dictfor item in languages_dict:language_name.append(languages_dict[item])#get all tasks from Rosettacode.orgurl_task="http://www.rosettacode.org/wiki/Category:Programming_Tasks"r = requests.get(url_task)soup = BeautifulSoup(r.text, 'html.parser')table=soup.find("div", {"class": "mw-category"})#Create an empty dictionary to be filled with the tasks as they appear in the HTML source and name (as header)url_dict={}#get all links (a tags) tags=table('a')#iterate over tag list and fill the task/url dictionaryfor tag in tags: url_dict[tag.get('title',None)]=tag.get('href',None)[6:]#store task names in an arraytask_name=[]for item in url_dict: task_name.append(item)array_language=[]count=[]task=""#flask method to get the task the user wants to compareif request.method == "POST": # get url from task the user requested task = request.form['task'] url="https://www.rosettacode.org/wiki/"+url_dict[task] r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') dict_count={} for language in languages_dict: try: header=soup.find("span", {"id": language}) snippet=BeautifulSoup(header.find_next("pre").text, 'html.parser') dict_count[languages_dict[language]] = len(snippet.text) except: continue #sort dictionary for lang in sorted(dict_count, key=dict_count.get, reverse=True): array_language.append(lang) count.append(dict_count[lang])
当用户选择要比较的任务时,上面的脚本查找预先选择的语言并评估相应片段的长度(在HTML中相应的标题之后的“pre”标签内)。该脚本将结果存储在一个数组中,该数组将通过Flask发送到前端到我的Highcharts。
以下是与“ For循环 ” 对应的片段的结果数组:
# array_language['C', 'Swift', 'Pascal', 'Go', 'BASIC', 'Haskell', 'UNIX Shell', 'Matlab', 'Processing', 'PowerShell', 'Fortran', 'Cobol', 'VBA', 'C++', 'Java', 'Julia', 'Ruby', 'JavaScript', 'Python', 'R', 'SAS', 'Stata', 'C#']#count (length of the snippets)[90, 73, 144, 167, 70, 115, 400, 103, 103, 116, 1211, 533, 193, 104, 119, 71, 55, 114, 92, 85, 293, 79, 261]
然后这些数组将提供条形图。
第2步:Highcharts
Python和Flask使用和将数据数组发送到Highcharts 。在HTML页面呈现期间,服务器注入使用python构造的数组。请注意,我使用该选项来避免任何编码意外。{ { array_language | safe}}
{ {count}}
| safe
Highcharts.chart('container', { chart: { type: 'bar' }, title: { text: 'Programming language comparison: { {task | safe}} ' }, subtitle: { text: 'Source: rosettacode.org' }, xAxis: { categories: { { array_language | safe}}, title: { text: null } }, yAxis: { min: 0, title: { text: 'Task size (char)', align: 'high' }, labels: { overflow: 'justify' } }, tooltip: { valueSuffix: 'chars' }, plotOptions: { bar: { dataLabels: { enabled: true } } }, series: [{ name: '{ {task}}', data: { {count}} }]});
结果
- 下面是该应用程序的屏幕截图。
- 以下是Azure上托管的Python脚本和HTML页面。
我们现在有一种交互方式来比较执行许多任务所需的代码长度!要添加到图表中的一个很好的功能是将代码段显示为每种语言的工具提示。这将增强我们对Rosettacode的视觉探索。